Jelajahi Sumber

订单余量计算优化

donglang 1 bulan lalu
induk
melakukan
711f6ad3b1

+ 12 - 28
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -273,8 +273,6 @@ public class WaybillOrderService {
         }
         Map<Long, List<KwtWaybillOrderSubtask>> logOrderIdAndSubtaskMap = orderSubtaskList.stream()
                 .collect(Collectors.groupingBy(KwtWaybillOrderSubtask::getLOrderId));
-        // 预加载运单磅单信息,避免在余量计算中出现 N+1 查询
-        Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList = getWaybillOrderIdAndTicketList(orderSubtaskList);
 
         //获取贸易订单
         List<OrderDetailVo> orderDetailVos = tradeOrderInfoService.queryByTradeOrderIds(tradeOrderIds);
@@ -294,7 +292,7 @@ public class WaybillOrderService {
                 .map(order -> {
                     return getLogisticsOrderResp(order, logOrderIdAndGoodsMap, goodsIdAndGoodsMap, logOrderIdAndUnitMap,
                             tOrderIdAndUnitMap, logOrderIdAndAddressMap, logOrderIdAndCirculateMap, tradeIdAndOrderDetailVoMap,
-                            tradeIdAndLogOrderList, logOrderIdAndSubtaskMap, waybillOrderIdAndTicketList, dictValueAndDictResDtoMap);
+                            tradeIdAndLogOrderList, logOrderIdAndSubtaskMap, dictValueAndDictResDtoMap);
                 })
                 .filter(logisticsOrderResp -> {
                     // 校验是否满足车辆任务量,满足才保留
@@ -406,7 +404,6 @@ public class WaybillOrderService {
                                                      Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
                                                      Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList ,
                                                      Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList,
-                                                     Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList,
                                                      Map<String, Map<String, String>> dictValueAndDictResDtoMap) {
         LogisticsOrderResp orderResp = new LogisticsOrderResp();
         orderResp.setLogisticsOrderId(Optional.ofNullable(order.getId()).map(String::valueOf).orElse(null));
@@ -457,7 +454,7 @@ public class WaybillOrderService {
         orderResp.setStatusDesc(LogisticsOrderV1Enum.IN_TRANSIT.getCode().equals(order.getStatus()) ? "待接单" : "未知状态");
         //设置余量
         BigDecimal orderSurplus = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
-                logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
+                logisticsOrderIdAndSubtaskList);
         orderResp.setOrderSurplus(orderSurplus.toPlainString());
         orderResp.setRemainingAmount(orderSurplus);
 
@@ -762,8 +759,7 @@ public class WaybillOrderService {
                 .collect(Collectors.groupingBy(KwtLogisticsOrder::getTOrderId));
         Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList = orderSubtaskList.stream()
                 .collect(Collectors.groupingBy(KwtWaybillOrderSubtask::getLOrderId));
-        // 预加载运单磅单信息,避免在余量计算中出现 N+1 查询
-        Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList = getWaybillOrderIdAndTicketList(orderSubtaskList);
+
         //物流订单商品
         List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
         if (CollectionUtils.isEmpty(logOrderGoods)) {
@@ -814,7 +810,7 @@ public class WaybillOrderService {
                     return getWaybillOrderResp(billOrder, subtaskMap, logOrderMap, logOrderIdAndCirculateMap,
                             logOrderIdAndGoodsMap, logOrderIdAndUnitMap, logOrderIdAndAddressMap, ticketMap,
                             tradeIdAndOrderDetailVoMap,tradeIdAndLogOrderList,logisticsOrderIdAndSubtaskList,
-                            waybillOrderIdAndTicketList,dictValueAndDictResDtoMap, goodsIdAndGoodsMap);
+                            dictValueAndDictResDtoMap, goodsIdAndGoodsMap);
                 }).collect(Collectors.toList());
         return ordderList;
     }
@@ -838,7 +834,6 @@ public class WaybillOrderService {
                                                        Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
                                                        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList ,
                                                        Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList,
-                                                       Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList,
                                                        Map<String, Map<String, String>> dictValueAndDictResDtoMap,
                                                        Map<Long, KwpGoods> goodsIdAndGoodsMap) {
         WaybillOrderStatusResp wbOrderResp = new WaybillOrderStatusResp();
@@ -859,7 +854,7 @@ public class WaybillOrderService {
         //设置余量
         KwtLogisticsOrder order = logOrderMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrder());
         BigDecimal supAmount = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
-                logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
+                logisticsOrderIdAndSubtaskList);
         wbOrderResp.setOrderSurplus(supAmount);
         //托运企业
         KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(wbOrder.getLOrderId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
@@ -948,8 +943,7 @@ public class WaybillOrderService {
     private BigDecimal getSupAmount(Long tradeOrderId,
                                     Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
                                     Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList,
-                                    Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList,
-                                    Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList) {
+                                    Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList) {
         log.debug("开始计算贸易订单余量,tradeOrderId: {}", tradeOrderId);
 
         // 1. 获取贸易订单总货物量
@@ -982,7 +976,7 @@ public class WaybillOrderService {
                 List<Integer> excludeStatusList = Arrays.asList(CarWaybillV1Enum.CANCELLED.getCode(), CarWaybillV1Enum.COMPLETED.getCode()
                         , CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode());
 
-                // 4. 计算子运单委托量合计(仅统计未取消/未完成的有效子运单)
+                // 4. 计算子运单委托量合计(仅统计未取消/未完成/空载的有效子运单)
                 BigDecimal entrustAmount = waybillOrderSubtasks.stream()
                         .filter(Objects::nonNull)
                         .filter(subtask -> !excludeStatusList.contains(subtask.getStatus()))
@@ -992,26 +986,16 @@ public class WaybillOrderService {
                 
                 log.debug("物流订单[{}]子运单委托量合计: {}", logOrderId, entrustAmount);
 
-                // 5. 计算磅单量合计
-                // 逻辑:通过子运单找到关联的运单ID,再找到对应的磅单,过滤出指定类型(装/卸)的磅单量
-                BigDecimal ticketAmount = waybillOrderSubtasks.stream()
-                        .filter(Objects::nonNull)
-                        .filter(subtask -> !Objects.equals(subtask.getStatus(), CarWaybillV1Enum.CANCELLED.getCode()))
-                        .map(KwtWaybillOrderSubtask::getWOrderId)
-                        .filter(Objects::nonNull)
-                        // 展开每个运单ID对应的磅单列表
-                        .flatMap(wOrderId -> waybillOrderIdAndTicketList.getOrDefault(wOrderId, Collections.emptyList()).stream())
-                        .filter(Objects::nonNull)
-                        // 只保留符合计费模式的磅单类型
-                        .filter(ticket -> Objects.equals(ticket.getType(),  AddressTypeEnum.SHIPMENT.getCode()))
-                        .map(KwtWaybillOrderTicket::getAmount)
+                // 5. 计算运单已完成的合计量
+                BigDecimal totalLoadAmount = kwtLogisticsOrders.stream().filter(Objects::nonNull)
+                        .map(KwtLogisticsOrder::getTotalLoadAmount)
                         .filter(Objects::nonNull)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
 
-                log.debug("物流订单[{}]进行中状态的实际装货量合计: {}", logOrderId, ticketAmount);
+                log.debug("物流订单[{}]有完成的运单实际装货量合计: {}", logOrderId, totalLoadAmount);
 
                 // 累加到总占用量
-                usedAmount = usedAmount.add(entrustAmount).add(ticketAmount);
+                usedAmount = usedAmount.add(entrustAmount).add(totalLoadAmount);
             }
         }