|
|
@@ -42,6 +42,7 @@ import com.sckw.transport.model.dto.TruckDto;
|
|
|
import com.sckw.transport.api.feign.VehicleTraceClient;
|
|
|
import com.sckw.transport.api.model.dto.VehicleDataDTO;
|
|
|
import com.sckw.transport.api.model.dto.VehicleReturnData;
|
|
|
+import com.sckw.transport.model.enuma.ExceptionSortTypeEnum;
|
|
|
import com.sckw.transport.model.enuma.VehicleExceptionTypeEnum;
|
|
|
import com.sckw.transport.model.param.*;
|
|
|
import com.sckw.transport.model.dto.GenerateTraceReq;
|
|
|
@@ -423,34 +424,42 @@ public class kwfTruckTraceService {
|
|
|
|
|
|
/**
|
|
|
* 查询当前任务的轨迹
|
|
|
- * @param req 请求参数
|
|
|
- * @return 响应参数
|
|
|
+ * @param req 请求参数,包含车辆编号和订单号等信息
|
|
|
+ * @return 当前任务轨迹信息,包括轨迹点列表和地址点列表
|
|
|
*/
|
|
|
public CurrentTaskTraceReqVo queryCurrentTaskTrace(CurrentTaskTraceReq req) {
|
|
|
log.info("查询当前任务轨迹参数:{}", req);
|
|
|
|
|
|
+ // 获取当前登录用户的企业ID
|
|
|
Long entId = LoginUserHolder.getEntId();
|
|
|
String wOrderNo = StringUtils.EMPTY ;
|
|
|
+
|
|
|
+ // 如果请求中包含订单号,则直接使用;否则根据车牌号查询对应订单号
|
|
|
if (StringUtils.isNotBlank(req.getOrderNo())){
|
|
|
wOrderNo = req.getOrderNo();
|
|
|
}else {
|
|
|
KwtWaybillOrder waybillOrder = kwtWaybillOrderRepository.findOneByTruckNo(req.getTruckNo(),entId);
|
|
|
wOrderNo = Optional.ofNullable(waybillOrder).map(KwtWaybillOrder::getWOrderNo).orElse("");
|
|
|
}
|
|
|
- //查询数据中台获取轨迹
|
|
|
+
|
|
|
+ // 查询数据中台获取轨迹数据
|
|
|
List<VehicleReturnData> vehicleReturnDataList = getVehicleReturnDataList(wOrderNo);
|
|
|
|
|
|
CurrentTaskTraceReqVo currentTaskTraceReqVo = new CurrentTaskTraceReqVo();
|
|
|
+
|
|
|
+ // 如果轨迹数据不为空,则处理轨迹点信息
|
|
|
if (CollectionUtils.isNotEmpty(vehicleReturnDataList)){
|
|
|
- //组织返回数据
|
|
|
+ // 将VehicleReturnData转换为CurrentTaskTrace,并按时间排序
|
|
|
List<CurrentTaskTraceReqVo.CurrentTaskTrace> currentTaskTraceList = vehicleReturnDataList.stream()
|
|
|
.map(kwfTruckTraceService::getCurrentTaskTrace)
|
|
|
.filter(x->StringUtils.isNotBlank(x.getLocationTime()))
|
|
|
.sorted(Comparator.comparing(CurrentTaskTraceReqVo.CurrentTaskTrace::getLocationTime))
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
+ // 设置订单号
|
|
|
currentTaskTraceReqVo.setOrderNo(vehicleReturnDataList.get(0).getWOrderNo());
|
|
|
|
|
|
+ // 计算相邻轨迹点之间的时间间隔(分钟)
|
|
|
for (int i = 1; i < currentTaskTraceList.size(); i++) {
|
|
|
CurrentTaskTraceReqVo.CurrentTaskTrace current = currentTaskTraceList.get(i);
|
|
|
CurrentTaskTraceReqVo.CurrentTaskTrace previous = currentTaskTraceList.get(i - 1);
|
|
|
@@ -460,6 +469,8 @@ public class kwfTruckTraceService {
|
|
|
Duration duration = Duration.between(previousTime, currentTime);
|
|
|
current.setDuration(String.valueOf(duration.toMinutes()));
|
|
|
}
|
|
|
+
|
|
|
+ // 计算总时长(第一个点到最后一个点的时间差)
|
|
|
CurrentTaskTraceReqVo.CurrentTaskTrace first = currentTaskTraceList.get(0);
|
|
|
CurrentTaskTraceReqVo.CurrentTaskTrace last = currentTaskTraceList.get(currentTaskTraceList.size() - 1);
|
|
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
@@ -472,10 +483,12 @@ public class kwfTruckTraceService {
|
|
|
currentTaskTraceReqVo.setCurrentTaskTraceList(currentTaskTraceList);
|
|
|
}
|
|
|
|
|
|
- //构造点位假数据
|
|
|
+ // 构造点位假数据(用于演示或测试)
|
|
|
List<CurrentTaskTraceReqVo.CurrentAddress> addressList = getCurrentAddresses();
|
|
|
// 将地址列表设置到 CurrentTaskTraceReqVo 对象中
|
|
|
currentTaskTraceReqVo.setCurrentAddressList(addressList);
|
|
|
+
|
|
|
+ // 计算地址点的总时长
|
|
|
int sum = addressList.stream()
|
|
|
.filter(a -> StringUtils.isNotBlank(a.getDuration()))
|
|
|
.mapToInt(x -> Integer.parseInt(x.getDuration()))
|
|
|
@@ -526,19 +539,21 @@ public class kwfTruckTraceService {
|
|
|
private List<VehicleReturnData> getVehicleReturnDataList(String wOrderNo) {
|
|
|
VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
|
|
|
vehicleDataDTO.setWOrderNo(wOrderNo);
|
|
|
- String s;
|
|
|
+
|
|
|
try {
|
|
|
- s = HttpUtil.postJson(urlConfigProperties.getApiBaseUrl()+ UrlConstants.QUERY_TRACE_URL, JSON.toJSONString(vehicleDataDTO), null);
|
|
|
+ // 使用 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) {
|
|
|
+ log.warn("查询任务轨迹返回空数据, 运单号: {}", wOrderNo);
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+ return result.getData();
|
|
|
} catch (Exception e) {
|
|
|
- log.error("查询任务轨迹异常",e);
|
|
|
+ log.error("查询任务轨迹异常, 运单号: {}", wOrderNo, e);
|
|
|
throw new BusinessException("查询任务轨迹异常");
|
|
|
}
|
|
|
- if (StringUtils.isBlank(s)){
|
|
|
- return Collections.emptyList();
|
|
|
- }
|
|
|
- JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
|
|
|
- String data = JSON.toJSONString(jsonObject.get("data"));
|
|
|
- return JSON.parseArray(data, VehicleReturnData.class);
|
|
|
}
|
|
|
|
|
|
public VehicleReturnData getVehicleReturnData(String truckId) {
|
|
|
@@ -566,6 +581,16 @@ public class kwfTruckTraceService {
|
|
|
currentTaskTrace.setLongitude(e.getLongitude());
|
|
|
currentTaskTrace.setLatitude(e.getLatitude());
|
|
|
currentTaskTrace.setLocationTime(Objects.isNull(e.getTs()) ? "" : DateUtils.format(e.getTs().toLocalDateTime(), DateUtils.DATE_TIME_PATTERN));
|
|
|
+ currentTaskTrace.setStatus(e.getStatus());
|
|
|
+ // 处理数据库状态值的兼容逻辑
|
|
|
+ int status = 0;
|
|
|
+ try {
|
|
|
+ status = Integer.parseInt(e.getStatus());
|
|
|
+ }catch (Exception ex){
|
|
|
+ log.info("状态码转换异常",ex);
|
|
|
+ }
|
|
|
+
|
|
|
+ currentTaskTrace.setStatusDesc(VehicleExceptionTypeEnum.getName(status));
|
|
|
return currentTaskTrace;
|
|
|
}
|
|
|
|
|
|
@@ -1062,7 +1087,8 @@ public class kwfTruckTraceService {
|
|
|
private Map<String, VehicleLocationInfo> queryVehicleLocationBatch(List<String> truckNos) {
|
|
|
Map<String, VehicleLocationInfo> locationInfoMap = new HashMap<>();
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
- LocalDateTime thirtyMinutesAgo = now.minusMinutes(30);
|
|
|
+ log.info("获取配置时间:{}", urlConfigProperties.getMinute());
|
|
|
+ LocalDateTime thirtyMinutesAgo = now.minusMinutes(urlConfigProperties.getMinute());
|
|
|
if (CollectionUtils.isEmpty(truckNos)){
|
|
|
return locationInfoMap;
|
|
|
}
|
|
|
@@ -1291,38 +1317,44 @@ public class kwfTruckTraceService {
|
|
|
return allEnt;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 生成车辆轨迹数据
|
|
|
- * @param req 生成轨迹请求
|
|
|
+ * @param req 生成轨迹请求参数
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void generateTrace(GenerateTraceReq req) {
|
|
|
log.info("生成车辆轨迹参数:{}", JSON.toJSONString(req));
|
|
|
|
|
|
- // 校验当前位置格式
|
|
|
+ // 校验当前位置格式,必须为经度,纬度格式
|
|
|
String[] location = req.getCurrentLocation().split(",");
|
|
|
if (location.length != 2) {
|
|
|
throw new BusinessException("当前位置格式错误,应为:经度,纬度");
|
|
|
}
|
|
|
|
|
|
+ // 提取经度和纬度
|
|
|
String longitude = location[0];
|
|
|
String latitude = location[1];
|
|
|
|
|
|
+ // 根据运单号查询运单信息
|
|
|
KwtWaybillOrder order = kwtWaybillOrderRepository.queryByWayOrderNo(req.getWayOrderNo());
|
|
|
if (Objects.isNull(order)){
|
|
|
throw new BusinessException("运单不存在");
|
|
|
}
|
|
|
- //查询子运单
|
|
|
+
|
|
|
+ // 查询子运单信息
|
|
|
KwtWaybillOrderSubtask subOrders = kwtWaybillOrderSubtaskRepository.queryByBillOrderId(order.getId());
|
|
|
if (Objects.isNull(subOrders)){
|
|
|
throw new BusinessException("子运单不存在");
|
|
|
}
|
|
|
- // 通过车牌id查询车队
|
|
|
+
|
|
|
+ // 通过车牌ID查询所属车队信息
|
|
|
RFleetVo fleetByTruckId = fleetService.findFleetByTruckId(order.getTruckId(), order.getEntId());
|
|
|
- //查询物流订单号
|
|
|
+
|
|
|
+ // 查询物流订单信息
|
|
|
KwtLogisticsOrder logisticsOrder = kwtLogisticsOrderRepository.queryByLogisticsOrderId(subOrders.getLOrderId());
|
|
|
|
|
|
- // 构造轨迹数据
|
|
|
+ // 构造要发送给数据中台的轨迹数据请求
|
|
|
VehiclesTrajectoryReq vehiclesTrajectoryReq = getVehiclesTrajectoryReq(req, order, longitude, latitude, logisticsOrder, fleetByTruckId);
|
|
|
|
|
|
try {
|
|
|
@@ -1334,7 +1366,7 @@ public class kwfTruckTraceService {
|
|
|
throw new BusinessException("生成轨迹失败:" + result.getMessage());
|
|
|
}
|
|
|
|
|
|
- // 如果有异常类型,同时保存到本地车辆异常表
|
|
|
+ // 如果请求中包含异常类型,则同时保存到本地车辆异常表
|
|
|
saveException(req, order, longitude, latitude);
|
|
|
|
|
|
log.info("生成车辆轨迹成功,运单号:{},车牌号:{}", req.getWayOrderNo(), req.getTruckNo());
|