Procházet zdrojové kódy

合并订单金额功能,手动改金额

ZHOUTD před 2 týdny
rodič
revize
d42689fb71

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

@@ -6,6 +6,8 @@ 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")
@@ -20,4 +22,14 @@ public class MergeOrderAmountReqVO {
     @Schema(description = "接收合并金额的订单 ID", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotNull(message = "目标订单不能为空")
     private Long targetOrderId;
+
+    @Schema(description = "合并后的订单金额", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "合并后的订单金额不能为空")
+    @DecimalMin(value = "0.00", message = "合并后的订单金额不能小于 0")
+    private BigDecimal mergedOrderAmount;
+
+    @Schema(description = "合并后的实际金额", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "合并后的实际金额不能为空")
+    @DecimalMin(value = "0.00", message = "合并后的实际金额不能小于 0")
+    private BigDecimal mergedPayAmount;
 }

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

@@ -4591,23 +4591,14 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 .map(TradeOrderDO::getPayAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal mergedOrderMoney = orderTotals.stream()
-                .map(TradeOrderTotalDO::getOrderMoney)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal mergedRealMoney = orderTotals.stream()
-                .map(TradeOrderTotalDO::getRealMoney)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal runningAmount = ObjectUtil.defaultIfNull(targetOrder.getPayAmount(), BigDecimal.ZERO);
+        List<TradeOrderDO> sourceOrders = new ArrayList<>();
 
         for (Long sourceOrderId : orderIdSet) {
             if (Objects.equals(sourceOrderId, targetOrder.getId())) {
                 continue;
             }
             TradeOrderDO sourceOrder = orderMap.get(sourceOrderId);
-            BigDecimal sourceAmount = ObjectUtil.defaultIfNull(sourceOrder.getPayAmount(), BigDecimal.ZERO);
-            runningAmount = runningAmount.add(sourceAmount);
+            sourceOrders.add(sourceOrder);
 
             TradeOrderDO sourceUpdate = new TradeOrderDO();
             sourceUpdate.setId(sourceOrder.getId());
@@ -4621,46 +4612,89 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             sourceTotalUpdate.setRealMoney(BigDecimal.ZERO);
             tradeOrderTotalMapper.updateById(sourceTotalUpdate);
 
-            insertMergeOrderLog(loginUser, targetOrder, sourceOrder, sourceAmount, runningAmount, true);
-            insertMergeOrderLog(loginUser, sourceOrder, targetOrder, sourceAmount, BigDecimal.ZERO, false);
+            insertSourceMergeOrderLog(loginUser, sourceOrder, targetOrder);
         }
 
         TradeOrderDO targetUpdate = new TradeOrderDO();
         targetUpdate.setId(targetOrder.getId());
-        targetUpdate.setAmount(mergedAmount);
-        targetUpdate.setPayAmount(mergedPayAmount);
+        targetUpdate.setAmount(reqVO.getMergedOrderAmount());
+        targetUpdate.setPayAmount(reqVO.getMergedPayAmount());
         tradeOrderMapper.updateById(targetUpdate);
 
         TradeOrderTotalDO targetTotalUpdate = new TradeOrderTotalDO();
         targetTotalUpdate.setId(orderTotalMap.get(targetOrder.getId()).getId());
-        targetTotalUpdate.setOrderMoney(mergedOrderMoney);
-        targetTotalUpdate.setRealMoney(mergedRealMoney);
+        targetTotalUpdate.setOrderMoney(reqVO.getMergedOrderAmount());
+        targetTotalUpdate.setRealMoney(reqVO.getMergedPayAmount());
         tradeOrderTotalMapper.updateById(targetTotalUpdate);
+
+        insertTargetMergeOrderLog(loginUser, targetOrder, sourceOrders, mergedAmount, mergedPayAmount,
+                reqVO.getMergedOrderAmount(), reqVO.getMergedPayAmount());
     }
 
-    private void insertMergeOrderLog(LoginUser loginUser, TradeOrderDO logOrder, TradeOrderDO relatedOrder,
-                                     BigDecimal amount, BigDecimal newAmount, boolean targetLog) {
+    private void insertSourceMergeOrderLog(LoginUser loginUser, TradeOrderDO sourceOrder,
+                                           TradeOrderDO targetOrder) {
         TradeOrderLogDO logDO = new TradeOrderLogDO();
         logDO.setId(IdWorker.getId());
-        logDO.setOrderId(logOrder.getId());
+        logDO.setOrderId(sourceOrder.getId());
         logDO.setUserId(loginUser.getId());
         logDO.setUserType(loginUser.getUserType());
-        logDO.setBeforeStatus(logOrder.getOrderStatus());
-        logDO.setAfterStatus(logOrder.getOrderStatus());
+        logDO.setBeforeStatus(sourceOrder.getOrderStatus());
+        logDO.setAfterStatus(sourceOrder.getOrderStatus());
         logDO.setOperateType(TradeOrderOperateTypeEnum.ORDER_MERGE.getType());
-        if (targetLog) {
-            logDO.setContent(StrUtil.format(TradeOrderOperateTypeEnum.ORDER_MERGE.getContent(),
-                    MapUtil.<String, Object>builder()
-                            .put("orderId", relatedOrder.getOrderNo())
-                            .put("payAmount", amount)
-                            .put("newPayAmount", newAmount)
-                            .build()));
-        } else {
-            logDO.setContent("订单金额" + amount + "已合并至订单" + relatedOrder.getOrderNo() + ",合并后为" + newAmount);
-        }
+        logDO.setContent("金额已合并至订单" + targetOrder.getOrderNo()
+                + ";合并前订单金额:" + defaultMoney(sourceOrder.getAmount())
+                + ",实际金额:" + defaultMoney(sourceOrder.getPayAmount())
+                + ";合并后订单金额:0,实际金额:0");
         tradeOrderLogMapper.insert(logDO);
     }
 
+    private void insertTargetMergeOrderLog(LoginUser loginUser, TradeOrderDO targetOrder,
+                                           List<TradeOrderDO> sourceOrders,
+                                           BigDecimal originalOrderAmount, BigDecimal originalPayAmount,
+                                           BigDecimal mergedOrderAmount, BigDecimal mergedPayAmount) {
+        TradeOrderLogDO logDO = new TradeOrderLogDO();
+        logDO.setId(IdWorker.getId());
+        logDO.setOrderId(targetOrder.getId());
+        logDO.setUserId(loginUser.getId());
+        logDO.setUserType(loginUser.getUserType());
+        logDO.setBeforeStatus(targetOrder.getOrderStatus());
+        logDO.setAfterStatus(targetOrder.getOrderStatus());
+        logDO.setOperateType(TradeOrderOperateTypeEnum.ORDER_MERGE.getType());
+        String sourceOrderDetails = sourceOrders.stream()
+                .map(order -> order.getOrderNo()
+                        + "(订单金额:" + defaultMoney(order.getAmount())
+                        + ",实际金额:" + defaultMoney(order.getPayAmount()) + ")")
+                .collect(Collectors.joining("、"));
+        StringBuilder content = new StringBuilder("合并订单金额")
+                .append(";目标订单合并前订单金额:").append(defaultMoney(targetOrder.getAmount()))
+                .append(",实际金额:").append(defaultMoney(targetOrder.getPayAmount()))
+                .append(";来源订单:").append(sourceOrderDetails)
+                .append(";合并总订单金额:").append(originalOrderAmount)
+                .append(",合并总实际金额:").append(originalPayAmount)
+                .append(";合并后订单金额:").append(mergedOrderAmount)
+                .append(",实际金额:").append(mergedPayAmount);
+        if (originalOrderAmount.compareTo(mergedOrderAmount) != 0
+                || originalPayAmount.compareTo(mergedPayAmount) != 0) {
+            content.append(";手动修改:");
+            if (originalOrderAmount.compareTo(mergedOrderAmount) != 0) {
+                content.append("订单金额由").append(originalOrderAmount).append("调整为").append(mergedOrderAmount);
+            }
+            if (originalOrderAmount.compareTo(mergedOrderAmount) != 0
+                    && originalPayAmount.compareTo(mergedPayAmount) != 0) {
+                content.append(",");
+            }
+            if (originalPayAmount.compareTo(mergedPayAmount) != 0) {
+                content.append("实际金额由").append(originalPayAmount).append("调整为").append(mergedPayAmount);
+            }
+        }
+        logDO.setContent(content.toString());
+        tradeOrderLogMapper.insert(logDO);
+    }
+
+    private BigDecimal defaultMoney(BigDecimal amount) {
+        return ObjectUtil.defaultIfNull(amount, BigDecimal.ZERO);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.HAND_ORDER_REFUND)