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