Explorar o código

原矿运输订单余量计算

donglang hai 1 mes
pai
achega
874d99c526

+ 68 - 10
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -318,8 +318,8 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
             log.info("车辆无皮重,按80%核定载重计算,车辆任务量:{}", loadVolume);
             log.info("车辆无皮重,按80%核定载重计算,车辆任务量:{}", loadVolume);
         }
         }
 
 
-        //订单余量
-        BigDecimal remainingAmount = getRemainingAmount(tradeOrder,logOrder);
+        //订单余量:区分正常流程和原矿运输
+        BigDecimal remainingAmount = Objects.equals(1, logOrder.getOrderType()) ? getRawOreSupAmount(logOrder) : getRemainingAmount(tradeOrder);
 
 
         // 最终接取的任务量
         // 最终接取的任务量
         BigDecimal taskAmount;
         BigDecimal taskAmount;
@@ -341,14 +341,9 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
     }
     }
 
 
     @NotNull
     @NotNull
-    private BigDecimal getRemainingAmount(OrderDetailVo tradeOrder, KwtLogisticsOrder logOrder) {
-        //订单分配总量(原矿运输的总量放在物流订单的)
-        BigDecimal entrustAmount;
-        if (Objects.equals(1, logOrder.getOrderType())) {
-            entrustAmount = logOrder.getAmount();
-        } else {
-            entrustAmount = tradeOrder.getAmount();
-        }
+    private BigDecimal getRemainingAmount(OrderDetailVo tradeOrder) {
+        //订单分配总量
+        BigDecimal entrustAmount = tradeOrder.getAmount();
         if (entrustAmount == null ||  entrustAmount.compareTo(BigDecimal.ZERO) <= 0) {
         if (entrustAmount == null ||  entrustAmount.compareTo(BigDecimal.ZERO) <= 0) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "订单分配总量必须大于0!");
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "订单分配总量必须大于0!");
         }
         }
@@ -392,6 +387,69 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         return remainingAmount;
         return remainingAmount;
     }
     }
 
 
+
+    /**
+     * 计算贸易订单余量
+     * 逻辑:贸易订单总量 - (所有关联物流订单下,非取消/完成状态的子运单委托量 + 对应计费模式的磅单量)
+     *
+     * @return 订单余量,保留两位小数
+     */
+    private BigDecimal getRawOreSupAmount(KwtLogisticsOrder order) {
+        log.debug("开始计算物流订单余量,param: {}", JSON.toJSONString(order));
+
+        // 1. 获取贸易订单总货物量
+        BigDecimal tradeAmount = order.getAmount();
+        log.debug("物流订单[{}]总货物量: {}", order.getId(), tradeAmount);
+
+        Long logOrderId = order.getId();
+        // 获取当前物流订单下的所有子运单
+        List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskRepository.queryByLogId(logOrderId);
+
+        if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
+            BigDecimal tradeTotalAmount = tradeAmount.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount;
+            BigDecimal bigDecimal = tradeTotalAmount.setScale(2, RoundingMode.HALF_UP);
+            log.debug("物流订单[{}]无子运单,跳过, 最终余量: {}",logOrderId, bigDecimal);
+            return bigDecimal;
+        }
+
+        // 定义需要剔除的状态:已取消、已完成、空载(这些状态下的运单不再占用当前可接单的余量,或者其量已结算)
+        // 注意:具体业务逻辑中,通常“进行中”的运单会占用余量。这里根据原代码逻辑,剔除CANCELLED和COMPLETED。
+        //      空载待离场,实际装货量接近0,所以也要剔除
+        List<Integer> excludeStatusList = Arrays.asList(CarWaybillV1Enum.CANCELLED.getCode(), CarWaybillV1Enum.COMPLETED.getCode()
+                , CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode());
+
+        // 4. 计算子运单委托量合计(仅统计未取消/未完成/空载的有效子运单)
+        BigDecimal entrustAmount = waybillOrderSubtasks.stream()
+                .filter(Objects::nonNull)
+                .filter(subtask -> !excludeStatusList.contains(subtask.getStatus()))
+                .map(KwtWaybillOrderSubtask::getEntrustAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        log.debug("物流订单[{}]子运单委托量合计: {}", logOrderId, entrustAmount);
+
+        // 5. 计算运单已完成的合计量
+        BigDecimal totalLoadAmount = order.getTotalLoadAmount();
+        totalLoadAmount = totalLoadAmount == null || totalLoadAmount.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : totalLoadAmount;
+        log.debug("物流订单[{}]有完成的运单实际装货量合计: {}", logOrderId, totalLoadAmount);
+
+        // 累加到总占用量
+        BigDecimal usedAmount = entrustAmount.add(totalLoadAmount);
+
+        log.debug("物流订单[{}]总占用量: {}", logOrderId, usedAmount);
+
+        // 6. 计算余量:贸易订单总量 - 已占用量
+        // 如果计算结果小于等于0,则余量为0,避免负数
+        BigDecimal surplus = tradeAmount.subtract(usedAmount);
+        BigDecimal finalSurplus = surplus.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : surplus;
+
+        // 保留两位小数,四舍五入
+        BigDecimal result = finalSurplus.setScale(2, RoundingMode.HALF_UP);
+        log.debug("物流订单[{}]最终余量: {}", logOrderId, result);
+
+        return result;
+    }
+
     /**
     /**
      * 创建物流运单
      * 创建物流运单
      *
      *

+ 5 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -455,7 +455,7 @@ public class WaybillOrderService {
      * @param truckNo
      * @param truckNo
      */
      */
     private Boolean checkCurTruckLoadVolume(RTruckVo truckNo, BigDecimal remainingAmount) {
     private Boolean checkCurTruckLoadVolume(RTruckVo truckNo, BigDecimal remainingAmount) {
-        log.info("开始校验当前车辆任务量!");
+        log.info("开始校验当前车辆任务量!param:{}, 订单余量:{}", JSON.toJSONString(truckNo), JSON.toJSONString(remainingAmount));
         //核定载重
         //核定载重
         BigDecimal actualWeight = truckNo.getLegalLoad();
         BigDecimal actualWeight = truckNo.getLegalLoad();
         //首次皮重
         //首次皮重
@@ -1225,8 +1225,10 @@ public class WaybillOrderService {
         List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderIdAndSubtaskList.getOrDefault(logOrderId, Collections.emptyList());
         List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderIdAndSubtaskList.getOrDefault(logOrderId, Collections.emptyList());
 
 
         if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
         if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
-            log.debug("物流订单[{}]无子运单,跳过", logOrderId);
-            return tradeAmount;
+            BigDecimal tradeTotalAmount = tradeAmount.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount;
+            BigDecimal bigDecimal = tradeTotalAmount.setScale(2, RoundingMode.HALF_UP);
+            log.debug("物流订单[{}]无子运单,跳过, 最终余量: {}",logOrderId, bigDecimal);
+            return bigDecimal;
         }
         }
 
 
         // 定义需要剔除的状态:已取消、已完成、空载(这些状态下的运单不再占用当前可接单的余量,或者其量已结算)
         // 定义需要剔除的状态:已取消、已完成、空载(这些状态下的运单不再占用当前可接单的余量,或者其量已结算)