diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java index 85614966..abe72c0e 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java @@ -1469,7 +1469,7 @@ public class OrderController extends BaseController { @PostMapping("/app/mix/after/list") @ResponseBody public AjaxResult appMixAfterList(@RequestBody OrderListRequest orderListRequest) { - List orderListResponses = new ArrayList<>(); + List orderListResponses = new ArrayList<>(); // 校验参数 Assert.notNull(orderListRequest.getWorkerId(), "师傅id不能为空"); @@ -1485,29 +1485,50 @@ public class OrderController extends BaseController { OrderMaster orderMasterReq = new OrderMaster(); BeanUtils.copyProperties(orderListRequest, orderMasterReq); List masterList = this.getMasterAfterList(orderMasterReq); + + // 查询售后记录 + AfterServiceRecord afterServiceRecord = new AfterServiceRecord(); + afterServiceRecord.setExcludeAfterServiceFinished(Boolean.TRUE); + List afterServiceRecordList = afterServiceRecordService + .selectAfterServiceRecordList(afterServiceRecord); + + // 按子单ID分组售后记录 + Map> detailRecordMap = afterServiceRecordList.stream() + .collect(Collectors.groupingBy(record -> record.getOrderDetailId())); + + // 获取有售后记录的子单ID列表 + List detailIds = afterServiceRecordList.stream() + .map(AfterServiceRecord::getOrderDetailId) + .distinct() + .collect(Collectors.toList()); + + // 需要排除同个师傅的主单子单同时出现 - List filteredMasterList = new ArrayList(); - for (OrderListResponse master : masterList) { - boolean isKeep = false; - // 查询该主单下所有售后中的子单 - OrderDetail detailAfterListOfMasterQry = new OrderDetail(); - detailAfterListOfMasterQry.setOrderMasterCode(master.getOrderMasterCode()); - List detailAfterListOfMasters = this.getDetailAfterList(detailAfterListOfMasterQry); - for (OrderListResponse detailAfterListOfMaster : detailAfterListOfMasters) { - if (!detailAfterListOfMaster.getWorkerId().equals(orderListRequest.getWorkerId())) { - isKeep = true; - break; - } - } - long count = detailAfterListOfMasters.stream() - .filter(x -> (x.getAfterTimeout() != null && x.getAfterTimeout() == 1)).count(); - if (isKeep) { - if (count > 0) { - master.setAfterTimeout(1); - } - filteredMasterList.add(master); - } - } + List filteredMasterList = masterList.stream() + .filter(master -> { + // 查询该主单下所有售后中的子单 + OrderDetail detailAfterListOfMasterQry = new OrderDetail(); + detailAfterListOfMasterQry.setOrderMasterCode(master.getOrderMasterCode()); + // 注意:这里使用getDetailAfterListLite方法,该方法只返回必要字段,性能更好 + List detailAfterList = this.getDetailAfterListLite(detailAfterListOfMasterQry, detailRecordMap,detailIds); + // List detailAfterList = this.getDetailAfterList(detailAfterListOfMasterQry); + + // 检查是否有其他师傅的售后单 + boolean hasOtherWorkerAfterService = detailAfterList.stream() + .anyMatch(detail -> !detail.getWorkerId().equals(orderListRequest.getWorkerId())); + + if (hasOtherWorkerAfterService) { + // 检查是否有超时的售后单,如果有则标记主单为超时 + boolean hasTimeout = detailAfterList.stream() + .anyMatch(detail -> detail.getAfterTimeout() != null && detail.getAfterTimeout() == 1); + if (hasTimeout) { + master.setAfterTimeout(1); + } + return true; + } + return false; + }) + .collect(Collectors.toList()); orderListResponses.addAll(filteredMasterList); // 根据更新时间倒序排列 @@ -1924,6 +1945,80 @@ public class OrderController extends BaseController { return orderListResponses; } + /** + * 轻量级售后订单查询方法 + * 只返回必要字段,提高查询性能 + * @param orderDetail 查询条件 + * @return 轻量级订单响应列表 + */ + public List getDetailAfterListLite(OrderDetail orderDetail,Map> detailRecordMap,List detailIds) { + + + // 设置查询条件 + StringBuilder orderDetailIds = new StringBuilder(); + detailIds.forEach(id -> orderDetailIds.append(id).append(",")); + String ids = orderDetailIds.toString(); + if (StringUtils.isNotEmpty(ids)) { + orderDetail.setOrderDetailIds(ids.substring(0, ids.length() - 1)); + } else { + orderDetail.setOrderDetailIds("0"); + } + + // 查询订单详情 + List orderDetailList = orderDetailService.selectOrderDetailList(orderDetail); + List responseList = new ArrayList<>(); + + for (OrderDetail detail : orderDetailList) { + // 查询主单基本信息 + OrderMaster orderMaster = orderMasterService.selectById(detail.getOrderMasterId()); + if (orderMaster == null) continue; + + // 查询师傅信息 + Worker worker = workerService.selectById(detail.getWorkerId()); + String workerName = ""; + String workerId = ""; + if (worker != null) { + workerId = worker.getWorkerId().toString(); + + } + + + + // 检查是否显示售后记录和超时状态 + List currentDetailRecords = detailRecordMap.get(detail.getId()); + int showAfterServiceRecord = 0; + Integer afterTimeout = null; + if (currentDetailRecords != null && !currentDetailRecords.isEmpty()) { + for (AfterServiceRecord record : currentDetailRecords) { + if (record.getAfterServiceStatus() != 1) { + showAfterServiceRecord = 1; + } + + } + } + + // 构建轻量级响应对象,只设置必要字段 + OrderListResponse response = new OrderListResponse(); + response.setOrderDetailId(detail.getId()); + response.setOrderMasterId(detail.getOrderMasterId()); + response.setOrderDetailCode(detail.getCode()); + response.setOrderMasterCode(detail.getOrderMasterCode()); + + response.setWorkerName(workerName); + response.setWorkerId(Long.valueOf(workerId)); // 必需字段,用于hasOtherWorkerAfterService判断 + + response.setOrderStatus(detail.getOrderStatus()); + + response.setShowAfterServiceRecord(showAfterServiceRecord); + response.setAfterServiceRecordList(currentDetailRecords); + response.setAfterTimeout(afterTimeout); // 必需字段,用于hasTimeout判断 + + responseList.add(response); + } + + return responseList; + } + public List getMasterList(OrderMaster orderMaster) { List orderListResponses = new ArrayList<>(); // 如果查询的是未约未排状态,只查询未全部派完的主单 diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java index b78e7e46..c6993397 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java @@ -1773,9 +1773,9 @@ public class OrderMasterController extends BaseController { } } } - if (totalPlatformRefundMoney.compareTo(BigDecimal.ZERO) > 0) { - totalPayMoney = totalPayMoney.subtract(totalPlatformRefundMoney); - } + // if (totalPlatformRefundMoney.compareTo(BigDecimal.ZERO) > 0) { + // totalPayMoney = totalPayMoney.subtract(totalPlatformRefundMoney); + // } BigDecimal leaderMoney = BigDecimal.ZERO; diff --git a/ghy-admin/src/main/resources/application.yaml b/ghy-admin/src/main/resources/application.yaml index 18bb5788..50056442 100644 --- a/ghy-admin/src/main/resources/application.yaml +++ b/ghy-admin/src/main/resources/application.yaml @@ -130,7 +130,7 @@ jim: # 百度地图应用api baidu: - ak: 'ZQTgMW7W0GTuE7Ripb0HDp5TqRaOI6PZ' + ak: 'i0sdnIsMmJVik7vJhfqMHA6DmS6d0fMB' url: 'https://api.map.baidu.com/reverse_geocoding/v3/?ak=#AK#&output=json&coordtype=wgs84ll&location=' sms: diff --git a/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java b/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java index 33a1ee32..0220f819 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/AfterServiceRecord.java @@ -166,6 +166,10 @@ public class AfterServiceRecord extends BaseEntity @Excel(name = "师傅重发/补发方案") private Integer workerResendPlan; + /** 师傅选择重发/补发方案时间 */ + @Excel(name = "师傅选择重发/补发方案时间") + private Date workerResendPlanTime; + /** 师傅重发/补发时间 */ @Excel(name = "师傅重发/补发时间", cellType = Excel.ColumnType.STRING) private Date workerResendTime; diff --git a/ghy-order/src/main/java/com/ghy/order/quartz/AfterServiceTimeoutTask.java b/ghy-order/src/main/java/com/ghy/order/quartz/AfterServiceTimeoutTask.java index 03838877..4a69f958 100644 --- a/ghy-order/src/main/java/com/ghy/order/quartz/AfterServiceTimeoutTask.java +++ b/ghy-order/src/main/java/com/ghy/order/quartz/AfterServiceTimeoutTask.java @@ -93,7 +93,8 @@ public class AfterServiceTimeoutTask { /** * 处理客户36小时不操作的情况 * 倒计时2:师傅重做完成后客户36小时不操作自动同意完单 - * 倒计时3:师傅拒绝后客户36小时不操作自动取消售后 + * 倒计时3:师傅拒绝或同意后客户36小时不操作自动取消售后 + * 倒计时4:师傅选择重发/补发方案后客户36小时不操作自动取消售后 */ private void processCustomerConfirmTimeout() { log.info("开始处理客户确认超时情况"); @@ -136,6 +137,13 @@ public class AfterServiceTimeoutTask { // } log.info("师傅拒绝/同意后客户超时自动取消,售后单取消完成,售后记录ID:{}", record.getId()); + }else if (record.getWorkerFeedbackResult() != null && record.getWorkerFeedbackResult().equals(2L)) { + // 倒计时4:客户同意后36小时不操作自动同意完单 + record.setCustomerFinalCheck(null); + record.setAfterServiceStatus(2); // 设置为已取消状态 + record.setIsAutoProcessed(1); // 自动处理 + + log.info("客户同意后超时自动取消,订单完成,售后记录ID:{}", record.getId()); } // 更新记录 @@ -155,8 +163,8 @@ public class AfterServiceTimeoutTask { /** * 师傅重发补发超时处理 - * 快递/物流:6天倒计时 - * 非快递:24小时倒计时 + * + * 同意为4天 * 超时后自动按客户同意处理 */ @Scheduled(fixedRate = 5 * 60 * 1000) // 5分钟执行一次 @@ -193,10 +201,10 @@ public class AfterServiceTimeoutTask { /** * 定时任务:自动处理超时的师傅确认收货 - * 每天凌晨2点执行,查询退货发货时间超过6天且师傅未确认收货的售后记录 + * ,查询退货发货时间超过6天且师傅未确认收货的售后记录 * 自动调用师傅确认收货方法进行退款处理 */ - @Scheduled(cron = "0 0 2 * * ?") + @Scheduled(cron = "0 0 8,12,18 * * ?") public void autoConfirmReceiveTask() { try { log.info("开始执行自动确认收货定时任务"); diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java index e4f4a1b5..53f35293 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java @@ -604,6 +604,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService afterServiceRecord.setRedoCompleteImages(param.getRedoCompleteImages()); } // 新增:处理重发/补发相关字段 + afterServiceRecord.setWorkerResendTime(new Date()); if (param.getWorkerResendType() != null) { afterServiceRecord.setWorkerResendType(param.getWorkerResendType()); } @@ -666,6 +667,10 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService afterServiceRecord.setWorkerResendPlan(param.getWorkerResendPlan()); afterServiceRecord.setWorkerResendTime(new Date()); + if (param.getWorkerFeedbackResult() != null && param.getWorkerFeedbackResult().equals(2L)) { + // afterServiceRecord.setWorkerFeedbackResult(2L); + afterServiceRecord.setWorkerResendPlanTime(new Date()); + } afterServiceRecord.setWorkerResendType(param.getWorkerResendType()); // 1-快递/物流,2-送货上门,3-自提 afterServiceRecord.setWorkerResendTrackingNumber(param.getWorkerResendTrackingNumber()); // 物流单号 // 新增:设置师傅重发/补发备注和图片 @@ -693,10 +698,10 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService if (param.getWorkerReceiveStatus() != null && param.getWorkerAgreeType() != null) { afterServiceRecord.setWorkerReceiveStatus(param.getWorkerReceiveStatus()); afterServiceRecord.setWorkerAgreeType(param.getWorkerAgreeType()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(new Date()); - calendar.add(Calendar.HOUR_OF_DAY, 36); - afterServiceRecord.setRedoCompleteTime(calendar.getTime()); + // Calendar calendar = Calendar.getInstance(); + // calendar.setTime(new Date()); + // calendar.add(Calendar.HOUR_OF_DAY, 36); + afterServiceRecord.setRedoCompleteTime(new Date()); // 处理师傅反馈相关字段 if (param.getWorkerFeedbackReasonType() != null) { afterServiceRecord.setWorkerFeedbackReasonType(param.getWorkerFeedbackReasonType()); @@ -1158,6 +1163,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } // 更新重发/补发方案 + afterServiceRecord.setWorkerFeedbackResult(param.getWorkerFeedbackResult()); + afterServiceRecord.setWorkerResendPlanTime(new Date()); afterServiceRecord.setWorkerResendPlan(param.getWorkerResendPlan()); afterServiceRecord.setUpdateBy(param.getUpdateBy()); @@ -1262,6 +1269,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } afterServiceRecord.setUpdateBy(param.getUpdateBy()); + afterServiceRecord.setRedoCompleteTime(null); // 设置客户操作时间 afterServiceRecord.setCustomerOperationTime(new Date()); diff --git a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml index 59e3a17d..43ff151f 100644 --- a/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/AfterServiceRecordMapper.xml @@ -44,6 +44,7 @@ + @@ -63,7 +64,7 @@ worker_feedback_reason_type, worker_feedback_reason, worker_feedback_images, refund, agreed_refund, platform_refund, original_refund, customer_final_check, create_by, create_time, update_by, update_time, remark, refund_apply_time, customer_agree_redo, customer_operation_time, redo_complete_time, redo_complete_remark, redo_complete_images, is_auto_processed, after_service_category, after_service_type, return_status, - return_address, return_contact, return_phone, return_type, return_remark, return_images, return_tracking_number, return_ship_time, merchant_receive_time, worker_resend_plan, worker_resend_time, worker_resend_type, worker_resend_tracking_number, worker_receive_status, worker_agree_type, worker_receive_confirm, worker_resend_remark, worker_resend_images, + return_address, return_contact, return_phone, return_type, return_remark, return_images, return_tracking_number, return_ship_time, merchant_receive_time, worker_resend_plan, worker_resend_plan_time, worker_resend_time, worker_resend_type, worker_resend_tracking_number, worker_receive_status, worker_agree_type, worker_receive_confirm, worker_resend_remark, worker_resend_images, customer_disagree_images, customer_disagree_reason, after_service_status, platform_handle_reason from after_service_record @@ -132,6 +133,7 @@ return_ship_time, merchant_receive_time, worker_resend_plan, + worker_resend_plan_time, worker_resend_time, worker_resend_type, worker_resend_tracking_number, @@ -181,6 +183,7 @@ #{returnShipTime}, #{merchantReceiveTime}, #{workerResendPlan}, + #{workerResendPlanTime}, #{workerResendTime}, #{workerResendType}, #{workerResendTrackingNumber}, @@ -236,6 +239,7 @@ return_ship_time = #{returnShipTime}, merchant_receive_time = #{merchantReceiveTime}, worker_resend_plan = #{workerResendPlan}, + worker_resend_plan_time = #{workerResendPlanTime}, worker_resend_time = #{workerResendTime}, worker_resend_type = #{workerResendType}, worker_resend_tracking_number = #{workerResendTrackingNumber}, @@ -282,6 +286,7 @@ + @@ -306,7 +316,7 @@ AND customer_final_check IS NULL AND (is_auto_processed IS NULL OR is_auto_processed = 0) AND ( - -- 所有类型统一:5天倒计时 + -- 所有类型统一:4天倒计时 worker_resend_time <= DATE_SUB(NOW(), INTERVAL 4 DAY) AND worker_resend_time >= DATE_SUB(NOW(), INTERVAL 5790 MINUTE) ) @@ -318,7 +328,7 @@ WHERE customer_operation_time IS NOT NULL AND customer_operation_time <= DATE_SUB(NOW(), INTERVAL 6 DAY) - AND customer_operation_time >= DATE_SUB(NOW(), INTERVAL 8670 MINUTE) + AND customer_operation_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) AND (worker_receive_confirm IS NULL OR worker_receive_confirm = 0) AND after_service_status = 0 AND after_service_category = 2