From ce2a0d299512f7bf9bc904fe4b4dc0fffe0425a4 Mon Sep 17 00:00:00 2001 From: Timi Date: Wed, 14 Oct 2026 15:53:46 +0800 Subject: [PATCH] revoke fulfillment and payment for cancel sale order --- .../GaoOrderPaymentServiceImplement.java | 6 ++- .../GaoSalesOrderServiceImplement.java | 54 ++++++++++++++++++- .../gao/vo/GaoSalesOrderCancelRequest.java | 8 +++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoOrderPaymentServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoOrderPaymentServiceImplement.java index 70df61c..487d284 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoOrderPaymentServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoOrderPaymentServiceImplement.java @@ -237,8 +237,12 @@ public class GaoOrderPaymentServiceImplement implements GaoOrderPaymentService { TimiException.required(request, "not found fund revoke request"); String requestNo = requiredText(request.getRequestNo(), "not found requestNo"); String reason = requiredText(request.getReason(), "资金冲正原因不能为空"); + GaoFundRecord sourceSnapshot = fundRecordService.detail(request.getFundRecordId()); + TimiException.requiredTrue(sourceSnapshot.getBizType() == GaoFundRecord.BizType.SALES_ORDER, "资金记录不是销售订单资金"); + TimiException.required(sourceSnapshot.getBizId(), "not found salesOrderId"); + GaoSalesOrder order = orderService.getForUpdate(sourceSnapshot.getBizId()); GaoFundRecord source = lockOrderRecord(request.getFundRecordId()); - GaoSalesOrder order = orderService.getForUpdate(source.getBizId()); + TimiException.requiredTrue(order.getId().equals(source.getBizId()), "资金流水所属订单已变化"); GaoFundRecord existing = fundRecordService.getByRequestNo(order.getStoreId(), requestNo); if (existing != null) { TimiException.requiredTrue(existing.getOperationType() == GaoFundRecord.OperationType.REVOKE && source.getId().equals(existing.getSourceRecordId()), "requestNo 已被其他资金操作使用"); diff --git a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java index c726397..566cc88 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/gao/service/implement/GaoSalesOrderServiceImplement.java @@ -9,6 +9,7 @@ import com.imyeyu.api.modules.gao.bean.GaoRoleCode; import com.imyeyu.api.modules.gao.entity.GaoCustomer; import com.imyeyu.api.modules.gao.entity.GaoEventRecord; import com.imyeyu.api.modules.gao.entity.GaoFundRecord; +import com.imyeyu.api.modules.gao.entity.GaoOrderFulfillment; import com.imyeyu.api.modules.gao.entity.GaoProduct; import com.imyeyu.api.modules.gao.entity.GaoProductSku; import com.imyeyu.api.modules.gao.entity.GaoProductSkuUnit; @@ -21,6 +22,7 @@ import com.imyeyu.api.modules.gao.service.GaoCustomerService; import com.imyeyu.api.modules.gao.service.GaoEventRecordService; import com.imyeyu.api.modules.gao.service.GaoFundRecordService; import com.imyeyu.api.modules.gao.service.GaoOrderFulfillmentService; +import com.imyeyu.api.modules.gao.service.GaoOrderPaymentService; import com.imyeyu.api.modules.gao.service.GaoOrderStraightThroughService; import com.imyeyu.api.modules.gao.service.GaoPointTriggerService; import com.imyeyu.api.modules.gao.service.GaoProductService; @@ -35,6 +37,8 @@ import com.imyeyu.api.modules.gao.vo.GaoCustomerProductCustomerView; import com.imyeyu.api.modules.gao.vo.GaoCustomerProductPage; import com.imyeyu.api.modules.gao.vo.GaoCustomerProductSummaryView; import com.imyeyu.api.modules.gao.vo.GaoCustomerProductView; +import com.imyeyu.api.modules.gao.vo.GaoOrderFulfillmentRevokeRequest; +import com.imyeyu.api.modules.gao.vo.GaoOrderPaymentRevokeRequest; import com.imyeyu.api.modules.gao.vo.GaoProductSkuUnitSelection; import com.imyeyu.api.modules.gao.vo.GaoSalesOrderCancelRequest; import com.imyeyu.api.modules.gao.vo.GaoSalesOrderItemRequest; @@ -88,6 +92,7 @@ public class GaoSalesOrderServiceImplement extends AbstractEntityService fulfillmentServiceProvider; + private final ObjectProvider paymentServiceProvider; private final ObjectProvider straightThroughServiceProvider; private final GaoCustomerService customerService; private final GaoProductService productService; @@ -326,7 +331,54 @@ public class GaoSalesOrderServiceImplement extends AbstractEntityService fulfillmentRevokeList = request.getFulfillmentRevokeList(); + Set fulfillmentIdSet = new HashSet<>(); + Set selectedFulfillmentIdSet = new HashSet<>(); + if (fulfillmentRevokeList != null && !fulfillmentRevokeList.isEmpty()) { + TimiException.requiredTrue(permissionChecker.hasAny(ModuleCode.GAO, GaoPermissionCode.ORDER_FULFILLMENT_REVOKE.getValue()), "缺少履约冲正权限"); + for (GaoOrderFulfillment fulfillment : fulfillmentService.listBySalesOrderId(order.getId())) { + fulfillmentIdSet.add(fulfillment.getId()); + } + for (GaoOrderFulfillmentRevokeRequest revokeRequest : fulfillmentRevokeList) { + TimiException.required(revokeRequest, "履约冲正请求不能为空"); + TimiException.required(revokeRequest.getFulfillmentId(), "not found fulfillmentId"); + TimiException.requiredTrue(fulfillmentIdSet.contains(revokeRequest.getFulfillmentId()), "履约单不属于当前订单"); + TimiException.requiredTrue(selectedFulfillmentIdSet.add(revokeRequest.getFulfillmentId()), "履约单不能重复冲正"); + } + } + + List fundRevokeList = request.getFundRevokeList(); + Set fundRecordIdSet = new HashSet<>(); + Set selectedFundRecordIdSet = new HashSet<>(); + if (fundRevokeList != null && !fundRevokeList.isEmpty()) { + TimiException.requiredTrue(permissionChecker.hasAny(ModuleCode.GAO, GaoPermissionCode.FUND_REVOKE.getValue()), "缺少资金流水冲正权限"); + for (GaoFundRecord fundRecord : fundRecordService.listByBizId(order.getId())) { + fundRecordIdSet.add(fundRecord.getId()); + } + for (GaoOrderPaymentRevokeRequest revokeRequest : fundRevokeList) { + TimiException.required(revokeRequest, "资金冲正请求不能为空"); + TimiException.required(revokeRequest.getFundRecordId(), "not found fundRecordId"); + TimiException.requiredTrue(fundRecordIdSet.contains(revokeRequest.getFundRecordId()), "资金流水不属于当前订单"); + TimiException.requiredTrue(selectedFundRecordIdSet.add(revokeRequest.getFundRecordId()), "资金流水不能重复冲正"); + } + } + + if (fulfillmentRevokeList != null) { + for (GaoOrderFulfillmentRevokeRequest revokeRequest : fulfillmentRevokeList) { + fulfillmentService.revoke(revokeRequest); + } + } + if (fundRevokeList != null && !fundRevokeList.isEmpty()) { + GaoOrderPaymentService paymentService = paymentServiceProvider.getObject(); + for (GaoOrderPaymentRevokeRequest revokeRequest : fundRevokeList) { + paymentService.revoke(revokeRequest); + } + } + + order = getForUpdate(order.getId()); String userId = userLoginService.getRequireLoginUserId(); GaoSalesOrder.RefundStatus refundStatus = safe(order.getPaidAmount()) == 0 ? GaoSalesOrder.RefundStatus.REFUNDED : GaoSalesOrder.RefundStatus.PENDING; Long cancelledAt = Time.now(); diff --git a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoSalesOrderCancelRequest.java b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoSalesOrderCancelRequest.java index 73110d6..e1f02f3 100644 --- a/src/main/java/com/imyeyu/api/modules/gao/vo/GaoSalesOrderCancelRequest.java +++ b/src/main/java/com/imyeyu/api/modules/gao/vo/GaoSalesOrderCancelRequest.java @@ -2,6 +2,8 @@ package com.imyeyu.api.modules.gao.vo; import lombok.Data; +import java.util.List; + /// GAO 销售订单取消请求 /// /// @author Codex @@ -17,4 +19,10 @@ public class GaoSalesOrderCancelRequest { /// 幂等请求号 private String requestNo; + + /// 取消时冲正的已核销履约单,按整张履约单冲正 + private List fulfillmentRevokeList; + + /// 取消时冲正的资金流水,按整条流水冲正 + private List fundRevokeList; }