From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
---
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java | 165 ++++++++++++++++++++++++++++++++++++------------------
1 files changed, 110 insertions(+), 55 deletions(-)
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
index 67e8844..d105420 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
@@ -1,18 +1,21 @@
package com.xiaopeng.maintenance.controller;
-import cn.hutool.core.util.IdUtil;
-import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
+import cn.hutool.core.lang.Snowflake;
+import com.alibaba.fastjson2.JSONObject;
+import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
import com.xiaopeng.api.dto.operation.NewCruiseOrderDto;
-import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
+import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
-import com.xiaopeng.api.vo.OrderType;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
+import com.xiaopeng.api.vo.automaticPilot.protobuf.TaskActionType;
import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.utils.SensitiveDataCryptoUtil;
import com.xiaopeng.common.core.web.page.PageInfo;
+import com.xiaopeng.evi.oss.service.AliOssService;
import com.xiaopeng.maintenance.dto.VehicleDispatchAcceptDTO;
import com.xiaopeng.maintenance.dto.VehicleDispatchDepartureDTO;
import com.xiaopeng.maintenance.model.query.OperationRecordsQuery;
@@ -21,16 +24,21 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
/**
* <p>
@@ -54,59 +62,94 @@
@Resource
private MongoTemplate mongoTemplate;
@Resource
- private OrderMissionClient orderMissionClient;
+ private AliOssService aliOssService;
@Autowired
private XpCruisePlanClient xpCruisePlanClient;
+ @Autowired
+ private VehicleBuriedPointClient vehicleBuriedPointClient;
+
+ @Resource(name = "hutoolSnowflake")
+ private Snowflake snowflake;
/**
* 车辆详情-车辆调度-发车 收车
*/
+ @Transactional(rollbackFor = Exception.class)
@ApiOperation(value = "车辆运维-车辆调度-发车/收车", tags = {"运维APP-车辆管理"})
- @PostMapping("/api/v1/vehicle/vehicleDispatchDeparture")
+ @PostMapping("/maintenance-app/api/v1/vehicle/vehicleDispatchDeparture")
public R<String> vehicleDispatchDeparture(@RequestBody VehicleDispatchDepartureDTO dto) {
// 判断是否有正在进行的正常订单
// 查询车辆
XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData();
- if(xpVehicle.getState()==1){
+ if (xpVehicle.getState() == 1) {
return R.fail("车辆正在接单中");
}
- xpVehicle.setOperatingStatus(dto.getDepartureStatus());
- xpVehicleClient.updateVehicleById(xpVehicle);
-
- VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
- if(vehiclePosition==null || vehiclePosition.getPoint()==null){
+ String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
+ VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+ if (vehiclePosition == null || vehiclePosition.getPoint() == null) {
return R.fail("车辆位置信息不存在");
}
+ Integer departureStatus = dto.getDepartureStatus();
+ XpVehicle vehicle1 = new XpVehicle();
+ vehicle1.setOperatingStatus(departureStatus);
+ vehicle1.setId(xpVehicle.getId());
+ xpVehicleClient.updateVehicleById(vehicle1);
+
+ // 封装埋点消息实体
+ VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+ vehicleEventDTO.setVin(vin);
+ vehicleEventDTO.setXpuId("");
+ vehicleEventDTO.setOrderId("");
+ vehicleEventDTO.setEventKey("RT_web_vehicle_status_changed");
+ vehicleEventDTO.setEventTime(System.currentTimeMillis());
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put("vin", vin);
+ attributes.put("order_id", "");
+ attributes.put("timestamp", vehicleEventDTO.getEventTime());
+
+ // 1.0埋点新增
+ attributes.put("odometer_km", vehiclePosition.getTotalOdometer());
+
+ if (departureStatus == 1) {
+ attributes.put("main_status", "ONLINE");
+ // TODO 预留位置 目前无状态
+ attributes.put("sub_status", "");
+ attributes.put("prev_sub_status", "");
+
+ } else {
+ attributes.put("main_status", "OFFLINE");
+ // TODO 预留位置 目前无状态
+ attributes.put("sub_status", "");
+ attributes.put("prev_sub_status", "");
+ }
+ vehicleEventDTO.setAttributes(attributes);
+ vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+
// 发车
- if(dto.getDepartureStatus()==1){
+ if (dto.getDepartureStatus() == 1) {
// 找车辆的任务 生成巡游单子 下发命令
- R<XpCruiseOrder> newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(),xpVehicle.getVehicleVin(),xpVehicle.getFleetId(),vehiclePosition.getPoint()));
- if(newCruiseOrder.getData()!=null){
-
- xpCruiseOrderClient.addCruiseOrder(newCruiseOrder.getData());
- // 下发命令
- PushOrderDto pushOrderDto = new PushOrderDto();
- pushOrderDto.setVin(xpVehicle.getVehicleVin());
- pushOrderDto.setOrderId("XU" + newCruiseOrder.getData().getId());
- pushOrderDto.setStartLatitude(newCruiseOrder.getData().getStartLat());
- pushOrderDto.setStartLongitude(newCruiseOrder.getData().getStartLon());
- pushOrderDto.setEndLatitude(newCruiseOrder.getData().getEndLat());
- pushOrderDto.setEndLongitude(newCruiseOrder.getData().getEndLon());
- pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
- pushOrderDto.setStage(2);
- orderMissionClient.pushOrder(pushOrderDto);
+ //发车之前,检查所有之前没终止的数据,将其终止
+ xpCruiseOrderClient.stopAllCruiseOrder(vin);
+ R<XpCruiseOrder> newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(), vin, xpVehicle.getFleetId(), vehiclePosition.getPoint()));
+ if (newCruiseOrder.getData() != null && 200 == newCruiseOrder.getCode()) {
+ //方向为正向
+ XpCruiseOrder cruiseOrder = newCruiseOrder.getData();
+ cruiseOrder.setOrderType(2);
+ cruiseOrder.setOrderReverse(1);
+ //不停车替换新任务
+ cruiseOrder.setTaskActionType(TaskActionType.kTerminateForNewTask);
+ R<Long> longR = xpCruiseOrderClient.addCruiseOrder(cruiseOrder);
+ if (200 != longR.getCode()) {
+ return R.fail(longR.getMsg());
+ }
}
-
-
- }else if(dto.getDepartureStatus()==3){
+ } else if (dto.getDepartureStatus() == 3) {
// 收车 关闭当前巡游单子 生成新的返程单子 找到收车站点
- R<Long> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin());
-
- // redis 获取当前最新经纬度位置
+ XpCruiseOrder oldCruiseOrder = xpCruiseOrderClient.cancelCruiseOrderByVin(vin).getData();
XpCruiseOrder xpCruiseOrder = new XpCruiseOrder();
- if(vehiclePosition!=null){
+ if (vehiclePosition != null) {
double x = vehiclePosition.getPoint().getX();
double y = vehiclePosition.getPoint().getY();
xpCruiseOrder.setStartLon(x);
@@ -117,25 +160,19 @@
xpCruiseOrder.setOrderType(2);
xpCruiseOrder.setStatus(1);
xpCruiseOrder.setOrderReverse(1);
- xpCruiseOrder.setLastOrderId(r.getData());
+ xpCruiseOrder.setLastOrderId(oldCruiseOrder.getId());
+ xpCruiseOrder.setOrderReverse(1);
+ xpCruiseOrder.setXpuTaskId(snowflake.nextId() + "");
// 找到收车站点
XpCruiseOrder returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder).getData();
- if(returnCruisePoint!=null){
+ if (returnCruisePoint != null) {
+ //不停车替换新任务
+ returnCruisePoint.setLastOrderId1("XU" + oldCruiseOrder.getId());
+ returnCruisePoint.setLastXpuTaskId(oldCruiseOrder.getXpuTaskId());
+ returnCruisePoint.setTaskActionType(TaskActionType.kTerminateForNewTask);
xpCruiseOrderClient.addCruiseOrder(returnCruisePoint);
- // 下发命令
- PushOrderDto pushOrderDto = new PushOrderDto();
- pushOrderDto.setVin(returnCruisePoint.getVehicleVin());
- pushOrderDto.setOrderId("XU" + returnCruisePoint.getId());
- pushOrderDto.setStartLatitude(returnCruisePoint.getStartLat());
- pushOrderDto.setStartLongitude(returnCruisePoint.getStartLon());
- pushOrderDto.setEndLatitude(returnCruisePoint.getEndLat());
- pushOrderDto.setEndLongitude(returnCruisePoint.getEndLon());
- pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
- pushOrderDto.setStage(2);
- orderMissionClient.pushOrder(pushOrderDto);
}
-
}
return R.ok();
}
@@ -144,13 +181,15 @@
* 车辆详情-车辆调度-接单、测试
*/
@ApiOperation(value = "车辆运维-车辆调度-接单、测试", tags = {"运维APP-车辆管理"})
- @PostMapping("/api/v1/vehicle/vehicleDispatchAccept")
+ @PostMapping("/maintenance-app/api/v1/vehicle/vehicleDispatchAccept")
public R<String> vehicleDispatchAccept(@RequestBody VehicleDispatchAcceptDTO dto) {
// 查询车辆
XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData();
- xpVehicle.setAcceptOrTest(dto.getAcceptOrTest());
- xpVehicle.setAcceptOrTestStatus(dto.getAcceptOrTestStatus());
- xpVehicleClient.updateVehicleById(xpVehicle);
+ XpVehicle vehicle1 = new XpVehicle();
+ vehicle1.setId(xpVehicle.getId());
+ vehicle1.setAcceptOrTest(dto.getAcceptOrTest());
+ vehicle1.setAcceptOrTestStatus(dto.getAcceptOrTestStatus());
+ xpVehicleClient.updateVehicleById(vehicle1);
return R.ok();
}
@@ -158,9 +197,25 @@
* 车辆详情-车辆调度-运维记录
*/
@ApiOperation(value = "车辆运维-车辆调度-运维记录", tags = {"运维APP-车辆管理"})
- @PostMapping("/api/v1/vehicle/operationRecords")
- public R<PageInfo<OperationRecordsVO>> operationRecords(@Validated @RequestBody OperationRecordsQuery query) {
+ @PostMapping("/maintenance-app/api/v1/vehicle/operationRecords")
+ public R<PageInfo<OperationRecordsVO>> operationRecords(@Validated @RequestBody OperationRecordsQuery query) throws UnsupportedEncodingException {
PageInfo<OperationRecordsVO> operationRecords = xpVehiclePreparationService.operationRecords(query);
+ for (OperationRecordsVO record : operationRecords.getRecords()) {
+ String vehiclePictures = record.getVehiclePictures();
+ if (StringUtils.isNotBlank(vehiclePictures)) {
+ JSONObject jsonObject = JSONObject.parseObject(vehiclePictures);
+ // 1
+ String downloadUrl = jsonObject.getString("url");
+ try {
+ downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
+ } catch (UnsupportedEncodingException e) {
+ log.error("获取图片下载地址失败", e);
+ }
+ jsonObject.put("url", downloadUrl);
+ record.setVehiclePictures(jsonObject.toJSONString());
+ }
+
+ }
return R.ok(operationRecords);
}
--
Gitblit v1.7.1