|
@@ -48,6 +48,7 @@ import com.sckw.transport.model.vo.TruckSelectVo;
|
|
|
import com.sckw.transport.model.dto.TruckSelectReq;
|
|
import com.sckw.transport.model.dto.TruckSelectReq;
|
|
|
import com.sckw.transport.model.dto.MapVehicleQueryReq;
|
|
import com.sckw.transport.model.dto.MapVehicleQueryReq;
|
|
|
import com.sckw.transport.model.vo.MapVehicleVo;
|
|
import com.sckw.transport.model.vo.MapVehicleVo;
|
|
|
|
|
+import com.sckw.transport.model.enuma.MapVehicleSortTypeEnum;
|
|
|
import com.sckw.transport.repository.*;
|
|
import com.sckw.transport.repository.*;
|
|
|
import com.sckw.transport.response.CollectZjxlResponse;
|
|
import com.sckw.transport.response.CollectZjxlResponse;
|
|
|
import com.sckw.transport.service.zj.VehicleCollectService;
|
|
import com.sckw.transport.service.zj.VehicleCollectService;
|
|
@@ -866,6 +867,14 @@ public class kwfTruckTraceService {
|
|
|
// 批量查询定位状态和位置信息
|
|
// 批量查询定位状态和位置信息
|
|
|
Map<String, VehicleLocationInfo> locationInfoMap = queryVehicleLocationBatch(truckNos);
|
|
Map<String, VehicleLocationInfo> locationInfoMap = queryVehicleLocationBatch(truckNos);
|
|
|
|
|
|
|
|
|
|
+ // 批量查询运单轨迹数据,统计异常数量(通过alarmCode判断)
|
|
|
|
|
+ List<String> wOrderNos = waybillOrders.stream()
|
|
|
|
|
+ .map(KwtWaybillOrder::getWOrderNo)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ Map<String, Integer> exceptionCountMap = countExceptionsByTraceData(wOrderNos);
|
|
|
|
|
+
|
|
|
// 根据定位状态筛选(这个筛选保留在内存中,因为涉及外部服务调用)
|
|
// 根据定位状态筛选(这个筛选保留在内存中,因为涉及外部服务调用)
|
|
|
List<KwtWaybillOrder> filteredOrders = waybillOrders;
|
|
List<KwtWaybillOrder> filteredOrders = waybillOrders;
|
|
|
if (req.getLocationStatus() != null) {
|
|
if (req.getLocationStatus() != null) {
|
|
@@ -881,10 +890,32 @@ public class kwfTruckTraceService {
|
|
|
Map<String, KwtLogisticsOrderUnit> finalUnitMap = unitMap;
|
|
Map<String, KwtLogisticsOrderUnit> finalUnitMap = unitMap;
|
|
|
Map<Long, KwtLogisticsOrderGoods> finalGoodsMap = goodsMap;
|
|
Map<Long, KwtLogisticsOrderGoods> finalGoodsMap = goodsMap;
|
|
|
List<MapVehicleVo> result = filteredOrders.stream()
|
|
List<MapVehicleVo> result = filteredOrders.stream()
|
|
|
- .map(order -> buildMapVehicleVo(order, wOrderIdSubtaskMap, finalUnitMap, finalGoodsMap, locationInfoMap))
|
|
|
|
|
- .sorted(Comparator.comparing(MapVehicleVo::getLocationTime, Comparator.reverseOrder()))
|
|
|
|
|
|
|
+ .map(order -> buildMapVehicleVo(order, wOrderIdSubtaskMap, finalUnitMap, finalGoodsMap, locationInfoMap, exceptionCountMap))
|
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
+ // 根据排序类型进行排序
|
|
|
|
|
+ MapVehicleSortTypeEnum sortType = MapVehicleSortTypeEnum.getByCode(req.getSortType());
|
|
|
|
|
+ result = switch (sortType) {
|
|
|
|
|
+ case TIME_DESC ->
|
|
|
|
|
+ // 按任务开始时间倒序
|
|
|
|
|
+ result.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(MapVehicleVo::getTaskStartTime,
|
|
|
|
|
+ Comparator.nullsLast(Comparator.reverseOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ case DURATION_DESC ->
|
|
|
|
|
+ // 按任务耗时倒序
|
|
|
|
|
+ result.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(MapVehicleVo::getTaskDuration,
|
|
|
|
|
+ Comparator.nullsLast(Comparator.reverseOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ case EXCEPTION_COUNT_DESC ->
|
|
|
|
|
+ // 按异常数量倒序
|
|
|
|
|
+ result.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(MapVehicleVo::getExceptionCount,
|
|
|
|
|
+ Comparator.nullsLast(Comparator.reverseOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
// 返回分页结果(使用数据库分页的总数)
|
|
// 返回分页结果(使用数据库分页的总数)
|
|
|
return PageDataResult.of(page, result);
|
|
return PageDataResult.of(page, result);
|
|
|
}
|
|
}
|
|
@@ -993,10 +1024,11 @@ public class kwfTruckTraceService {
|
|
|
if (vehicleData.getTs() != null) {
|
|
if (vehicleData.getTs() != null) {
|
|
|
locationInfo.setLocationTime(vehicleData.getTs().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
locationInfo.setLocationTime(vehicleData.getTs().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
}
|
|
}
|
|
|
|
|
+ locationInfo.setStatus(vehicleData.getStatus());
|
|
|
} else {
|
|
} else {
|
|
|
locationInfo.setLocationStatus(0);
|
|
locationInfo.setLocationStatus(0);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
locationInfoMap.put(truckNo, locationInfo);
|
|
locationInfoMap.put(truckNo, locationInfo);
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.warn("查询车辆定位信息异常, 车牌号: {}", truckNo, e);
|
|
log.warn("查询车辆定位信息异常, 车牌号: {}", truckNo, e);
|
|
@@ -1009,6 +1041,53 @@ public class kwfTruckTraceService {
|
|
|
return locationInfoMap;
|
|
return locationInfoMap;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 批量查询运单轨迹数据并统计异常数量
|
|
|
|
|
+ * 通过调用VehicleTraceClient#queryVehicleDataList查询轨迹,统计alarmCode不为空的数据为异常
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param wOrderNos 运单号列表
|
|
|
|
|
+ * @return 运单号对应的异常数量 Map
|
|
|
|
|
+ */
|
|
|
|
|
+ private Map<String, Integer> countExceptionsByTraceData(List<String> wOrderNos) {
|
|
|
|
|
+ Map<String, Integer> exceptionCountMap = new HashMap<>();
|
|
|
|
|
+
|
|
|
|
|
+ if (CollectionUtils.isEmpty(wOrderNos)) {
|
|
|
|
|
+ return exceptionCountMap;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 批量查询每个运单的轨迹数据
|
|
|
|
|
+ for (String wOrderNo : wOrderNos) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
|
|
|
+ vehicleDataDTO.setWOrderNo(wOrderNo);
|
|
|
|
|
+
|
|
|
|
|
+ // 调用Feign接口查询轨迹列表
|
|
|
|
|
+ BaseResult<List<com.sckw.transport.api.model.dto.VehicleReturnData>> result =
|
|
|
|
|
+ vehicleTraceClient.queryVehicleDataList(vehicleDataDTO);
|
|
|
|
|
+
|
|
|
|
|
+ if (result != null && result.getCode() == HttpStatus.SUCCESS_CODE && result.getData() != null) {
|
|
|
|
|
+ List<com.sckw.transport.api.model.dto.VehicleReturnData> traceDataList = result.getData();
|
|
|
|
|
+
|
|
|
|
|
+ // 统计alarmCode不为null且不为0的记录数量(表示有异常报警)
|
|
|
|
|
+ int exceptionCount = (int) traceDataList.stream()
|
|
|
|
|
+ .filter(data -> StringUtils.equals(data.getStatus(),"0"))
|
|
|
|
|
+ .count();
|
|
|
|
|
+
|
|
|
|
|
+ exceptionCountMap.put(wOrderNo, exceptionCount);
|
|
|
|
|
+ log.debug("运单号: {}, 异常数量: {}", wOrderNo, exceptionCount);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.warn("查询运单轨迹数据失败或返回空数据, 运单号: {}", wOrderNo);
|
|
|
|
|
+ exceptionCountMap.put(wOrderNo, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("查询运单轨迹数据异常, 运单号: {}", wOrderNo, e);
|
|
|
|
|
+ exceptionCountMap.put(wOrderNo, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return exceptionCountMap;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 构建地图车辆VO
|
|
* 构建地图车辆VO
|
|
|
*/
|
|
*/
|
|
@@ -1016,7 +1095,8 @@ public class kwfTruckTraceService {
|
|
|
Map<Long, KwtWaybillOrderSubtask> subtaskMap,
|
|
Map<Long, KwtWaybillOrderSubtask> subtaskMap,
|
|
|
Map<String, KwtLogisticsOrderUnit> unitMap,
|
|
Map<String, KwtLogisticsOrderUnit> unitMap,
|
|
|
Map<Long, KwtLogisticsOrderGoods> goodsMap,
|
|
Map<Long, KwtLogisticsOrderGoods> goodsMap,
|
|
|
- Map<String, VehicleLocationInfo> locationInfoMap) {
|
|
|
|
|
|
|
+ Map<String, VehicleLocationInfo> locationInfoMap,
|
|
|
|
|
+ Map<String, Integer> exceptionCountMap) {
|
|
|
MapVehicleVo vo = new MapVehicleVo();
|
|
MapVehicleVo vo = new MapVehicleVo();
|
|
|
|
|
|
|
|
// 车辆和司机信息
|
|
// 车辆和司机信息
|
|
@@ -1077,6 +1157,26 @@ public class kwfTruckTraceService {
|
|
|
vo.setLocationStatusDesc("离线");
|
|
vo.setLocationStatusDesc("离线");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 任务开始时间
|
|
|
|
|
+ if (order.getTaskStartTime() != null) {
|
|
|
|
|
+ vo.setTaskStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(order.getTaskStartTime()));
|
|
|
|
|
+ } else if (order.getCreateTime() != null) {
|
|
|
|
|
+ // 如果没有任务开始时间,使用创建时间
|
|
|
|
|
+ vo.setTaskStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(order.getCreateTime()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算任务耗时(分钟)
|
|
|
|
|
+ Date startTime = order.getTaskStartTime() != null ? order.getTaskStartTime() : order.getCreateTime();
|
|
|
|
|
+ if (startTime != null) {
|
|
|
|
|
+ Date endTime = order.getTaskEndTime() != null ? order.getTaskEndTime() : new Date();
|
|
|
|
|
+ long duration = (endTime.getTime() - startTime.getTime()) / (1000 * 60);
|
|
|
|
|
+ vo.setTaskDuration(duration);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 从异常表查询该运单的异常数量
|
|
|
|
|
+ Integer exceptionCount = exceptionCountMap.getOrDefault(order.getWOrderNo(), 0);
|
|
|
|
|
+ vo.setExceptionCount(exceptionCount);
|
|
|
|
|
+
|
|
|
return vo;
|
|
return vo;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1090,6 +1190,7 @@ public class kwfTruckTraceService {
|
|
|
private String latitude;
|
|
private String latitude;
|
|
|
private String location;
|
|
private String location;
|
|
|
private String locationTime;
|
|
private String locationTime;
|
|
|
|
|
+ private String status;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@NotNull
|
|
@NotNull
|