Bladeren bron

修复导出订单金额不一致问题

jinch 1 week geleden
bovenliggende
commit
f9e3f130a5

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

@@ -46,6 +46,9 @@ public class TouristExportVisitorVO {
     @Schema(description = "订单状态")
     private String orderStatus;
 
+    @Schema(description = "订单id")
+    private String orderId;
+
     // ==================== 房间详情 ====================
     @Schema(description = "房间索引ID(用于合并)")
     private String roomIndexId;

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

@@ -110,6 +110,7 @@ import com.yc.ship.module.trade.utils.AgencyAuthUtils;
 import com.yc.ship.module.trade.utils.excel.ExcelStyleHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hpsf.Decimal;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.RegionUtil;
@@ -2749,6 +2750,13 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     }
 
     private File getFile(TradeOrderPageReqVO reqVO,InputStream template, int fileType) {
+        List<Integer> orderStatus = reqVO.getOrderStatus();
+        // 排除状态为 -2 的订单
+        if (orderStatus != null && orderStatus.contains(-2)) {
+            orderStatus.remove(Integer.valueOf(-2));
+            reqVO.setOrderStatus(orderStatus.isEmpty() ? null : orderStatus);
+        }
+
         // 1. 查询订单基础信息(船名、航期、航向)
         Map<String, Object> baseInfo = tradeOrderMapper.selectTouristExportBase(reqVO);
         // 查询订单表头信息
@@ -2887,8 +2895,16 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                             Collectors.toList()
                     ));
 
-            // 按订单号计算 payAmount 总和
+            // 先按 orderId 分组取每个订单的 payAmount(同一订单不重复计算)
+            // 再按 orderNo 分组累加 payAmount
             Map<String, BigDecimal> orderPayAmountMap = visitorList.stream()
+                    .collect(Collectors.toMap(
+                            TouristExportVisitorVO::getOrderId,
+                            v -> v,
+                            (v1, v2) -> v1,  // orderId 相同时保留第一个
+                            LinkedHashMap::new
+                    ))
+                    .values().stream()
                     .collect(Collectors.groupingBy(
                             TouristExportVisitorVO::getOrderNo,
                             LinkedHashMap::new,
@@ -2899,6 +2915,44 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                             )
                     ));
 
+
+            Map<String, BigDecimal> orderAmountMap = visitorList.stream()
+                    .collect(Collectors.toMap(
+                            TouristExportVisitorVO::getOrderId,
+                            v -> v,
+                            (v1, v2) -> v1,  // orderId 相同时保留第一个
+                            LinkedHashMap::new
+                    ))
+                    .values().stream()
+                    .collect(Collectors.groupingBy(
+                            TouristExportVisitorVO::getOrderNo,
+                            LinkedHashMap::new,
+                            Collectors.reducing(
+                                    BigDecimal.ZERO,
+                                    v -> v.getAmount() != null ? v.getAmount() : BigDecimal.ZERO,
+                                    BigDecimal::add
+                            )
+                    ));
+
+            // 定金
+            Map<String, BigDecimal> orderDeposiMap = visitorList.stream()
+                    .collect(Collectors.toMap(
+                            TouristExportVisitorVO::getOrderId,
+                            v -> v,
+                            (v1, v2) -> v1,  // orderId 相同时保留第一个
+                            LinkedHashMap::new
+                    ))
+                    .values().stream()
+                    .collect(Collectors.groupingBy(
+                            TouristExportVisitorVO::getOrderNo,
+                            LinkedHashMap::new,
+                            Collectors.reducing(
+                                    BigDecimal.ZERO,
+                                    v -> v.getDeposi() != null ? v.getDeposi() : BigDecimal.ZERO,
+                                    BigDecimal::add
+                            )
+                    ));
+
             // 房间序号从1开始累加
             int roomIndex = 1;
             for (List<TouristExportVisitorVO> orderVisitors : orderGroupMap.values()) {
@@ -2926,18 +2980,17 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                         item.put("groupNo", StringUtils.isEmpty(visitor.getGroupNo()) ? "" : visitor.getGroupNo()); // 团号
                         item.put("direction", StringUtils.isEmpty(visitor.getDirection()) ? "" : visitor.getDirection()); // 航向(宜昌-重庆/重庆-宜昌)
                         item.put("travelDate", StringUtils.isEmpty(visitor.getTravelDate()) ? "" : visitor.getTravelDate()); // 航期(格式:yyyy.M.d)
-                        item.put("amount", visitor.getAmount() != null ? visitor.getAmount() : BigDecimal.ZERO); // 应收款
+                        item.put("amount", orderAmountMap.getOrDefault(visitor.getOrderNo(), BigDecimal.ZERO)); // 应收款
 
 
                         // 实收款计算逻辑:根据支付状态判断
                         //Integer payStatus = visitor.getPayStatus(); // 支付状态
                         //BigDecimal payAmount = visitor.getPayAmount() != null ? visitor.getPayAmount() : BigDecimal.ZERO; // 实际金额
                         BigDecimal deposi = visitor.getDeposi() != null ? visitor.getDeposi() : BigDecimal.ZERO; // 定金
-                        BigDecimal applyPayAmount  = BigDecimal.ZERO;  // 实际收款
 
                         item.put("payAmount", orderPayAmountMap.getOrDefault(visitor.getOrderNo(), BigDecimal.ZERO)); // 实收款
 
-                        item.put("deposi", deposi); // 定金
+                        item.put("deposi", orderDeposiMap.getOrDefault(visitor.getOrderNo(), BigDecimal.ZERO)); // 定金
 
                         // 房间详情(3列):同一房间的游客合并显示这些列
                         item.put("floor", StringUtils.isEmpty(visitor.getFloor()) ? "" : visitor.getFloor()); // 楼层

+ 1 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeVisitorMapper.xml

@@ -263,6 +263,7 @@
             tv.gender,
             tv.birthday,
             tv.mobile,
+            tv.order_id as orderId,
             tv.credential_type AS credentialType,
             tv.credential_no AS credentialNo,
             tv.type AS visitorType,

BIN
ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_operator.xlsx