|
|
@@ -6,10 +6,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.sckw.contract.api.RemoteContractService;
|
|
|
import com.sckw.core.exception.BusinessException;
|
|
|
+import com.sckw.core.model.constant.UrlConstants;
|
|
|
import com.sckw.core.model.enums.CarWaybillEnum;
|
|
|
import com.sckw.core.model.page.PageResult;
|
|
|
|
|
|
+import com.sckw.transport.common.config.UrlConfigProperties;
|
|
|
import com.sckw.core.utils.DateUtils;
|
|
|
+import com.sckw.core.utils.HttpUtil;
|
|
|
import com.sckw.core.web.constant.CommonConstants;
|
|
|
import com.sckw.fleet.api.RemoteFleetService;
|
|
|
import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
@@ -23,22 +26,30 @@ import com.sckw.system.api.RemoteSystemService;
|
|
|
import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
|
|
|
import com.sckw.transport.model.KwtWaybillOrder;
|
|
|
import com.sckw.transport.model.KwtWaybillOrderAddress;
|
|
|
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
|
|
|
import com.sckw.transport.model.dto.TruckDto;
|
|
|
+import com.sckw.transport.model.dto.VehicleDataDTO;
|
|
|
+import com.sckw.transport.model.dto.VehicleReturnData;
|
|
|
import com.sckw.transport.model.param.CurrentTaskTraceReq;
|
|
|
import com.sckw.transport.model.param.KwfTruckTraceReplayReq;
|
|
|
import com.sckw.transport.model.param.TruckInfoReq;
|
|
|
+import com.sckw.transport.model.param.VehiclesTrajectoryReq;
|
|
|
import com.sckw.transport.model.vo.CurrentTaskTraceReqVo;
|
|
|
import com.sckw.transport.model.vo.KwfTruckTraceReplayVo;
|
|
|
import com.sckw.transport.model.vo.TruckInfoVo;
|
|
|
import com.sckw.transport.repository.KwtWaybillOrderAddressRepository;
|
|
|
import com.sckw.transport.repository.KwtWaybillOrderRepository;
|
|
|
+import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
|
|
|
+import jakarta.validation.Valid;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -52,6 +63,8 @@ import java.util.stream.Collectors;
|
|
|
public class kwfTruckTraceService {
|
|
|
private final KwtWaybillOrderRepository kwtWaybillOrderRepository;
|
|
|
private final KwtWaybillOrderAddressRepository kwtWaybillOrderAddressRepository;
|
|
|
+ private final UrlConfigProperties urlConfigProperties;
|
|
|
+ private final KwtWaybillOrderSubtaskRepository kwtWaybillOrderSubtaskRepository;
|
|
|
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
|
|
|
RemoteSystemService remoteSystemService;
|
|
|
@@ -114,19 +127,25 @@ public class kwfTruckTraceService {
|
|
|
return PageResult.of(page,kwfTruckTraceReplayVoList);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- private static KwfTruckTraceReplayVo getKwfTruckTraceReplayVo(KwtWaybillOrder r, Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap, Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap) {
|
|
|
+ /**
|
|
|
+ * 组织轨迹回访返回数据
|
|
|
+ * @param waybillOrder 运单信息
|
|
|
+ * @param idAndKwsEnterpriseMap 企业id映射企业信息map
|
|
|
+ * @param wOrderIdAndAddressMap 运单id映射地址map
|
|
|
+ * @return 轨迹回访返回数据
|
|
|
+ */
|
|
|
+ private static KwfTruckTraceReplayVo getKwfTruckTraceReplayVo(KwtWaybillOrder waybillOrder, Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap, Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap) {
|
|
|
|
|
|
KwfTruckTraceReplayVo kwfTruckTraceReplay = new KwfTruckTraceReplayVo();
|
|
|
- kwfTruckTraceReplay.setWOrderId(r.getId());
|
|
|
- kwfTruckTraceReplay.setWOrderNo(r.getWOrderNo());
|
|
|
- kwfTruckTraceReplay.setDriverName(r.getDriverName());
|
|
|
- kwfTruckTraceReplay.setPhone(r.getDriverPhone());
|
|
|
- kwfTruckTraceReplay.setStatus(String.valueOf(r.getStatus()));
|
|
|
- kwfTruckTraceReplay.setStatusDesc(CarWaybillEnum.getName(r.getStatus()));
|
|
|
- KwsEnterpriseResDto orDefault = idAndKwsEnterpriseMap.getOrDefault(r.getEntId(), new KwsEnterpriseResDto());
|
|
|
+ kwfTruckTraceReplay.setWOrderId(waybillOrder.getId());
|
|
|
+ kwfTruckTraceReplay.setWOrderNo(waybillOrder.getWOrderNo());
|
|
|
+ kwfTruckTraceReplay.setDriverName(waybillOrder.getDriverName());
|
|
|
+ kwfTruckTraceReplay.setPhone(waybillOrder.getDriverPhone());
|
|
|
+ kwfTruckTraceReplay.setStatus(String.valueOf(waybillOrder.getStatus()));
|
|
|
+ kwfTruckTraceReplay.setStatusDesc(CarWaybillEnum.getName(waybillOrder.getStatus()));
|
|
|
+ KwsEnterpriseResDto orDefault = idAndKwsEnterpriseMap.getOrDefault(waybillOrder.getEntId(), new KwsEnterpriseResDto());
|
|
|
kwfTruckTraceReplay.setCarrier(orDefault.getFirmName());
|
|
|
- List<KwtWaybillOrderAddress> addressList = wOrderIdAndAddressMap.get(r.getId());
|
|
|
+ List<KwtWaybillOrderAddress> addressList = wOrderIdAndAddressMap.get(waybillOrder.getId());
|
|
|
addressList.forEach(e -> {
|
|
|
if (Objects.equals(e.getAddressType(),1)){
|
|
|
kwfTruckTraceReplay.setStartAddress(e.getDetailAddress());
|
|
|
@@ -136,27 +155,27 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
- kwfTruckTraceReplay.setRelationTaskNo(Objects.nonNull(r.getLOrderId()) ? String.valueOf(r.getLOrderId()) : "");
|
|
|
-// if (Objects.equals(r.getStatus(), CarWaybillEnum.WAIT_LOADING.getCode())){
|
|
|
-//
|
|
|
-// }
|
|
|
- String taskStartEndTime = DateUtils.format(r.getTaskStartTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
+ kwfTruckTraceReplay.setRelationTaskNo(Objects.nonNull(waybillOrder.getLOrderId()) ? String.valueOf(waybillOrder.getLOrderId()) : "");
|
|
|
+
|
|
|
+ String taskStartEndTime = DateUtils.format(waybillOrder.getTaskStartTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
kwfTruckTraceReplay.setTaskStartTime(StringUtils.equals(taskStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: taskStartEndTime);
|
|
|
-// if (Objects.equals(r.getStatus(),CarWaybillEnum.COMPLETION_UNLOADING.getCode())){
|
|
|
-//
|
|
|
-// }
|
|
|
- String endStartEndTime = DateUtils.format(r.getTaskEndTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
+
|
|
|
+ String endStartEndTime = DateUtils.format(waybillOrder.getTaskEndTime(), DateUtils.DATE_TIME_PATTERN);
|
|
|
kwfTruckTraceReplay.setTaskEndTime(StringUtils.equals(endStartEndTime, CommonConstants.DATE_TIME) ? StringUtils.EMPTY: endStartEndTime);
|
|
|
kwfTruckTraceReplay.setWarningCount("");
|
|
|
return kwfTruckTraceReplay;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 查询车辆实时位置信息
|
|
|
+ * @param req 查询参数
|
|
|
+ * @return 车辆实时位置信息
|
|
|
+ */
|
|
|
public TruckInfoVo queryTruckInfo(TruckInfoReq req) {
|
|
|
log.info("查询车辆实时位置信息参数:{}", req);
|
|
|
- //todo cxf 查询当前位置 有可能没有任务则不查询td 查询redis
|
|
|
- String location;
|
|
|
- if (StringUtils.isNotBlank(req.getTruckNo())){
|
|
|
- return getTruckInfoVo(req.getTruckNo());
|
|
|
+ //先查缓存 缓存没有 在查询数据中台 数据中台没有 则查询中交
|
|
|
+ if (StringUtils.isNotBlank(req.getTruckNo()) && StringUtils.isNotBlank(req.getTruckNo())){
|
|
|
+ return getTruckInfo(req.getTruckNo(),req.getWOrderNo());
|
|
|
}
|
|
|
|
|
|
//如果车牌为空那么查询车队的第一条数据 (从tab页面直接进来)
|
|
|
@@ -167,43 +186,156 @@ public class kwfTruckTraceService {
|
|
|
if (Objects.isNull(dataFirstTruck) || Objects.isNull(dataFirstTruck.getTruckNo())){
|
|
|
return new TruckInfoVo();
|
|
|
}
|
|
|
- return getTruckInfoVo(dataFirstTruck.getTruckNo());
|
|
|
+ return getTruckInfo(dataFirstTruck.getTruckNo(),"");
|
|
|
}
|
|
|
|
|
|
- private static TruckInfoVo getTruckInfoVo(String truckNo) {
|
|
|
- String location = RedissonUtils.getString(CommonConstants.TRUCK_LOCATION + truckNo);
|
|
|
+ private TruckInfoVo getTruckInfo(String truckNo, String wOrderNo) {
|
|
|
+ //先查询缓存 如果缓存没有就查数据中台 数据中台没有就查中交
|
|
|
+ String location = RedissonUtils.getString(CommonConstants.TRUCK_LOCATION + truckNo+CommonConstants.UNDERSCORE+wOrderNo);
|
|
|
if (StringUtils.isBlank(location)){
|
|
|
- //todo cxf 查询中交运车辆位置
|
|
|
return new TruckInfoVo();
|
|
|
}
|
|
|
TruckDto truckDto = JSON.parseObject(location, TruckDto.class);
|
|
|
//如果运单号为空那么返回redis的数据 这个数据是app最后一次上报的数据
|
|
|
- if (Objects.nonNull(truckDto) && StringUtils.isBlank(truckDto.getWOrderNo())){
|
|
|
- return TruckInfoVo.toTruckInfoVo(truckDto);
|
|
|
+ if (Objects.nonNull(truckDto)){
|
|
|
+ return TruckInfoVo.toTruckInfoVo(truckDto);
|
|
|
}
|
|
|
- //如果车牌不为空直接查询 查缓存
|
|
|
- if (StringUtils.isNotBlank(truckDto.getWOrderNo())){
|
|
|
- //todo cxf 查询中交
|
|
|
- return new TruckInfoVo();
|
|
|
+ //缓存没有则查询数据中台
|
|
|
+ List<VehicleReturnData> vehicleReturnData = getVehicleReturnData(wOrderNo);
|
|
|
+ if (CollectionUtils.isNotEmpty(vehicleReturnData)){
|
|
|
+ return buildTruckInfo(wOrderNo, vehicleReturnData);
|
|
|
}
|
|
|
- return null;
|
|
|
+ //todo 查询中交 如果数据中台没有数据则查询中交
|
|
|
+ return new TruckInfoVo();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将数据中台的数据进行组织
|
|
|
+ * @param wOrderNo 运单号
|
|
|
+ * @param vehicleReturnData 中台数据
|
|
|
+ * @return 组织的数据
|
|
|
+ */
|
|
|
+ private TruckInfoVo buildTruckInfo(String wOrderNo, List<VehicleReturnData> vehicleReturnData) {
|
|
|
+ VehicleReturnData vehicleReturn = vehicleReturnData.get(0);
|
|
|
+ TruckInfoVo truckInfoVo = TruckInfoVo.getInstance();
|
|
|
+ truckInfoVo.setWOrderNo(vehicleReturn.getWOrderNo());
|
|
|
+ truckInfoVo.setTruckNo(vehicleReturn.getCarNo());
|
|
|
+ truckInfoVo.setGpsStatus(String.valueOf(vehicleReturn.getSpeed()));
|
|
|
+ truckInfoVo.setLongitude(vehicleReturn.getLongitude());
|
|
|
+ truckInfoVo.setLatitude(vehicleReturn.getLatitude());
|
|
|
+ truckInfoVo.setLocationTime(Objects.isNull(vehicleReturn.getTs())? "" : DateUtils.format(vehicleReturn.getTs(),DateUtils.DATE_TIME_PATTERN));
|
|
|
+ KwtWaybillOrderSubtask subtask = kwtWaybillOrderSubtaskRepository.findOneByWOrderNo(wOrderNo);
|
|
|
+ truckInfoVo.setLOrderNo(Objects.isNull(subtask) ? "" : String.valueOf(subtask.getLOrderId()));
|
|
|
+ truckInfoVo.setTaskAddress("");
|
|
|
+ return truckInfoVo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 查询当前任务的轨迹
|
|
|
+ * @param req 请求参数
|
|
|
+ * @return 响应参数
|
|
|
+ */
|
|
|
public CurrentTaskTraceReqVo queryCurrentTaskTrace(CurrentTaskTraceReq req) {
|
|
|
log.info("查询当前任务轨迹参数:{}", req);
|
|
|
if (StringUtils.isBlank(req.getWOrderNo())){
|
|
|
log.info("运单号为空没有任务,没有关联路线");
|
|
|
return new CurrentTaskTraceReqVo();
|
|
|
}
|
|
|
- //cxf todo 查询车辆td数据库
|
|
|
- return new CurrentTaskTraceReqVo();
|
|
|
+ //查询数据中台获取轨迹
|
|
|
+ List<VehicleReturnData> vehicleReturnDataList = getVehicleReturnData(req.getWOrderNo());
|
|
|
+ if (CollectionUtils.isEmpty(vehicleReturnDataList)){
|
|
|
+ return new CurrentTaskTraceReqVo();
|
|
|
+ }
|
|
|
+ //组织返回数据
|
|
|
+ List<CurrentTaskTraceReqVo.CurrentTaskTrace> currentTaskTraceList = vehicleReturnDataList.stream()
|
|
|
+ .map(kwfTruckTraceService::getCurrentTaskTrace)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ CurrentTaskTraceReqVo currentTaskTraceReqVo = new CurrentTaskTraceReqVo();
|
|
|
+ currentTaskTraceReqVo.setWOrderNo(vehicleReturnDataList.get(0).getWOrderNo());
|
|
|
+ currentTaskTraceReqVo.setCurrentTaskTraceList(currentTaskTraceList);
|
|
|
+ return currentTaskTraceReqVo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 查询数据中台获取轨迹
|
|
|
+ * @param wOrderNo 运单号
|
|
|
+ * @return 轨迹数据
|
|
|
+ */
|
|
|
+ private List<VehicleReturnData> getVehicleReturnData(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);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("查询任务轨迹异常",e);
|
|
|
+ throw new BusinessException("查询任务轨迹异常");
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(s)){
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ return JSON.parseArray(s, VehicleReturnData.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static CurrentTaskTraceReqVo.CurrentTaskTrace getCurrentTaskTrace(VehicleReturnData e) {
|
|
|
+ CurrentTaskTraceReqVo.CurrentTaskTrace currentTaskTrace = new CurrentTaskTraceReqVo.CurrentTaskTrace();
|
|
|
+ currentTaskTrace.setLongitude(e.getLongitude());
|
|
|
+ currentTaskTrace.setLatitude(e.getLatitude());
|
|
|
+ currentTaskTrace.setLocationTime(Objects.isNull(e.getTs()) ? "" : DateUtils.format(e.getTs(), DateUtils.DATE_TIME_PATTERN));
|
|
|
+ return currentTaskTrace;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询车辆轨迹
|
|
|
+ * @param req 轨迹参数
|
|
|
+ * @return 轨迹数据
|
|
|
+ */
|
|
|
public CurrentTaskTraceReqVo queryCurrentTruckTrace(CurrentTaskTraceReq req) {
|
|
|
+ log.info("查询车辆轨迹参数:{}", req);
|
|
|
if (StringUtils.isBlank(req.getTruckNo())){
|
|
|
throw new BusinessException("车牌号不能为空");
|
|
|
}
|
|
|
//cxf todo 查询车辆td数据库
|
|
|
+
|
|
|
return new CurrentTaskTraceReqVo();
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 上报车辆轨迹
|
|
|
+ * @param req 请求参数
|
|
|
+ * @return 响应参数
|
|
|
+ */
|
|
|
+ public Void vehiclesTrajectory(@Valid VehiclesTrajectoryReq req) {
|
|
|
+ try {
|
|
|
+ HttpUtil.postJson(urlConfigProperties.getApiBaseUrl()+ UrlConstants.VEHICLE_TRAJECTORY, JSON.toJSONString(req), null);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("app上报车辆轨迹异常",e);
|
|
|
+ throw new BusinessException("app上报车辆轨迹异常");
|
|
|
+ }
|
|
|
+ //先删除缓存
|
|
|
+ RedissonUtils.delete(CommonConstants.TRUCK_LOCATION + req.getTruckNo()+CommonConstants.UNDERSCORE+req.getWOrderNo());
|
|
|
+ //组织缓存数据
|
|
|
+ TruckDto truckDto = getTruckDto(req);
|
|
|
+ //放入缓存
|
|
|
+ RedissonUtils.add(CommonConstants.TRUCK_LOCATION + req.getTruckNo()+CommonConstants.UNDERSCORE+req.getWOrderNo(),JSON.toJSONString(truckDto));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 组织返回数据
|
|
|
+ * @param req 请求参数
|
|
|
+ * @return 缓存数据
|
|
|
+ */
|
|
|
+ private static TruckDto getTruckDto(VehiclesTrajectoryReq req) {
|
|
|
+ TruckDto truckDto = new TruckDto();
|
|
|
+ truckDto.setWOrderNo(req.getWOrderNo());
|
|
|
+ truckDto.setTruckNo(req.getTruckNo());
|
|
|
+ truckDto.setGpsStatus(String.valueOf(req.getSpeed()));
|
|
|
+ truckDto.setLongitude(req.getLongitude());
|
|
|
+ truckDto.setLatitude(req.getLatitude());
|
|
|
+ truckDto.setLocationTime(DateUtils.format(LocalDateTime.now(), DateUtils.DATE_TIME_PATTERN));
|
|
|
+ truckDto.setLOrderNo(req.getLOrderNo());
|
|
|
+ truckDto.setTaskAddress("");
|
|
|
+ return truckDto;
|
|
|
+ }
|
|
|
}
|