chenxiaofei 3 тижнів тому
батько
коміт
4328e75251

+ 99 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -3234,6 +3234,12 @@ public class KwtLogisticsConsignmentService {
             // logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + kwtLogisticsOrder.getUnit());
             // logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + kwtLogisticsOrder.getUnit());
             logisticsOrderResp.setUnloadAmount(unloadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() +"吨");
             logisticsOrderResp.setUnloadAmount(unloadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() +"吨");
             logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() +"吨");
             logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() +"吨");
+
+            //设置余量
+            BigDecimal orderSurplus = getRaworeSupAmount(kwtLogisticsOrder, tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
+                    logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
+            logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + "吨");
+            logisticsOrderResp.setRemainingAmount(orderSurplus);
         }else {
         }else {
             log.info("订单类型不为1,普通订单");
             log.info("订单类型不为1,普通订单");
             if (org.apache.commons.lang3.StringUtils.equals(kwtLogisticsOrder.getBillingMode(),
             if (org.apache.commons.lang3.StringUtils.equals(kwtLogisticsOrder.getBillingMode(),
@@ -3263,6 +3269,11 @@ public class KwtLogisticsConsignmentService {
                 //logisticsOrderResp.setActualTransportPrice(transportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
                 //logisticsOrderResp.setActualTransportPrice(transportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
             }
             }
             logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + kwtLogisticsOrder.getUnit());
             logisticsOrderResp.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + kwtLogisticsOrder.getUnit());
+            //设置余量
+            BigDecimal orderSurplus = getSupAmount(kwtLogisticsOrder.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
+                    logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
+            logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + kwtLogisticsOrder.getUnit());
+            logisticsOrderResp.setRemainingAmount(orderSurplus);
         }
         }
         logisticsOrderResp.setActualTransportPrice(transportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
         logisticsOrderResp.setActualTransportPrice(transportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
 //        logisticsOrderResp.setActualTransportPrice(actualTransportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
 //        logisticsOrderResp.setActualTransportPrice(actualTransportPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() + priceUnit);
@@ -3287,11 +3298,7 @@ public class KwtLogisticsConsignmentService {
         logisticsOrderResp.setCreateTime(DateUtils.format(kwtLogisticsOrder.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
         logisticsOrderResp.setCreateTime(DateUtils.format(kwtLogisticsOrder.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
         logisticsOrderResp.setStatus(String.valueOf(kwtLogisticsOrder.getStatus()));
         logisticsOrderResp.setStatus(String.valueOf(kwtLogisticsOrder.getStatus()));
         logisticsOrderResp.setStatusDesc(LogisticsOrderV1Enum.getDesc(kwtLogisticsOrder.getStatus()));
         logisticsOrderResp.setStatusDesc(LogisticsOrderV1Enum.getDesc(kwtLogisticsOrder.getStatus()));
-        //设置余量
-        BigDecimal orderSurplus = getSupAmount(kwtLogisticsOrder.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
-                logisticsOrderIdAndSubtaskList, waybillOrderIdAndTicketList);
-        logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + kwtLogisticsOrder.getUnit());
-        logisticsOrderResp.setRemainingAmount(orderSurplus);
+
         return logisticsOrderResp;
         return logisticsOrderResp;
     }
     }
 
 
@@ -3402,6 +3409,93 @@ public class KwtLogisticsConsignmentService {
         return surplus.setScale(2, RoundingMode.HALF_UP);
         return surplus.setScale(2, RoundingMode.HALF_UP);
     }
     }
 
 
+    private static BigDecimal getRaworeSupAmount(KwtLogisticsOrder kwtLogisticsOrder,
+                                           Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
+                                           Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList,
+                                           Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList,
+                                           Map<Long, List<KwtWaybillOrderTicket>> waybillOrderIdAndTicketList) {
+        log.debug("开始计算原矿订单余量,物流订单号: {}", kwtLogisticsOrder.getLOrderNo());
+
+        // 1. 获取贸易订单基础信息及总货物量
+        BigDecimal tradeAmount = Optional.ofNullable(kwtLogisticsOrder).map(KwtLogisticsOrder::getAmount).orElse(BigDecimal.ZERO);
+        log.debug("贸易订单总货物量: {}", tradeAmount);
+
+        // 2. 获取该贸易订单关联的所有物流订单
+        BigDecimal usedAmount = BigDecimal.ZERO;
+
+        if (Objects.nonNull(kwtLogisticsOrder)) {
+            log.debug("开始获取该贸易订单关联的所有物流订单");
+            Long logOrderId = kwtLogisticsOrder.getId();
+            // 获取当前物流订单下的所有子运单
+            List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderIdAndSubtaskList.getOrDefault(logOrderId, Collections.emptyList());
+
+            if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
+                log.debug("物流订单 {} 下无子运单,跳过", logOrderId);
+                return BigDecimal.ZERO;
+            }
+
+            // 3. 根据计费模式确定磅单类型(装货或卸货)
+            // CHARGING_TYPE_1: 按装货量计费 -> 对应装货磅单 (SHIPMENT)
+            // CHARGING_TYPE_2: 按卸货量计费 -> 对应卸货磅单 (TAKE)
+            Integer ticketType;
+            String billingMode = kwtLogisticsOrder.getBillingMode();
+            if (org.apache.commons.lang3.StringUtils.equals(billingMode, DictEnum.CHARGING_TYPE_1.getValue())) {
+                ticketType = AddressTypeEnum.SHIPMENT.getCode();
+            } else if (org.apache.commons.lang3.StringUtils.equals(billingMode, DictEnum.CHARGING_TYPE_2.getValue())) {
+                ticketType = AddressTypeEnum.TAKE.getCode();
+            } else {
+                // 未知计费模式,记录警告并跳过该物流订单的计算,避免数据错误
+                log.warn("余量计算跳过未知计费模式, logOrderId:{}, billingMode:{}",
+                                 logOrderId, billingMode);
+                return BigDecimal.ZERO;
+            }
+
+            // 4. 计算子运单委托量总和
+            // 过滤条件:对象非空、状态非取消、委托量非空
+            List<Integer> statusList = Arrays.asList(CarWaybillV1Enum.COMPLETED.getCode(), CarWaybillV1Enum.CANCELLED.getCode());
+            BigDecimal entrustAmount = waybillOrderSubtasks.stream()
+                    .filter(Objects::nonNull)
+                    .filter(subtask -> !statusList.contains(subtask.getStatus()))
+                    .map(KwtWaybillOrderSubtask::getEntrustAmount)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 5. 计算磅单实际量总和
+            // 逻辑:子运单 -> 主运单ID -> 磅单列表 -> 过滤特定类型 -> 累加金额/数量
+            BigDecimal ticketAmount = waybillOrderSubtasks.stream()
+                    .filter(Objects::nonNull)
+                    .filter(subtask -> !Objects.equals(subtask.getStatus(), CarWaybillV1Enum.CANCELLED.getCode()))
+                    .map(KwtWaybillOrderSubtask::getWOrderId)
+                    .filter(Objects::nonNull)
+                    .flatMap(wOrderId -> waybillOrderIdAndTicketList.getOrDefault(wOrderId, Collections.emptyList()).stream())
+                    .filter(Objects::nonNull)
+                    // 只统计与计费模式匹配的磅单类型(装或卸)
+                    .filter(ticket -> Objects.equals(ticket.getType(), ticketType))
+                    .map(KwtWaybillOrderTicket::getAmount)
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 累加当前物流订单的已使用量
+            BigDecimal currentUsed = entrustAmount.add(ticketAmount);
+            usedAmount = usedAmount.add(currentUsed);
+
+            log.debug("物流订单 {} 计算详情: 委托量={}, 磅单量={}, 计费类型={}",
+                    logOrderId, entrustAmount, ticketAmount, ticketType);
+        }
+
+        // 6. 计算最终余量:总量 - 已用量,若结果小于0则置为0
+        BigDecimal surplus = tradeAmount.subtract(usedAmount);
+        if (surplus.compareTo(BigDecimal.ZERO) <= 0) {
+            log.info("物流订单 {} 余量计算结果为负或零,重置为0。总量: {}, 已用: {}", kwtLogisticsOrder.getId(), tradeAmount, usedAmount);
+            surplus = BigDecimal.ZERO;
+        } else {
+            log.debug("物流订单 {} 余量计算正常。总量: {}, 已用: {}, 余量: {}",  kwtLogisticsOrder.getId(), tradeAmount, usedAmount, surplus);
+        }
+
+        // 保留两位小数,四舍五入
+        return surplus.setScale(2, RoundingMode.HALF_UP);
+    }
+
     public LogisticsOrderDetailResp getLogisticsOrderDetail(@Valid LogisticsOrderReq req) {
     public LogisticsOrderDetailResp getLogisticsOrderDetail(@Valid LogisticsOrderReq req) {
         KwtLogisticsOrder logisticsOrder =
         KwtLogisticsOrder logisticsOrder =
                 logisticsOrderRepository.queryByLogisticsOrderId(Long.valueOf(req.getLogisticsOrderId()));
                 logisticsOrderRepository.queryByLogisticsOrderId(Long.valueOf(req.getLogisticsOrderId()));