Explorar el Código

Merge remote-tracking branch 'origin/dev_20260131_youshen430' into dev_20260131_youshen430

xucaiqin hace 2 semanas
padre
commit
0e86069469

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderStatusResp.java

@@ -246,4 +246,10 @@ public class WaybillOrderStatusResp implements Serializable {
      */
     private String passUrl;
 
+    /**
+     * 货损率是否超过配置的货损率
+     */
+    @Schema(description = "货损率是否超过配置的货损率")
+    private Boolean isPassReason;
+
 }

+ 17 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/GatekeeperOrderResp.java

@@ -227,5 +227,22 @@ public class GatekeeperOrderResp implements Serializable {
     @Schema(description = "货损率是否超过千分之三")
     private Boolean isPassReason;
 
+    /**
+     * 皮重
+     */
+    @Schema(description = "卸货皮重")
+    private BigDecimal unloadingTareAmount;
+
+    /**
+     * 毛重
+     */
+    @Schema(description = "卸货毛重")
+    private BigDecimal unloadingGrossAmount;
+
+    /**
+     * 卸货净重
+     */
+    @Schema(description = "卸货净重")
+    private BigDecimal unloadAmount;
 
 }

+ 5 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -14,6 +14,7 @@ import com.google.common.collect.Sets;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.feign.LogisticsScoreFeignService;
 import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
+import com.sckw.contract.api.model.vo.KwcContractLogisticsDto;
 import com.sckw.contract.api.model.vo.TradeContractGoodsDto;
 import com.sckw.contract.api.model.vo.TradeContractUnitDto;
 import com.sckw.core.common.enums.enums.DictEnum;
@@ -152,6 +153,7 @@ public class KwtWaybillOrderV1Service {
     private final KwtWaybillOrderTicketRepository kwtWaybillOrderTicketRepository;
     private final KwtWaybillOrderNodeRepository kwtWaybillOrderNodeRepository;
     private final VehicleTraceClient vehicleTraceClient;
+
     @Resource
     private StreamBridge streamBridge;
     @DubboReference(version = "1.0.0", group = "design", check = false)
@@ -4652,7 +4654,7 @@ public class KwtWaybillOrderV1Service {
      * @param tradeContractUnitDtos 贸易合同单位列表
      * @return 运单详情响应对象
      */
-    private static WaybillOrderDetailResp getWaybillOrderDetailResp(KwtWaybillOrderSubtask subtask,
+    private WaybillOrderDetailResp getWaybillOrderDetailResp(KwtWaybillOrderSubtask subtask,
                                                                     KwtWaybillOrder billOrder,
                                                                     KwtLogisticsOrder logOrder,
                                                                     RTruckVo truck, RFleetVo fleet,
@@ -4784,7 +4786,8 @@ public class KwtWaybillOrderV1Service {
         BigDecimal unloadAmount = subtask.getUnloadAmount();
 
         resp.setLoadCompleteRate(calculatePercentage(loadAmount, entrustAmount));
-        resp.setLossRate(calculateLossRate(loadAmount, unloadAmount));
+        String lossRate = calculateLossRate(loadAmount, unloadAmount);
+        resp.setLossRate(lossRate);
 
         // 轨迹记录
         if (!CollectionUtils.isEmpty(nodeList)) {

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -439,6 +439,9 @@ public class GatekeeperOrderService {
             //卸货净重
             KwtWaybillOrderTicket unloadTicket = waybillOrderTicketMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId() + "-" + 2, new KwtWaybillOrderTicket());
             BigDecimal unloadAmount = unloadTicket.getAmount();
+            gatekeeper.setUnloadAmount(unloadAmount);
+            gatekeeper.setUnloadingTareAmount(unloadTicket.getTareAmount());
+            gatekeeper.setUnloadingGrossAmount(unloadTicket.getGrossAmount());
 
             //计算货损率
             BigDecimal lossRate = calculateLossRate(loadAmount, unloadAmount);

+ 58 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.model.vo.KwcContractLogisticsDto;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
@@ -75,6 +77,7 @@ public class WaybillOrderService {
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
     private final KwtWaybillOrderWeighbridgeRepository waybillOrderWeighbridgeRepository;
+    private final KwtLogisticsOrderContractRepository logisticsOrderContractRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     RemoteSystemService remoteSystemService;
@@ -84,6 +87,8 @@ public class WaybillOrderService {
     RemoteFleetService remoteFleetService;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     GoodsInfoService goodsInfoService;
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteContractService remoteContractService;
 
     private final TakingOrderHandler takingOrderHandler;
     private final CancelHandler cancelHandler;
@@ -1184,10 +1189,63 @@ public class WaybillOrderService {
             wbOrderResp.setStatusDesc("未知状态");
         }
 
+        // 原矿运输订单计算是否超过货损率
+        if (Objects.equals(logOrder.getOrderType(), 1)) {
+            //装货净重
+            BigDecimal loadAmount = tareAmountTicket.getAmount();
+            //卸货净重
+            KwtWaybillOrderTicket unloadTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + 2, new KwtWaybillOrderTicket());
+            BigDecimal unloadAmount = unloadTicket.getAmount();
+
+            //计算货损率
+            BigDecimal lossRate = calculateLossRate(loadAmount, unloadAmount);
+            wbOrderResp.setIsPassReason(isLossRateExceeded(logOrder, lossRate));
+        }
+
         return wbOrderResp;
 
     }
 
+    /**
+     * 计算货损率
+     */
+    private static BigDecimal calculateLossRate(BigDecimal loadAmount, BigDecimal unloadAmount) {
+        log.info("[门卫]开始计算货损率,装货净重:{},卸货净重:{}", JSON.toJSONString(loadAmount), JSON.toJSONString(loadAmount));
+        BigDecimal lossRate = BigDecimal.ZERO;
+        if (loadAmount != null && unloadAmount != null && loadAmount.compareTo(BigDecimal.ZERO) > 0) {
+            lossRate = loadAmount.subtract(unloadAmount)
+                    .divide(loadAmount, 4, RoundingMode.HALF_UP)
+                    .setScale(2, RoundingMode.HALF_UP);
+            return lossRate;
+        }
+        log.info("[门卫]计算货损率完成,货损率:{}", JSON.toJSONString(lossRate));
+        return lossRate;
+
+    }
+
+    /**
+     * 校验货损率是否超过千分之三
+     */
+    private boolean isLossRateExceeded(KwtLogisticsOrder logOrder, BigDecimal lossRate) {
+        log.info("[门卫]开始计算货损率是否超过配置值,物流订单:{},货损率:{}", com.alibaba.fastjson2.JSON.toJSONString(logOrder), com.alibaba.fastjson2.JSON.toJSONString(lossRate));
+        KwtLogisticsOrderContract orderContract = logisticsOrderContractRepository.queryByLogOrderId(logOrder.getId());
+        if (orderContract == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_CONTRACT_NOT_FOUND, "物流订单无合同数据!");
+        }
+        KwcContractLogisticsDto contractLogisticsDto = remoteContractService.queryContractByContractId(orderContract.getContractId());
+        if (contractLogisticsDto == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "物流合同不存在!");
+        }
+        if (contractLogisticsDto.getAllowedError() == null || contractLogisticsDto.getAllowedError().compareTo(BigDecimal.ZERO) <= 0) {
+            return false;
+        }
+        // 查询出来的货损率为5,表示千分之5,需除以1000
+        BigDecimal allowedError = contractLogisticsDto.getAllowedError().divide(new BigDecimal("1000"), 6, RoundingMode.HALF_UP);
+
+        log.info("[门卫]计算货损率是否超过配置值完成,配置的货损率:{}", com.alibaba.fastjson.JSON.toJSONString(allowedError));
+        return lossRate.compareTo(allowedError) > 0;
+    }
+
     /**
      * 计算贸易订单余量
      * 逻辑:贸易订单总量 - (所有关联物流订单下,非取消/完成状态的子运单委托量 + 对应计费模式的磅单量)