فهرست منبع

合并订单金额功能兼容选择单个订单则修改订单金额

ZHOUTD 1 هفته پیش
والد
کامیت
0bb6bb9d8d

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/OtcTradeOrderController.java

@@ -170,7 +170,7 @@ public class OtcTradeOrderController {
     }
 
     @PostMapping("/window/merge-order-amount")
-    @Operation(summary = "合并已选订单金额")
+    @Operation(summary = "合并或手动修改已选订单金额")
     @OperateLog(type = TRADE)
     @PreAuthorize("@ss.hasPermission('trade:order:merge-amount')")
     public CommonResult<Boolean> mergeOrderAmount(@Valid @RequestBody MergeOrderAmountReqVO reqVO) {

+ 1 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/MergeOrderAmountReqVO.java

@@ -5,18 +5,16 @@ import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.validation.constraints.DecimalMin;
 import java.math.BigDecimal;
 import java.util.List;
 
-@Schema(description = "管理后台 - 合并订单金额 Request VO")
+@Schema(description = "管理后台 - 合并或手动修改订单金额 Request VO")
 @Data
 public class MergeOrderAmountReqVO {
 
     @Schema(description = "选中的订单 ID", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotEmpty(message = "订单不能为空")
-    @Size(min = 2, message = "至少选择两个订单")
     private List<@NotNull(message = "订单 ID 不能为空") Long> orderIds;
 
     @Schema(description = "接收合并金额的订单 ID", requiredMode = Schema.RequiredMode.REQUIRED)

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/OtcTradeOrderService.java

@@ -124,7 +124,7 @@ public interface OtcTradeOrderService {
     CommonResult<?> motifyOtcOrder(LoginUser agencyLoginUser, TradeOrderOtcCreateVO createVO);
 
     /**
-     * 将多个订单的实际金额合并到指定订单。
+     * 将多个订单的金额合并到指定订单,或手动修改单个订单金额
      */
     void mergeOrderAmount(LoginUser loginUser, MergeOrderAmountReqVO reqVO);
 

+ 56 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -4569,6 +4569,14 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Transactional(rollbackFor = Exception.class)
     public void mergeOrderAmount(LoginUser loginUser, MergeOrderAmountReqVO reqVO) {
         LinkedHashSet<Long> orderIdSet = new LinkedHashSet<>(reqVO.getOrderIds());
+        Asserts.isTrue(!orderIdSet.isEmpty(), MERGE_ORDER_AMOUNT_ERROR + "请选择订单");
+        if (orderIdSet.size() == 1) {
+            Long orderId = orderIdSet.iterator().next();
+            Asserts.isTrue(Objects.equals(orderId, reqVO.getTargetOrderId()),
+                    MERGE_ORDER_AMOUNT_ERROR + "目标订单必须为已选订单");
+            updateSingleOrderAmount(loginUser, orderId, reqVO);
+            return;
+        }
         Asserts.isTrue(orderIdSet.size() >= 2, MERGE_ORDER_AMOUNT_ERROR + "至少选择两个不同的订单");
         Asserts.isTrue(orderIdSet.contains(reqVO.getTargetOrderId()),
                 MERGE_ORDER_AMOUNT_ERROR + "目标订单必须在已选订单中");
@@ -4657,6 +4665,54 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 reqVO.getMergedOrderAmount(), reqVO.getMergedPayAmount());
     }
 
+    private void updateSingleOrderAmount(LoginUser loginUser, Long orderId, MergeOrderAmountReqVO reqVO) {
+        TradeOrderDO order = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getId, orderId)
+                .last("FOR UPDATE"));
+        Asserts.isTrue(order != null, MERGE_ORDER_AMOUNT_ERROR + "订单不存在或无权操作");
+        Asserts.isTrue(order.getOrderStatus() != null && order.getOrderStatus() >= 0,
+                MERGE_ORDER_AMOUNT_ERROR + "只允许修改订单状态大于等于 0 的订单");
+        Asserts.isTrue(Objects.equals(order.getPayStatus(), 0),
+                MERGE_ORDER_AMOUNT_ERROR + "只允许修改未支付订单");
+
+        TradeOrderTotalDO orderTotal = tradeOrderTotalMapper.selectOne(
+                new LambdaQueryWrapper<TradeOrderTotalDO>()
+                        .eq(TradeOrderTotalDO::getOldOrderId, orderId)
+                        .last("FOR UPDATE"));
+        Asserts.isTrue(orderTotal != null, MERGE_ORDER_AMOUNT_ERROR + "订单汇总信息不存在");
+
+        TradeOrderDO orderUpdate = new TradeOrderDO();
+        orderUpdate.setId(order.getId());
+        orderUpdate.setAmount(reqVO.getMergedOrderAmount());
+        orderUpdate.setPayAmount(reqVO.getMergedPayAmount());
+        tradeOrderMapper.updateById(orderUpdate);
+
+        TradeOrderTotalDO totalUpdate = new TradeOrderTotalDO();
+        totalUpdate.setId(orderTotal.getId());
+        totalUpdate.setOrderMoney(reqVO.getMergedOrderAmount());
+        totalUpdate.setRealMoney(reqVO.getMergedPayAmount());
+        tradeOrderTotalMapper.updateById(totalUpdate);
+
+        insertManualOrderAmountUpdateLog(loginUser, order, reqVO);
+    }
+
+    private void insertManualOrderAmountUpdateLog(LoginUser loginUser, TradeOrderDO order,
+                                                  MergeOrderAmountReqVO reqVO) {
+        TradeOrderLogDO logDO = new TradeOrderLogDO();
+        logDO.setId(IdWorker.getId());
+        logDO.setOrderId(order.getId());
+        logDO.setUserId(loginUser.getId());
+        logDO.setUserType(loginUser.getUserType());
+        logDO.setBeforeStatus(order.getOrderStatus());
+        logDO.setAfterStatus(order.getOrderStatus());
+        logDO.setOperateType(TradeOrderOperateTypeEnum.UPDATE_ORDER_INFO.getType());
+        logDO.setContent("手动修改订单金额;修改前订单金额:" + defaultMoney(order.getAmount())
+                + ",实际金额:" + defaultMoney(order.getPayAmount())
+                + ";修改后订单金额:" + reqVO.getMergedOrderAmount()
+                + ",实际金额:" + reqVO.getMergedPayAmount());
+        tradeOrderLogMapper.insert(logDO);
+    }
+
     private void insertSourceMergeOrderLog(LoginUser loginUser, TradeOrderDO sourceOrder,
                                            TradeOrderDO targetOrder) {
         TradeOrderLogDO logDO = new TradeOrderLogDO();