package com.xiaopeng.maintenance.controller; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.operation.NewCruiseOrderDto; 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.automaticPilot.VehiclePosition; import com.xiaopeng.common.core.domain.R; 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; import com.xiaopeng.maintenance.model.vo.OperationRecordsVO; import com.xiaopeng.maintenance.service.IXpVehiclePreparationService; 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; /** *

* 车辆管理 前端控制器 *

* * @author mitao * @since 2026-02-03 */ @Slf4j @RestController @Api(tags = "车辆运维") public class XpVehicleOperationsController { @Resource private IXpVehiclePreparationService xpVehiclePreparationService; @Resource private XpVehicleClient xpVehicleClient; @Resource private XpCruiseOrderClient xpCruiseOrderClient; @Resource private MongoTemplate mongoTemplate; @Resource private AliOssService aliOssService; @Autowired private XpCruisePlanClient xpCruisePlanClient; /** * 车辆详情-车辆调度-发车 收车 */ @Transactional(rollbackFor = Exception.class) @ApiOperation(value = "车辆运维-车辆调度-发车/收车", tags = {"运维APP-车辆管理"}) @PostMapping("/api/v1/vehicle/vehicleDispatchDeparture") public R vehicleDispatchDeparture(@RequestBody VehicleDispatchDepartureDTO dto) { // 判断是否有正在进行的正常订单 // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData(); if(xpVehicle.getState()==1){ return R.fail("车辆正在接单中"); } VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); if(vehiclePosition==null || vehiclePosition.getPoint()==null){ return R.fail("车辆位置信息不存在"); } xpVehicle.setOperatingStatus(dto.getDepartureStatus()); xpVehicleClient.updateVehicleById(xpVehicle); // 发车 if(dto.getDepartureStatus()==1){ // 找车辆的任务 生成巡游单子 下发命令 //发车之前,检查所有之前没终止的数据,将其终止 xpCruiseOrderClient.stopAllCruiseOrder(xpVehicle.getVehicleVin()); R newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(),xpVehicle.getVehicleVin(),xpVehicle.getFleetId(),vehiclePosition.getPoint())); if(newCruiseOrder.getData()!=null){ //标记订单为返程类型巡游单 //方向为正向 XpCruiseOrder cruiseOrder = newCruiseOrder.getData(); cruiseOrder.setOrderType(2); cruiseOrder.setOrderReverse(1); R longR = xpCruiseOrderClient.addCruiseOrder(cruiseOrder); if(200 != longR.getCode()){ return R.fail(longR.getMsg()); } } }else if(dto.getDepartureStatus()==3){ // 收车 关闭当前巡游单子 生成新的返程单子 找到收车站点 R r = xpCruiseOrderClient.cancelCruiseOrderByVin(xpVehicle.getVehicleVin()); XpCruiseOrder xpCruiseOrder = new XpCruiseOrder(); if(vehiclePosition!=null){ double x = vehiclePosition.getPoint().getX(); double y = vehiclePosition.getPoint().getY(); xpCruiseOrder.setStartLon(x); xpCruiseOrder.setStartLat(y); } xpCruiseOrder.setVehicleId(xpVehicle.getId()); xpCruiseOrder.setFleetId(xpVehicle.getFleetId()); xpCruiseOrder.setOrderType(2); xpCruiseOrder.setStatus(1); xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setLastOrderId(r.getData()); xpCruiseOrder.setOrderReverse(1); // 找到收车站点 XpCruiseOrder returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder).getData(); if(returnCruisePoint!=null){ xpCruiseOrderClient.addCruiseOrder(returnCruisePoint); } } return R.ok(); } /** * 车辆详情-车辆调度-接单、测试 */ @ApiOperation(value = "车辆运维-车辆调度-接单、测试", tags = {"运维APP-车辆管理"}) @PostMapping("/api/v1/vehicle/vehicleDispatchAccept") public R vehicleDispatchAccept(@RequestBody VehicleDispatchAcceptDTO dto) { // 查询车辆 XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData(); xpVehicle.setAcceptOrTest(dto.getAcceptOrTest()); xpVehicle.setAcceptOrTestStatus(dto.getAcceptOrTestStatus()); xpVehicleClient.updateVehicleById(xpVehicle); return R.ok(); } /** * 车辆详情-车辆调度-运维记录 */ @ApiOperation(value = "车辆运维-车辆调度-运维记录", tags = {"运维APP-车辆管理"}) @PostMapping("/api/v1/vehicle/operationRecords") public R> operationRecords(@Validated @RequestBody OperationRecordsQuery query) throws UnsupportedEncodingException { PageInfo 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); } }