From bba67251af97bd977c55148c84338c28d3034f7f Mon Sep 17 00:00:00 2001 From: cb <275647614@qq.com> Date: Fri, 10 Oct 2025 16:13:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=90=8E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=9C=8D=E5=8A=A1=E4=B8=BB=E5=8D=95=E8=B4=A2?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81=EF=BC=8C=E4=BF=AE=E6=94=B9=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E5=8D=95=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=95=86=E5=93=81=E4=B8=BB=E5=8D=95?= =?UTF-8?q?=20=E5=85=A8=E5=8D=95=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/callback/PayCallbackService.java | 28 +++ .../web/controller/order/OrderController.java | 12 +- .../order/OrderMasterController.java | 186 +++++++++++++++++- .../ghy/web/pojo/vo/OrderListResponse.java | 2 + .../ghy/order/mapper/OrderMasterMapper.java | 8 + .../ghy/order/service/OrderMasterService.java | 8 + .../service/impl/OrderMasterServiceImpl.java | 5 + .../mapper/order/OrderMasterMapper.xml | 13 +- 8 files changed, 250 insertions(+), 12 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java b/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java index 76ab6794..a655ac15 100644 --- a/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java +++ b/ghy-admin/src/main/java/com/ghy/callback/PayCallbackService.java @@ -8,6 +8,8 @@ import com.ghy.common.adapay.model.PayCallback; import com.ghy.common.adapay.model.PaymentDTO; import com.ghy.common.enums.PayStatus; import com.ghy.order.domain.OrderAddSubtract; +import com.ghy.order.domain.OrderMaster; +import com.ghy.order.mapper.OrderMasterMapper; import com.ghy.order.service.IOrderAddSubtractService; import com.ghy.order.service.OrderMasterService; import com.ghy.payment.domain.FinancialChangeRecord; @@ -39,6 +41,7 @@ public class PayCallbackService implements CallBackService { @Resource OrderMasterService orderMasterService; + @Resource FinancialMasterService financialMasterService; @Resource @@ -96,6 +99,31 @@ public class PayCallbackService implements CallBackService { // 更新主财务单的支付信息 financialMasterService.updatePay(relationId, paymentId, PayStatus.PAID.getCode()); log.info("主财务单[{}]支付成功", relationId); + + // 检查是否为商品订单且有关联的服务订单,需要同步更新服务订单财务主单支付状态 + try { + OrderMaster orderMaster = orderMasterService.selectById(financialMaster.getOrderMasterId()); + if (orderMaster != null && orderMaster.getOrderType() == 1 && orderMaster.getHasServiceOrder() == 1) { + // 查询关联的服务订单 + OrderMaster serviceOrder = orderMasterService.selectByGoodsOrderMasterId(orderMaster.getId()); + if (serviceOrder != null) { + // 查询服务订单对应的财务主单 + FinancialMaster serviceFinancialMaster = financialMasterService.selectByOrderMasterId(serviceOrder.getId()); + if (serviceFinancialMaster != null && !PayStatus.PAID.getCode().equals(serviceFinancialMaster.getPayStatus())) { + // 更新服务订单财务主单支付状态 + financialMasterService.updatePay(serviceFinancialMaster.getId(), paymentId, PayStatus.PAID.getCode()); + // 更新服务订单支付状态 + orderMasterService.updatePayStatus(serviceOrder.getId(), PayStatus.PAID.getCode()); + log.info("商品订单[{}]关联的服务订单[{}]财务主单[{}]支付状态已同步更新为已支付", + orderMaster.getId(), serviceOrder.getId(), serviceFinancialMaster.getId()); + } + } + + } + } catch (Exception e) { + log.error("同步更新商品订单关联服务订单支付状态时发生异常,商品订单ID: {}, 异常信息: {}", + financialMaster.getOrderMasterId(), e.getMessage(), e); + } } else if (PaymentRelation.FINANCIAL_CHANGE.equals(relation.getRelationIdType())) { 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 a6d4ddf4..361ed8a8 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 @@ -578,14 +578,14 @@ public class OrderController extends BaseController { Set workIds = orderDetailService.selectByOrderMasterId(om.getId()).stream() .map(OrderDetail::getWorkerId).collect(Collectors.toSet()); if (workIds.size() > 1 || !workIds.contains(om.getWorkerId())) { - // 派完单 并且有其他师傅接单(监控单) + // 派完单 并且有其他师傅接单(包含其他人,监控单需要显示) om2up.setHasDispatchedAll(1); - om2up.setAllSelfAssigned(1); + om2up.setAllSelfAssigned(1); // 1表示有其他师傅参与 om2up.setOrderStatus(OrderStatus.PLAIN.code()); } else { - // 派完单 但是只有自己接单 + // 派完单 但是只有自己接单(只有自己,监控单不显示) om2up.setHasDispatchedAll(1); - om2up.setAllSelfAssigned(0); + om2up.setAllSelfAssigned(0); // 0表示只有自己承接 if (request.getIsQuicklyDelivery() != null && request.getIsQuicklyDelivery() == 1) { om2up.setOrderStatus(OrderStatus.SERVER.code()); } else { @@ -593,8 +593,8 @@ public class OrderController extends BaseController { } } } else { - // 未派完单 - om2up.setAllSelfAssigned(0); + // 未派完单(还未完全派单,暂不显示在监控单) + om2up.setAllSelfAssigned(0); // 0表示未完成派单或只有自己 om2up.setHasDispatchedAll(0); om2up.setOrderStatus(OrderStatus.PLAIN.code()); } 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 cf1245d6..fa5e124c 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 @@ -1,6 +1,8 @@ package com.ghy.web.controller.order; import cn.hutool.core.date.DateUtil; + +import com.alibaba.fastjson.JSONObject; import com.ghy.common.annotation.Log; import com.ghy.common.constant.UserConstants; import com.ghy.common.core.controller.BaseController; @@ -26,6 +28,10 @@ import com.ghy.web.controller.order.AfterServiceDisputeRequest; import com.ghy.payment.domain.FinancialChangeRecord; import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; +import java.math.BigDecimal; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import com.ghy.payment.service.AdapayService; import com.ghy.payment.service.FinancialChangeRecordService; import com.ghy.payment.service.FinancialDetailService; import com.ghy.payment.service.FinancialMasterService; @@ -117,6 +123,8 @@ public class OrderMasterController extends BaseController { @Resource private CustomerAddressService customerAddressService; @Resource + private AdapayService adapayService; + @Resource private IOrderAttachmentRecordService orderAttachmentRecordService; @Resource private InsuranceService insuranceService; @@ -1875,7 +1883,7 @@ public class OrderMasterController extends BaseController { goodsWorker = workerService.selectById(goodsOrderMaster.getWorkerId()); goodsWorkerRealInfo = workerCertificationService.selectByWorkerId(goodsOrderMaster.getWorkerId()); orderStandardList=orderGoodsService.selectByOrderMasterId(goodsOrderMaster.getId()); - + orderListResponse.setOriginalOrderMasterCode(goodsOrderMaster.getCode()); } if (masterWorker != null) { // 大师傅实名信息 @@ -2427,7 +2435,7 @@ public class OrderMasterController extends BaseController { } try { - // 判断是否为服务订单且需要退还服务金额 + // 判断是否为服务订单且需要退还服务金额 if (isServiceOrder(orderMasterInfo) && orderMasterInfo.getGoodsOrderMasterId() != null && orderMasterInfo.getServerGoodsMoney() != null && @@ -2514,6 +2522,180 @@ public class OrderMasterController extends BaseController { } } + /** + * 商品主单退单退款 + * 用于商品主单生成了服务主单后,先退服务主单然后再退商品主单 + * 前提是这两个主单状态都必须是没有进入确认中(状态不能是4-待确认) + * + * @param goodsOrderMasterId 商品主单ID + */ + @PostMapping("/goodsOrderRefund") + @ResponseBody + @Transactional(rollbackFor = Exception.class) + public AjaxResult goodsOrderRefund(@RequestParam Long goodsOrderMasterId) { + logger.info("商品主单退单退款开始,goodsOrderMasterId={}", goodsOrderMasterId); + + try { + // 1. 检查商品主单是否存在 + OrderMaster goodsOrderMaster = orderMasterService.selectById(goodsOrderMasterId); + if (goodsOrderMaster == null) { + return AjaxResult.error("商品主单不存在!"); + } + + // 2. 检查商品主单状态,不能是待确认状态(4) + if (goodsOrderMaster.getOrderStatus().equals(OrderStatus.FINISH_CHECK.code())) { + return AjaxResult.error("商品主单已进入确认中状态,无法退单!"); + } + + // 3. 检查商品主单是否有关联的服务主单 + if (goodsOrderMaster.getHasServiceOrder() != null && goodsOrderMaster.getHasServiceOrder() == 1) { + // 查找关联的服务主单 + OrderMaster serviceOrderMaster = orderMasterService.selectByGoodsOrderMasterId(goodsOrderMasterId); + if (serviceOrderMaster != null) { + // 检查服务主单状态,不能是待确认状态(4) + if (serviceOrderMaster.getOrderStatus().equals(OrderStatus.FINISH_CHECK.code())) { + return AjaxResult.error("关联的服务主单已进入确认中状态,无法退单!"); + } + + // 4. 先退服务主单 + logger.info("开始退服务主单,serviceOrderMasterId={}", serviceOrderMaster.getId()); + OrderMaster serviceOrderParam = new OrderMaster(); + serviceOrderParam.setId(serviceOrderMaster.getId()); + AjaxResult serviceResult = consoleCancel(serviceOrderParam); + if (!serviceResult.get("code").equals(0)) { + logger.error("退服务主单失败:{}", serviceResult.get("msg")); + throw new RuntimeException("退服务主单失败:" + serviceResult.get("msg")); + } + logger.info("退服务主单成功,serviceOrderMasterId={}", serviceOrderMaster.getId()); + } + } + + // 5. 再退商品主单 + logger.info("开始退商品主单,goodsOrderMasterId={}", goodsOrderMasterId); + OrderMaster goodsOrderParam = new OrderMaster(); + goodsOrderParam.setId(goodsOrderMasterId); + AjaxResult goodsResult = consoleCancel(goodsOrderParam); + if (!goodsResult.get("code").equals(0)) { + logger.error("退商品主单失败:{}", goodsResult.get("msg")); + throw new RuntimeException("退商品主单失败:" + goodsResult.get("msg")); + } + logger.info("退商品主单成功,goodsOrderMasterId={}", goodsOrderMasterId); + + // 6. 退单成功后进行退款操作 + try { + // 获取商品主单的财务信息 + FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(goodsOrderMasterId); + if (financialMaster == null) { + logger.warn("未找到商品主单的财务信息,goodsOrderMasterId={}", goodsOrderMasterId); + return AjaxResult.success("商品主单退单成功,但未找到财务信息,无法自动退款"); + } + + // 添加重复退款检查 + if (financialMaster.getPayStatus() != null && (financialMaster.getPayStatus() == 3 || financialMaster.getPayStatus() == 4)) { + logger.warn("财务主单已处于退款中或已退款状态,无法重复退款,goodsOrderMasterId={}, payStatus={}", goodsOrderMasterId, financialMaster.getPayStatus()); + return AjaxResult.error("订单已处于退款中或已退款状态,无法重复退款"); + } + + // 计算退款金额(使用财务主单的payMoney) + BigDecimal refundAmount = financialMaster.getPayMoney(); + if (refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { + logger.info("商品主单退款金额为零,goodsOrderMasterId={}, refundAmount={}", goodsOrderMasterId, refundAmount); + return AjaxResult.success("商品主单退单成功,无需退款(金额为零)"); + } + + // 检查支付状态,只有已支付的订单才需要退款 + if (financialMaster.getPayStatus() == null || financialMaster.getPayStatus() != 1) { + logger.info("商品主单未支付,无需退款,goodsOrderMasterId={}, payStatus={}", goodsOrderMasterId, financialMaster.getPayStatus()); + return AjaxResult.success("商品主单退单成功,无需退款(未支付)"); + } + + // 更新财务主单状态为退款中 + financialMaster.setPayStatus(3); // 3表示退款中 + financialMasterService.updateFinancialMaster(financialMaster); + logger.info("更新财务主单状态为退款中,financialMasterId={}", financialMaster.getId()); + + // 更新财务子单状态为退款中 + List financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); + for (FinancialDetail detail : financialDetails) { + detail.setPayStatus(3); // 3表示退款中 + financialDetailService.updateFinancialDetail(detail); + } + logger.info("更新财务子单状态为退款中,财务子单数量={}", financialDetails.size()); + + // 调用支付撤销接口进行退款 + logger.info("开始调用支付撤销接口,paymentId={}, refundAmount={}", financialMaster.getPaymentId(), refundAmount); + JSONObject reverseResult = adapayService.payReverse(goodsOrderMasterId, financialMaster.getPaymentId(), refundAmount.toPlainString(), RefundType.ROM); + + // 修复退款结果判断逻辑 + if (reverseResult != null && reverseResult.containsKey("reverseId") && reverseResult.getString("reverseId") != null) { + // 完善reverseId保存逻辑,添加空值检查 + String reverseId = reverseResult.getString("reverseId"); + if (reverseId != null && !reverseId.trim().isEmpty()) { + financialMaster.setReverseId(reverseId); + financialMaster.setPayStatus(4); // 更新为已退款状态 + financialMasterService.updateFinancialMaster(financialMaster); + + // 更新财务子单状态为已退款 + for (FinancialDetail detail : financialDetails) { + detail.setPayStatus(4); // 4表示已退款 + financialDetailService.updateFinancialDetail(detail); + } + + logger.info("退款成功,reverseId={}, goodsOrderMasterId={}", reverseId, goodsOrderMasterId); + return AjaxResult.success("商品主单退单退款成功,退款ID:" + reverseId); + } else { + logger.error("退款接口返回的reverseId为空,goodsOrderMasterId={}, reverseResult={}", goodsOrderMasterId, reverseResult); + } + } else { + logger.error("退款接口返回异常结果,goodsOrderMasterId={}, reverseResult={}", goodsOrderMasterId, reverseResult); + } + + // 退款失败,恢复财务状态 + logger.error("退款失败,开始恢复财务状态,goodsOrderMasterId={}", goodsOrderMasterId); + financialMaster.setPayStatus(1); // 恢复为已支付状态 + financialMasterService.updateFinancialMaster(financialMaster); + + for (FinancialDetail detail : financialDetails) { + detail.setPayStatus(1); // 恢复为已支付状态 + financialDetailService.updateFinancialDetail(detail); + } + + return AjaxResult.error("退单成功但退款失败,请联系管理员处理"); + } catch (Exception refundException) { + // 退款异常处理 - 改进异常处理和日志记录 + logger.error("退款过程中发生异常,goodsOrderMasterId={}, 异常类型={}, 异常信息={}", + goodsOrderMasterId, refundException.getClass().getSimpleName(), refundException.getMessage(), refundException); + + // 尝试恢复财务状态 + try { + FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(goodsOrderMasterId); + if (financialMaster != null && financialMaster.getPayStatus() == 3) { + financialMaster.setPayStatus(1); // 恢复为已支付状态 + financialMasterService.updateFinancialMaster(financialMaster); + + List financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); + for (FinancialDetail detail : financialDetails) { + if (detail.getPayStatus() == 3) { + detail.setPayStatus(1); // 恢复为已支付状态 + financialDetailService.updateFinancialDetail(detail); + } + } + logger.info("异常情况下成功恢复财务状态,goodsOrderMasterId={}", goodsOrderMasterId); + } + } catch (Exception recoverException) { + logger.error("恢复财务状态时发生异常,goodsOrderMasterId={}, 恢复异常信息={}", + goodsOrderMasterId, recoverException.getMessage(), recoverException); + } + + return AjaxResult.error("退单成功但退款过程中发生异常:" + refundException.getMessage()); + } + + } catch (Exception e) { + logger.error("商品主单退单退款失败:goodsOrderMasterId={}, 错误信息={}", goodsOrderMasterId, e.getMessage(), e); + return AjaxResult.error("商品主单退单退款失败:" + e.getMessage()); + } + } + /** * 师傅审核取消主订单申请 * 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 55bf4b10..9914b90b 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 @@ -33,6 +33,8 @@ public class OrderListResponse { private String orderMasterCode; + private String originalOrderMasterCode; + private Long orderDetailId; private String orderDetailCode; diff --git a/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java b/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java index 8fc26566..8402ede2 100644 --- a/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java +++ b/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java @@ -119,4 +119,12 @@ public interface OrderMasterMapper { int updateCreateTime(Long id); int updateOrderMasterAddressById(OrderMaster orderMaster); + + /** + * 根据商品主单ID查询服务主单 + * + * @param goodsOrderMasterId 商品主单ID + * @return 服务主单 + */ + OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java index 9079aaab..6a5a8d91 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java +++ b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java @@ -204,4 +204,12 @@ public interface OrderMasterService { */ int saveMasterWorkerRemark(Long orderMasterId, String workerRemark); + /** + * 根据商品主单ID查询服务主单 + * + * @param goodsOrderMasterId 商品主单ID + * @return 服务主单 + */ + OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId); + } diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index 04863e6c..7771252d 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -803,4 +803,9 @@ public class OrderMasterServiceImpl implements OrderMasterService { return orderMasterMapper.updateOrderMaster(orderMaster); } + @Override + public OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId) { + return orderMasterMapper.selectByGoodsOrderMasterId(goodsOrderMasterId); + } + } diff --git a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml index a461a7cd..b7588e0a 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml @@ -250,7 +250,7 @@ AND ca.country_id = #{district} - AND (om.has_dispatched_all = 0 OR (om.has_dispatched_all = 1 AND om.all_self_assigned = 0)) AND om.order_status in (0,1,2,3,4) and om.worker_id is not null + AND om.all_self_assigned = 1 AND om.order_status in (0,1,2,3,4) and om.worker_id is not null AND all_self_assigned = #{allSelfAssigned} @@ -399,7 +399,7 @@ LEFT JOIN financial_master fm ON om.id = fm.order_master_id - AND (om.has_dispatched_all = 0 OR (om.has_dispatched_all = 1 AND om.all_self_assigned = 0)) AND om.order_status in (1,2,3,4) + AND om.all_self_assigned = 1 AND om.order_status in (1,2,3,4) AND all_self_assigned = #{allSelfAssigned} @@ -612,7 +612,8 @@ worker_remark, share_account_countdown_end_time, share_account_countdown_duration, - create_time + create_time, + update_time )VALUES( #{deptId}, #{code}, @@ -667,6 +668,7 @@ #{workerRemark}, #{shareAccountCountdownEndTime}, #{shareAccountCountdownDuration}, + SYSDATE(), SYSDATE() ) @@ -780,6 +782,9 @@ WHERE id = #{id} - +