Jelajahi Sumber

运单详情新增是否超过损货率

donglang 2 minggu lalu
induk
melakukan
5f57766a79

+ 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;
+    }
+
     /**
      * 计算贸易订单余量
      * 逻辑:贸易订单总量 - (所有关联物流订单下,非取消/完成状态的子运单委托量 + 对应计费模式的磅单量)