puzhibing
2026-03-09 2f4b407e014be7e5e6090c247f66ac695c5a9fbf
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -17,6 +17,7 @@
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpOrder;import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.SystemEventType;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.RTTask;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.TaskStatus;
@@ -65,7 +66,7 @@
    @PostMapping("/inner/pushOrder")
    public R<Boolean> pushOrder(@RequestBody PushOrderDto dto) {
        RtTask.Builder taskBuilder = RtTask.newBuilder();
        //TODO 设置目标地点信息
        taskBuilder.setOrderId(dto.getOrderId().toString());
        taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
@@ -75,44 +76,82 @@
            taskBuilder.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI);
        }
        //构建点位信息
        Waypoint.Builder pointBuilder = Waypoint.newBuilder();
        Waypoint.Builder pointBuilderStart = Waypoint.newBuilder();
        Waypoint.Builder pointBuilderEnd = Waypoint.newBuilder();
        //巡游订单
        if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER)){
            pointBuilder.setPointType(PointType.CRUISE_END_POINT);
            pointBuilder.setSequence(1);
            //构建终点坐标
            //构建起点坐标数据
            pointBuilderStart.setWaypointId(dto.getOrderId() + "-001");
            pointBuilderStart.setPointType(PointType.START_POINT);
            pointBuilderStart.setSequence(1);
            pointBuilderStart.setActionType(ActionType.ACTION_UNSPECIFIED);
            GeoPoint.Builder geoPointBuilder = GeoPoint.newBuilder();
            geoPointBuilder.setLatitude(dto.getStartLatitude());
            geoPointBuilder.setLongitude(dto.getStartLongitude());
            pointBuilderStart.setPoint(geoPointBuilder.build());
            taskBuilder.addPoints(pointBuilderStart);
            //构建终点数据
            pointBuilderEnd.setWaypointId(dto.getOrderId() + "-002");
            pointBuilderEnd.setPointType(PointType.CRUISE_END_POINT);
            pointBuilderEnd.setSequence(2);
            pointBuilderEnd.setActionType(ActionType.DRIVE_THROUGH);
            geoPointBuilder = GeoPoint.newBuilder();
            geoPointBuilder.setLatitude(dto.getEndLatitude());
            geoPointBuilder.setLongitude(dto.getEndLatitude());
            // geoPointBuilder.setPoiName("Start Point"); // GeoPoint might not have poi_name
            pointBuilder.setPoint(geoPointBuilder.build());
            pointBuilderEnd.setPoint(geoPointBuilder.build());
            taskBuilder.addPoints(pointBuilderEnd);
            taskBuilder.setSequence(1);
        }else{
            //用户订单
            if(dto.getStage() == 1){
                //开往上车点
                pointBuilder.setPointType(PointType.START_POINT);
                pointBuilder.setActionType(ActionType.PICK_UP);
                pointBuilder.setSequence(1);
                //构建起点坐标
                //构建车辆当前位置数据
                pointBuilderStart.setWaypointId(dto.getOrderId() + "-JJ-001");
                pointBuilderStart.setPointType(PointType.START_POINT);
                pointBuilderStart.setActionType(ActionType.ACTION_UNSPECIFIED);
                pointBuilderStart.setSequence(1);
                GeoPoint.Builder geoPointBuilder = GeoPoint.newBuilder();
                geoPointBuilder.setLatitude(dto.getStartLatitude());
                geoPointBuilder.setLongitude(dto.getStartLongitude());
                // geoPointBuilder.setPoiName("Start Point"); // GeoPoint might not have poi_name
                pointBuilder.setPoint(geoPointBuilder.build());
                pointBuilderStart.setPoint(geoPointBuilder.build());
                taskBuilder.addPoints(pointBuilderStart);
                //构建上车点位置信息
                pointBuilderEnd.setWaypointId(dto.getOrderId() + "-JJ-002");
                pointBuilderEnd.setPointType(PointType.PICK_UP_POINT);
                pointBuilderEnd.setActionType(ActionType.PICK_UP);
                pointBuilderEnd.setSequence(2);
                geoPointBuilder = GeoPoint.newBuilder();
                geoPointBuilder.setLatitude(dto.getStartLatitude());
                geoPointBuilder.setLongitude(dto.getStartLongitude());
                pointBuilderEnd.setPoint(geoPointBuilder.build());
                taskBuilder.addPoints(pointBuilderEnd);
                taskBuilder.setSequence(1);
            }else{
                //开往终点
                pointBuilder.setPointType(PointType.END_POINT);
                pointBuilder.setActionType(ActionType.PICK_UP);
                pointBuilder.setSequence(1);
                //构建起点坐标
                //构建上车点位置信息
                pointBuilderStart.setWaypointId(dto.getOrderId() + "-SD-001");
                pointBuilderStart.setPointType(PointType.PICK_UP_POINT);
                pointBuilderStart.setActionType(ActionType.PICK_UP);
                pointBuilderStart.setSequence(1);
                GeoPoint.Builder geoPointBuilder = GeoPoint.newBuilder();
                geoPointBuilder.setLatitude(dto.getEndLatitude());
                geoPointBuilder.setLongitude(dto.getEndLatitude());
                // geoPointBuilder.setPoiName("Start Point"); // GeoPoint might not have poi_name
                pointBuilder.setPoint(geoPointBuilder.build());
                pointBuilderStart.setPoint(geoPointBuilder.build());
                taskBuilder.addPoints(pointBuilderStart);
                //构建下车点位置信息
                pointBuilderEnd.setWaypointId(dto.getOrderId() + "-SD-002");
                pointBuilderEnd.setPointType(PointType.END_POINT);
                pointBuilderEnd.setActionType(ActionType.DROP_OFF);
                pointBuilderEnd.setSequence(2);
                geoPointBuilder = GeoPoint.newBuilder();
                geoPointBuilder.setLatitude(dto.getEndLatitude());
                geoPointBuilder.setLongitude(dto.getEndLatitude());
                pointBuilderEnd.setPoint(geoPointBuilder.build());
                taskBuilder.addPoints(pointBuilderEnd);
                taskBuilder.setSequence(2);
            }
        }
        taskBuilder.addPoints(pointBuilder);
        RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
        taskListBuilder.addTasks(taskBuilder.build());
@@ -120,12 +159,19 @@
        snowFlake.withStartTimestamp(1420041600000L);
        long sequence = snowFlake.nextId();
        MqttPublishDto mqttPublishDto = xpuUtil.cloudCreateOrder(taskListBuilder.build(), dto.getVin(),sequence);
        // 正常单子才修改  巡游单子不修改状态
        if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("event", SystemEventType.CREATE_ORDER);
            jsonObject.put("orderType", dto.getOrderId().contains("XU") ? com.xiaopeng.api.vo.OrderType.CRUISE_ORDER : com.xiaopeng.api.vo.OrderType.USER_ORDER);
            jsonObject.put("orderId", dto.getOrderId());
            jsonObject.put("vin", dto.getVin());
            redisTemplate.opsForValue().set("CREATE_ORDER:" + dto.getOrderId().toString(), jsonObject.toJSONString(),30, TimeUnit.MINUTES);
            return R.ok(true);
        }
        //先将车辆修改状态,防止在异步通知之前被其他订单选中
        if (!dto.getOrderId().contains("XU") && mqttPublishDto.getCode()== 200) {
            // 修改车子为接单状态
            xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(),1));
            return R.ok(true);
            xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1));
        }
        return R.ok(false);
    }
@@ -136,7 +182,7 @@
        operationBuilder.setOrderId(dto.getOrderId().toString());
        operationBuilder.setTaskId("CANCEL_MISSION_" + IdUtil.fastUUID());
        if (dto.getOperation_type() != null) {
            operationBuilder.setOperationType(OrderOperationType.forNumber(dto.getOperation_type().getValue()));
            operationBuilder.setOperationType(OrderOperationType.forNumber(dto.getOperation_type().getNumber()));
        }
        SnowFlake snowFlake = new SnowFlake(0, 0);