|
|
@@ -30,6 +30,7 @@ import com.sckw.transport.model.enuma.WeighbridgeTypeEnum;
|
|
|
import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
|
|
|
import com.sckw.transport.model.param.forklift.request.GatekeeperOrderIsPassParam;
|
|
|
import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
|
|
|
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassReasonParam;
|
|
|
import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
|
|
|
import com.sckw.transport.model.vo.StatisticsWaybillResp;
|
|
|
import com.sckw.transport.repository.*;
|
|
|
@@ -41,6 +42,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
@@ -423,6 +425,21 @@ public class GatekeeperOrderService {
|
|
|
gatekeeper.setPrEntId(orderUnit.getEntId());
|
|
|
gatekeeper.setPrEntName(orderUnit.getFirmName());
|
|
|
}
|
|
|
+
|
|
|
+ // 原矿运输
|
|
|
+ if (isRawOre) {
|
|
|
+ //装货净重
|
|
|
+ BigDecimal loadAmount = ticket.getAmount();
|
|
|
+ //卸货净重
|
|
|
+ KwtWaybillOrderTicket unloadTicket = waybillOrderTicketMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId() + "-" + 2, new KwtWaybillOrderTicket());
|
|
|
+ BigDecimal unloadAmount = unloadTicket.getAmount();
|
|
|
+
|
|
|
+ //计算货损率
|
|
|
+ BigDecimal lossRate = calculateLossRate(loadAmount, unloadAmount);
|
|
|
+ gatekeeper.setLossRate(lossRate);
|
|
|
+ gatekeeper.setIsPassReason(isLossRateExceeded(lossRate));
|
|
|
+ }
|
|
|
+
|
|
|
gatekeeper.setOrderType(logOrder.getOrderType());
|
|
|
gatekeeper.setOrderTypeDesc(Objects.equals(logOrder.getOrderType(), 1) ? "原矿运输" : "产品销售");
|
|
|
|
|
|
@@ -430,6 +447,26 @@ public class GatekeeperOrderService {
|
|
|
return gatekeeper;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 计算货损率
|
|
|
+ */
|
|
|
+ private static BigDecimal calculateLossRate(BigDecimal loadAmount, BigDecimal unloadAmount) {
|
|
|
+ if (loadAmount != null && unloadAmount != null && loadAmount.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ return loadAmount.subtract(unloadAmount)
|
|
|
+ .divide(loadAmount, 4, RoundingMode.HALF_UP)
|
|
|
+ .setScale(2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验货损率是否超过千分之三
|
|
|
+ */
|
|
|
+ private static boolean isLossRateExceeded(BigDecimal lossRate) {
|
|
|
+ BigDecimal threshold = new BigDecimal("0.003");
|
|
|
+ return lossRate.compareTo(threshold) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 处理异常车辆数据
|
|
|
* @param param
|
|
|
@@ -1032,6 +1069,26 @@ public class GatekeeperOrderService {
|
|
|
return subtask;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 校验是否可放行
|
|
|
+ * @param gatekeeper
|
|
|
+ */
|
|
|
+ public void savePassReason(GatekeeperOrderPassReasonParam gatekeeper) {
|
|
|
+ log.info("[门卫放行原因]保存放行原因, param:{}", JSON.toJSONString(gatekeeper));
|
|
|
+ KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository.getById(gatekeeper.getId());
|
|
|
+ if (gatekeeperWaybillOrder == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "[门卫放行原因]门卫订单不存在!");
|
|
|
+ }
|
|
|
+ KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(gatekeeperWaybillOrder.getLOrderId());
|
|
|
+ if (waybillOrder == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "[门卫放行原因]运单不存在!");
|
|
|
+ }
|
|
|
+ waybillOrder.setPassReason(gatekeeper.getPassReason());
|
|
|
+ waybillOrder.setPassUrl(gatekeeper.getPassUrl());
|
|
|
+ waybillOrderRepository.updateById(waybillOrder);
|
|
|
+ log.info("[门卫放行原因]保存放行原因完成!");
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 校验是否可放行
|
|
|
* @param gatekeeper
|