|
|
@@ -24,6 +24,7 @@ import com.sckw.core.web.response.BaseResult;
|
|
|
import com.sckw.fleet.api.RemoteFleetService;
|
|
|
import com.sckw.fleet.api.model.vo.RDriverVo;
|
|
|
import com.sckw.fleet.api.model.vo.RFleetDriverVo;
|
|
|
+import com.sckw.fleet.api.model.vo.RFleetVo;
|
|
|
import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
import com.sckw.manage.api.RemoteManageService;
|
|
|
import com.sckw.order.api.dubbo.RemoteTradeOrderAmountService;
|
|
|
@@ -41,6 +42,7 @@ 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.param.*;
|
|
|
+import com.sckw.transport.model.dto.GenerateTraceReq;
|
|
|
import com.sckw.transport.model.vo.CurrentTaskTraceReqVo;
|
|
|
import com.sckw.transport.model.vo.KwfTruckTraceReplayVo;
|
|
|
import com.sckw.transport.model.vo.TruckInfoVo;
|
|
|
@@ -89,6 +91,7 @@ public class kwfTruckTraceService {
|
|
|
private final VehicleTraceClient vehicleTraceClient;
|
|
|
private final KwtLogisticsOrderGoodsRepository kwtLogisticsOrderGoodsRepository;
|
|
|
private final KwtLogisticsOrderRepository kwtLogisticsOrderRepository;
|
|
|
+ private final KwtVehicleExceptionRepository kwtVehicleExceptionRepository;
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
|
|
|
RemoteSystemService remoteSystemService;
|
|
|
|
|
|
@@ -1158,20 +1161,16 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
|
|
|
|
// 任务开始时间
|
|
|
- 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()));
|
|
|
- }
|
|
|
+ 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);
|
|
|
+ Date startTime = order.getCreateTime();
|
|
|
+ Date endTime = new Date();
|
|
|
+ if (Objects.equals(order.getStatus(), CarWaybillV1Enum.WAIT_UNLOADING.getCode())){
|
|
|
+ endTime = order.getUpdateTime() != null ? order.getUpdateTime() : new Date();
|
|
|
}
|
|
|
+ long duration = (endTime.getTime() - startTime.getTime()) / (1000 * 60);
|
|
|
+ vo.setTaskDuration(duration);
|
|
|
|
|
|
// 从异常表查询该运单的异常数量
|
|
|
Integer exceptionCount = exceptionCountMap.getOrDefault(order.getWOrderNo(), 0);
|
|
|
@@ -1210,4 +1209,114 @@ public class kwfTruckTraceService {
|
|
|
}
|
|
|
return allEnt;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成车辆轨迹数据
|
|
|
+ * @param req 生成轨迹请求
|
|
|
+ */
|
|
|
+ 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.getWOrderNo());
|
|
|
+ if (Objects.isNull(order)){
|
|
|
+ throw new BusinessException("运单不存在");
|
|
|
+ }
|
|
|
+ //查询子运单
|
|
|
+ KwtWaybillOrder subOrders = kwtWaybillOrderRepository.queryByBillOrderId(order.getLOrderId());
|
|
|
+ if (Objects.isNull(subOrders)){
|
|
|
+ throw new BusinessException("子运单不存在");
|
|
|
+ }
|
|
|
+ // 通过车牌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 {
|
|
|
+ // 调用数据中台保存轨迹数据
|
|
|
+ BaseResult<Void> result = vehicleTraceClient.saveVehicleData(vehiclesTrajectoryReq);
|
|
|
+ if (result.getCode() != HttpStatus.SUCCESS_CODE) {
|
|
|
+ log.error("保存车辆轨迹数据失败:{}", result.getMessage());
|
|
|
+ throw new BusinessException("生成轨迹失败:" + result.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果有异常类型,同时保存到本地车辆异常表
|
|
|
+ saveException(req, order, longitude, latitude);
|
|
|
+
|
|
|
+ log.info("生成车辆轨迹成功,运单号:{},车牌号:{}", req.getWOrderNo(), req.getTruckNo());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("生成车辆轨迹异常:", e);
|
|
|
+ throw new BusinessException("生成轨迹失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ 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.setWOrderNo(req.getWOrderNo());
|
|
|
+ vehicleException.setDriverId(order.getDriverId());
|
|
|
+ vehicleException.setDriverName(order.getDriverName());
|
|
|
+ vehicleException.setDriverPhone(order.getDriverPhone());
|
|
|
+ vehicleException.setExceptionType(req.getExceptionType());
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @NotNull
|
|
|
+ private static VehiclesTrajectoryReq getVehiclesTrajectoryReq(GenerateTraceReq req, KwtWaybillOrder order, String longitude, String latitude, KwtLogisticsOrder logisticsOrder, RFleetVo fleetByTruckId) {
|
|
|
+ VehiclesTrajectoryReq vehiclesTrajectoryReq = new VehiclesTrajectoryReq();
|
|
|
+ vehiclesTrajectoryReq.setTs(req.getDate() + " " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")));
|
|
|
+ vehiclesTrajectoryReq.setMobile(order.getDriverPhone());
|
|
|
+ vehiclesTrajectoryReq.setTruckNo(req.getTruckNo());
|
|
|
+ vehiclesTrajectoryReq.setLongitude(longitude);
|
|
|
+ vehiclesTrajectoryReq.setLatitude(latitude);
|
|
|
+ vehiclesTrajectoryReq.setSpeed(60.0f);
|
|
|
+ vehiclesTrajectoryReq.setGpsStatus("60");
|
|
|
+ vehiclesTrajectoryReq.setDirection(30.0f);
|
|
|
+ vehiclesTrajectoryReq.setFuelLevel(20.0f);
|
|
|
+ vehiclesTrajectoryReq.setMileage("60");
|
|
|
+ vehiclesTrajectoryReq.setEngineTemp(40.0f);
|
|
|
+ vehiclesTrajectoryReq.setBatteryVoltage(30.0f);
|
|
|
+ vehiclesTrajectoryReq.setStatus("0");
|
|
|
+ if (req.getExceptionType() != null){
|
|
|
+ vehiclesTrajectoryReq.setStatus(String.valueOf(req.getExceptionType()));
|
|
|
+ }
|
|
|
+ vehiclesTrajectoryReq.setWOrderNo(req.getWOrderNo());
|
|
|
+ vehiclesTrajectoryReq.setLOrderNo(Optional.ofNullable(logisticsOrder).map(KwtLogisticsOrder::getLOrderNo).orElse( ""));
|
|
|
+ VehiclesTrajectoryReq.VehicleDataVO vehicleDataVO = new VehiclesTrajectoryReq.VehicleDataVO();
|
|
|
+ vehicleDataVO.setCarNo(req.getTruckNo());
|
|
|
+ if (fleetByTruckId != null){
|
|
|
+ vehicleDataVO.setFleetId(fleetByTruckId.getId().toString());
|
|
|
+ vehicleDataVO.setFleetName(fleetByTruckId.getName());
|
|
|
+ }
|
|
|
+ vehiclesTrajectoryReq.setVehicleDataVO(vehicleDataVO);
|
|
|
+ return vehiclesTrajectoryReq;
|
|
|
+ }
|
|
|
}
|