Просмотр исходного кода

1.原矿运输
2.场内流程优化

donglang 1 месяц назад
Родитель
Сommit
f14b8c7ea0

+ 2 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java

@@ -125,7 +125,8 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
         if (param == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "参数不能为空");
         }
-        if (!(param instanceof WaybillOrderCancelParam || param instanceof WaybillOrderCmeIntoWeighParam || param instanceof WaybillOrderUnloadingWeighParam)) {
+        if (!(param instanceof WaybillOrderCancelParam || param instanceof WaybillOrderCmeIntoWeighParam
+                || param instanceof WaybillOrderUnloadingWeighParam ||  param instanceof WaybillOrderReplenishParam)) {
             if (StringUtils.isBlank(param.getLng()) || StringUtils.isBlank(param.getLat())) {
                 throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "未获取到定位,请重启app后再次操作");
             }

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -300,6 +300,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         BigDecimal entrustAmount = waybillSubtask.getEntrustAmount();
         //场景一:净重<-0.5
         if (loadAmount.compareTo(BigDecimal.valueOf(-0.5)) < 0) {
+            //什么不展示
             return;
         }
         //场景二:空载离场,-0.5<=净重<=0.5
@@ -314,6 +315,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
                     && !Objects.equals(CarWaybillV1Enum.REPLENISH_FINISH.getCode(), waybillOrder.getStatus())
                     && !Objects.equals(CarWaybillV1Enum.WAIT_LEAVE.getCode(), waybillOrder.getStatus())
                     && !Objects.equals(CarWaybillV1Enum.UNLOADING.getCode(), waybillOrder.getStatus())) {
+                //什么不展示
                 return;
             }
         } else {
@@ -332,6 +334,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         // 场景三:超载流程, 净重>任务量或者毛重>法定载重
         if (loadAmount.compareTo(entrustAmount) > 0 || param.getWeighAmount().compareTo(truckStandardLoad) > 0) {
             waybillOrder.setTargetStatus(3);
+            return;
         }
 
         // 场景四:正常流程,0.5<净重<=任务量

+ 70 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -639,10 +639,9 @@ public class WaybillOrderService {
         orderResp.setStatus(Optional.ofNullable(order.getStatus()).map(String::valueOf).orElse(null));
         orderResp.setStatusDesc(LogisticsOrderV1Enum.IN_TRANSIT.getCode().equals(order.getStatus()) ? "待接单" : "未知状态");
         //设置余量
-//        BigDecimal orderSurplus = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
-//                logisticsOrderIdAndSubtaskList);
-//        orderResp.setOrderSurplus(orderSurplus.toPlainString());
-//        orderResp.setRemainingAmount(orderSurplus);
+        BigDecimal orderSurplus = getRawOreSupAmount(order, logisticsOrderIdAndSubtaskList);
+        orderResp.setOrderSurplus(orderSurplus.toPlainString());
+        orderResp.setRemainingAmount(orderSurplus);
 
         return orderResp;
     }
@@ -1201,6 +1200,73 @@ public class WaybillOrderService {
         return result;
     }
 
+
+    /**
+     * 计算贸易订单余量
+     * 逻辑:贸易订单总量 - (所有关联物流订单下,非取消/完成状态的子运单委托量 + 对应计费模式的磅单量)
+     *
+     * @param tradeOrderId                贸易订单ID
+     * @param tradeIdAndOrderDetailVoMap  贸易订单详情映射
+     * @param tradeIdAndLogOrderList      贸易订单关联的物流订单列表映射
+     * @param logisticsOrderIdAndSubtaskList 物流订单关联的子运单列表映射
+     * @param waybillOrderIdAndTicketList    运单ID关联的磅单列表映射
+     * @return 订单余量,保留两位小数
+     */
+    private BigDecimal getRawOreSupAmount(KwtLogisticsOrder order,
+                                          Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList) {
+        log.debug("开始计算物流订单余量,param: {}", JSON.toJSONString(order));
+
+        // 1. 获取贸易订单总货物量
+        BigDecimal tradeAmount = order.getAmount();
+        log.debug("物流订单[{}]总货物量: {}", order.getId(), tradeAmount);
+
+        Long logOrderId = order.getId();
+        // 获取当前物流订单下的所有子运单
+        List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderIdAndSubtaskList.getOrDefault(logOrderId, Collections.emptyList());
+
+        if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
+            log.debug("物流订单[{}]无子运单,跳过", logOrderId);
+            return BigDecimal.ZERO;
+        }
+
+        // 定义需要剔除的状态:已取消、已完成、空载(这些状态下的运单不再占用当前可接单的余量,或者其量已结算)
+        // 注意:具体业务逻辑中,通常“进行中”的运单会占用余量。这里根据原代码逻辑,剔除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;
+    }
+
     /**
      * 批量构建运单ID与磅单信息映射,供订单余量计算复用。
      */