|
@@ -279,10 +279,6 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
protected void calculateAutoDispatchScore(WaybillOrderUnloadParam param, KwtWaybillOrder waybillOrder) {
|
|
protected void calculateAutoDispatchScore(WaybillOrderUnloadParam param, KwtWaybillOrder waybillOrder) {
|
|
|
-// if (true) {
|
|
|
|
|
-// //先不执行自动派单逻辑
|
|
|
|
|
-// return;
|
|
|
|
|
-// }
|
|
|
|
|
//查询运单装卸货地址
|
|
//查询运单装卸货地址
|
|
|
List<KwtWaybillOrderAddress> addressList = waybillOrderAddressRepository.queryByWOrderId(waybillOrder.getId());
|
|
List<KwtWaybillOrderAddress> addressList = waybillOrderAddressRepository.queryByWOrderId(waybillOrder.getId());
|
|
|
if (CollectionUtils.isEmpty(addressList)) {
|
|
if (CollectionUtils.isEmpty(addressList)) {
|
|
@@ -318,14 +314,16 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
@NotNull
|
|
@NotNull
|
|
|
private void checkFakeUnloadDistance(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
private void checkFakeUnloadDistance(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
|
log.info("校验司机是否虚假卸货:waybillOrderId:{}", waybillOrder.getId());
|
|
log.info("校验司机是否虚假卸货:waybillOrderId:{}", waybillOrder.getId());
|
|
|
|
|
+ //供应商
|
|
|
|
|
+ Long supEntId = getSupplierId(waybillOrder);
|
|
|
// 获取司机行为规则配置
|
|
// 获取司机行为规则配置
|
|
|
- DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
|
|
|
|
|
|
|
+ DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(supEntId);
|
|
|
//虚假卸货分数
|
|
//虚假卸货分数
|
|
|
Integer fakeUnloadScore = driverRulesVO.getFakeUnloadScore();
|
|
Integer fakeUnloadScore = driverRulesVO.getFakeUnloadScore();
|
|
|
//虚假卸货偏离距离
|
|
//虚假卸货偏离距离
|
|
|
Integer distance = driverRulesVO.getFakeUnloadDistance();
|
|
Integer distance = driverRulesVO.getFakeUnloadDistance();
|
|
|
if (fakeUnloadScore <= 0 || distance <= 0) {
|
|
if (fakeUnloadScore <= 0 || distance <= 0) {
|
|
|
- log.warn("【虚假卸货】企业{}的虚假卸货配置分数/偏差距离异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
|
|
|
|
+ log.warn("【虚假卸货】企业{}的虚假卸货配置分数/偏差距离异常,运单ID:{}", supEntId, waybillOrder.getId());
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【虚假卸货】配置分数/偏差距离需大于0!");
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【虚假卸货】配置分数/偏差距离需大于0!");
|
|
|
}
|
|
}
|
|
|
//运单应卸货地址
|
|
//运单应卸货地址
|
|
@@ -351,13 +349,10 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
log.info("【虚假卸货】运单ID={},卸货地址偏差={}KM",waybillOrder.getId(), distanceKm);
|
|
log.info("【虚假卸货】运单ID={},卸货地址偏差={}KM",waybillOrder.getId(), distanceKm);
|
|
|
//1、更新司机分数(减分)
|
|
//1、更新司机分数(减分)
|
|
|
fakeUnloadScore = -Math.abs(fakeUnloadScore);
|
|
fakeUnloadScore = -Math.abs(fakeUnloadScore);
|
|
|
- Long supEntId = getSupplierId(waybillOrder);
|
|
|
|
|
updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), fakeUnloadScore, "虚假卸货");
|
|
updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), fakeUnloadScore, "虚假卸货");
|
|
|
//2、更新企业分数(减分)
|
|
//2、更新企业分数(减分)
|
|
|
updateLogEntScore(waybillOrder, supEntId, fakeUnloadScore, "虚假卸货");
|
|
updateLogEntScore(waybillOrder, supEntId, fakeUnloadScore, "虚假卸货");
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -366,22 +361,22 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
* @param addressMap 运单地址
|
|
* @param addressMap 运单地址
|
|
|
*/
|
|
*/
|
|
|
protected void checkWaybillCompletionTimeout(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
protected void checkWaybillCompletionTimeout(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
|
|
|
+ Long supEntId = getSupplierId(waybillOrder);
|
|
|
//查询司机行为规则配置
|
|
//查询司机行为规则配置
|
|
|
- DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
|
|
|
|
|
|
|
+ DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(supEntId);
|
|
|
//严重超时倍数
|
|
//严重超时倍数
|
|
|
BigDecimal timeoutMultiple = rulesVO.getUnloadSeriousTimeoutMultiple();
|
|
BigDecimal timeoutMultiple = rulesVO.getUnloadSeriousTimeoutMultiple();
|
|
|
//严重超时分数
|
|
//严重超时分数
|
|
|
Integer timeoutScore = rulesVO.getUnloadSeriousTimeoutScore();
|
|
Integer timeoutScore = rulesVO.getUnloadSeriousTimeoutScore();
|
|
|
if (timeoutMultiple == null || timeoutMultiple.compareTo(BigDecimal.ZERO) <= 0 || timeoutScore <= 0) {
|
|
if (timeoutMultiple == null || timeoutMultiple.compareTo(BigDecimal.ZERO) <= 0 || timeoutScore <= 0) {
|
|
|
- log.warn("【卸货严重超时】扣分失败,企业{}的司机卸货严重超时倍数/分数配置为空,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
|
|
|
|
+ log.warn("【卸货严重超时】扣分失败,企业{}的司机卸货严重超时倍数/分数配置为空,运单ID:{}", supEntId, waybillOrder.getId());
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【卸货严重超时】配置严重超时倍数/分数需大于0!");
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【卸货严重超时】配置严重超时倍数/分数需大于0!");
|
|
|
}
|
|
}
|
|
|
//校验是否超时
|
|
//校验是否超时
|
|
|
- Boolean timeOut = isTimeOut(waybillOrder, addressMap, timeoutMultiple);
|
|
|
|
|
|
|
+ Boolean timeOut = isTimeOut(supEntId, waybillOrder, addressMap, timeoutMultiple);
|
|
|
if (timeOut) {
|
|
if (timeOut) {
|
|
|
//1、更新司机分数(减分)
|
|
//1、更新司机分数(减分)
|
|
|
timeoutScore = -Math.abs(timeoutScore);
|
|
timeoutScore = -Math.abs(timeoutScore);
|
|
|
- Long supEntId = getSupplierId(waybillOrder);
|
|
|
|
|
updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), timeoutScore, "卸货严重超时");
|
|
updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), timeoutScore, "卸货严重超时");
|
|
|
//2、更新企业分数(减分)
|
|
//2、更新企业分数(减分)
|
|
|
updateLogEntScore(waybillOrder, supEntId, timeoutScore, "卸货严重超时");
|
|
updateLogEntScore(waybillOrder, supEntId, timeoutScore, "卸货严重超时");
|
|
@@ -394,12 +389,12 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
* @param waybillOrder 运单
|
|
* @param waybillOrder 运单
|
|
|
* @param addressMap 运单地址
|
|
* @param addressMap 运单地址
|
|
|
*/
|
|
*/
|
|
|
- protected Boolean isTimeOut(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap, BigDecimal timeoutMultiple) {
|
|
|
|
|
|
|
+ protected Boolean isTimeOut(Long supEntId, KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap, BigDecimal timeoutMultiple) {
|
|
|
log.info("校验司机运单完成是否超时:运单ID:{}", waybillOrder.getId());
|
|
log.info("校验司机运单完成是否超时:运单ID:{}", waybillOrder.getId());
|
|
|
//运单总耗时
|
|
//运单总耗时
|
|
|
Long orderTotalTimes = calOrderTotalTimes(waybillOrder);
|
|
Long orderTotalTimes = calOrderTotalTimes(waybillOrder);
|
|
|
//平台配置的单趟总耗时
|
|
//平台配置的单趟总耗时
|
|
|
- Integer singleTripTotalTimes = calSingleTripTotalTimes(waybillOrder, addressMap);
|
|
|
|
|
|
|
+ Integer singleTripTotalTimes = calSingleTripTotalTimes(supEntId, waybillOrder, addressMap);
|
|
|
//计算超时阈值
|
|
//计算超时阈值
|
|
|
BigDecimal threshold = timeoutMultiple.compareTo(BigDecimal.ZERO) == 0 ?
|
|
BigDecimal threshold = timeoutMultiple.compareTo(BigDecimal.ZERO) == 0 ?
|
|
|
new BigDecimal(singleTripTotalTimes) : timeoutMultiple.multiply(new BigDecimal(singleTripTotalTimes));
|
|
new BigDecimal(singleTripTotalTimes) : timeoutMultiple.multiply(new BigDecimal(singleTripTotalTimes));
|
|
@@ -419,10 +414,10 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
private Long calOrderTotalTimes(KwtWaybillOrder waybillOrder) {
|
|
private Long calOrderTotalTimes(KwtWaybillOrder waybillOrder) {
|
|
|
//司机接单时间
|
|
//司机接单时间
|
|
|
KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.PENDING_VEHICLE.getCode());
|
|
KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.PENDING_VEHICLE.getCode());
|
|
|
- Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
|
|
|
|
|
|
|
+ Date takingOrderTime = takingOrderNodes.getCreateTime();
|
|
|
//司机完成运单时间
|
|
//司机完成运单时间
|
|
|
KwtWaybillOrderNode overOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.COMPLETED.getCode());
|
|
KwtWaybillOrderNode overOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.COMPLETED.getCode());
|
|
|
- Date overOrderTime = overOrderNodes.getCreateTime() != null ? overOrderNodes.getCreateTime() : null;
|
|
|
|
|
|
|
+ Date overOrderTime = overOrderNodes.getCreateTime();
|
|
|
//运单总耗时(分钟)
|
|
//运单总耗时(分钟)
|
|
|
Long orderTotalTimes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, overOrderTime);
|
|
Long orderTotalTimes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, overOrderTime);
|
|
|
log.info("司机完成运单总耗时:{}", orderTotalTimes);
|
|
log.info("司机完成运单总耗时:{}", orderTotalTimes);
|
|
@@ -435,9 +430,9 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
* @param addressMap
|
|
* @param addressMap
|
|
|
* @return
|
|
* @return
|
|
|
*/
|
|
*/
|
|
|
- private Integer calSingleTripTotalTimes(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
|
|
|
|
|
+ private Integer calSingleTripTotalTimes(Long supEntId, KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
|
// 获取自动派单系数配置(单趟耗时 = 装货时间 + 卸货时间 + 运输时间 + 返回时间)
|
|
// 获取自动派单系数配置(单趟耗时 = 装货时间 + 卸货时间 + 运输时间 + 返回时间)
|
|
|
- TruckDispatchCoefficientVO truckDispatchVO = getAutoTruckDispatchByEntId(waybillOrder.getEntId());
|
|
|
|
|
|
|
+ TruckDispatchCoefficientVO truckDispatchVO = getAutoTruckDispatchByEntId(supEntId);
|
|
|
//装货时长
|
|
//装货时长
|
|
|
Integer vehicleLoadingHours = truckDispatchVO.getVehicleLoadingHours();
|
|
Integer vehicleLoadingHours = truckDispatchVO.getVehicleLoadingHours();
|
|
|
//卸货货时长
|
|
//卸货货时长
|
|
@@ -446,7 +441,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
Integer vehicleAvgSpeed = truckDispatchVO.getVehicleAvgSpeed();
|
|
Integer vehicleAvgSpeed = truckDispatchVO.getVehicleAvgSpeed();
|
|
|
if (vehicleLoadingHours <= 0 || vehicleUnloadingHours <= 0 || vehicleAvgSpeed <= 0) {
|
|
if (vehicleLoadingHours <= 0 || vehicleUnloadingHours <= 0 || vehicleAvgSpeed <= 0) {
|
|
|
log.warn("企业{}的司机装货时长/卸货时长/平均行驶速度配置数据异常(装货:{},卸货:{},速度:{}),运单ID:{}",
|
|
log.warn("企业{}的司机装货时长/卸货时长/平均行驶速度配置数据异常(装货:{},卸货:{},速度:{}),运单ID:{}",
|
|
|
- waybillOrder.getEntId(), vehicleLoadingHours, vehicleUnloadingHours, vehicleAvgSpeed, waybillOrder.getId());
|
|
|
|
|
|
|
+ supEntId, vehicleLoadingHours, vehicleUnloadingHours, vehicleAvgSpeed, waybillOrder.getId());
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机配置的装货时长/卸货时长/平均行驶速度需要大于0!");
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "司机配置的装货时长/卸货时长/平均行驶速度需要大于0!");
|
|
|
}
|
|
}
|
|
|
//查询运单装卸货地址
|
|
//查询运单装卸货地址
|
|
@@ -491,14 +486,15 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
* @param waybillOrder
|
|
* @param waybillOrder
|
|
|
*/
|
|
*/
|
|
|
private void checkContinuousUnload(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
private void checkContinuousUnload(KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderAddress> addressMap) {
|
|
|
|
|
+ Long supEntId = getSupplierId(waybillOrder);
|
|
|
// 获取司机行为规则配置(连续准时卸货次数)
|
|
// 获取司机行为规则配置(连续准时卸货次数)
|
|
|
- DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
|
|
|
|
|
|
|
+ DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(supEntId);
|
|
|
//连续卸货次数
|
|
//连续卸货次数
|
|
|
Integer continuousOnTimes = driverRulesVO.getContinuousOnTimeUnloadTimes();
|
|
Integer continuousOnTimes = driverRulesVO.getContinuousOnTimeUnloadTimes();
|
|
|
//连续卸货分数
|
|
//连续卸货分数
|
|
|
Integer continuousUnloadScore = driverRulesVO.getContinuousOnTimeUnloadScore();
|
|
Integer continuousUnloadScore = driverRulesVO.getContinuousOnTimeUnloadScore();
|
|
|
if (continuousOnTimes <= 0 || continuousUnloadScore <= 0) {
|
|
if (continuousOnTimes <= 0 || continuousUnloadScore <= 0) {
|
|
|
- log.warn("【连续准时卸货】该司机无需加分,企业{}的连续按时到场配置次数/分数异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
|
|
|
|
+ log.warn("【连续准时卸货】该司机无需加分,企业{}的连续按时到场配置次数/分数异常,运单ID:{}", supEntId, waybillOrder.getId());
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【连续准时卸货】配置次数/分数需大于0!");
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【连续准时卸货】配置次数/分数需大于0!");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -513,7 +509,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
List<Long> nodeIds = new ArrayList<>();
|
|
List<Long> nodeIds = new ArrayList<>();
|
|
|
for (KwtWaybillOrderNode orderNode : waybillOrderNodeList) {
|
|
for (KwtWaybillOrderNode orderNode : waybillOrderNodeList) {
|
|
|
KwtWaybillOrder wOrder = getWaybillOrder(orderNode.getWOrderId());
|
|
KwtWaybillOrder wOrder = getWaybillOrder(orderNode.getWOrderId());
|
|
|
- Boolean timeOut = isTimeOut(wOrder, addressMap, BigDecimal.ZERO);
|
|
|
|
|
|
|
+ Boolean timeOut = isTimeOut(supEntId, wOrder, addressMap, BigDecimal.ZERO);
|
|
|
if (timeOut) {
|
|
if (timeOut) {
|
|
|
log.info("司机{}存在超时情况,运单id:{}", orderNode.getDriverId(), orderNode.getWOrderId());
|
|
log.info("司机{}存在超时情况,运单id:{}", orderNode.getDriverId(), orderNode.getWOrderId());
|
|
|
return;
|
|
return;
|
|
@@ -536,7 +532,6 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
updateNode(waybillOrder, nodeIds, continuousCount, continuousUnloadScore);
|
|
updateNode(waybillOrder, nodeIds, continuousCount, continuousUnloadScore);
|
|
|
|
|
|
|
|
//2 .更新司机分数(加分)
|
|
//2 .更新司机分数(加分)
|
|
|
- Long supEntId = getSupplierId(waybillOrder);
|
|
|
|
|
updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousUnloadScore, "连续准时卸货");
|
|
updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousUnloadScore, "连续准时卸货");
|
|
|
|
|
|
|
|
//3. 更新企业分数(加分)
|
|
//3. 更新企业分数(加分)
|