|
|
@@ -23,10 +23,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* Author: donglang
|
|
|
@@ -36,7 +34,7 @@ import java.util.Objects;
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
-public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCmeIntoWeighParam>{
|
|
|
+public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCmeIntoWeighParam> {
|
|
|
|
|
|
@Autowired
|
|
|
private KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
|
|
|
@@ -57,7 +55,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
|
|
|
@Override
|
|
|
protected void doBusiness(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
|
|
|
//1.填充运单皮重
|
|
|
- LambdaQueryWrapper<KwtWaybillOrderTicket> queryWrapper = Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
|
|
|
+ LambdaQueryWrapper<KwtWaybillOrderTicket> queryWrapper = Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
|
|
|
.eq(KwtWaybillOrderTicket::getWOrderId, param.getWaybillOrderId())
|
|
|
.eq(KwtWaybillOrderTicket::getType, AddressTypeEnum.SHIPMENT.getCode());
|
|
|
KwtWaybillOrderTicket orderTicket = waybillOrderTicketRepository.getOne(queryWrapper);
|
|
|
@@ -112,6 +110,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
|
|
|
|
|
|
/**
|
|
|
* 自动派单计算分值
|
|
|
+ *
|
|
|
* @param param
|
|
|
* @param waybillOrder
|
|
|
*/
|
|
|
@@ -131,64 +130,34 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
|
|
|
}
|
|
|
|
|
|
|
|
|
- /**
|
|
|
- * 校验司机到达装货点是否超时
|
|
|
- * @param waybillOrder
|
|
|
- */
|
|
|
- private void checkArrivedLoadingPointTimeout(KwtWaybillOrder waybillOrder) {
|
|
|
- //计算司机到达装货点是否超时
|
|
|
- Boolean isTimeOut = isTimeOut(waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
- if (isTimeOut) {
|
|
|
- DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
|
|
|
- Integer notOnTimeArrive = rulesVO.getNotOnTimeArriveScore();
|
|
|
- if (notOnTimeArrive <= 0) {
|
|
|
- log.warn("【司机未按时到场】司机扣分失败,企业{}的司机未按时到场分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
- throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】分数配置需大于0!");
|
|
|
- }
|
|
|
- //1、更新司机分数(减分)
|
|
|
- notOnTimeArrive = -Math.abs(notOnTimeArrive);
|
|
|
- Long supEntId = getSupplierId(waybillOrder);
|
|
|
- updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), notOnTimeArrive, "司机未按时到场");
|
|
|
-
|
|
|
- //2、更新企业分数(减分)
|
|
|
- updateLogEntScore(waybillOrder, supEntId, notOnTimeArrive, "司机未按时到场");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 司机到达装货点是否超时
|
|
|
- * @param entId
|
|
|
- */
|
|
|
- private Boolean isTimeOut(Long entId, Long wOrderId) {
|
|
|
- // 获取自动派单系数配置(司机超时限制)
|
|
|
- TruckDispatchCoefficientVO truckDispatchVO = getAutoTruckDispatchByEntId(entId);
|
|
|
- Integer driverTimeout = truckDispatchVO.getDriverTimeoutLimit();
|
|
|
- if (driverTimeout <= 0) {
|
|
|
- log.warn("【司机未按时到场】企业{}的司机超时限制配置异常,运单ID:{}", entId,wOrderId);
|
|
|
- throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】司机超时限制配置需大于0!");
|
|
|
- }
|
|
|
- //司机接单时间
|
|
|
- KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(wOrderId, CarWaybillV1Enum.PENDING_VEHICLE.getCode());
|
|
|
- Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
|
|
|
- //司机到底装货点时间
|
|
|
- KwtWaybillOrderNode comeIntoNode = getNodesByOrderId(wOrderId, CarWaybillV1Enum.REFUSE_TRAFFIC.getCode());
|
|
|
- Date comeIntoTime = comeIntoNode.getCreateTime() != null ? comeIntoNode.getCreateTime() : null;
|
|
|
-
|
|
|
- // 计算两个时间的分钟差
|
|
|
- Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, comeIntoTime);
|
|
|
- //超时
|
|
|
- if (timeDiffMinutes > driverTimeout.longValue()) {
|
|
|
- log.info("司机到场耗时超时!司机超时限制:" + driverTimeout + "分钟,实际:" + timeDiffMinutes + "分钟");
|
|
|
- return true;
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
+// /**
|
|
|
+// * 校验司机到达装货点是否超时
|
|
|
+// * @param waybillOrder
|
|
|
+// */
|
|
|
+// private void checkArrivedLoadingPointTimeout(KwtWaybillOrder waybillOrder) {
|
|
|
+// //计算司机到达装货点是否超时
|
|
|
+// Boolean isTimeOut = isTimeOut(waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
+// if (isTimeOut) {
|
|
|
+// DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
|
|
|
+// Integer notOnTimeArrive = rulesVO.getNotOnTimeArriveScore();
|
|
|
+// if (notOnTimeArrive <= 0) {
|
|
|
+// log.warn("【司机未按时到场】司机扣分失败,企业{}的司机未按时到场分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
|
|
|
+// throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】分数配置需大于0!");
|
|
|
+// }
|
|
|
+// //1、更新司机分数(减分)
|
|
|
+// notOnTimeArrive = -Math.abs(notOnTimeArrive);
|
|
|
+// Long supEntId = getSupplierId(waybillOrder);
|
|
|
+// updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), notOnTimeArrive, "司机未按时到场");
|
|
|
+//
|
|
|
+// //2、更新企业分数(减分)
|
|
|
+// updateLogEntScore(waybillOrder, supEntId, notOnTimeArrive, "司机未按时到场");
|
|
|
+// }
|
|
|
+// }
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 校验连续按时到场次数
|
|
|
+ *
|
|
|
* @param waybillOrder
|
|
|
*/
|
|
|
private void checkContinuousArriveTimes(KwtWaybillOrder waybillOrder) {
|
|
|
@@ -206,44 +175,92 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
|
|
|
|
|
|
//查询该司机连续到达装货点的节点数据
|
|
|
List<KwtWaybillOrderNode> waybillOrderNodeList = getWaybillOrderNodesByStatus(waybillOrder, continuousOnTimeArriveTimes, CarWaybillV1Enum.REFUSE_TRAFFIC);
|
|
|
- if (waybillOrderNodeList == null) {
|
|
|
+ List<KwtWaybillOrderNode> recentNodes = getWaybillOrderDistantNodeList(waybillOrderNodeList, continuousOnTimeArriveTimes);
|
|
|
+ if (recentNodes.size() != continuousOnTimeArriveTimes) {
|
|
|
+ log.info("司机{}最近按时到场记录不足{}条,当前:{}", waybillOrder.getDriverId(), continuousOnTimeArriveTimes, recentNodes.size());
|
|
|
return;
|
|
|
}
|
|
|
- //记录连续到场次数
|
|
|
- int continuousCount = 0;
|
|
|
- List<Long> qualifiedNodeIds = new ArrayList<>();
|
|
|
List<Long> nodeIds = new ArrayList<>();
|
|
|
- for (KwtWaybillOrderNode orderNode : waybillOrderNodeList) {
|
|
|
- //计算每次运单到达场地耗时时间
|
|
|
- if (isTimeOut(waybillOrder.getEntId(), orderNode.getWOrderId())){
|
|
|
- log.info("司机{}存在超时情况,运单id:{}", orderNode.getDriverId(), orderNode.getWOrderId());
|
|
|
- return;
|
|
|
+ boolean allOnTime = true;
|
|
|
+ for (KwtWaybillOrderNode orderNode : recentNodes) {
|
|
|
+ if (orderNode.getContinuous() == 1) {
|
|
|
+ break;
|
|
|
}
|
|
|
- continuousCount++;
|
|
|
- qualifiedNodeIds.add(orderNode.getId());
|
|
|
-
|
|
|
- // 达到10次,返回最新的10条ID
|
|
|
- if (continuousCount >= continuousOnTimeArriveTimes) {
|
|
|
- // 截断前10条
|
|
|
- nodeIds = qualifiedNodeIds.subList(0, continuousOnTimeArriveTimes);
|
|
|
+ //计算每次运单到达场地耗时时间
|
|
|
+ if (isTimeOut(waybillOrder, orderNode.getWOrderId())) {
|
|
|
+ allOnTime = false;
|
|
|
break;
|
|
|
}
|
|
|
+ nodeIds.add(orderNode.getId());
|
|
|
}
|
|
|
- // 校验是否达到次数
|
|
|
- if (continuousCount < continuousOnTimeArriveTimes) {
|
|
|
- log.info("【司机连续按时到场】司机{}连续按时到场次数{},未达到配置阈值{}", waybillOrder.getDriverId(), continuousCount, continuousOnTimeArriveTimes);
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (allOnTime && nodeIds.size() == continuousOnTimeArriveTimes) {
|
|
|
+ //1. 给连续的N次节点数据打标
|
|
|
+ updateNode(waybillOrder, nodeIds, continuousOnTimeArriveTimes, continuousOnTimeScore);
|
|
|
|
|
|
- //1. 给连续的10次节点数据打标
|
|
|
- updateNode(waybillOrder, nodeIds, continuousOnTimeArriveTimes, continuousOnTimeScore);
|
|
|
+ //2 .更新司机分数(加分)
|
|
|
+ updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousOnTimeScore, "司机连续按时到场");
|
|
|
|
|
|
- //2 .更新司机分数(加分)
|
|
|
- updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), continuousOnTimeScore, "司机连续按时到场");
|
|
|
+ //3. 更新企业分数(加分)
|
|
|
+ updateLogEntScore(waybillOrder, supEntId, continuousOnTimeScore, "司机连续按时到场");
|
|
|
+ } else {
|
|
|
+ log.info("司机{}最近{}次中存在超时,未加分", waybillOrder.getDriverId(), continuousOnTimeArriveTimes);
|
|
|
+ }
|
|
|
|
|
|
- //3. 更新企业分数(加分)
|
|
|
- updateLogEntScore(waybillOrder, supEntId, continuousOnTimeScore, "司机连续按时到场");
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取去重后的节点数据
|
|
|
+ * @param waybillOrderNodeList
|
|
|
+ * @param continuousOnTimeArriveTimes
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<KwtWaybillOrderNode> getWaybillOrderDistantNodeList(List<KwtWaybillOrderNode> waybillOrderNodeList, Integer continuousOnTimeArriveTimes) {
|
|
|
+ //由于到达装货点有生成两条节点数据,需要过来出一条
|
|
|
+ List<KwtWaybillOrderNode> deduplicated = waybillOrderNodeList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ KwtWaybillOrderNode::getWOrderId,
|
|
|
+ node -> node,
|
|
|
+ (existing, replacement) ->
|
|
|
+ existing.getCreateTime().compareTo(replacement.getCreateTime()) >= 0 ? existing : replacement,
|
|
|
+ LinkedHashMap::new)
|
|
|
+ ).values()
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ //取continuousOnTimes条节点数据
|
|
|
+ return deduplicated.stream().sorted(Comparator.comparing(KwtWaybillOrderNode::getCreateTime).reversed())
|
|
|
+ .limit(continuousOnTimeArriveTimes)
|
|
|
+ .collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 司机到达装货点是否超时
|
|
|
+ *
|
|
|
+ * @param waybillOrder
|
|
|
+ */
|
|
|
+ private Boolean isTimeOut(KwtWaybillOrder waybillOrder, Long wOrderId) {
|
|
|
+ Long supEntId = getSupplierId(waybillOrder);
|
|
|
+ // 获取自动派单系数配置(司机超时限制)
|
|
|
+ TruckDispatchCoefficientVO truckDispatchVO = getAutoTruckDispatchByEntId(supEntId);
|
|
|
+ Integer driverTimeout = truckDispatchVO.getDriverTimeoutLimit();
|
|
|
+ if (driverTimeout <= 0) {
|
|
|
+ log.warn("【司机未按时到场】企业{}的司机超时限制配置异常,运单ID:{}", supEntId, wOrderId);
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】司机超时限制配置需大于0!");
|
|
|
+ }
|
|
|
+ //司机接单时间
|
|
|
+ KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(wOrderId, CarWaybillV1Enum.PENDING_VEHICLE.getCode());
|
|
|
+ Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
|
|
|
+ //司机到底装货点时间
|
|
|
+ KwtWaybillOrderNode comeIntoNode = getNodesByOrderId(wOrderId, CarWaybillV1Enum.REFUSE_TRAFFIC.getCode());
|
|
|
+ Date comeIntoTime = comeIntoNode.getCreateTime() != null ? comeIntoNode.getCreateTime() : null;
|
|
|
+
|
|
|
+ // 计算两个时间的分钟差
|
|
|
+ Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, comeIntoTime);
|
|
|
+ //超时
|
|
|
+ if (timeDiffMinutes > driverTimeout.longValue()) {
|
|
|
+ log.info("司机到场耗时超时!司机超时限制:" + driverTimeout + "分钟,实际:" + timeDiffMinutes + "分钟");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|