|
|
@@ -1585,12 +1585,54 @@ public class kwfTruckTraceService {
|
|
|
// 输入的日期字符串
|
|
|
// LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
LocalDateTime dateTime = date.atTime(LocalTime.now());
|
|
|
+
|
|
|
+ // 如果存在异常类型集合,根据异常类型数量随机选择对应数量的轨迹点来设置异常
|
|
|
+ Random random = new Random();
|
|
|
+ // 轨迹点索引 -> 异常类型 的映射
|
|
|
+ Map<Integer, Integer> exceptionPointMap = new HashMap<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(req.getExceptionType()) && routePoints.size() > 0) {
|
|
|
+ List<Integer> exceptionTypes = req.getExceptionType();
|
|
|
+ int exceptionTypeCount = exceptionTypes.size();
|
|
|
+
|
|
|
+ // 异常类型有几种,就随机生成几种异常节点
|
|
|
+ // 随机选择对应数量的轨迹点索引(不重复)
|
|
|
+ Set<Integer> selectedIndexes = new HashSet<>();
|
|
|
+ while (selectedIndexes.size() < exceptionTypeCount && selectedIndexes.size() < routePoints.size()) {
|
|
|
+ selectedIndexes.add(random.nextInt(routePoints.size()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将每个异常类型分配给一个轨迹点
|
|
|
+ List<Integer> selectedIndexList = new ArrayList<>(selectedIndexes);
|
|
|
+ Collections.shuffle(selectedIndexList, random); // 打乱顺序,确保随机分配
|
|
|
+
|
|
|
+ for (int j = 0; j < exceptionTypeCount && j < selectedIndexList.size(); j++) {
|
|
|
+ int pointIndex = selectedIndexList.get(j);
|
|
|
+ int exceptionType = exceptionTypes.get(j);
|
|
|
+ exceptionPointMap.put(pointIndex, exceptionType);
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("异常类型数量:{},随机选择{}个轨迹点设置异常,轨迹点索引和异常类型映射:{}",
|
|
|
+ exceptionTypeCount, exceptionPointMap.size(), exceptionPointMap);
|
|
|
+ }
|
|
|
+
|
|
|
for (int i = 0; i < routePoints.size(); i++) {
|
|
|
LocUtils.RoutePoint routePoint = routePoints.get(i);
|
|
|
VehiclesTrajectoryReq vehiclesTrajectoryReq = getVehiclesTrajectoryReq(req, order, routePoint.getLongitude(), routePoint.getLatitude(), logisticsOrder, fleetByTruckId);
|
|
|
LocalDateTime localDateTime = dateTime.plusSeconds(i * 5L);
|
|
|
Timestamp timestamp = Timestamp.valueOf(localDateTime);
|
|
|
vehiclesTrajectoryReq.setTs(timestamp);
|
|
|
+
|
|
|
+ // 如果当前轨迹点被选中设置异常,则使用对应的异常类型
|
|
|
+ Integer selectedExceptionType = exceptionPointMap.get(i);
|
|
|
+ if (selectedExceptionType != null) {
|
|
|
+ // 设置状态为异常(异常类型的code转换为字符串)
|
|
|
+ vehiclesTrajectoryReq.setStatus(String.valueOf(selectedExceptionType));
|
|
|
+ log.info("轨迹点[{}]设置异常类型:{}", i, selectedExceptionType);
|
|
|
+ } else {
|
|
|
+ // 正常状态
|
|
|
+ vehiclesTrajectoryReq.setStatus("0");
|
|
|
+ }
|
|
|
+
|
|
|
try {
|
|
|
// 调用数据中台保存轨迹数据
|
|
|
log.info("调用数据中台保存车辆轨迹数据:{}", JSON.toJSONString(vehiclesTrajectoryReq));
|
|
|
@@ -1600,10 +1642,12 @@ public class kwfTruckTraceService {
|
|
|
throw new BusinessException("生成轨迹失败:" + result.getMessage());
|
|
|
}
|
|
|
|
|
|
- // 如果请求中包含异常类型,则同时保存到本地车辆异常表
|
|
|
- saveException(req, order, longitude, latitude);
|
|
|
+ // 如果当前轨迹点有异常类型,则保存到本地车辆异常表
|
|
|
+ if (selectedExceptionType != null) {
|
|
|
+ saveException(req, order, routePoint.getLongitude(), routePoint.getLatitude(), selectedExceptionType, timestamp);
|
|
|
+ }
|
|
|
|
|
|
- log.info("生成车辆轨迹成功,运单号:{},车牌号:{}", req.getWayOrderNo(), req.getTruckNo());
|
|
|
+ log.info("生成车辆轨迹成功,运单号:{},车牌号:{},轨迹点:{}", req.getWayOrderNo(), req.getTruckNo(), i);
|
|
|
} catch (Exception e) {
|
|
|
log.error("生成车辆轨迹异常:", e);
|
|
|
throw new BusinessException("生成轨迹失败:" + e.getMessage());
|
|
|
@@ -1639,33 +1683,44 @@ public class kwfTruckTraceService {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
- private void saveException(GenerateTraceReq req, KwtWaybillOrder order, String longitude, String latitude) {
|
|
|
- if (Objects.nonNull(req.getExceptionType())) {
|
|
|
- // 保存到车辆异常表
|
|
|
- KwtVehicleException vehicleException = new KwtVehicleException();
|
|
|
- vehicleException.setEntId(order.getEntId());
|
|
|
- vehicleException.setTruckId(order.getTruckId());
|
|
|
- vehicleException.setTruckNo(req.getTruckNo());
|
|
|
- vehicleException.setTruckId(order.getTruckId());
|
|
|
- vehicleException.setWOrderNo(req.getWayOrderNo());
|
|
|
- vehicleException.setDriverId(order.getDriverId());
|
|
|
- vehicleException.setDriverName(order.getDriverName());
|
|
|
- vehicleException.setDriverPhone(order.getDriverPhone());
|
|
|
- vehicleException.setExceptionType(req.getExceptionType());
|
|
|
- vehicleException.setDescription(VehicleExceptionTypeEnum.getName(req.getExceptionType()));
|
|
|
- vehicleException.setLocation(req.getExceptionLocation());
|
|
|
- vehicleException.setLongitude(longitude);
|
|
|
- vehicleException.setLatitude(latitude);
|
|
|
- vehicleException.setExceptionTime(new Date());
|
|
|
- vehicleException.setCreateBy(LoginUserHolder.getUserId());
|
|
|
- vehicleException.setCreateTime(new Date());
|
|
|
- vehicleException.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
- vehicleException.setUpdateTime(new Date());
|
|
|
- vehicleException.setDelFlag(0);
|
|
|
-
|
|
|
- // 保存异常信息
|
|
|
- kwtVehicleExceptionRepository.save(vehicleException);
|
|
|
+ /**
|
|
|
+ * 保存单个异常信息到车辆异常表
|
|
|
+ * @param req 生成轨迹请求参数
|
|
|
+ * @param order 运单信息
|
|
|
+ * @param longitude 经度
|
|
|
+ * @param latitude 纬度
|
|
|
+ * @param exceptionType 异常类型
|
|
|
+ * @param exceptionTime 异常时间
|
|
|
+ */
|
|
|
+ private void saveException(GenerateTraceReq req, KwtWaybillOrder order, String longitude, String latitude, Integer exceptionType, Timestamp exceptionTime) {
|
|
|
+ if (exceptionType == null) {
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ // 保存到车辆异常表
|
|
|
+ KwtVehicleException vehicleException = new KwtVehicleException();
|
|
|
+ vehicleException.setEntId(order.getEntId());
|
|
|
+ vehicleException.setTruckId(order.getTruckId());
|
|
|
+ vehicleException.setTruckNo(req.getTruckNo());
|
|
|
+ vehicleException.setWOrderNo(req.getWayOrderNo());
|
|
|
+ vehicleException.setDriverId(order.getDriverId());
|
|
|
+ vehicleException.setDriverName(order.getDriverName());
|
|
|
+ vehicleException.setDriverPhone(order.getDriverPhone());
|
|
|
+ vehicleException.setExceptionType(exceptionType);
|
|
|
+ vehicleException.setDescription(VehicleExceptionTypeEnum.getName(exceptionType));
|
|
|
+ vehicleException.setLocation(req.getExceptionLocation());
|
|
|
+ vehicleException.setLongitude(longitude);
|
|
|
+ vehicleException.setLatitude(latitude);
|
|
|
+ vehicleException.setExceptionTime(exceptionTime != null ? new Date(exceptionTime.getTime()) : new Date());
|
|
|
+ vehicleException.setCreateBy(LoginUserHolder.getUserId());
|
|
|
+ vehicleException.setCreateTime(new Date());
|
|
|
+ vehicleException.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
+ vehicleException.setUpdateTime(new Date());
|
|
|
+ vehicleException.setDelFlag(0);
|
|
|
+
|
|
|
+ // 保存异常信息
|
|
|
+ kwtVehicleExceptionRepository.save(vehicleException);
|
|
|
+ log.info("保存车辆异常信息成功,运单号:{},异常类型:{},位置:{},{}", req.getWayOrderNo(), exceptionType, longitude, latitude);
|
|
|
}
|
|
|
|
|
|
@NotNull
|
|
|
@@ -1685,9 +1740,6 @@ public class kwfTruckTraceService {
|
|
|
vehiclesTrajectoryReq.setBatteryVoltage(30.0f);
|
|
|
vehiclesTrajectoryReq.setStatus("0");
|
|
|
vehiclesTrajectoryReq.setAlarmCode("0");
|
|
|
- if (req.getExceptionType() != null){
|
|
|
- vehiclesTrajectoryReq.setStatus(String.valueOf(req.getExceptionType()));
|
|
|
- }
|
|
|
vehiclesTrajectoryReq.setWOrderNo(req.getWayOrderNo());
|
|
|
vehiclesTrajectoryReq.setWayOrderNo(req.getWayOrderNo());
|
|
|
vehiclesTrajectoryReq.setLOrderNo(Optional.ofNullable(logisticsOrder).map(KwtLogisticsOrder::getLOrderNo).orElse( ""));
|