|
@@ -60,11 +60,13 @@ import com.sckw.transport.service.zj.VehicleCollectService;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
|
+import org.apache.commons.collections4.MapUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.sql.Timestamp;
|
|
import java.sql.Timestamp;
|
|
|
import java.time.*;
|
|
import java.time.*;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.time.format.DateTimeFormatter;
|
|
@@ -122,18 +124,18 @@ public class kwfTruckTraceService {
|
|
|
|
|
|
|
|
public PageDataResult<KwfTruckTraceReplayVo> findPage(KwfTruckTraceReplayReq req) {
|
|
public PageDataResult<KwfTruckTraceReplayVo> findPage(KwfTruckTraceReplayReq req) {
|
|
|
log.info("查询历轨迹回放参数:{}", req);
|
|
log.info("查询历轨迹回放参数:{}", req);
|
|
|
- if (StringUtils.isBlank(req.getTruckNo())){
|
|
|
|
|
|
|
+
|
|
|
|
|
+ Date startDate = getStartDate(req.getStartTime());
|
|
|
|
|
+ Date endDate = getEndDate(req.getEndTime());
|
|
|
|
|
+ // 前置条件:根据承运单位和托运单位筛选出符合条件的运单ID
|
|
|
|
|
+ MapVehicleQueryReq queryReq = new MapVehicleQueryReq();
|
|
|
|
|
+ queryReq.setCarrierEntId(req.getCarrierEntId());
|
|
|
|
|
+ queryReq.setLogisticOrderNo(req.getLogisticOrderNo());
|
|
|
|
|
+ Set<Long> wayOrderIds = getWayOrderIds(queryReq);
|
|
|
|
|
+ if (CollectionUtils.isEmpty(wayOrderIds) && (StringUtils.isNotBlank(req.getLogisticOrderNo()) || Objects.nonNull(req.getCarrierEntId()))) {
|
|
|
return PageDataResult.empty(req.getPageNum(), req.getPageSize());
|
|
return PageDataResult.empty(req.getPageNum(), req.getPageSize());
|
|
|
}
|
|
}
|
|
|
- Date date = new Date();
|
|
|
|
|
- if (StringUtils.isNotBlank(req.getStartTime())){
|
|
|
|
|
- date = DateUtils.formatDate(req.getStartTime());
|
|
|
|
|
- }
|
|
|
|
|
- Date beforeDate = DateUtils.addDateDays(date, -30);
|
|
|
|
|
- if (StringUtils.isNotBlank(req.getEndTime())){
|
|
|
|
|
- beforeDate = DateUtils.formatDate(req.getEndTime());
|
|
|
|
|
- }
|
|
|
|
|
- Page<KwtWaybillOrder> page = kwtWaybillOrderRepository.findPage(req.getTruckNo(),req.getPageNum(), req.getPageSize(), beforeDate, date);
|
|
|
|
|
|
|
+ Page<KwtWaybillOrder> page = kwtWaybillOrderRepository.findPage(wayOrderIds,req.getTruckNo(),req.getPageNum(), req.getPageSize(), startDate, endDate);
|
|
|
List<KwtWaybillOrder> records = page.getRecords();
|
|
List<KwtWaybillOrder> records = page.getRecords();
|
|
|
if(CollectionUtils.isEmpty(page.getRecords())) {
|
|
if(CollectionUtils.isEmpty(page.getRecords())) {
|
|
|
return PageDataResult.success(req.getPageNum(), req.getPageSize(),0L, null);
|
|
return PageDataResult.success(req.getPageNum(), req.getPageSize(),0L, null);
|
|
@@ -154,8 +156,19 @@ public class kwfTruckTraceService {
|
|
|
worderNoAndWorderMap = waybillOrderSubtasks.stream()
|
|
worderNoAndWorderMap = waybillOrderSubtasks.stream()
|
|
|
.collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderNo, Function.identity(), (k1, k2) -> k1));
|
|
.collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderNo, Function.identity(), (k1, k2) -> k1));
|
|
|
}
|
|
}
|
|
|
|
|
+ List<KwtLogisticsOrderUnit> logisticsOrderUnits = Lists.newArrayList();
|
|
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap = Maps.newHashMap();
|
|
|
|
|
+ if (CollectionUtils.isNotEmpty(lOrderIds)){
|
|
|
|
|
+ //查询物流订单
|
|
|
|
|
+ List<KwtLogisticsOrder> logisticsOrders = kwtLogisticsOrderRepository.queryByLogisticsOrderIds(new ArrayList<>(lOrderIds));
|
|
|
|
|
+ logisticsOrderMap = Optional.ofNullable(logisticsOrders)
|
|
|
|
|
+ .orElse(List.of())
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (k1, k2) -> k1));
|
|
|
|
|
+ logisticsOrderUnits = kwtLogisticsOrderUnitRepository.queryByLOrderIdsAndUnitType(lOrderIds,2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
- List<KwtLogisticsOrderUnit> logisticsOrderUnits = kwtLogisticsOrderUnitRepository.queryByLOrderIdsAndUnitType(lOrderIds,2);
|
|
|
|
|
//物流订单id映射企业
|
|
//物流订单id映射企业
|
|
|
Map<Long, KwtLogisticsOrderUnit> lOrderIdAndLogisticsOrderUnitMap = logisticsOrderUnits.stream()
|
|
Map<Long, KwtLogisticsOrderUnit> lOrderIdAndLogisticsOrderUnitMap = logisticsOrderUnits.stream()
|
|
|
.collect(Collectors.toMap(KwtLogisticsOrderUnit::getLOrderId, Function.identity(), (k1, k2) -> k1));
|
|
.collect(Collectors.toMap(KwtLogisticsOrderUnit::getLOrderId, Function.identity(), (k1, k2) -> k1));
|
|
@@ -169,13 +182,84 @@ public class kwfTruckTraceService {
|
|
|
Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap = orderAddresses.stream()
|
|
Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap = orderAddresses.stream()
|
|
|
.collect(Collectors.groupingBy(KwtWaybillOrderAddress::getWOrderId));
|
|
.collect(Collectors.groupingBy(KwtWaybillOrderAddress::getWOrderId));
|
|
|
|
|
|
|
|
|
|
+ // 批量查询运单轨迹数据,统计异常数量(通过alarmCode判断)
|
|
|
|
|
+ List<String> wOrderNos = records.stream()
|
|
|
|
|
+ .map(KwtWaybillOrder::getWOrderNo)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ // 批量查询每个运单的轨迹数据
|
|
|
|
|
+ Map<String, Integer> exceptionCountMap = Maps.newHashMap();
|
|
|
|
|
+ Map<String,List<VehicleReturnData>> traceMap = Maps.newHashMap();
|
|
|
|
|
+ getTraceInfoList(wOrderNos, traceMap, exceptionCountMap);
|
|
|
|
|
+
|
|
|
|
|
+ // Map<String, Integer> exceptionCountMap = countExceptionsByTraceData(wOrderNos);
|
|
|
Map<String, KwtWaybillOrderSubtask> finalWorderNoAndWorderMap = worderNoAndWorderMap;
|
|
Map<String, KwtWaybillOrderSubtask> finalWorderNoAndWorderMap = worderNoAndWorderMap;
|
|
|
|
|
+ Map<Long, KwtLogisticsOrder> finalLogisticsOrderMap = logisticsOrderMap;
|
|
|
List<KwfTruckTraceReplayVo> kwfTruckTraceReplayVoList = records.stream()
|
|
List<KwfTruckTraceReplayVo> kwfTruckTraceReplayVoList = records.stream()
|
|
|
- .map(r -> getKwfTruckTraceReplayVo(r, idAndKwsEnterpriseMap, wOrderIdAndAddressMap, lOrderIdAndLogisticsOrderUnitMap, finalWorderNoAndWorderMap))
|
|
|
|
|
|
|
+ .map(r -> getKwfTruckTraceReplayVo(r, idAndKwsEnterpriseMap, wOrderIdAndAddressMap,
|
|
|
|
|
+ lOrderIdAndLogisticsOrderUnitMap, finalWorderNoAndWorderMap,
|
|
|
|
|
+ exceptionCountMap, finalLogisticsOrderMap,traceMap))
|
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
|
|
|
+ // 根据排序类型进行排序
|
|
|
|
|
+ MapVehicleSortTypeEnum sortType = MapVehicleSortTypeEnum.getByCode(req.getSortType());
|
|
|
|
|
+ kwfTruckTraceReplayVoList = switch (sortType) {
|
|
|
|
|
+ case TIME_DESC ->
|
|
|
|
|
+ // 按任务开始时间倒序
|
|
|
|
|
+ kwfTruckTraceReplayVoList.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(KwfTruckTraceReplayVo::getTaskStartTime,
|
|
|
|
|
+ Comparator.nullsLast(Comparator.reverseOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ case DURATION_DESC ->
|
|
|
|
|
+ // 按任务耗时倒序
|
|
|
|
|
+ kwfTruckTraceReplayVoList.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(KwfTruckTraceReplayVo::getTaskDuration,
|
|
|
|
|
+ Comparator.nullsLast(Comparator.reverseOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ case EXCEPTION_COUNT_DESC ->
|
|
|
|
|
+ // 按异常数量倒序
|
|
|
|
|
+ kwfTruckTraceReplayVoList.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(KwfTruckTraceReplayVo::getExceptionCount,
|
|
|
|
|
+ Comparator.nullsLast(Comparator.reverseOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ };
|
|
|
return PageDataResult.of(page,kwfTruckTraceReplayVoList);
|
|
return PageDataResult.of(page,kwfTruckTraceReplayVoList);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private void getTraceInfoList(List<String> wOrderNos, Map<String,List<VehicleReturnData>> traceMap, Map<String, Integer> exceptionCountMap) {
|
|
|
|
|
+ if (CollectionUtils.isNotEmpty(wOrderNos)) {
|
|
|
|
|
+ for (String wOrderNo : wOrderNos) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
|
|
|
+ vehicleDataDTO.setWOrderNo(wOrderNo);
|
|
|
|
|
+
|
|
|
|
|
+ // 调用Feign接口查询轨迹列表
|
|
|
|
|
+ log.info("查询车辆数据中台请求轨迹数据:{}", JSON.toJSONString( vehicleDataDTO));
|
|
|
|
|
+ BaseIotResult<List<VehicleReturnData>> result =
|
|
|
|
|
+ vehicleTraceClient.queryVehicleDataList(vehicleDataDTO);
|
|
|
|
|
+ log.info("查询车辆数据中台响应轨迹数据:{}", JSON.toJSONString( result));
|
|
|
|
|
+ if (result != null && StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
|
|
|
|
|
+ List<VehicleReturnData> traceDataList = result.getData();
|
|
|
|
|
+ traceMap.put(wOrderNo, traceDataList);
|
|
|
|
|
+ // 统计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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 组织轨迹回访返回数据
|
|
* 组织轨迹回访返回数据
|
|
|
* @param waybillOrder 运单信息
|
|
* @param waybillOrder 运单信息
|
|
@@ -186,17 +270,43 @@ public class kwfTruckTraceService {
|
|
|
private static KwfTruckTraceReplayVo getKwfTruckTraceReplayVo(KwtWaybillOrder waybillOrder, Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap,
|
|
private static KwfTruckTraceReplayVo getKwfTruckTraceReplayVo(KwtWaybillOrder waybillOrder, Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap,
|
|
|
Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap
|
|
Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap
|
|
|
,Map<Long, KwtLogisticsOrderUnit> lOrderIdAndLogisticsOrderUnitMap
|
|
,Map<Long, KwtLogisticsOrderUnit> lOrderIdAndLogisticsOrderUnitMap
|
|
|
- ,Map<String, KwtWaybillOrderSubtask> worderNoAndWorderMap) {
|
|
|
|
|
|
|
+ ,Map<String, KwtWaybillOrderSubtask> worderNoAndWorderMap,
|
|
|
|
|
+ Map<String, Integer> exceptionCountMap,
|
|
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap,
|
|
|
|
|
+ Map<String,List<VehicleReturnData>> traceMap) {
|
|
|
|
|
|
|
|
KwfTruckTraceReplayVo kwfTruckTraceReplay = new KwfTruckTraceReplayVo();
|
|
KwfTruckTraceReplayVo kwfTruckTraceReplay = new KwfTruckTraceReplayVo();
|
|
|
kwfTruckTraceReplay.setOrderId(waybillOrder.getId());
|
|
kwfTruckTraceReplay.setOrderId(waybillOrder.getId());
|
|
|
kwfTruckTraceReplay.setOrderNo(waybillOrder.getWOrderNo());
|
|
kwfTruckTraceReplay.setOrderNo(waybillOrder.getWOrderNo());
|
|
|
kwfTruckTraceReplay.setDriverName(waybillOrder.getDriverName());
|
|
kwfTruckTraceReplay.setDriverName(waybillOrder.getDriverName());
|
|
|
kwfTruckTraceReplay.setPhone(waybillOrder.getDriverPhone());
|
|
kwfTruckTraceReplay.setPhone(waybillOrder.getDriverPhone());
|
|
|
|
|
+ kwfTruckTraceReplay.setTruckNo(waybillOrder.getTruckNo());
|
|
|
|
|
+ //已完成的状态
|
|
|
|
|
+ List<Integer> complatedStatusList = Arrays.asList(CarWaybillV1Enum.WAIT_UNLOADING.getCode(), CarWaybillV1Enum.APPROVAL_TREAT.getCode());
|
|
|
|
|
+ if (complatedStatusList.contains(waybillOrder.getStatus())){
|
|
|
|
|
+ kwfTruckTraceReplay.setStatus("1");
|
|
|
|
|
+ kwfTruckTraceReplay.setStatusDesc("已结束");
|
|
|
|
|
+ String endStartEndTime = DateUtils.format(waybillOrder.getUpdateTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
|
|
+ kwfTruckTraceReplay.setTaskEndTime(StringUtils.equals(endStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: endStartEndTime);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ kwfTruckTraceReplay.setStatus("0");
|
|
|
|
|
+ kwfTruckTraceReplay.setStatusDesc("任务中");
|
|
|
|
|
+ List<VehicleReturnData> data = traceMap.getOrDefault(waybillOrder.getWOrderNo(), new ArrayList<>());
|
|
|
|
|
+ if (CollectionUtils.isNotEmpty(data)){
|
|
|
|
|
+ VehicleReturnData vehicleReturnData = data.get(0);
|
|
|
|
|
+ kwfTruckTraceReplay.setLatitude(vehicleReturnData.getLatitude());
|
|
|
|
|
+ kwfTruckTraceReplay.setLongitude(vehicleReturnData.getLongitude());
|
|
|
|
|
+ String endStartEndTime = DateUtils.format(vehicleReturnData.getTs(), DateUtils.DATE_TIME_PATTERN);
|
|
|
|
|
+ kwfTruckTraceReplay.setTaskEndTime(StringUtils.equals(endStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: endStartEndTime);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
kwfTruckTraceReplay.setStatus(String.valueOf(waybillOrder.getStatus()));
|
|
kwfTruckTraceReplay.setStatus(String.valueOf(waybillOrder.getStatus()));
|
|
|
kwfTruckTraceReplay.setStatusDesc(CarWaybillEnum.getName(waybillOrder.getStatus()));
|
|
kwfTruckTraceReplay.setStatusDesc(CarWaybillEnum.getName(waybillOrder.getStatus()));
|
|
|
KwtWaybillOrderSubtask subtask = worderNoAndWorderMap.getOrDefault(waybillOrder.getWOrderNo(), new KwtWaybillOrderSubtask());
|
|
KwtWaybillOrderSubtask subtask = worderNoAndWorderMap.getOrDefault(waybillOrder.getWOrderNo(), new KwtWaybillOrderSubtask());
|
|
|
kwfTruckTraceReplay.setRelationTaskNo(String.valueOf(subtask.getLOrderId()));
|
|
kwfTruckTraceReplay.setRelationTaskNo(String.valueOf(subtask.getLOrderId()));
|
|
|
|
|
+ KwtLogisticsOrder logisticsOrder = logisticsOrderMap.getOrDefault(subtask.getLOrderId(), new KwtLogisticsOrder());
|
|
|
|
|
+ kwfTruckTraceReplay.setLogOrderNo(logisticsOrder.getLOrderNo());
|
|
|
KwtLogisticsOrderUnit kwtLogisticsOrderUnit = lOrderIdAndLogisticsOrderUnitMap.getOrDefault(subtask.getLOrderId(), new KwtLogisticsOrderUnit());
|
|
KwtLogisticsOrderUnit kwtLogisticsOrderUnit = lOrderIdAndLogisticsOrderUnitMap.getOrDefault(subtask.getLOrderId(), new KwtLogisticsOrderUnit());
|
|
|
KwsEnterpriseResDto orDefault = idAndKwsEnterpriseMap.getOrDefault(kwtLogisticsOrderUnit.getEntId(), new KwsEnterpriseResDto());
|
|
KwsEnterpriseResDto orDefault = idAndKwsEnterpriseMap.getOrDefault(kwtLogisticsOrderUnit.getEntId(), new KwsEnterpriseResDto());
|
|
|
kwfTruckTraceReplay.setCarrier(orDefault.getFirmName());
|
|
kwfTruckTraceReplay.setCarrier(orDefault.getFirmName());
|
|
@@ -210,13 +320,21 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- String taskStartEndTime = DateUtils.format(waybillOrder.getTaskStartTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
|
|
|
|
+ Date startTime = waybillOrder.getCreateTime();
|
|
|
|
|
+ String taskStartEndTime = DateUtils.format(startTime, DateUtils.DATE_TIME_PATTERN);
|
|
|
kwfTruckTraceReplay.setTaskStartTime(StringUtils.equals(taskStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: taskStartEndTime);
|
|
kwfTruckTraceReplay.setTaskStartTime(StringUtils.equals(taskStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: taskStartEndTime);
|
|
|
|
|
|
|
|
- String endStartEndTime = DateUtils.format(waybillOrder.getTaskEndTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
|
|
- kwfTruckTraceReplay.setTaskEndTime(StringUtils.equals(endStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: endStartEndTime);
|
|
|
|
|
kwfTruckTraceReplay.setWarningCount("");
|
|
kwfTruckTraceReplay.setWarningCount("");
|
|
|
|
|
+ // 从异常表查询该运单的异常数量
|
|
|
|
|
+ Integer exceptionCount = exceptionCountMap.getOrDefault(waybillOrder.getWOrderNo(), 0);
|
|
|
|
|
+ kwfTruckTraceReplay.setExceptionCount(exceptionCount);
|
|
|
|
|
+ // 计算任务耗时(分钟)
|
|
|
|
|
+ Date endTime = new Date();
|
|
|
|
|
+ if (Objects.equals(waybillOrder.getStatus(), CarWaybillV1Enum.WAIT_UNLOADING.getCode())){
|
|
|
|
|
+ endTime = waybillOrder.getUpdateTime() != null ? waybillOrder.getUpdateTime() : new Date();
|
|
|
|
|
+ }
|
|
|
|
|
+ long duration = (endTime.getTime() - startTime.getTime()) / (1000 * 60);
|
|
|
|
|
+ kwfTruckTraceReplay.setTaskDuration(duration);
|
|
|
return kwfTruckTraceReplay;
|
|
return kwfTruckTraceReplay;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -721,13 +839,13 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 获取所有车牌号列表,用于查询实时位置
|
|
// 获取所有车牌号列表,用于查询实时位置
|
|
|
- List<String> truckNos = waybillOrders.stream()
|
|
|
|
|
- .map(KwtWaybillOrder::getTruckNo)
|
|
|
|
|
- .distinct()
|
|
|
|
|
- .collect(Collectors.toList());
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ Map<Long, String> truckIdTruckNoMap = waybillOrders.stream()
|
|
|
|
|
+ .filter(x->Objects.nonNull(x.getTruckId()))
|
|
|
|
|
+ .collect(Collectors.toMap(KwtWaybillOrder::getTruckId, KwtWaybillOrder::getTruckNo, (key1, key2) -> key1));
|
|
|
|
|
+
|
|
|
// 批量查询实时位置状态(30分钟内有数据为在线)
|
|
// 批量查询实时位置状态(30分钟内有数据为在线)
|
|
|
- Map<String, Integer> truckLocationStatusMap = getStringIntegerMap(truckNos);
|
|
|
|
|
|
|
+ Map<String, Integer> truckLocationStatusMap = getStringIntegerMap(truckIdTruckNoMap);
|
|
|
|
|
|
|
|
// 转换为 VO 对象并根据状态筛选
|
|
// 转换为 VO 对象并根据状态筛选
|
|
|
return waybillOrders.stream()
|
|
return waybillOrders.stream()
|
|
@@ -739,21 +857,23 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@NotNull
|
|
@NotNull
|
|
|
- private Map<String, Integer> getStringIntegerMap(List<String> truckNos) {
|
|
|
|
|
|
|
+ private Map<String, Integer> getStringIntegerMap(Map<Long, String> truckIdTruckNoMap) {
|
|
|
Map<String, Integer> truckLocationStatusMap = new HashMap<>();
|
|
Map<String, Integer> truckLocationStatusMap = new HashMap<>();
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
LocalDateTime thirtyMinutesAgo = now.minusMinutes(30);
|
|
LocalDateTime thirtyMinutesAgo = now.minusMinutes(30);
|
|
|
-
|
|
|
|
|
- for (String truckNo : truckNos) {
|
|
|
|
|
|
|
+ if (MapUtils.isEmpty(truckIdTruckNoMap)){
|
|
|
|
|
+ return truckLocationStatusMap;
|
|
|
|
|
+ }
|
|
|
|
|
+ truckIdTruckNoMap.forEach((truckId, truckNo) -> {
|
|
|
try {
|
|
try {
|
|
|
VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
|
- vehicleDataDTO.setCarNo(truckNo);
|
|
|
|
|
|
|
+ vehicleDataDTO.setCarNo(Objects.isNull(truckId) ? "0" : String.valueOf(truckId));
|
|
|
BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
|
|
BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
|
|
|
|
|
|
|
|
if (result == null || !Objects.equals(result.getCode(), "0") || result.getData() == null) {
|
|
if (result == null || !Objects.equals(result.getCode(), "0") || result.getData() == null) {
|
|
|
// 无定位数据,设置为离线
|
|
// 无定位数据,设置为离线
|
|
|
truckLocationStatusMap.put(truckNo, 0);
|
|
truckLocationStatusMap.put(truckNo, 0);
|
|
|
- return truckLocationStatusMap;
|
|
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
VehicleReturnData vehicleData = result.getData();
|
|
VehicleReturnData vehicleData = result.getData();
|
|
@@ -762,7 +882,7 @@ public class kwfTruckTraceService {
|
|
|
if (vehicleData.getTs() == null) {
|
|
if (vehicleData.getTs() == null) {
|
|
|
// 无GPS时间,设置为离线
|
|
// 无GPS时间,设置为离线
|
|
|
truckLocationStatusMap.put(truckNo, 0);
|
|
truckLocationStatusMap.put(truckNo, 0);
|
|
|
- return truckLocationStatusMap;
|
|
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 30分钟内为在线
|
|
// 30分钟内为在线
|
|
@@ -776,7 +896,7 @@ public class kwfTruckTraceService {
|
|
|
log.warn("查询车辆实时位置异常, 车牌号: {}", truckNo, e);
|
|
log.warn("查询车辆实时位置异常, 车牌号: {}", truckNo, e);
|
|
|
truckLocationStatusMap.put(truckNo, 0);
|
|
truckLocationStatusMap.put(truckNo, 0);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
+ });
|
|
|
return truckLocationStatusMap;
|
|
return truckLocationStatusMap;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -911,14 +1031,13 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 获取车牌号列表,查询定位信息
|
|
// 获取车牌号列表,查询定位信息
|
|
|
- List<String> truckNos = waybillOrders.stream()
|
|
|
|
|
- .map(KwtWaybillOrder::getTruckNo)
|
|
|
|
|
- .distinct()
|
|
|
|
|
- .collect(Collectors.toList());
|
|
|
|
|
-
|
|
|
|
|
|
|
+ Map<Long, String> truckIdAndTruckNoMap = waybillOrders.stream()
|
|
|
|
|
+ .filter(x->Objects.nonNull(x.getTruckId()))
|
|
|
|
|
+ .collect(Collectors.toMap(KwtWaybillOrder::getTruckId, KwtWaybillOrder::getTruckNo, (k1, k2) -> k1));
|
|
|
|
|
+
|
|
|
// 批量查询定位状态和位置信息
|
|
// 批量查询定位状态和位置信息
|
|
|
- Map<String, VehicleLocationInfo> locationInfoMap = queryVehicleLocationBatch(truckNos);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ Map<String, VehicleLocationInfo> locationInfoMap = queryVehicleLocationBatch(truckIdAndTruckNoMap);
|
|
|
|
|
+
|
|
|
// 批量查询运单轨迹数据,统计异常数量(通过alarmCode判断)
|
|
// 批量查询运单轨迹数据,统计异常数量(通过alarmCode判断)
|
|
|
List<String> wOrderNos = waybillOrders.stream()
|
|
List<String> wOrderNos = waybillOrders.stream()
|
|
|
.map(KwtWaybillOrder::getWOrderNo)
|
|
.map(KwtWaybillOrder::getWOrderNo)
|
|
@@ -987,11 +1106,16 @@ public class kwfTruckTraceService {
|
|
|
@NotNull
|
|
@NotNull
|
|
|
private Set<Long> getWayOrderIds(MapVehicleQueryReq req) {
|
|
private Set<Long> getWayOrderIds(MapVehicleQueryReq req) {
|
|
|
Set<Long> wayOrderIds = Sets.newHashSet();
|
|
Set<Long> wayOrderIds = Sets.newHashSet();
|
|
|
- if (req.getConsignEntId() != null || req.getCarrierEntId() != null) {
|
|
|
|
|
|
|
+ List<Long> entIds = new ArrayList<>();
|
|
|
|
|
+ if (req.getConsignEntId() != null){
|
|
|
|
|
+ entIds.add(req.getConsignEntId());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (req.getCarrierEntId() != null){
|
|
|
|
|
+ entIds.add(req.getCarrierEntId());
|
|
|
|
|
+ }
|
|
|
|
|
+ if (CollectionUtils.isNotEmpty(entIds)) {
|
|
|
// 第一步:从物流订单单位表查询符合条件的物流订单ID
|
|
// 第一步:从物流订单单位表查询符合条件的物流订单ID
|
|
|
// 同时有托运和承运单位条件,将企业ID和类型组合后批量查询
|
|
// 同时有托运和承运单位条件,将企业ID和类型组合后批量查询
|
|
|
- List<Long> entIds = Arrays.asList(req.getConsignEntId(), req.getCarrierEntId());
|
|
|
|
|
-
|
|
|
|
|
List<KwtLogisticsOrderUnit> allUnits = kwtLogisticsOrderUnitRepository.list(
|
|
List<KwtLogisticsOrderUnit> allUnits = kwtLogisticsOrderUnitRepository.list(
|
|
|
Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
|
|
Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
|
|
|
.eq(KwtLogisticsOrderUnit::getDelFlag, 0)
|
|
.eq(KwtLogisticsOrderUnit::getDelFlag, 0)
|
|
@@ -1084,32 +1208,32 @@ public class kwfTruckTraceService {
|
|
|
/**
|
|
/**
|
|
|
* 批量查询车辆定位信息
|
|
* 批量查询车辆定位信息
|
|
|
*/
|
|
*/
|
|
|
- private Map<String, VehicleLocationInfo> queryVehicleLocationBatch(List<String> truckNos) {
|
|
|
|
|
|
|
+ private Map<String, VehicleLocationInfo> queryVehicleLocationBatch(Map<Long, String> truckIdAndTruckNoMap) {
|
|
|
Map<String, VehicleLocationInfo> locationInfoMap = new HashMap<>();
|
|
Map<String, VehicleLocationInfo> locationInfoMap = new HashMap<>();
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
log.info("获取配置时间:{}", urlConfigProperties.getMinute());
|
|
log.info("获取配置时间:{}", urlConfigProperties.getMinute());
|
|
|
LocalDateTime thirtyMinutesAgo = now.minusMinutes(urlConfigProperties.getMinute());
|
|
LocalDateTime thirtyMinutesAgo = now.minusMinutes(urlConfigProperties.getMinute());
|
|
|
- if (CollectionUtils.isEmpty(truckNos)){
|
|
|
|
|
|
|
+ if (MapUtils.isEmpty(truckIdAndTruckNoMap)){
|
|
|
return locationInfoMap;
|
|
return locationInfoMap;
|
|
|
}
|
|
}
|
|
|
- for (String truckNo : truckNos) {
|
|
|
|
|
|
|
+ truckIdAndTruckNoMap.forEach((truckId, truckNo) -> {
|
|
|
try {
|
|
try {
|
|
|
VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
|
- vehicleDataDTO.setCarNo(truckNo);
|
|
|
|
|
|
|
+ vehicleDataDTO.setCarNo(Objects.isNull(truckId) ? "0" : String.valueOf(truckId));
|
|
|
BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
|
|
BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
|
|
|
log.info("查询车辆数据中台响应定位信息:{}", JSON.toJSONString( result));
|
|
log.info("查询车辆数据中台响应定位信息:{}", JSON.toJSONString( result));
|
|
|
VehicleLocationInfo locationInfo = new VehicleLocationInfo();
|
|
VehicleLocationInfo locationInfo = new VehicleLocationInfo();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (result != null && StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
|
|
if (result != null && StringUtils.equals(result.getCode(), "0") && result.getData() != null) {
|
|
|
VehicleReturnData vehicleData = result.getData();
|
|
VehicleReturnData vehicleData = result.getData();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 判断定位状态
|
|
// 判断定位状态
|
|
|
if (vehicleData.getTs() != null && vehicleData.getTs().toLocalDateTime().isAfter(thirtyMinutesAgo)) {
|
|
if (vehicleData.getTs() != null && vehicleData.getTs().toLocalDateTime().isAfter(thirtyMinutesAgo)) {
|
|
|
locationInfo.setLocationStatus(1);
|
|
locationInfo.setLocationStatus(1);
|
|
|
} else {
|
|
} else {
|
|
|
locationInfo.setLocationStatus(0);
|
|
locationInfo.setLocationStatus(0);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
locationInfo.setLongitude(vehicleData.getLongitude());
|
|
locationInfo.setLongitude(vehicleData.getLongitude());
|
|
|
locationInfo.setLatitude(vehicleData.getLatitude());
|
|
locationInfo.setLatitude(vehicleData.getLatitude());
|
|
|
if (vehicleData.getTs() != null) {
|
|
if (vehicleData.getTs() != null) {
|
|
@@ -1127,7 +1251,7 @@ public class kwfTruckTraceService {
|
|
|
locationInfo.setLocationStatus(0);
|
|
locationInfo.setLocationStatus(0);
|
|
|
locationInfoMap.put(truckNo, locationInfo);
|
|
locationInfoMap.put(truckNo, locationInfo);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
return locationInfoMap;
|
|
return locationInfoMap;
|
|
|
}
|
|
}
|
|
@@ -1215,9 +1339,9 @@ public class kwfTruckTraceService {
|
|
|
|
|
|
|
|
// 装货重量/任务量
|
|
// 装货重量/任务量
|
|
|
String loadWeight = String.format("%s%s / %s%s",
|
|
String loadWeight = String.format("%s%s / %s%s",
|
|
|
- subtask.getLoadAmount() != null ? subtask.getLoadAmount() : "0",
|
|
|
|
|
|
|
+ subtask.getLoadAmount() != null ? subtask.getLoadAmount().setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00",
|
|
|
subtask.getUnit() != null ? subtask.getUnit() : "",
|
|
subtask.getUnit() != null ? subtask.getUnit() : "",
|
|
|
- subtask.getEntrustAmount() != null ? subtask.getEntrustAmount() : "0",
|
|
|
|
|
|
|
+ subtask.getEntrustAmount() != null ? subtask.getEntrustAmount().setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00",
|
|
|
subtask.getUnit() != null ? subtask.getUnit() : "");
|
|
subtask.getUnit() != null ? subtask.getUnit() : "");
|
|
|
vo.setLoadWeight(loadWeight);
|
|
vo.setLoadWeight(loadWeight);
|
|
|
|
|
|
|
@@ -1428,13 +1552,15 @@ public class kwfTruckTraceService {
|
|
|
vehiclesTrajectoryReq.setEngineTemp(40.0f);
|
|
vehiclesTrajectoryReq.setEngineTemp(40.0f);
|
|
|
vehiclesTrajectoryReq.setBatteryVoltage(30.0f);
|
|
vehiclesTrajectoryReq.setBatteryVoltage(30.0f);
|
|
|
vehiclesTrajectoryReq.setStatus("0");
|
|
vehiclesTrajectoryReq.setStatus("0");
|
|
|
|
|
+ vehiclesTrajectoryReq.setAlarmCode("0");
|
|
|
if (req.getExceptionType() != null){
|
|
if (req.getExceptionType() != null){
|
|
|
vehiclesTrajectoryReq.setStatus(String.valueOf(req.getExceptionType()));
|
|
vehiclesTrajectoryReq.setStatus(String.valueOf(req.getExceptionType()));
|
|
|
}
|
|
}
|
|
|
vehiclesTrajectoryReq.setWOrderNo(req.getWayOrderNo());
|
|
vehiclesTrajectoryReq.setWOrderNo(req.getWayOrderNo());
|
|
|
|
|
+ vehiclesTrajectoryReq.setWayOrderNo(req.getWayOrderNo());
|
|
|
vehiclesTrajectoryReq.setLOrderNo(Optional.ofNullable(logisticsOrder).map(KwtLogisticsOrder::getLOrderNo).orElse( ""));
|
|
vehiclesTrajectoryReq.setLOrderNo(Optional.ofNullable(logisticsOrder).map(KwtLogisticsOrder::getLOrderNo).orElse( ""));
|
|
|
VehiclesTrajectoryReq.VehicleDataVO vehicleDataVO = new VehiclesTrajectoryReq.VehicleDataVO();
|
|
VehiclesTrajectoryReq.VehicleDataVO vehicleDataVO = new VehiclesTrajectoryReq.VehicleDataVO();
|
|
|
- vehicleDataVO.setCarNo(req.getTruckNo());
|
|
|
|
|
|
|
+ vehicleDataVO.setCarNo(Objects.isNull(order.getTruckId()) ? "0" : String.valueOf(order.getTruckId()));
|
|
|
if (fleetByTruckId != null){
|
|
if (fleetByTruckId != null){
|
|
|
vehicleDataVO.setFleetId(Objects.nonNull(fleetByTruckId.getId())?fleetByTruckId.getId().toString():"");
|
|
vehicleDataVO.setFleetId(Objects.nonNull(fleetByTruckId.getId())?fleetByTruckId.getId().toString():"");
|
|
|
vehicleDataVO.setFleetName(fleetByTruckId.getName());
|
|
vehicleDataVO.setFleetName(fleetByTruckId.getName());
|