revoke fulfillment and payment for cancel sale order

This commit is contained in:
Timi
2026-10-14 15:53:46 +08:00
parent f0b001dba9
commit ce2a0d2995
3 changed files with 66 additions and 2 deletions
@@ -237,8 +237,12 @@ public class GaoOrderPaymentServiceImplement implements GaoOrderPaymentService {
TimiException.required(request, "not found fund revoke request"); TimiException.required(request, "not found fund revoke request");
String requestNo = requiredText(request.getRequestNo(), "not found requestNo"); String requestNo = requiredText(request.getRequestNo(), "not found requestNo");
String reason = requiredText(request.getReason(), "资金冲正原因不能为空"); 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()); 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); GaoFundRecord existing = fundRecordService.getByRequestNo(order.getStoreId(), requestNo);
if (existing != null) { if (existing != null) {
TimiException.requiredTrue(existing.getOperationType() == GaoFundRecord.OperationType.REVOKE && source.getId().equals(existing.getSourceRecordId()), "requestNo 已被其他资金操作使用"); TimiException.requiredTrue(existing.getOperationType() == GaoFundRecord.OperationType.REVOKE && source.getId().equals(existing.getSourceRecordId()), "requestNo 已被其他资金操作使用");
@@ -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.GaoCustomer;
import com.imyeyu.api.modules.gao.entity.GaoEventRecord; import com.imyeyu.api.modules.gao.entity.GaoEventRecord;
import com.imyeyu.api.modules.gao.entity.GaoFundRecord; 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.GaoProduct;
import com.imyeyu.api.modules.gao.entity.GaoProductSku; import com.imyeyu.api.modules.gao.entity.GaoProductSku;
import com.imyeyu.api.modules.gao.entity.GaoProductSkuUnit; 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.GaoEventRecordService;
import com.imyeyu.api.modules.gao.service.GaoFundRecordService; import com.imyeyu.api.modules.gao.service.GaoFundRecordService;
import com.imyeyu.api.modules.gao.service.GaoOrderFulfillmentService; 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.GaoOrderStraightThroughService;
import com.imyeyu.api.modules.gao.service.GaoPointTriggerService; import com.imyeyu.api.modules.gao.service.GaoPointTriggerService;
import com.imyeyu.api.modules.gao.service.GaoProductService; 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.GaoCustomerProductPage;
import com.imyeyu.api.modules.gao.vo.GaoCustomerProductSummaryView; import com.imyeyu.api.modules.gao.vo.GaoCustomerProductSummaryView;
import com.imyeyu.api.modules.gao.vo.GaoCustomerProductView; 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.GaoProductSkuUnitSelection;
import com.imyeyu.api.modules.gao.vo.GaoSalesOrderCancelRequest; import com.imyeyu.api.modules.gao.vo.GaoSalesOrderCancelRequest;
import com.imyeyu.api.modules.gao.vo.GaoSalesOrderItemRequest; import com.imyeyu.api.modules.gao.vo.GaoSalesOrderItemRequest;
@@ -88,6 +92,7 @@ public class GaoSalesOrderServiceImplement extends AbstractEntityService<GaoSale
private final GaoSalesOrderItemMapper itemMapper; private final GaoSalesOrderItemMapper itemMapper;
private final GaoFundRecordService fundRecordService; private final GaoFundRecordService fundRecordService;
private final ObjectProvider<GaoOrderFulfillmentService> fulfillmentServiceProvider; private final ObjectProvider<GaoOrderFulfillmentService> fulfillmentServiceProvider;
private final ObjectProvider<GaoOrderPaymentService> paymentServiceProvider;
private final ObjectProvider<GaoOrderStraightThroughService> straightThroughServiceProvider; private final ObjectProvider<GaoOrderStraightThroughService> straightThroughServiceProvider;
private final GaoCustomerService customerService; private final GaoCustomerService customerService;
private final GaoProductService productService; private final GaoProductService productService;
@@ -326,7 +331,54 @@ public class GaoSalesOrderServiceImplement extends AbstractEntityService<GaoSale
} }
TimiException.requiredTrue(order.getStatus() == GaoSalesOrder.Status.ACTIVE, "当前订单不可取消"); TimiException.requiredTrue(order.getStatus() == GaoSalesOrder.Status.ACTIVE, "当前订单不可取消");
TimiException.requiredTrue(fundRecordService.countPendingReceiveByBizId(order.getId()) == 0, "订单存在待核销收款,不能取消"); TimiException.requiredTrue(fundRecordService.countPendingReceiveByBizId(order.getId()) == 0, "订单存在待核销收款,不能取消");
TimiException.requiredTrue(fulfillmentServiceProvider.getObject().countPendingBySalesOrderId(order.getId()) == 0, "订单存在待履约操作,不能取消"); GaoOrderFulfillmentService fulfillmentService = fulfillmentServiceProvider.getObject();
TimiException.requiredTrue(fulfillmentService.countPendingBySalesOrderId(order.getId()) == 0, "订单存在待履约操作,不能取消");
List<GaoOrderFulfillmentRevokeRequest> fulfillmentRevokeList = request.getFulfillmentRevokeList();
Set<String> fulfillmentIdSet = new HashSet<>();
Set<String> 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<GaoOrderPaymentRevokeRequest> fundRevokeList = request.getFundRevokeList();
Set<String> fundRecordIdSet = new HashSet<>();
Set<String> 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(); String userId = userLoginService.getRequireLoginUserId();
GaoSalesOrder.RefundStatus refundStatus = safe(order.getPaidAmount()) == 0 ? GaoSalesOrder.RefundStatus.REFUNDED : GaoSalesOrder.RefundStatus.PENDING; GaoSalesOrder.RefundStatus refundStatus = safe(order.getPaidAmount()) == 0 ? GaoSalesOrder.RefundStatus.REFUNDED : GaoSalesOrder.RefundStatus.PENDING;
Long cancelledAt = Time.now(); Long cancelledAt = Time.now();
@@ -2,6 +2,8 @@ package com.imyeyu.api.modules.gao.vo;
import lombok.Data; import lombok.Data;
import java.util.List;
/// GAO 销售订单取消请求 /// GAO 销售订单取消请求
/// ///
/// @author Codex /// @author Codex
@@ -17,4 +19,10 @@ public class GaoSalesOrderCancelRequest {
/// 幂等请求号 /// 幂等请求号
private String requestNo; private String requestNo;
/// 取消时冲正的已核销履约单,按整张履约单冲正
private List<GaoOrderFulfillmentRevokeRequest> fulfillmentRevokeList;
/// 取消时冲正的资金流水,按整条流水冲正
private List<GaoOrderPaymentRevokeRequest> fundRevokeList;
} }