Jelajahi Sumber

地磅数据上报

chenxiaofei 7 jam lalu
induk
melakukan
f6d7a8dbe4

+ 3 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java

@@ -191,4 +191,7 @@ public interface TradeOrderInfoService {
     BuyDto countBuy(CountPara countPara);
 
     GoodsDto countGoods(CountPara countPara);
+
+    List<OrderUnitInfoDetailVO> queryOrderUnitByTradeOrderId(Long tradeOrderId);
+
 }

+ 20 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -1053,5 +1053,25 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
     }
+    @Override
+    public List<OrderUnitInfoDetailVO> queryOrderUnitByTradeOrderId(Long tradeOrderId) {
+        List<KwoTradeOrderUnit> tradeOrderUnits = kwoTradeOrderUnitRepository.queryByOrderId(tradeOrderId);
+        if (CollectionUtils.isEmpty(tradeOrderUnits)) {
+            return Collections.emptyList();
+        }
+        return tradeOrderUnits.stream().map(unit -> {
+            OrderUnitInfoDetailVO vo = new OrderUnitInfoDetailVO();
+            vo.setId(unit.getId());
+            vo.setTOrderId(unit.getTOrderId());
+            vo.setTOrderNo(unit.getTOrderNo());
+            vo.setUnitType(unit.getUnitType());
+            vo.setEntId(unit.getEntId());
+            vo.setFirmName(unit.getFirmName());
+            vo.setContactsId(unit.getContactsId());
+            vo.setContacts(unit.getContacts());
+            vo.setPhone(unit.getPhone());
+            return vo;
+        }).collect(Collectors.toList());
+    }
 
 }

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java

@@ -148,6 +148,7 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
     protected void getStatus(KwtWaybillOrder waybillOrder) {
         // 1. 修改运单状态
         waybillOrder.setStatus(CarWaybillV1Enum.CANCELLED.getCode());
+        waybillOrder.setOpened(1);
         waybillOrderRepository.updateById(waybillOrder);
 
         // 2. 修改子运单状态

+ 150 - 130
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -14,6 +14,7 @@ import com.sckw.core.utils.StringUtils;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.transport.model.*;
@@ -59,7 +60,9 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         if (orderTicket == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录皮重!");
         }
-        if (checkIsFirst(waybillOrder)) {
+        // 校验是否是第一次过磅
+        checkIsFirst(waybillOrder);
+        if (waybillOrder.getIsExistWeighbridges()) {
             //第一次过磅
             firstWeighbridge(param, waybillOrder, orderTicket);
         } else {
@@ -74,10 +77,14 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param waybillOrder
      * @return
      */
-    private Boolean checkIsFirst(KwtWaybillOrder waybillOrder) {
+    private void checkIsFirst(KwtWaybillOrder waybillOrder) {
         List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository
                 .queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId(), WeighbridgeTypeEnum.LOADING.getCode());
-        return CollectionUtils.isEmpty(weighbridges);
+        if (CollectionUtils.isEmpty(weighbridges)) {
+            waybillOrder.setIsExistWeighbridges(Boolean.TRUE);
+        } else {
+            waybillOrder.setIsExistWeighbridges(Boolean.FALSE);
+        }
     }
 
     /**
@@ -86,6 +93,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param waybillOrder
      */
     private void firstWeighbridge(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, KwtWaybillOrderTicket orderTicket) {
+        log.info("[过磅称重]开始第一次过磅称重,入参参数:{}", JSON.toJSONString(waybillOrder));
         if (param.getWeighAmount() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "皮重不能为空!");
         }
@@ -114,7 +122,8 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         createForkliftWaybill(waybillOrder);
 
         //5.创建过磅记录
-        createWeighbridges(param,waybillOrder);
+        createWeighbridges(param, waybillOrder);
+        log.info("[过磅称重]第一次过磅称重结束!");
     }
 
     /**
@@ -122,54 +131,83 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param waybillOrder
      */
     private void createForkliftWaybill(KwtWaybillOrder waybillOrder) {
-        CompletableFuture.runAsync(() ->{
-            try {
-                log.debug("开始异步保存铲车司机数据,运单ID:{}", waybillOrder.getId());
-
-                KwtForkliftWaybillOrder forklift = new KwtForkliftWaybillOrder();
-                forklift.setFOrderNo("F" + System.currentTimeMillis());
-                forklift.setEntId(waybillOrder.getEntId());
-                forklift.setWOrderId(waybillOrder.getId());
-                forklift.setLOrderId(waybillOrder.getLOrderId());
-
-                //查询字典
-                Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(
-                        Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
-                Map<String, String> goodsTypeMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
-                Map<String, String> goodsSpecMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
-
-                // 查询商品信息
-                KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
-                KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
-                if (goods != null) {
-                    List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.GOODS_SPEC.getType(), goods.getSpec());
-                    forklift.setDictId(CollectionUtils.isNotEmpty(dictResDtoList) ? dictResDtoList.get(0).getId() : -1L);
-                    forklift.setGoodsId(goods.getId());
-                    forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
-                }
-                forklift.setLoadingType(LoadingTypeEnum.LOADING.getCode());
-                forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
-                forklift.setWaybillAcceptTime(waybillOrder.getCreateTime());
-
-                // 任务量
-                KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
-                forklift.setEntrustAmount(waybillSubtask.getEntrustAmount());
-                // 车辆类型
-                RTruckVo truckVo = remoteFleetService.findTruckByTruckNo(waybillOrder.getTruckNo());
-                if (truckVo != null) {
-                    forklift.setTruckType(truckVo.getTruckType());
-                    forklift.setCarAxis(truckVo.getCarAxis());
-                }
-                forklift.setCreateTime(new Date());
-                forklift.setCreateUser(waybillOrder.getDriverId());
-                forklift.setUpdateUser(waybillOrder.getDriverId());
-
-                forkliftWaybillOrderRepository.save(forklift);
-                log.debug("铲车司机数据保存成功");
-            } catch (Exception e) {
-                throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "异步保存铲车司机数据失败!");
+        try {
+            log.debug("开始异步保存铲车司机数据,运单ID:{}", waybillOrder.getId());
+            //企业id
+            Long entId = getEntId(waybillOrder);
+
+            KwtForkliftWaybillOrder forklift = new KwtForkliftWaybillOrder();
+            forklift.setFOrderNo("F" + System.currentTimeMillis());
+            forklift.setEntId(entId);
+            forklift.setWOrderId(waybillOrder.getId());
+            forklift.setLOrderId(waybillOrder.getLOrderId());
+
+            //查询字典
+            Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(
+                    Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+            Map<String, String> goodsTypeMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
+            Map<String, String> goodsSpecMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
+
+            // 查询商品信息
+            KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
+            KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
+            if (goods != null) {
+                List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.GOODS_SPEC.getType(), goods.getSpec());
+                forklift.setDictId(CollectionUtils.isNotEmpty(dictResDtoList) ? dictResDtoList.get(0).getId() : -1L);
+                forklift.setGoodsId(goods.getId());
+                forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
             }
-        });
+            forklift.setLoadingType(LoadingTypeEnum.LOADING.getCode());
+            forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
+            forklift.setWaybillAcceptTime(waybillOrder.getCreateTime());
+
+            // 任务量
+            KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+            forklift.setEntrustAmount(waybillSubtask.getEntrustAmount());
+            // 车辆类型
+            RTruckVo truckVo = remoteFleetService.findTruckByTruckNo(waybillOrder.getTruckNo());
+            if (truckVo != null) {
+                forklift.setTruckType(truckVo.getTruckType());
+                forklift.setCarAxis(truckVo.getCarAxis());
+            }
+            forklift.setCreateTime(new Date());
+            forklift.setCreateUser(waybillOrder.getDriverId());
+            forklift.setUpdateUser(waybillOrder.getDriverId());
+
+            forkliftWaybillOrderRepository.save(forklift);
+            log.debug("铲车司机数据保存成功");
+        } catch (Exception e) {
+            log.info("[创建装货铲车]保存铲车司机数据异常!", e);
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "保存铲车司机数据失败!");
+        }
+    }
+
+    /**
+     * 获取企业id
+     * @param waybillOrder
+     * @return
+     */
+    private Long getEntId(KwtWaybillOrder waybillOrder) {
+        log.info("[创建装货铲车]开始查询企业id,入参参数:{}", JSON.toJSONString(waybillOrder));
+        Long entId;
+        KwtLogisticsOrder logOrder = getLogisticsOrder(waybillOrder.getLOrderId());
+        KwtLogisticsOrderUnit kwtLogisticsOrderUnit = logisticsOrderUnitRepository.queryByLOrderIdAndUnitType(logOrder.getId(), 1);
+        if (kwtLogisticsOrderUnit == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "[接单]物流企业信息数据不存在");
+        }
+        // 原矿运输山上、上下门卫企业id
+        List<Long> mockEntIds = Arrays.asList(538039617157337089L, 538040297439891457L);
+        if (Objects.equals(1, logOrder.getOrderType()) && mockEntIds.contains(kwtLogisticsOrderUnit.getEntId())) {
+            entId = mockEntIds.get(0);
+        } else {
+            List<OrderUnitInfoDetailVO> unitInfoDetailVOS = tradeOrderInfoService.queryOrderUnitByTradeOrderId(logOrder.getTOrderId());
+            OrderUnitInfoDetailVO unitInfoDetailVO = unitInfoDetailVOS.stream()
+                    .filter(unit -> Objects.equals(unit.getUnitType(), "2"))
+                    .findFirst().orElse(new OrderUnitInfoDetailVO());
+            entId = unitInfoDetailVO.getEntId();
+        }
+        log.info("[创建装货铲车]查询企业id完成,入参参数:{}", JSON.toJSONString(entId));
+        return entId;
     }
 
     /**
@@ -178,7 +216,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @return
      */
     public void updateGatekeeperOrderStatus(KwtWaybillOrder waybillOrder) {
-        log.info("推进门卫数据为已进场:{}", JSON.toJSONString(waybillOrder));
+        log.info("开始推进门卫数据为已进场:{}", JSON.toJSONString(waybillOrder));
         KwtGatekeeperWaybillOrder gatekeeper = gatekeeperWaybillOrderRepository
                 .queryGatekeeperWaybillOrderByWOrderId(waybillOrder.getId(), GatekeeperTypeEnum.LOADING.getCode());
         if (gatekeeper == null) {
@@ -191,35 +229,35 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         gatekeeper.setStatus(GatekeeperStatusEnum.IN_YARD.getCode());
         gatekeeper.setIntoTime(new Date());
         gatekeeperWaybillOrderRepository.updateById(gatekeeper);
+        log.info("推进门卫数据为已进场结算!");
     }
 
     /**
      * 创建过磅记录
      * @param waybillOrder
      */
-    private void createWeighbridges(WaybillOrderCmeIntoWeighParam param,KwtWaybillOrder waybillOrder) {
-        CompletableFuture.runAsync(() ->{
-            try {
-                log.debug("开始异步保存地磅记录,运单ID:{}", waybillOrder.getId());
-                KwtWaybillOrderWeighbridge weighbridge = new KwtWaybillOrderWeighbridge();
-                weighbridge.setWOrderId(waybillOrder.getId());
-                weighbridge.setLOrderId(waybillOrder.getLOrderId());
-                weighbridge.setTruckId(waybillOrder.getTruckId());
-                weighbridge.setTruckNo(waybillOrder.getTruckNo());
-                weighbridge.setType(WeighbridgeTypeEnum.LOADING.getCode());
-                weighbridge.setWeighbridgeId(param.getWeighbridgeId());
-                weighbridge.setWeight(param.getWeighAmount());
-                weighbridge.setWeighUrl(param.getWeighUrl());
-                weighbridge.setCreateTime(new Date());
-                weighbridge.setCreateUser(waybillOrder.getDriverId());
-                weighbridge.setUpdateUser(waybillOrder.getDriverId());
-
-                waybillOrderWeighbridgeRepository.save(weighbridge);
-                log.debug("异步保存过磅数据保存成功");
-            } catch (Exception e) {
-                throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "异步保存过磅数据失败!");
-            }
-        });
+    private void createWeighbridges(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
+        try {
+            log.debug("开始异步保存地磅记录,运单ID:{}", waybillOrder.getId());
+            KwtWaybillOrderWeighbridge weighbridge = new KwtWaybillOrderWeighbridge();
+            weighbridge.setWOrderId(waybillOrder.getId());
+            weighbridge.setLOrderId(waybillOrder.getLOrderId());
+            weighbridge.setTruckId(waybillOrder.getTruckId());
+            weighbridge.setTruckNo(waybillOrder.getTruckNo());
+            weighbridge.setType(WeighbridgeTypeEnum.LOADING.getCode());
+            weighbridge.setWeighbridgeId(param.getWeighbridgeId());
+            weighbridge.setWeight(param.getWeighAmount());
+            weighbridge.setWeighUrl(param.getWeighUrl());
+            weighbridge.setCreateTime(new Date());
+            weighbridge.setCreateUser(waybillOrder.getDriverId());
+            weighbridge.setUpdateUser(waybillOrder.getDriverId());
+
+            waybillOrderWeighbridgeRepository.save(weighbridge);
+            log.debug("异步保存过磅数据保存成功");
+        } catch (Exception e) {
+            log.info("保存过磅数据异常!", e);
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "保存过磅数据失败!");
+        }
     }
 
 
@@ -229,18 +267,21 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param waybillOrder
      */
     private void laterWeighbridge(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, KwtWaybillOrderTicket orderTicket) {
+        log.info("[过磅称重]开始第二次过磅称重,入参参数:{}", JSON.toJSONString(waybillOrder));
         if (param.getWeighAmount() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "毛重不能为空!");
         }
         //1.填充装货单毛重和装货净重
         BigDecimal loadAmount = updateGrossAmount(param, orderTicket);
-        //2.填充运单装货净重
+        //2.填充运单装货净重
         updateLoadAmount(param, waybillOrder, loadAmount);
         //3.判断流程
         checkProcess(param, waybillOrder, loadAmount);
         //4.创建过磅记录
-        createWeighbridges(param,waybillOrder);
-
+        createWeighbridges(param, waybillOrder);
+        //5.填补门卫地磅id
+        updateGatekeeperOrder(param, waybillOrder);
+        log.info("[过磅称重]第二次过磅称重结束!");
     }
 
     /**
@@ -249,6 +290,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param shipmentTicket
      */
     private BigDecimal updateGrossAmount(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrderTicket shipmentTicket) {
+        log.info("[二次过磅称重]填充装货单毛重和装货净重,入参参数:{}", JSON.toJSONString(param));
         //毛重
         shipmentTicket.setGrossAmount(param.getWeighAmount());
         //皮重
@@ -267,12 +309,13 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param loadAmount
      */
     private void updateLoadAmount(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, BigDecimal loadAmount) {
+        log.info("[二次过磅称重]填充子运单装货净重,入参参数:{}", JSON.toJSONString(param));
         //更新子运单装货净重
         KwtWaybillOrderSubtask subtask = getWaybillSubtask(waybillOrder.getId());
         subtask.setLoadAmount(loadAmount);
         subtask.setLoadTime(new Date());
         waybillOrderSubtaskRepository.updateById(subtask);
-        log.info("物流运单离场过磅成功!运单ID: {}, 毛重: {}, 装货净重: {}", param.getWaybillOrderId(), param.getWeighAmount(), loadAmount);
+        log.info("[二次过磅称重]填充子运单装货净重结束,运单ID: {}, 毛重: {}, 装货净重: {}", param.getWaybillOrderId(), param.getWeighAmount(), loadAmount);
     }
 
     //
@@ -286,6 +329,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      * @param loadAmount
      */
     private void checkProcess(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, BigDecimal loadAmount) {
+        log.info("[二次过磅称重]判断过磅称重流程,入参参数:{}", JSON.toJSONString(waybillOrder));
         //获取运单任务量
         KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
         if (waybillSubtask.getEntrustAmount() == null) {
@@ -338,51 +382,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
             // 场景四:正常流程,0.5<净重<=任务量
             waybillOrder.setTargetStatus(2);
         }
-
-
-//        //场景一:净重<-0.5
-//        if (loadAmount.compareTo(BigDecimal.valueOf(-0.5)) < 0) {
-//            return;
-//        }
-//        //场景二:空载离场,-0.5<=净重<=0.5
-//        if (loadAmount.compareTo(BigDecimal.valueOf(0.5)) <= 0) {
-//            waybillOrder.setTargetStatus(1);
-//            return;
-//        }
-//
-//        if (Objects.equals(forklift.getStatus(), ForkliftStatusEnum.PENDING_ORDERS.getCode())) {
-//            //如果铲车司机未接单,则二次过磅的时候,非空载情况,必须校验是否完成装载
-//            //场景:铲车未接单,司机第一次空载离场,第二次空载离场,还是展示空载,其它什么不展示。(就是没有完成装货就什么都不展示)
-//            if (!Objects.equals(CarWaybillV1Enum.EXIT_COMPLETED.getCode(), waybillOrder.getStatus())
-//                    && !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 {
-//            //如果铲车司机完成装载,则二次过磅的时候,已最新的一次称重为准
-//            //场景:铲车未接单,司机第一次空载离场,然后铲车装货完成。 二次过磅,是什么流程就是什么流程
-//            if (!Objects.equals(CarWaybillV1Enum.EXIT_COMPLETED.getCode(), waybillOrder.getStatus())
-//                    && !Objects.equals(CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(), waybillOrder.getStatus())
-//                    && !Objects.equals(CarWaybillV1Enum.REPLENISH_FINISH.getCode(), waybillOrder.getStatus())
-//                    && !Objects.equals(CarWaybillV1Enum.WAIT_LEAVE.getCode(), waybillOrder.getStatus())
-//                    && !Objects.equals(CarWaybillV1Enum.UNLOADING.getCode(), waybillOrder.getStatus())) {
-//                return;
-//            }
-//        }
-//
-//        //法定载重
-//        BigDecimal truckStandardLoad = getTruckStandardLoad(param.getTruckNo());
-//        // 场景三:超载流程, 净重>任务量或者毛重>法定载重
-//        if (loadAmount.compareTo(entrustAmount) > 0 || param.getWeighAmount().compareTo(truckStandardLoad) > 0) {
-//            waybillOrder.setTargetStatus(3);
-//            return;
-//        }
-//
-//        // 场景四:正常流程,0.5<净重<=任务量
-//        waybillOrder.setTargetStatus(2);
-
+        log.info("[二次过磅称重]判断过磅称重流程结束!");
     }
 
     /**
@@ -398,6 +398,26 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         return truckVo.getLegalLoad();
     }
 
+    /**
+     * 创建过磅记录
+     * @param waybillOrder
+     */
+    private void updateGatekeeperOrder(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
+        log.info("[二次过磅称重]填补门卫地磅id,入参参数:{}", JSON.toJSONString(waybillOrder));
+        KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository
+                .queryGatekeeperWaybillOrderByWOrderId(waybillOrder.getId(), GatekeeperTypeEnum.LOADING.getCode());
+        if (gatekeeperWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "门卫订单不存在!");
+        }
+        if (!GatekeeperStatusEnum.IN_YARD.getCode().equals(gatekeeperWaybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_STATUS_ERROR, "门卫状态异常,不能填充门卫地磅id!");
+        }
+
+        gatekeeperWaybillOrder.setWeighbridgeId(param.getWeighbridgeId());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeperWaybillOrder);
+        log.info("[二次过磅称重]填补门卫地磅id结束!");
+    }
+
     @Override
     protected String getProcessName() {
         return "称重过磅";
@@ -407,7 +427,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
     protected void getStatus(KwtWaybillOrder waybillOrder) {
         Integer status;
         // 校验是否第一次过磅
-        if (checkIsFirst(waybillOrder)) {
+        if (waybillOrder.getIsExistWeighbridges()) {
             status = CarWaybillV1Enum.REFUSE_TRAFFIC.getCode();
             updateOrderStatus(waybillOrder, status);
             return;
@@ -457,12 +477,12 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      */
     @Override
     protected void createNodeTrace(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository
-                .queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId(), WeighbridgeTypeEnum.LOADING.getCode());
-        if (CollectionUtils.isEmpty(weighbridges)) {
+        if (waybillOrder.getIsExistWeighbridges()) {
             // 首次过磅
             createArrivedAndFirstWeighNodes(param, waybillOrder);
         } else {
+            List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository
+                    .queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId(), WeighbridgeTypeEnum.LOADING.getCode());
             // 后续过磅
             createMultipleWeighNode(param, waybillOrder, weighbridges);
         }
@@ -500,7 +520,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
     private void createMultipleWeighNode(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, List<KwtWaybillOrderWeighbridge> weighbridges) {
         KwtWaybillOrderNode node = getWaybillOrderNode(param, waybillOrder);
         //过磅次数
-        int size = weighbridges.size() + 1;
+        int size = weighbridges.size();
         String grossAmount = getWeighAmount(param);
         node.setRemark("第" + size + "次称重,[" + param.getWeighbridgeName() +  "]称重["  + grossAmount + "吨]");
         waybillOrderNodeRepository.save(node);
@@ -526,7 +546,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
     @Override
     @Transactional(rollbackFor = Exception.class)
     protected void calculateAutoDispatchScore(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        if (checkIsFirst(waybillOrder)) {
+        if (waybillOrder.getIsExistWeighbridges()) {
             //校验连续按时到场次数
             checkContinuousArriveTimes(waybillOrder);
         }

+ 31 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ReplenishHandler.java

@@ -1,6 +1,7 @@
 package com.sckw.transport.handler;
 
 
+import com.alibaba.fastjson.JSON;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
@@ -9,12 +10,10 @@ import com.sckw.core.model.enums.ForkliftStatusEnum;
 import com.sckw.core.model.enums.LoadingTypeEnum;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.fleet.api.model.vo.RTruckVo;
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
-import com.sckw.transport.model.KwtForkliftWaybillOrder;
-import com.sckw.transport.model.KwtLogisticsOrderGoods;
-import com.sckw.transport.model.KwtWaybillOrder;
-import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderReplenishParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -57,10 +56,12 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
     private void createForkliftWaybill(KwtWaybillOrder waybillOrder) {
         try {
             log.debug("开始异步保存铲车司机数据,运单ID:{}", waybillOrder.getId());
+            //企业id
+            Long entId = getEntId(waybillOrder);
 
             KwtForkliftWaybillOrder forklift = new KwtForkliftWaybillOrder();
             forklift.setFOrderNo("F" + System.currentTimeMillis());
-            forklift.setEntId(waybillOrder.getEntId());
+            forklift.setEntId(entId);
             forklift.setWOrderId(waybillOrder.getId());
             forklift.setLOrderId(waybillOrder.getLOrderId());
 
@@ -99,10 +100,35 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
             forkliftWaybillOrderRepository.save(forklift);
             log.debug("铲车司机数据保存成功");
         } catch (Exception e) {
+            log.info("[创建补货铲车]保存铲车司机数据异常!", e);
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_SAVE_FAIL, "保存铲车司机数据失败!");
         }
     }
 
+    /**
+     * 获取企业id
+     * @param waybillOrder
+     * @return
+     */
+    private Long getEntId(KwtWaybillOrder waybillOrder) {
+        log.info("[创建补货铲车]开始查询企业id,入参参数:{}", JSON.toJSONString(waybillOrder));
+        Long entId;
+        KwtLogisticsOrder logOrder = getLogisticsOrder(waybillOrder.getLOrderId());
+        KwtLogisticsOrderUnit kwtLogisticsOrderUnit = logisticsOrderUnitRepository.queryByLOrderIdAndUnitType(logOrder.getId(), 1);
+        if (kwtLogisticsOrderUnit == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "[接单]物流企业信息数据不存在");
+        }
+
+        List<OrderUnitInfoDetailVO> unitInfoDetailVOS = tradeOrderInfoService.queryOrderUnitByTradeOrderId(logOrder.getTOrderId());
+        OrderUnitInfoDetailVO unitInfoDetailVO = unitInfoDetailVOS.stream()
+                .filter(unit -> Objects.equals(unit.getUnitType(), "2"))
+                .findFirst().orElse(new OrderUnitInfoDetailVO());
+        entId = unitInfoDetailVO.getEntId();
+
+        log.info("[创建补货铲车]查询企业id完成,入参参数:{}", JSON.toJSONString(entId));
+        return entId;
+    }
+
     @Override
     protected void calculateAutoDispatchScore(WaybillOrderReplenishParam param, KwtWaybillOrder waybillOrder) {
 

+ 157 - 40
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -3,6 +3,7 @@ package com.sckw.transport.handler;
 
 import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
+import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
@@ -13,7 +14,9 @@ import com.sckw.fleet.api.model.vo.RDriverVo;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.order.api.model.OrderDetailVo;
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
 import com.sckw.order.api.model.UpdateActualAmountParam;
+import com.sckw.product.api.model.KwpGoods;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.OrderCirculateTakingQueryParam;
 import com.sckw.transport.model.param.OrderTakingResp;
@@ -66,6 +69,22 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
             CarWaybillV1Enum.REVIEW_REJECTION.getCode()
     );
 
+    // 定义禁止运单接单的状态集合
+    private static final List<Integer> RAW_ORE_FORBIDDEN_STATUSES = Arrays.asList(
+            CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
+            CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
+            CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
+            CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.UNLOADING.getCode(),
+            CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+            CarWaybillV1Enum.REPLENISHING.getCode(),
+            CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+            CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
+            CarWaybillV1Enum.WAIT_LOADING.getCode(),
+            CarWaybillV1Enum.REVIEW_REJECTION.getCode()
+    );
+
 
     @Override
     protected KwtWaybillOrder getWaybillOrder(OrderCirculateTakingQueryParam param) {
@@ -87,7 +106,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         // 5.校验车辆
         RTruckVo truck = checkTruck(param);
         // 6.校验车辆是否已有未完成运单
-        checkTruckUnfinished(param);
+        checkTruckUnfinished(param, logOrder);
 
         // 存储到线程上下文
         BusinessContext.set("logOrder", logOrder);
@@ -106,7 +125,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         RTruckVo truck = BusinessContext.get("truck");
 
         // 计算任务量(含接单校验)
-        BigDecimal truckLoadVolume = queryCurTruckLoadVolume(truck, tradeOrder);
+        BigDecimal truckLoadVolume = queryCurTruckLoadVolume(truck, tradeOrder, logOrder);
 
         //1、生成物流运单
         KwtWaybillOrder waybillOrder = createWaybillOrder(param, driver, truck, logOrder);
@@ -130,7 +149,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         driverBindTruck(waybillOrder);
 
         //8、生成门卫订单
-        createGatekeeperWaybillOrder(waybillOrder, truck, truckLoadVolume);
+        createGatekeeperWaybillOrder(logOrder, waybillOrder, truck, truckLoadVolume);
 
         BusinessContext.set("createdWaybillOrder", waybillOrder);
 
@@ -143,38 +162,62 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
      * @param waybillOrder
      * @param truckLoadVolume
      */
-    private void createGatekeeperWaybillOrder(KwtWaybillOrder waybillOrder, RTruckVo truck, BigDecimal truckLoadVolume) {
-        CompletableFuture.runAsync(() -> {
-            try {
-                KwtGatekeeperWaybillOrder gatekeeper = new KwtGatekeeperWaybillOrder();
-                gatekeeper.setEntId(waybillOrder.getEntId());
-                gatekeeper.setWOrderId(waybillOrder.getId());
-                gatekeeper.setWOrderNo(waybillOrder.getWOrderNo());
-                gatekeeper.setLOrderId(waybillOrder.getLOrderId());
-                // 查询商品信息
-                KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
-                if (orderGoods != null) {
-                    gatekeeper.setGoodsId(orderGoods.getGoodsId());
-                    gatekeeper.setGoodsName(orderGoods.getGoodsName());
-                }
-                gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
-                gatekeeper.setType(GatekeeperTypeEnum.LOADING.getCode());
-                gatekeeper.setStatus(GatekeeperStatusEnum.PENDING_ENTRY.getCode());
-                gatekeeper.setTruckType(truck.getTruckType());
-                gatekeeper.setEntrustAmount(truckLoadVolume);
-                gatekeeper.setCarAxis(truck.getCarAxis());
-                gatekeeper.setLegalLoad(truck.getLegalLoad());
-                gatekeeper.setCreateTime(new Date());
-                gatekeeper.setCreateUser(waybillOrder.getDriverId());
-                gatekeeper.setUpdateUser(waybillOrder.getDriverId());
-
-                log.debug("开始异步保存门卫订单数据,运单ID:{}", waybillOrder.getId());
-                gatekeeperWaybillOrderRepository.save(gatekeeper);
-                log.debug("门卫订单数据保存成功");
-            } catch (Exception e) {
-                log.error("异步保存门卫订单数据失败!");
-            }
-        });
+    private void createGatekeeperWaybillOrder(KwtLogisticsOrder logOrder, KwtWaybillOrder waybillOrder,
+                                              RTruckVo truck, BigDecimal truckLoadVolume) {
+        log.info("开始创建门卫订单,入参参数:{}", JSON.toJSONString(waybillOrder));
+        // 获取企业id
+        Long entId = getEntId(logOrder);
+
+        KwtGatekeeperWaybillOrder gatekeeper = new KwtGatekeeperWaybillOrder();
+        gatekeeper.setEntId(entId);
+        gatekeeper.setWOrderId(waybillOrder.getId());
+        gatekeeper.setWOrderNo(waybillOrder.getWOrderNo());
+        gatekeeper.setLOrderId(waybillOrder.getLOrderId());
+
+        //查询字典
+        Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(
+                Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+        Map<String, String> goodsTypeMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
+        Map<String, String> goodsSpecMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
+
+        // 查询商品信息
+        KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
+        KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
+        if (goods != null) {
+            gatekeeper.setGoodsId(goods.getId());
+            gatekeeper.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
+        }
+
+        gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
+        gatekeeper.setType(GatekeeperTypeEnum.LOADING.getCode());
+        gatekeeper.setStatus(GatekeeperStatusEnum.PENDING_ENTRY.getCode());
+        gatekeeper.setTruckType(truck.getTruckType());
+        gatekeeper.setEntrustAmount(truckLoadVolume);
+        gatekeeper.setCarAxis(truck.getCarAxis());
+        gatekeeper.setLegalLoad(truck.getLegalLoad());
+        gatekeeper.setCreateTime(new Date());
+        gatekeeper.setCreateUser(waybillOrder.getDriverId());
+        gatekeeper.setUpdateUser(waybillOrder.getDriverId());
+
+        log.debug("开始保存门卫订单数据,运单ID:{}", waybillOrder.getId());
+        gatekeeperWaybillOrderRepository.save(gatekeeper);
+        log.debug("门卫订单数据保存成功");
+    }
+
+    /**
+     * 获取企业id
+     * @param logOrder
+     * @return
+     */
+    private Long getEntId(KwtLogisticsOrder logOrder) {
+        log.info("[创建装货门卫]开始查询企业id,入参参数:{}", JSON.toJSONString(logOrder));
+        List<OrderUnitInfoDetailVO> unitInfoDetailVOS = tradeOrderInfoService.queryOrderUnitByTradeOrderId(logOrder.getTOrderId());
+        OrderUnitInfoDetailVO unitInfoDetailVO = unitInfoDetailVOS.stream()
+                .filter(unit -> Objects.equals(unit.getUnitType(), "2"))
+                .findFirst().orElse(new OrderUnitInfoDetailVO());
+        Long entId = unitInfoDetailVO.getEntId();
+        log.info("[创建装货门卫]查询企业id完成,入参参数:{}", JSON.toJSONString(entId));
+        return entId;
     }
 
     @Override
@@ -215,6 +258,10 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
      * @return
      */
     private OrderDetailVo checkTradeOrder(OrderCirculateTakingQueryParam param, KwtLogisticsOrder logOrder) {
+        // 原矿运输没有贸易订单
+        if (Objects.equals(1, logOrder.getOrderType())) {
+            return new OrderDetailVo();
+        }
         OrderDetailVo orderDetail = tradeOrderInfoService.queryByTradeOrderId(logOrder.getTOrderId());
         if (orderDetail == null || orderDetail.getStatus() == Global.NUMERICAL_ONE) {
             throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_STATUS_ERROR, "当前物流订单的交易订单已锁定");
@@ -276,8 +323,15 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
      * 校验车辆是否已有未完成运单(不可继续接单状态:已接单、已入场、已装货、已离场、审核驳回)
      * @param param
      */
-    private void checkTruckUnfinished(OrderCirculateTakingQueryParam param) {
-        List<KwtWaybillOrder> wbOrderByTruckNo = waybillOrderRepository.findWbOrderByTruckNoAndStatus(param.getTruckNo(), FORBIDDEN_STATUSES);
+    private void checkTruckUnfinished(OrderCirculateTakingQueryParam param, KwtLogisticsOrder logOrder) {
+        // 原矿运输
+        List<KwtWaybillOrder> wbOrderByTruckNo;
+        if (Objects.equals(1, logOrder.getOrderType())) {
+            wbOrderByTruckNo = waybillOrderRepository.findWbOrderByTruckNoAndStatus(param.getTruckNo(), RAW_ORE_FORBIDDEN_STATUSES);
+        } else {
+            // 正常流程
+            wbOrderByTruckNo = waybillOrderRepository.findWbOrderByTruckNoAndStatus(param.getTruckNo(), FORBIDDEN_STATUSES);
+        }
         if (CollectionUtils.isNotEmpty(wbOrderByTruckNo)) {
             throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_UNFINISHED, "当前车辆有未完成的状态,不可继续接单");
         }
@@ -295,7 +349,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
      *
      * @param truckNo
      */
-    private BigDecimal queryCurTruckLoadVolume(RTruckVo truckNo, OrderDetailVo tradeOrder) {
+    private BigDecimal queryCurTruckLoadVolume(RTruckVo truckNo, OrderDetailVo tradeOrder, KwtLogisticsOrder logOrder) {
         log.info("开始计算当前车辆任务量!");
         //核定载重
         BigDecimal actualWeight = truckNo.getLegalLoad();
@@ -314,8 +368,8 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
             log.info("车辆无皮重,按80%核定载重计算,车辆任务量:{}", loadVolume);
         }
 
-        //订单余量
-        BigDecimal remainingAmount = getRemainingAmount(tradeOrder);
+        //订单余量:区分正常流程和原矿运输
+        BigDecimal remainingAmount = getRawOreSupAmount(logOrder);
 
         // 最终接取的任务量
         BigDecimal taskAmount;
@@ -383,6 +437,69 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         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;
+    }
+
     /**
      * 创建物流运单
      *

+ 7 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtGatekeeperWaybillOrder.java

@@ -139,4 +139,11 @@ public class KwtGatekeeperWaybillOrder implements Serializable {
      */
     private Long updateUser;
 
+    /**
+     * 地磅id
+     */
+    private Long weighbridgeId;
+
+
+
 }

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrder.java

@@ -264,5 +264,6 @@ public class KwtLogisticsOrder implements Serializable {
 
     @TableField(exist = false)
     private String yearAndMonth;
+    private Integer orderType;
 
 }

+ 4 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrder.java

@@ -206,4 +206,8 @@ public class KwtWaybillOrder implements Serializable {
     //用于存储动态状态
     @TableField(exist = false)
     private Integer targetStatus;
+
+    //用于存储动态状态
+    @TableField(exist = false)
+    private Boolean isExistWeighbridges;
 }