From 40ba4652be92c3139e209443a54444fd3015eca6 Mon Sep 17 00:00:00 2001 From: cb <275647614@qq.com> Date: Sat, 25 Oct 2025 16:35:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=94=AE=E5=90=8E=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=B9=B3=E5=8F=B0=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E7=B1=BB=E5=9E=8B=EF=BC=8C=E5=B9=B3=E5=8F=B0=E9=80=80?= =?UTF-8?q?=E6=AC=BE=E9=87=91=E9=A2=9D=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/order/OrderController.java | 3 + .../order/OrderDetailController.java | 1 + .../order/OrderMasterController.java | 123 ++++++++++++++++++ .../ghy/web/pojo/vo/OrderListResponse.java | 3 + .../ghy/web/pojo/vo/OrderStandardDetail.java | 3 +- .../resources/templates/order/master.html | 44 ++++++- .../templates/order/orderManager.html | 43 +++++- .../com/ghy/order/domain/OrderDetail.java | 2 +- .../com/ghy/order/domain/OrderMaster.java | 2 +- .../impl/AfterServiceRecordServiceImpl.java | 4 +- 10 files changed, 216 insertions(+), 12 deletions(-) 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 8b3c1249..0b517f0e 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 @@ -2050,6 +2050,7 @@ public class OrderController extends BaseController { // 编辑返回属性 + orderListResponse.setAfterPlatformServiceStatus(master.getAfterServiceStatus()); orderListResponse.setShowInMonitor(master.getShowInMonitor()); orderListResponse.setShowAfterServiceRecord(hasMatchingAfterService ? 1 : 0); orderListResponse.setWorkerRemark(master.getWorkerRemark()); @@ -2298,7 +2299,9 @@ public class OrderController extends BaseController { =afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); orderListResponse.setShowAfterServiceRecord( 1); + // 编辑返回属性 + orderListResponse.setAfterPlatformServiceStatus(detail.getAfterServiceStatus()); orderListResponse.setWorkerRemark(detail.getWorkerRemark()); orderListResponse.setGoods(goods); orderListResponse.setGoodsBrand(orderMaster.getGoodsBrand()); diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java index ab631247..0a7a6ffc 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java @@ -535,6 +535,7 @@ public class OrderDetailController extends BaseController { orderListResponse.setHandoverRemark(detail.getHandoverRemark()); orderListResponse.setGoods(goods); + orderListResponse.setAfterPlatformServiceStatus(detail.getAfterServiceStatus()); orderListResponse.setAddMoneyRemark(addMoneyRemark); orderListResponse.setAddMoney(addMoneyTotal); orderListResponse.setOrderDetailId(detail.getId()); 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 58296c43..a04ad411 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 @@ -1825,6 +1825,7 @@ public class OrderMasterController extends BaseController { } OrderStandardDetail orderStandardDetail = new OrderStandardDetail(); + orderStandardDetail.setAfterPlatformServiceStatus(orderDetail.getAfterServiceStatus()); orderStandardDetail.setOrderImages(orderDetail.getOrderImages()); orderStandardDetail.setHandoverImages(orderDetail.getHandoverImages()); orderStandardDetail.setHandoverRemark(orderDetail.getHandoverRemark()); @@ -2995,6 +2996,128 @@ public class OrderMasterController extends BaseController { return shop; } + /** + * 取消售后 + * + * @param afterServiceRecordId 售后记录ID + * @return 操作结果 + */ + @PostMapping("/after/cancel") + @ResponseBody + @Log(title = "取消售后管理", businessType = BusinessType.UPDATE) + @Transactional(rollbackFor = Exception.class) + public AjaxResult cancelAfterService(@RequestParam("afterServiceRecordId") Long afterServiceRecordId, + @RequestParam("platformHandleReason") String platformHandleReason) { + try { + // 参数校验 + if (afterServiceRecordId == null) { + return AjaxResult.error("售后记录ID不能为空"); + } + if (StringUtils.isEmpty(platformHandleReason)) { + return AjaxResult.error("平台取消原因不能为空"); + } + + // 查询售后记录是否存在 + AfterServiceRecord afterServiceRecord = afterServiceRecordService.selectAfterServiceRecordById(String.valueOf(afterServiceRecordId)); + if (afterServiceRecord == null) { + return AjaxResult.error("售后记录不存在"); + } + + // 检查售后记录状态是否允许取消 + if (afterServiceRecord.getAfterServiceStatus() != null && afterServiceRecord.getAfterServiceStatus() == 4) { + return AjaxResult.error("售后记录已完成,无法取消"); + } + + // 更新售后记录状态 + AfterServiceRecord updateRecord = new AfterServiceRecord(); + updateRecord.setId(String.valueOf(afterServiceRecordId)); + // updateRecord.setAfterServiceStatus(3); // 3表示平台取消 + updateRecord.setPlatformRefund(BigDecimal.ZERO); // 平台退款金额设为0 + updateRecord.setAfterServiceStatus(2); // 售后状态改为已取消 + updateRecord.setPlatformHandleReason(platformHandleReason); + updateRecord.setUpdateBy(getLoginName()); + updateRecord.setUpdateTime(new Date()); + + afterServiceRecordService.updateAfterServiceRecord(updateRecord); + + // 同步更新子单和主单的售后纠纷状态 + // 1. 通过售后记录的orderDetailId查询对应的OrderDetail + Long orderDetailId = afterServiceRecord.getOrderDetailId(); + if (orderDetailId != null) { + OrderDetail orderDetail = orderDetailService.selectById(orderDetailId); + if (orderDetail != null) { + // 2. 将OrderDetail的afterServiceStatus字段设为3(售后已取消) + OrderDetail updateOrderDetail = new OrderDetail(); + updateOrderDetail.setId(orderDetailId); + updateOrderDetail.setAfterServiceStatus(3); // 0-无售后 + updateOrderDetail.setUpdateBy(getLoginName()); + updateOrderDetail.setUpdateTime(new Date()); + + orderDetailService.updateOrderDetail(updateOrderDetail); + + logger.info("更新子单售后状态成功:子单ID={}, 售后状态=0", orderDetailId); + + // 3. 通过OrderDetail的orderMasterId查询对应的OrderMaster + Long orderMasterId = orderDetail.getOrderMasterId(); + if (orderMasterId != null) { + // 4. 检查该主单下是否还有其他售后纠纷记录 + // 首先通过主单ID查询该主单下的所有子单 + OrderDetail queryOrderDetail = new OrderDetail(); + queryOrderDetail.setOrderMasterId(orderMasterId); + List orderDetails = orderDetailService.selectOrderDetailList(queryOrderDetail); + + // 获取所有子单ID列表 + List orderDetailIds = orderDetails.stream() + .map(OrderDetail::getId) + .collect(Collectors.toList()); + + // 通过子单ID列表查询对应的售后记录 + List masterAfterRecords = new ArrayList<>(); + for (Long detailId : orderDetailIds) { + AfterServiceRecord queryParam = new AfterServiceRecord(); + queryParam.setOrderDetailId(detailId); + List detailAfterRecords = afterServiceRecordService.selectAfterServiceRecordList(queryParam); + masterAfterRecords.addAll(detailAfterRecords); + } + + // 过滤掉当前取消的售后记录,检查是否还有其他进行中的售后 + boolean hasOtherAfterService = masterAfterRecords.stream() + .anyMatch(record -> !record.getId().equals(String.valueOf(afterServiceRecordId)) + && record.getAfterServiceStatus() != null + && record.getAfterServiceStatus() != 2); // 2表示已取消 + + // 5. 如果没有其他售后纠纷则将OrderMaster的afterServiceStatus字段也设为0(无售后) + if (!hasOtherAfterService) { + OrderMaster updateOrderMaster = new OrderMaster(); + updateOrderMaster.setId(orderMasterId); + updateOrderMaster.setAfterServiceStatus(0); // 0-无售后 + updateOrderMaster.setUpdateBy(getLoginName()); + updateOrderMaster.setUpdateTime(new Date()); + orderMasterService.updateOrderMaster(updateOrderMaster); + + logger.info("更新主单售后状态成功:主单ID={}, 售后状态=0", orderMasterId); + } else { + logger.info("主单下还有其他售后记录,不更新主单售后状态:主单ID={}", orderMasterId); + } + } + } else { + logger.warn("未找到对应的子单:子单ID={}", orderDetailId); + } + } else { + logger.warn("售后记录中未找到对应的子单ID:售后记录ID={}", afterServiceRecordId); + } + + logger.info("取消售后成功:售后记录ID={}, 操作人={}", + afterServiceRecordId, getLoginName()); + + return AjaxResult.success("取消售后成功"); + + } catch (Exception e) { + logger.error("取消售后失败:售后记录ID={}, 错误信息={}", afterServiceRecordId, e.getMessage(), e); + return AjaxResult.error("取消售后失败:" + e.getMessage()); + } + } + /** * 获取售后纠纷的主单ID列表 * 通过查询AfterServiceRecord表中customerFinalCheck=0的记录 diff --git a/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java b/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java index 54011299..cf65d319 100644 --- a/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java +++ b/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java @@ -328,4 +328,7 @@ public class OrderListResponse { @Excel(name = "是否显示在监控单", cellType = Excel.ColumnType.NUMERIC, readConverterExp = "0=不显示,1=显示在监控单") private Integer showInMonitor; + + @Excel(name = "售后状态:0-无售后,1-售后纠纷,2-售后已完成,3-售后已取消") + private Integer afterPlatformServiceStatus; } diff --git a/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderStandardDetail.java b/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderStandardDetail.java index 5f078ca7..448ca78f 100644 --- a/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderStandardDetail.java +++ b/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderStandardDetail.java @@ -128,5 +128,6 @@ public class OrderStandardDetail { private String handoverRemark; private String orderImages; - + //= "售后状态:0-无售后,1-售后纠纷,2-售后已完成,3-售后已取消" + private Integer afterPlatformServiceStatus; } diff --git a/ghy-admin/src/main/resources/templates/order/master.html b/ghy-admin/src/main/resources/templates/order/master.html index 3d396e16..716d6208 100644 --- a/ghy-admin/src/main/resources/templates/order/master.html +++ b/ghy-admin/src/main/resources/templates/order/master.html @@ -1031,20 +1031,18 @@ modalContent += ''; modalContent += ''; modalContent += ''; - modalContent += ''; + modalContent += ''; modalContent += ''; modalContent += ''; - modalContent += ''; modalContent += ''; modalContent += ''; disputeRecords.forEach(function(record) { modalContent += ''; modalContent += ''; - modalContent += ''; + modalContent += ''; modalContent += ''; modalContent += ''; - modalContent += ''; modalContent += ''; modalContent += ''; }); @@ -1118,6 +1117,43 @@ }); } + // 取消售后 + function cancelAfterService(recordId, orderDetailId) { + // 获取处理原因输入框的值 + var processReason = $('#processReason_' + recordId).val(); + + if (!processReason || processReason.trim() === '') { + $.modal.msgError("请输入处理原因"); + return; + } + + $.modal.confirm("确认取消该售后申请吗?", function() { + $.ajax({ + type: "POST", + dataType: "json", + url: ctx + "order/master/after/cancel", + data: { + afterServiceRecordId: recordId, + platformHandleReason: processReason.trim() + }, + success: function (result) { + if (result.code == web_status.SUCCESS) { + $.modal.msgSuccess("取消售后成功"); + // 关闭弹窗 + layer.closeAll(); + // 刷新表格 + $.table.refresh(); + } else { + $.modal.msgError("取消售后失败:" + result.msg); + } + }, + error: function () { + $.modal.msgError("取消售后失败,请重试"); + } + }); + }); + } + // 获取售后类型文本 function getAfterServiceTypeText(type) { var typeMap = { diff --git a/ghy-admin/src/main/resources/templates/order/orderManager.html b/ghy-admin/src/main/resources/templates/order/orderManager.html index 5cc636b8..3556fe52 100644 --- a/ghy-admin/src/main/resources/templates/order/orderManager.html +++ b/ghy-admin/src/main/resources/templates/order/orderManager.html @@ -1268,15 +1268,13 @@ if (afterServiceRecords && afterServiceRecords.length > 0) { html += '
'; html += '
子单号售后类型申请退款金额师傅反馈客户确认申请退款金额操作
' + (record.orderDetailCode || record.id) + '' + getAfterServiceTypeText(record.afterServiceType) + '¥' + (record.refund || record.agreedRefund || 0) + '' + getWorkerFeedbackText(record.workerFeedbackResult) + '' + getCustomerCheckText(record.customerFinalCheck) + '¥' + (record.agreedRefund || 0) + ''; modalContent += '
'; modalContent += ''; @@ -1055,6 +1053,7 @@ modalContent += ''; modalContent += '
'; modalContent += ''; + modalContent += ''; modalContent += '
'; - html += ''; + html += ''; html += ''; afterServiceRecords.forEach(function(record) { html += ''; html += ''; - html += ''; - html += ''; - html += ''; + html += ''; html += ''; html += ''; html += ''; html += ''; }); @@ -1358,6 +1357,42 @@ }); } + // 取消售后 + function cancelAfterService(recordId, orderMasterId) { + // 获取处理原因输入框的值 + var processReason = $('#processReason_' + recordId).val(); + + if (!processReason || processReason.trim() === '') { + $.modal.msgError("请输入处理原因"); + return; + } + + $.modal.confirm("确认取消该售后申请吗?", function() { + $.ajax({ + type: "POST", + dataType: "json", + url: prefix + '/after/cancel', + data: { + afterServiceRecordId: recordId, + platformHandleReason: processReason.trim() + }, + success: function (result) { + if (result.code == web_status.SUCCESS) { + $.modal.msgSuccess("取消售后成功"); + $('#afterServiceDisputeModal').modal('hide'); + // 刷新页面数据 + $.table.refresh(); + } else { + $.modal.msgError("取消售后失败:" + result.msg); + } + }, + error: function() { + $.modal.msgError("取消售后失败,请重试!"); + } + }); + }); + } + // 获取售后类型文本 function getAfterServiceTypeText(type) { var types = { diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java index 31461da4..7e7b4788 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java @@ -264,7 +264,7 @@ public class OrderDetail extends BaseEntity { /** * 售后状态:0-无售后,1-售后纠纷 */ - @Excel(name = "售后状态:0-无售后,1-售后纠纷,2-售后已完成") + @Excel(name = "售后状态:0-无售后,1-售后纠纷,2-售后已完成,3-售后已取消") private Integer afterServiceStatus; /** diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java index 7a08ba8b..bbe40123 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java @@ -327,7 +327,7 @@ public class OrderMaster extends BaseEntity { /** * 售后状态:0-无售后,1-售后纠纷 */ - @Excel(name = "售后状态:0-无售后,1-售后纠纷") + @Excel(name = "售后状态:0-无售后,1-售后纠纷,2-售后已完成,3-售后已取消") private Integer afterServiceStatus; /** 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 443f1f05..7ca7338c 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 @@ -878,7 +878,9 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService log.info("当前订单是否已支付: {}", payReverse); // 申请退款金额 BigDecimal refundMoney=BigDecimal.ZERO; - if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) { + if (ObjectUtils.isNotEmpty(afterServiceRecord.getPlatformRefund())) { + refundMoney = afterServiceRecord.getPlatformRefund(); + }else if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) { refundMoney = afterServiceRecord.getAgreedRefund(); } else { refundMoney = afterServiceRecord.getRefund();
子单号售后类型申请原因申请金额师傅反馈客户确认操作
子单号申请退款金额师傅反馈客户确认操作
' + (record.orderDetailCode || '') + '' + getAfterServiceTypeText(record.afterServiceType) + '' + (record.customerReason || '') + '¥' + (record.refund || 0) + '¥' + (record.refund || record.agreedRefund || 0) + '' + getWorkerFeedbackText(record.workerFeedbackResult) + '' + getCustomerCheckText(record.customerFinalCheck) + ''; @@ -1289,6 +1287,7 @@ html += ''; html += ''; html += ''; + html += ''; html += '