xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/NewCruiseOrderDto.java
New file @@ -0,0 +1,19 @@ package com.xiaopeng.api.dto.operation; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.web.bind.annotation.RequestParam; @Data @AllArgsConstructor @NoArgsConstructor public class NewCruiseOrderDto { // 车id private Long vehicleId; // 车vin private String vehicleVin; // 车队id private Long fleetId; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpCruisePlanClientFallbackFactory.java
@@ -36,10 +36,18 @@ } @Override public R<XpCruiseOrder> getNewCruiseOrder(Long vehicleId) { public R<XpCruiseOrder> getNewCruiseOrder(NewCruiseOrderDto dto) { log.error("XpCruisePlanClientFallbackFactory getNewCruiseOrder error:{}", cause.getMessage()); return null; } @Override public R<XpCruiseOrder> findReturnCruisePoint(XpCruiseOrder xpCruiseOrder) { log.error("XpCruisePlanClientFallbackFactory findReturnCruisePoint error:{}", cause.getMessage()); return null; } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpCruisePlanClient.java
@@ -43,5 +43,13 @@ * @return */ @PostMapping("/inner/cruise/getNewCruiseOrder") R<XpCruiseOrder> getNewCruiseOrder(@RequestParam Long vehicleId); R<XpCruiseOrder> getNewCruiseOrder(@RequestBody NewCruiseOrderDto dto); /** * 找到收车点位 * @return */ @PostMapping("/inner/cruise/findReturnCruisePoint") R<XpCruiseOrder> findReturnCruisePoint(@RequestBody XpCruiseOrder xpCruiseOrder); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java
@@ -109,4 +109,13 @@ @PostMapping("/inner/vehicle/updateVehicleStatus") R<?> updateVehicleStatus(@RequestBody UpdateVehicleStateDto updateVehicleStateDto); /** * 根据车辆id查询车辆所属的车队id * * @param vehicleId * @return */ @GetMapping("/inner/vehicle/findFleetIdByVehicleId") R<Long> findFleetIdByVehicleId(@RequestParam Long vehicleId); } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
@@ -2,6 +2,7 @@ import cn.hutool.core.util.IdUtil; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.operation.NewCruiseOrderDto; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient; import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; @@ -74,16 +75,17 @@ // 发车 if(dto.getDepartureStatus()==1){ // 找车辆的任务 生成巡游单子 下发命令 TODO v xpCruisePlanClient.getNewCruiseOrder(xpVehicle.getId()); // 找车辆的任务 生成巡游单子 下发命令 R<XpCruiseOrder> newCruiseOrder = xpCruisePlanClient.getNewCruiseOrder(new NewCruiseOrderDto(xpVehicle.getId(),xpVehicle.getVehicleVin(),xpVehicle.getFleetId())); if(newCruiseOrder.getData()!=null){ // 下发命令 orderMissionClient.pushOrder(new PushOrderDto(xpVehicle.getVehicleVin(),newCruiseOrder.getData().getId(),null)); } }else if(dto.getDepartureStatus()==3){ // 收车 关闭当前巡游单子 生成新的返程单子 找到收车站点 xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin()); R<String> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin()); // redis 获取当前最新经纬度位置 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); @@ -97,22 +99,17 @@ xpCruiseOrder.setOrderType(2); xpCruiseOrder.setStartLon(x); xpCruiseOrder.setStartLat(y); // TODO v 找到收车站点 xpCruiseOrder.setStatus(1); xpCruiseOrder.setOrderReverse(1); xpCruiseOrder.setLastOrderId(r.getData()); xpCruiseOrderClient.addCruiseOrder(xpCruiseOrder); // 下发命令 orderMissionClient.pushOrder(new PushOrderDto( xpCruiseOrder.getVehicleVin(),xpCruiseOrder.getId(),null)); // 找到收车站点 R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder); if(returnCruisePoint!=null){ xpCruiseOrderClient.addCruiseOrder(returnCruisePoint.getData()); // 下发命令 orderMissionClient.pushOrder(new PushOrderDto( xpCruiseOrder.getVehicleVin(),xpCruiseOrder.getId(),null)); } } return R.ok(); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
@@ -1,8 +1,10 @@ package com.xiaopeng.operation.controller; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xiaopeng.api.dto.operation.CruisePointDto; import com.xiaopeng.api.dto.operation.NewCruiseOrderDto; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.operation.XpCruisePlan; import com.xiaopeng.api.model.operation.XpCruisePlanPoint; @@ -38,6 +40,7 @@ import io.swagger.annotations.ApiParam; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -110,27 +113,32 @@ break; } } XpCruiseOrder newXpCruiseOrder = dto.getNewXpCruiseOrder(); XpCruisePlanPoint xpCruisePlanPoint = null; // 判断是否是最后一个 是则往前一个 否找下一个 if (index == planPointList.size() - 1) { // 最后一个 找上一个 xpCruisePlanPoint = planPointList.get(index - 1); newXpCruiseOrder.setOrderReverse(2); } else if (index == 0) { // 第一个 找下一个 xpCruisePlanPoint = planPointList.get(index + 1); newXpCruiseOrder.setOrderReverse(1); } else { // 中间点位 if (dto.getOrderReverse() == 1) { // 正向 找下一个 xpCruisePlanPoint = planPointList.get(index + 1); newXpCruiseOrder.setOrderReverse(1); } else { // 反向找上一个 xpCruisePlanPoint = planPointList.get(index - 1); newXpCruiseOrder.setOrderReverse(2); } } Long pointId = xpCruisePlanPoint.getPointId(); XpPoint point = pointService.getById(pointId); XpCruiseOrder newXpCruiseOrder = dto.getNewXpCruiseOrder(); newXpCruiseOrder.setEndPointId(pointId); newXpCruiseOrder.setEndPointName(point.getPointName()); newXpCruiseOrder.setEndLon(point.getPointLon()); @@ -142,27 +150,71 @@ } /** * 获取巡游订单数据 * @return */ @PostMapping("/inner/cruise/getNewCruiseOrder") public R<XpCruiseOrder> getNewCruiseOrder(@RequestParam Long vehicleId) { // 获取车辆的车队id public R<XpCruiseOrder> getNewCruiseOrder(@RequestBody NewCruiseOrderDto dto) { // 先找计划 XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, vehicleId)); XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, dto.getVehicleId())); // 找对应的多个点位 List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, plan.getCruisePlanId()).orderByAsc(XpCruisePlanPoint::getSortOrder)); XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0); Long pointId = xpCruisePlanPoint.getPointId(); XpPoint point = pointService.getById(pointId); XpCruiseOrder newXpCruiseOrder = new XpCruiseOrder(); newXpCruiseOrder.setId("XU"+ IdUtil.fastUUID()); newXpCruiseOrder.setFleetId(dto.getFleetId()); newXpCruiseOrder.setVehicleId(dto.getVehicleId()); newXpCruiseOrder.setVehicleVin(dto.getVehicleVin()); newXpCruiseOrder.setOrderType(1); newXpCruiseOrder.setMissionId(plan.getCruisePlanId()); newXpCruiseOrder.setStatus(1); newXpCruiseOrder.setOrderReverse(1); // 起点 newXpCruiseOrder.setStartLon(point.getPointLon()); newXpCruiseOrder.setStartLat(point.getPointLat()); newXpCruiseOrder.setStartPointId(pointId); newXpCruiseOrder.setStartPointName(point.getPointName()); newXpCruiseOrder.setMissionId(xpCruisePlanPoint.getCruisePlanId()); return null; // 终点 XpCruisePlanPoint endCruisePlanPoint = planPointList.get(1); Long endPointId = endCruisePlanPoint.getPointId(); XpPoint endPoint = pointService.getById(endPointId); newXpCruiseOrder.setEndPointId(endPointId); newXpCruiseOrder.setEndPointName(endPoint.getPointName()); newXpCruiseOrder.setEndLon(endPoint.getPointLon()); newXpCruiseOrder.setEndLat(endPoint.getPointLat()); return R.ok(newXpCruiseOrder); } /** * 获取车辆返回点位 * @param xpCruiseOrder * @return */ @PostMapping("/inner/cruise/findReturnCruisePoint") public R<XpCruiseOrder> findReturnCruisePoint(@RequestBody XpCruiseOrder xpCruiseOrder){ // 先找计划 XpCruisePlanVehicle plan = xpCruisePlanVehicleService.getOne(new LambdaQueryWrapper<XpCruisePlanVehicle>().eq(XpCruisePlanVehicle::getVehicleId, xpCruiseOrder.getVehicleId())); // 找对应的多个点位 List<XpCruisePlanPoint> planPointList = xpCruisePlanPointService.list(new LambdaQueryWrapper<XpCruisePlanPoint>().eq(XpCruisePlanPoint::getCruisePlanId, plan.getCruisePlanId()).orderByAsc(XpCruisePlanPoint::getSortOrder)); XpPoint xpPoint = pointService.list(new LambdaQueryWrapper<XpPoint>().eq(XpPoint::getParkingPoint, 1).in(XpPoint::getId, planPointList.stream().map(XpCruisePlanPoint::getPointId).collect(Collectors.toList()))).get(0); xpCruiseOrder.setEndPointId(xpPoint.getId()); xpCruiseOrder.setEndPointName(xpPoint.getPointName()); xpCruiseOrder.setEndLon(xpPoint.getPointLon()); xpCruiseOrder.setEndLat(xpPoint.getPointLat()); return R.ok(xpCruiseOrder); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -461,6 +461,18 @@ } /** * * 查询车辆所属车队ID * @param vehicleId * @return */ @GetMapping("/inner/vehicle/findFleetIdByVehicleId") public R<Long> findFleetIdByVehicleId(@RequestParam Long vehicleId){ XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper<XpFleetVehicle>().eq(XpFleetVehicle::getVehicleId, vehicleId)); return R.ok(xpFleetVehicle.getFleetId()); } /** * 查询可改派的车辆列表 * * @return 车辆列表