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

运单分页列表新增货损率

donglang 5 часов назад
Родитель
Сommit
63f4ea14c0

+ 12 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderResp.java

@@ -185,5 +185,17 @@ public class WaybillOrderResp implements Serializable {
     @Schema(description = "门卫订单主键id")
     private Long gatekeeperId;
 
+    /**
+     * 货损率(装货量-卸货量)*装货量*100%
+     */
+    @Schema(description = "货损率")
+    private BigDecimal lossRate;
+
+    /**
+     * 货损率是否超过千分之三
+     */
+    @Schema(description = "货损率是否超过千分之三")
+    private Boolean isPassReason;
+
 
 }

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

@@ -154,6 +154,7 @@ public class KwtWaybillOrderV1Service {
     private final KwtWaybillOrderNodeRepository kwtWaybillOrderNodeRepository;
     private final VehicleTraceClient vehicleTraceClient;
     private final KwtGatekeeperWaybillOrderRepository gatekeeperWaybillOrderRepository;
+    private final KwtLogisticsOrderContractRepository logisticsOrderContractRepository;
 
     @Resource
     private StreamBridge streamBridge;
@@ -4140,8 +4141,8 @@ public class KwtWaybillOrderV1Service {
         return endDate;
     }
 
-    @NotNull
-    private static WaybillOrderResp getWaybillOrderResp(KwtWaybillOrderSubtask record, Map<Long, KwtWaybillOrder> finalWaybillOrderIdAndBillOrderMap,
+
+    private WaybillOrderResp getWaybillOrderResp(KwtWaybillOrderSubtask record, Map<Long, KwtWaybillOrder> finalWaybillOrderIdAndBillOrderMap,
                                                         Map<String, KwtLogisticsOrderUnit> finalLogOrderIdUnitTypeKeyAndUnitMap,
                                                         Map<Long, KwtLogisticsOrderGoods> finalLogOrderIdAndGoodsIdMap,
                                                         Map<Long, KwpGoods> kwpGoodsMap,
@@ -4275,6 +4276,19 @@ public class KwtWaybillOrderV1Service {
         }
 
         KwtGatekeeperWaybillOrder gatekeeper = gatekeeperMap.getOrDefault(billOrder.getId(), new KwtGatekeeperWaybillOrder());
+        if (Objects.equals(logOrder.getOrderType(), 1) && Objects.equals(gatekeeper.getType(), 2)){
+            // 装货重量
+            BigDecimal loadAmount = tareAmountTicket.getAmount();
+
+            //卸货净重
+            KwtWaybillOrderTicket unloadTicket = ticketMap.getOrDefault(billOrder.getId() + "-" + 2, new KwtWaybillOrderTicket());
+            BigDecimal unloadAmount = unloadTicket.getAmount();
+
+            //计算货损率
+            BigDecimal lossRate = calculateLossRate2(loadAmount, unloadAmount);
+            waybillOrderResp.setLossRate(lossRate);
+            waybillOrderResp.setIsPassReason(isLossRateExceeded(logOrder, lossRate));
+        }
         waybillOrderResp.setGatekeeperId(gatekeeper.getId());
 
         return waybillOrderResp;
@@ -4870,6 +4884,45 @@ public class KwtWaybillOrderV1Service {
         return "0.00%";
     }
 
+    /**
+     * 计算货损率
+     */
+    private static BigDecimal calculateLossRate2(BigDecimal loadAmount, BigDecimal unloadAmount) {
+        log.info("[门卫]开始计算货损率,装货净重:{},卸货净重:{}", com.alibaba.fastjson.JSON.toJSONString(loadAmount), com.alibaba.fastjson.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("[门卫]计算货损率完成,货损率:{}", com.alibaba.fastjson.JSON.toJSONString(lossRate));
+        return lossRate;
+    }
+
+    /**
+     * 校验货损率是否超过千分之三
+     */
+    private boolean isLossRateExceeded(KwtLogisticsOrder logOrder, BigDecimal lossRate) {
+        log.info("[门卫]开始计算货损率是否超过配置值,物流订单:{},货损率:{}", com.alibaba.fastjson.JSON.toJSONString(logOrder), com.alibaba.fastjson.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;
+    }
+
     /**
      * 转换为称重记录
      */