From c98d3f2fc620b3f5d699e2be34eaabc1033b42b2 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 11 三月 2026 16:17:32 +0800
Subject: [PATCH] 修改巡游订单部分逻辑

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java        |   33 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java                |    1 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskRuleDetailVO.java                                   |    5 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskClient.java                              |   12 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpCruiseOrderClient.java                             |   18 +
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java                            |    9 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutinePreparationScheduleTask.java      |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpCruiseOrderClientFallbackFactory.java                  |   19 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java                    |   42 ++
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java          |  122 +++++---
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java     |  131 ++++----
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java                  |   39 ++
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCleanScheduleTask.java            |    2 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java                       |   26 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java             |    9 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java                   |    2 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java              |   15 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/utils/GDMapGeocodingUtil.java                     |   56 ++++
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java               |   89 +++--
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskNotificationScheduleTask.java |    2 
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java                              |    6 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java           |    2 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskExpireCheckScheduleTask.java  |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskClientFallbackFactory.java                   |    7 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskRuleClient.java                          |    9 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java     |    7 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleMaintenanceScheduleTask.java      |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java                                          |    9 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java                          |    6 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/InsuranceInspectionScheduleTask.java     |    2 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java       |    5 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskRuleClientFallbackFactory.java               |    7 
 /dev/null                                                                                                             |  111 -------
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java         |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java                                         |    4 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java                             |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskScheduleConstants.java                              |    2 
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserNotificationClient.java             |    2 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleInspectionScheduleTask.java       |    2 
 39 files changed, 453 insertions(+), 370 deletions(-)

diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskClientFallbackFactory.java
index 0c0a8af..9bcff29 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskClientFallbackFactory.java
@@ -21,6 +21,13 @@
                 // 降级策略: 返回 false (未上班状态)
                 return R.fail("通过车辆id查询上一次保养记录失败,"+cause.getMessage());
             }
+
+            @Override
+            public R saveVehicleAccidentError(Long vehicleId) {
+                log.error("添加车辆事故任务失败, vehicleId={}, 错误信息: {}",
+                        vehicleId, cause.getMessage(), cause);
+                return R.fail("添加车辆事故任务失败:" + cause.getMessage());
+            }
         };
     }
 
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskRuleClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskRuleClientFallbackFactory.java
index 7372aab..b710ab6 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskRuleClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskRuleClientFallbackFactory.java
@@ -2,6 +2,7 @@
 
 import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
 import com.xiaopeng.api.model.maintenance.XpTaskRule;
+import com.xiaopeng.api.vo.maintenance.TaskRuleDetailVO;
 import com.xiaopeng.common.core.domain.R;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -20,6 +21,12 @@
                          cause.getMessage(), cause);
                 return R.fail("查询运维规则失败,"+cause.getMessage());
             }
+
+            @Override
+            public R<TaskRuleDetailVO> taskRuleAndRoleDetail() {
+                log.error("查询运维规则详情失败 {}", cause.getMessage());
+                return R.fail("查询运维规则失败:" + cause.getMessage());
+            }
         };
     }
 
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpCruiseOrderClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpCruiseOrderClientFallbackFactory.java
index d76076e..ad2130e 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpCruiseOrderClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpCruiseOrderClientFallbackFactory.java
@@ -31,7 +31,7 @@
         log.error("订单服务调用失败: {}", cause.getMessage());
         return new XpCruiseOrderClient() {
             @Override
-            public R<String> addCruiseOrder(XpCruiseOrder order) {
+            public R<Long> addCruiseOrder(XpCruiseOrder order) {
                 log.error("订单服务调用失败: {}", cause.getMessage());
                 return null;
             }
@@ -43,19 +43,24 @@
             }
 
             @Override
-            public R<String> updateCruiseOrder(String vin) {
+            public R<Long> updateCruiseOrder(String vin) {
                 log.error("订单服务调用失败: {}", cause.getMessage());
-                return null;
+                return R.fail("根据车辆VIN查询取消订单失败:" + cause.getMessage());
             }
 
             @Override
-            public R<String> closeCruiseOrder(String vin) {
-                log.error("订单服务调用失败: {}", cause.getMessage());
-                return null;
+            public R<Long> updateCruiseOrderId(Long orderId) {
+                return R.fail("根据订单ID查询取消订单失败:" + cause.getMessage());
             }
 
             @Override
-            public R<XpCruiseOrder> getCruiseOrder(String orderId) {
+            public R<Long> closeCruiseOrder(String vin) {
+                log.error("订单服务调用失败: {}", cause.getMessage());
+                return R.fail("根据VIN码关闭巡游单失败");
+            }
+
+            @Override
+            public R<XpCruiseOrder> getCruiseOrder(Long orderId) {
                 log.error("订单服务调用失败: {}", cause.getMessage());
                 return null;
             }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserNotificationClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserNotificationClient.java
index e6b1810..deb097a 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserNotificationClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserNotificationClient.java
@@ -33,5 +33,5 @@
      * @return
      */
     @PostMapping(value = "/inner/v1/notification/addBatch")
-    public R<?> addNotificationBatch(@RequestBody List<XpOperationsUserNotification> notifications);
+    R<?> addNotificationBatch(@RequestBody List<XpOperationsUserNotification> notifications);
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskClient.java
index 99c3bde..21ebeb3 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskClient.java
@@ -8,6 +8,8 @@
 import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 /**
@@ -29,4 +31,14 @@
      */
     @GetMapping("/inner/xpTask/queryInfoByVehicleId")
     R<XpTask> queryInfoByVehicleId(@RequestParam("vehicleId") Long vehicleId);
+
+
+
+    /**
+     * 添加车辆事故任务
+     * @param vehicleId
+     * @return
+     */
+    @PostMapping("/api/v1/taskManagement/saveVehicleAccidentError")
+    R saveVehicleAccidentError(@RequestParam Long vehicleId);
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskRuleClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskRuleClient.java
index 532826a..f64de0e 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskRuleClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskRuleClient.java
@@ -5,6 +5,7 @@
 import com.xiaopeng.api.model.maintenance.XpTask;
 import com.xiaopeng.api.model.maintenance.XpTaskRule;
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
+import com.xiaopeng.api.vo.maintenance.TaskRuleDetailVO;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -29,4 +30,12 @@
      */
     @GetMapping("/inner/xpTaskRule/queryDetail")
     R<XpTaskRule> queryDetail();
+
+
+    /**
+     * 查询任务规则详情
+     * @return
+     */
+    @GetMapping("/inner/v1/taskRule/taskRuleAndRoleDetail")
+    R<TaskRuleDetailVO> taskRuleAndRoleDetail();
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpCruiseOrderClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpCruiseOrderClient.java
index 87e77ea..304f3bc 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpCruiseOrderClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpCruiseOrderClient.java
@@ -34,7 +34,7 @@
      * @param order 订单信息
      */
     @PostMapping("/inner/cruiseOrder/addCruiseOrder")
-    R<String> addCruiseOrder(@RequestBody XpCruiseOrder order);
+    R<Long> addCruiseOrder(@RequestBody XpCruiseOrder order);
 
 
     /**
@@ -53,14 +53,24 @@
      * @param vin 订单信息
      */
     @PostMapping("/inner/cruiseOrder/updateCruiseOrder")
-    R<String> updateCruiseOrder(@RequestParam String vin);
+    R<Long> updateCruiseOrder(@RequestParam String vin);
+
+
+    /**
+     * 根据订单ID查询取消订单
+     * @param orderId
+     * @return
+     */
+    @PostMapping("/inner/cruiseOrder/updateCruiseOrderId")
+    R<Long> updateCruiseOrderId(@RequestParam Long orderId);
 
 
     /**
      * 关闭
      */
     @PostMapping("/inner/cruiseOrder/closeCruiseOrder")
-    R<String> closeCruiseOrder(@RequestParam String vin);
+    R<Long> closeCruiseOrder(@RequestParam String vin);
+
 
     /**
      * 查询订单信息
@@ -68,5 +78,5 @@
      * @param orderId 订单信息id
      */
     @PostMapping("/inner/cruiseOrder/getCruiseOrder")
-    R<XpCruiseOrder> getCruiseOrder(@RequestParam String orderId);
+    R<XpCruiseOrder> getCruiseOrder(@RequestParam Long orderId);
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
index 16a94bb..58124d2 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
@@ -29,7 +29,7 @@
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 @TableName("xp_task")
-@ApiModel(value="XpTask对象", description="任务管理")
+@ApiModel(value = "XpTask对象", description = "任务管理")
 public class XpTask extends BaseModel {
 
     private static final long serialVersionUID = 1L;
@@ -43,7 +43,7 @@
 
     @ApiModelProperty(value = "任务类别1常规 2事故")
     private Integer taskCategory;
-//1:车辆检查,2:车辆充电,3:车辆整备,4:整备洗车,5:车辆维修,6:车辆保养,7:车辆保险到期,8:车辆年检到期9:车辆运营资质到期
+    //1:车辆检查,2:车辆充电,3:车辆整备,4:整备洗车,5:车辆维修,6:车辆保养,7:车辆保险到期,8:车辆年检到期9:车辆运营资质到期
     @ApiModelProperty(value = "任务类型id 任务类别为2时对应数据字典,多个逗号分割,为1的时候 枚举1车辆检查 2车辆充电 3车辆整备 4整备洗车 5车辆维修 6车辆保养 7车辆保险到期 8车辆年检到期 9车辆运营资质到期")
     private String taskTypeId;
 
@@ -55,10 +55,6 @@
 
     @ApiModelProperty(value = "任务描述图片")
     private String taskImage;
-
-
-
-
 
     @ApiModelProperty(value = "车辆id")
     private Long vehicleId;
@@ -98,7 +94,6 @@
 
     @ApiModelProperty(value = "状态 0=待到达 1=待处理 2=已完成 3=已取消")
     private Integer status;
-
 
 
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java
index bc04ba0..638cc90 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java
@@ -32,7 +32,7 @@
     private static final long serialVersionUID = 1L;
 
     @TableId(value = "id", type = IdType.NONE)
-    private String id;
+    private Long id;
 
     @ApiModelProperty(value = "车辆id")
     private Long vehicleId;
@@ -83,7 +83,7 @@
 
     @ApiModelProperty(value = "返程上次的订单id")
     @TableField("last_order_id")
-    private String lastOrderId;
+    private Long lastOrderId;
 
     @ApiModelProperty(value = "方向 1正2反")
     @TableField("order_reverse")
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskRuleDetailVO.java
similarity index 95%
rename from xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java
rename to xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskRuleDetailVO.java
index c379e43..ecf5656 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskRuleDetailVO.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskRuleDetailVO.java
@@ -1,7 +1,5 @@
-package com.xiaopeng.maintenance.vo;
+package com.xiaopeng.api.vo.maintenance;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
 import io.swagger.annotations.ApiModel;
@@ -10,7 +8,6 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.List;
 
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/TaskScheduleConstants.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskScheduleConstants.java
similarity index 98%
rename from xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/TaskScheduleConstants.java
rename to xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskScheduleConstants.java
index edbf40e..70e2218 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/TaskScheduleConstants.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskScheduleConstants.java
@@ -1,4 +1,4 @@
-package com.xiaopeng.maintenance.constant;
+package com.xiaopeng.api.vo.maintenance;
 
 /**
  * 定时任务常量类
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
index 6e12f34..d465fb7 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -26,7 +26,6 @@
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.enums.OrderStatusEnum;
 import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
-import com.xiaopeng.common.core.utils.SnowFlake;
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.redis.service.RedisService;
 import io.swagger.annotations.Api;
@@ -59,25 +58,21 @@
     private RedisService redisService;
     @Resource
     private XpVehicleClient xpVehicleClient;
+    @Resource
+    private Snowflake snowflake;
 
     @PostMapping("/inner/pushOrder")
     public R<Boolean> pushOrder(@RequestBody PushOrderDto dto) {
-        RtTask.Builder taskBuilder = RtTask.newBuilder();
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        taskBuilder.setOrderId(dto.getOrderId().toString());
-        taskBuilder.setTaskId(snowFlake.nextId() + "");
-
-        if(dto.getOrderId().contains("XU")){
-            taskBuilder.setTaskType(OrderType.ORDER_TYPE_CRUISE);
-        }else {
-            taskBuilder.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI);
-        }
         //构建点位信息
         Waypoint.Builder pointBuilderStart = Waypoint.newBuilder();
         Waypoint.Builder pointBuilderEnd = Waypoint.newBuilder();
+        RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
         //巡游订单
         if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER)){
+            RtTask.Builder taskBuilder = RtTask.newBuilder();
+            taskBuilder.setOrderId(dto.getOrderId().toString());
+            taskBuilder.setTaskId(snowflake.nextId() + "");
+            taskBuilder.setTaskType(OrderType.ORDER_TYPE_CRUISE);
             //构建起点坐标数据
             pointBuilderStart.setWaypointId(dto.getOrderId() + "-001");
             pointBuilderStart.setPointType(PointType.START_POINT);
@@ -101,62 +96,68 @@
             taskBuilder.addPoints(pointBuilderEnd);
             taskBuilder.setSequence(1);
             taskBuilder.addOrderPhase(OrderPhase.ROUTE_TO_CRUISE);
+            taskListBuilder.addTasks(taskBuilder.build());
         }else{
-            //用户订单
-            if(dto.getStage() == 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());
-                pointBuilderStart.setPoint(geoPointBuilder.build());
-                taskBuilder.addPoints(pointBuilderStart);
+            for (int i = 1; i < 3; i++) {
+                RtTask.Builder taskBuilder = RtTask.newBuilder();
+                taskBuilder.setOrderId(dto.getOrderId().toString());
+                taskBuilder.setTaskId(snowflake.nextId() + "");
+                taskBuilder.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI);
+                if(i == 1){
+                    VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getVin())), VehiclePosition.class);
+                    //构建车辆当前位置数据
+                    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(vehiclePosition.getPoint().getY());
+                    geoPointBuilder.setLongitude(vehiclePosition.getPoint().getX());
+                    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);
-                taskBuilder.addOrderPhase(OrderPhase.ROUTE_TO_PICKUP);
-            }else{
-                //构建上车点位置信息
-                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());
-                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(i);
+                    taskBuilder.addOrderPhase(OrderPhase.ROUTE_TO_PICKUP);
+                }else{
+                    //构建上车点位置信息
+                    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.getStartLatitude());
+                    geoPointBuilder.setLongitude(dto.getStartLongitude());
+                    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.addOrderPhase(OrderPhase.ROUTE_TO_DESTINATION);
+                    //构建下车点位置信息
+                    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(i);
+                    taskBuilder.addOrderPhase(OrderPhase.ROUTE_TO_DESTINATION);
+                }
+                taskListBuilder.addTasks(taskBuilder.build());
             }
         }
-        RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
-        taskListBuilder.addTasks(taskBuilder.build());
 
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         MqttPublishDto mqttPublishDto = xpuUtil.cloudCreateOrder(taskListBuilder.build(), dto.getVin(),sequence);
         //先将车辆修改状态,防止在异步通知之前被其他订单选中
         if (!dto.getOrderId().contains("XU") && mqttPublishDto.getCode()== 200) {
@@ -179,14 +180,12 @@
     R<Boolean> cancelOrder(@RequestBody PushOrderDto dto) {
         OrderOperation.Builder operationBuilder = OrderOperation.newBuilder();
         operationBuilder.setOrderId(dto.getOrderId().toString());
-        operationBuilder.setTaskId("CANCEL_MISSION_" + IdUtil.fastUUID());
+        operationBuilder.setTaskId(snowflake.nextId() + "");
         if (dto.getOperation_type() != null) {
             operationBuilder.setOperationType(OrderOperationType.forNumber(dto.getOperation_type().getNumber()));
         }
 
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         MqttPublishDto mqttPublishDto = xpuUtil.cloudOrderOperation(operationBuilder.build(), dto.getVin(), sequence);
 
         if (mqttPublishDto.getCode() == 200) {
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index 6602ed1..1267084 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -1,6 +1,6 @@
 package com.xiaopeng.automaticPilot.service;
 
-import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.lang.Snowflake;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.google.protobuf.InvalidProtocolBufferException;
@@ -14,6 +14,10 @@
 import com.xiaopeng.api.dto.order.PopOrderDto;
 import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
+import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
+import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
+import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
 import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
@@ -21,13 +25,13 @@
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.order.XpCruiseOrder;
 import com.xiaopeng.api.model.order.XpOrder;
-import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.OrderType;
-import com.xiaopeng.api.vo.SystemEventType;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
 import com.xiaopeng.api.vo.operation.RouteVo;
@@ -37,18 +41,17 @@
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.enums.OrderStatusEnum;
 import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
-import com.xiaopeng.common.core.utils.SnowFlake;
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.utils.uuid.UUID;
 import com.xiaopeng.common.redis.service.RedisService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.geo.Point;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.data.mongodb.core.query.UpdateDefinition;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
@@ -100,6 +103,15 @@
 
     @Resource
     private XpCruisePlanClient xpCruisePlanClient;
+
+    @Resource
+    private Snowflake snowflake;
+
+    @Value("${robotaxi.appId:xp_robotaxi_api}")
+    private String appid;
+
+    @Resource
+    private XpTaskClient xpTaskClient;
 
     private static final com.google.protobuf.util.JsonFormat.Printer jsonPrinter = com.google.protobuf.util.JsonFormat.printer()
             .printingEnumsAsInts()
@@ -377,35 +389,52 @@
         int value = gearLevel.getNumber();
         redisService.setCacheObject(CacheConstants.GEAR_LEVEL + systemRuntimeStatus.getVehicleStatus().getStaticInfo().getXpuId(), value);
         // 判断是否为故障状态
+        XpVehicle vehicle = null;
         if (abnormalReason == AbnormalReason.FAULT) {
             log.info("车辆故障,开始处理故障");
-            // TODO 添加异常任务
-            // 解绑用户与车辆关系
-            CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
             String orderId = systemRuntimeStatus.getRunningOrderStatusInfo().getOrderId();
-            XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
-            XpVehicle vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
-            if (vehicle != null) {
-                // 修改车辆状态
-                vehicle.setOperatingStatus(4);
-                xpVehicleClient.updateVehicleById(vehicle);
-                cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin());
-                cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString());
-                cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber());
-                userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+            if(!orderId.contains("XU")){
+                //巡游订单,需要关闭订单
+                xpCruiseOrderClient.updateCruiseOrderId(Long.parseLong(orderId.substring(2)));
+                XpCruiseOrder cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2))).getData();
+                vehicle = xpVehicleClient.queryById(cruiseOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    vehicle.setOperatingStatus(4);
+                    xpVehicleClient.updateVehicleById(vehicle);
+                }
+            }else{
+                //正常订单
+                XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
+                vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+                if (vehicle != null) {
+                    // 修改车辆状态
+                    vehicle.setState(0);
+                    vehicle.setOperatingStatus(4);
+                    xpVehicleClient.updateVehicleById(vehicle);
+                    // 解绑用户与车辆关系
+                    CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
+                    cancelTaxiPassengerVo.setVin(vehicle.getVehicleVin());
+                    cancelTaxiPassengerVo.setUid(xpOrder.getAppUserId().toString());
+                    cancelTaxiPassengerVo.setOrderNo(xpOrder.getOrderNumber());
+                    cancelTaxiPassengerVo.setAppId(appid);
+                    userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+                }
+                // TODO 重新派单
+                ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
+                reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
+                reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
+                reassignOrderDTO.setCount(10);
+                RealtimePose pose = systemRuntimeStatus.getPose();
+                Wgs naviPose = pose.getNaviPose();
+                Double latitude = naviPose.getLatitude();
+                Double longitude = naviPose.getLongitude();
+                reassignOrderDTO.setLongitude(longitude);
+                reassignOrderDTO.setLatitude(latitude);
+                reassignOrderClient.reassignOrder(reassignOrderDTO);
             }
-            // TODO 重新派单
-            ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
-            reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
-            reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
-            reassignOrderDTO.setCount(10);
-            RealtimePose pose = systemRuntimeStatus.getPose();
-            Wgs naviPose = pose.getNaviPose();
-            Double latitude = naviPose.getLatitude();
-            Double longitude = naviPose.getLongitude();
-            reassignOrderDTO.setLongitude(longitude);
-            reassignOrderDTO.setLatitude(latitude);
-            reassignOrderClient.reassignOrder(reassignOrderDTO);
+            //添加车辆异常任务和发送消息
+            xpTaskClient.saveVehicleAccidentError(vehicle.getId());
         }
     }
 
@@ -475,7 +504,7 @@
             if (orderId.contains("XU")) {
 //                orderType = OrderType.CRUISE_ORDER;
 
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
                 //先响应消息
@@ -591,7 +620,7 @@
             //巡游单
             if (orderPhase.equals(OrderPhase.ROUTE_TO_CRUISE)) {
                 /* 构建导航数据给到车端 */
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
 
                 origin.setLongitude(xpCruiseOrder.getStartLon());
@@ -738,9 +767,7 @@
 
         }
         orderOperationBuilder.addAllWaypoints(waypoints);
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         // 处理数据
         redisService.setCacheObject(sequence + "","pushOrder_"+orderId+"_"+vin,30L, TimeUnit.MINUTES);
         //开发发送请求到XPU
@@ -892,7 +919,7 @@
 
                 // 返程找到目前的订单 -》之前的订单 查询生成一个   正常巡游 找到下一个点位   若到达最后点位  则反向找点位  每次判断是否收车状态 是则不进行处理了
                 // 找到这个订单
-                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(orderId);
+                R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2)));
                 if(cruiseOrder!=null){
                     XpCruiseOrder xpCruiseOrder = cruiseOrder.getData();
                     Long vehicleId = xpCruiseOrder.getVehicleId();
@@ -909,13 +936,13 @@
                             XpCruiseOrder lastXpCruiseOrder = lastOrder.getData();
 
                             // 修改一下id 加一个一样的巡游单子
-                            lastXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
+                            lastXpCruiseOrder.setId(null);
                             lastXpCruiseOrder.setStatus(1);
                             xpCruiseOrderClient.addCruiseOrder(lastXpCruiseOrder);
                             //构建下发XPU订单报文数据
                             RtTask.Builder taskBuilder = RtTask.newBuilder();
-                            taskBuilder.setOrderId(lastXpCruiseOrder.getId());
-                            taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
+                            taskBuilder.setOrderId("XU" + lastXpCruiseOrder.getId());
+                            taskBuilder.setTaskId(snowflake.nextId() + "");
                             taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
                             //构建点位信息
                             Waypoint.Builder pointBuilder = Waypoint.newBuilder();
@@ -932,9 +959,7 @@
                             RtTask task = taskBuilder.build();
                             RtTaskList taskList = RtTaskList.newBuilder().addTasks(task).build();
 
-                            SnowFlake snowFlake = new SnowFlake(0, 0);
-                            snowFlake.withStartTimestamp(1420041600000L);
-                            long sequence1 = snowFlake.nextId();
+                            long sequence1 = snowflake.nextId();
                             xpuUtil.cloudCreateOrder(taskList, xpVehicle.getVehicleVin(),sequence1);
                         }else if(xpCruiseOrder.getOrderType()==1){
                            // 正常巡游 找到下一个点位   若到达最后点位  则反向找点位
@@ -942,7 +967,6 @@
                             Double endLon = xpCruiseOrder.getEndLon();
                             Double endLat = xpCruiseOrder.getEndLat();
                             XpCruiseOrder newXpCruiseOrder = new XpCruiseOrder();
-                            newXpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
                             newXpCruiseOrder.setVehicleId(xpCruiseOrder.getVehicleId());
                             newXpCruiseOrder.setVehicleVin(xpCruiseOrder.getVehicleVin());
                             newXpCruiseOrder.setFleetId(xpCruiseOrder.getFleetId());
@@ -966,8 +990,8 @@
                                 xpCruiseOrderClient.addCruiseOrder(cruisePoint.getData());
                                 RtTask.Builder taskBuilder = RtTask.newBuilder();
 
-                                taskBuilder.setOrderId(newXpCruiseOrder.getId());
-                                taskBuilder.setTaskId("MISSION_"+ IdUtil.fastUUID());
+                                taskBuilder.setOrderId("XU" + newXpCruiseOrder.getId());
+                                taskBuilder.setTaskId(snowflake.nextId() + "");
                                 taskBuilder.setTaskType(com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType.ORDER_TYPE_CRUISE);
 
                                 //构建点位信息
@@ -985,9 +1009,7 @@
                                 RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
                                 taskListBuilder.addTasks(taskBuilder.build());
 
-                                SnowFlake snowFlake = new SnowFlake(0, 0);
-                                snowFlake.withStartTimestamp(1420041600000L);
-                                long sequence1 = snowFlake.nextId();
+                                long sequence1 = snowflake.nextId();
                                 xpuUtil.cloudCreateOrder(taskListBuilder.build(), xpVehicle.getVehicleVin(),sequence1);
                             }
                         }
@@ -1038,9 +1060,7 @@
         navigationDataBuilder.setRequestId(requestId);
         navigationDataBuilder.setContent(routeDataContent);
         navigationDataBuilder.setTimestamp(System.currentTimeMillis());
-        SnowFlake snowFlake = new SnowFlake(0, 0);
-        snowFlake.withStartTimestamp(1420041600000L);
-        long sequence = snowFlake.nextId();
+        long sequence = snowflake.nextId();
         log.info("开始推送导航数据 {}", orderId);
         MqttPublishDto mqttPublishDto = xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
         log.info("推送导航的响应消息,{}", JSON.toJSONString(mqttPublishDto));
diff --git a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/SnowFlake.java b/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/SnowFlake.java
deleted file mode 100644
index a6c17f6..0000000
--- a/xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/SnowFlake.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.xiaopeng.common.core.utils;
-
-/**
- * see @https://raw.githubusercontent.com/beyondfengyu/SnowFlake/master/SnowFlake.java
- * Created by Lox on 2017/8/21.
- */
-public class SnowFlake {
-    /**
-     * 起始的时间戳
-     */
-    private static long START_STMP = 1503305692631L;
-
-    /**
-     * 每一部分占用的位数
-     */
-    private final static long SEQUENCE_BIT = 12; //序列号占用的位数
-    private final static long MACHINE_BIT = 5;   //机器标识占用的位数
-    private final static long DATACENTER_BIT = 5;//数据中心占用的位数
-
-    /**
-     * 每一部分的最大值
-     */
-    public final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
-    public final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
-    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
-
-    /**
-     * 每一部分向左的位移
-     */
-    private final static long MACHINE_LEFT = SEQUENCE_BIT;
-    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
-    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
-
-    private long datacenterId;  //数据中心
-    private long machineId;     //机器标识
-    private long sequence = 0L; //序列号
-    private long lastStmp = -1L;//上一次时间戳
-
-    public SnowFlake(long datacenterId, long machineId) {
-        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
-            throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
-        }
-        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
-            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
-        }
-        this.datacenterId = datacenterId;
-        this.machineId = machineId;
-    }
-
-    /**
-     * 设置初始时间,各业务方的旧算法有可能初始时间不一致,请使用
-     * @param timestamp 设定的新初始时间戳
-     * @return 当前对象
-     */
-    public SnowFlake withStartTimestamp(long timestamp) {
-        SnowFlake.START_STMP = timestamp;
-        return this;
-    }
-
-    /**
-     * 产生下一个ID
-     *
-     * @return
-     */
-    public synchronized long nextId() {
-        long currStmp = getNewstmp();
-        if (currStmp < lastStmp) {
-            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
-        }
-
-        if (currStmp == lastStmp) {
-            //相同毫秒内,序列号自增
-            sequence = (sequence + 1) & MAX_SEQUENCE;
-            //同一毫秒的序列数已经达到最大
-            if (sequence == 0L) {
-                currStmp = getNextMill();
-            }
-        } else {
-            //不同毫秒内,序列号置为0
-            sequence = 0L;
-        }
-
-        lastStmp = currStmp;
-
-        return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
-                | datacenterId << DATACENTER_LEFT       //数据中心部分
-                | machineId << MACHINE_LEFT             //机器标识部分
-                | sequence;                             //序列号部分
-    }
-
-    private long getNextMill() {
-        long mill = getNewstmp();
-        while (mill <= lastStmp) {
-            mill = getNewstmp();
-        }
-        return mill;
-    }
-
-    private long getNewstmp() {
-        return System.currentTimeMillis();
-    }
-
-//    public static void main(String[] args) {
-//        SnowFlake snowFlake = new SnowFlake(0, 0);
-//        snowFlake.withStartTimestamp(1420041600000L);
-//
-//        for (int i = 0; i < (1 << 5); i++) {
-//            System.out.println(snowFlake.nextId());
-//        }
-//    }
-}
\ No newline at end of file
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
index af174bf..cde62f6 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -61,11 +61,13 @@
     private XpFleetOperationsClient xpFleetOperationsClient;
     @Resource
     private XpVehicleClient xpVehicleClient;
+
     @ApiOperation(value = "事故类型列表", response = XpErrorType.class, tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/errorTypeList")
     public R<List<XpErrorType>> errorTypeList() {
         return xpErrorTypeService.errorTypeList();
     }
+
     @ApiOperation(value = "任务中心列表", response = TaskPageListVO.class, tags = "运维APP-任务中心")
     @PostMapping("/api/v1/task/pageList")
     public R<PageInfo<TaskPageListVO>> pageList(@RequestBody TaskPageListQuery query) {
@@ -73,13 +75,15 @@
         PageInfo<TaskPageListVO> pageList = xpTaskService.pageList(query);
         return R.ok(pageList);
     }
+
     @ApiOperation(value = "事故任务确认到达", tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/confirmArrive")
     @Transactional
-    public R confirmArrive( Long id) {
+    public R confirmArrive(Long id) {
         Long userId = tokenService.getLoginOperationUser().getXpOperationsUser().getId();
-        return xpTaskService.confirmArrive(id,userId);
+        return xpTaskService.confirmArrive(id, userId);
     }
+
     @ApiOperation(value = "查询车辆不分页列表", tags = "运维APP-任务中心")
     @PostMapping("/api/v1/task/listVehicle")
     public R<List<VehicleListVO>> listVehicle() {
@@ -89,21 +93,21 @@
         // 查询当前人员所属车队 查询车队关联车辆
         R<List<Long>> vehicleByUserId = xpFleetOperationsClient.getVehicleByUserId(xpOperationsUser.getId());
         List<Long> vehicleIds = vehicleByUserId.getData();
-        if (vehicleIds != null && !vehicleIds.isEmpty()){
+        if (vehicleIds != null && !vehicleIds.isEmpty()) {
 
             List<XpVehicle> data = xpVehicleClient.listByIds(vehicleIds).getData();
-            if (data!=null){
+            if (data != null) {
                 List<VehicleListVO> vehicleListVOS = new ArrayList<>();
                 for (XpVehicle xpVehicle : data) {
 
                     VehicleListVO vehicleListVO = new VehicleListVO();
                     vehicleListVO.setId(xpVehicle.getId());
                     VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
-                    if(vehiclePosition!=null){
+                    if (vehiclePosition != null) {
                         double x = vehiclePosition.getPoint().getX();
                         double y = vehiclePosition.getPoint().getY();
-                        vehicleListVO.setVehicleLon(x+"");
-                        vehicleListVO.setVehicleLat(y+"");
+                        vehicleListVO.setVehicleLon(x + "");
+                        vehicleListVO.setVehicleLat(y + "");
                     }
                     vehicleListVO.setVehicleCode(xpVehicle.getVehicleCode());
                     vehicleListVO.setVehicleColor(xpVehicle.getVehicleColor());
@@ -118,6 +122,7 @@
 
         return R.ok(new ArrayList<>());
     }
+
     @ApiOperation(value = "上传车辆事故", tags = "运维APP-任务中心")
     @PostMapping("/api/v1/task/saveVehicleAccident")
     public R saveVehicleAccident(@RequestBody SaveVehicleAccidentDto dto) {
@@ -126,6 +131,7 @@
         xpTaskService.saveVehicleAccident(dto, xpOperationsUser);
         return R.ok();
     }
+
     @ApiOperation(value = "车辆事故任务详情", tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/vehicleAccidentDetail")
     public R<TaskAccidentDetailVO> vehicleAccidentDetail(Long id) {
@@ -137,6 +143,7 @@
     public R<TaskRoutineDetailVO> vehicleRoutineDetail(Long id) {
         return xpTaskService.vehicleRoutineDetail(id);
     }
+
     @ApiOperation(value = "上传车辆其他常规任务详情", tags = "运维APP-任务中心")
     @PostMapping("/api/v1/task/saveRoutineDetail")
     public R saveRoutineDetail(@RequestBody SaveRoutineDetailDto dto) {
@@ -144,6 +151,7 @@
         Long id = loginOperationUser.getId();
         return xpTaskService.saveRoutineDetail(dto, id);
     }
+
     @ApiOperation(value = "车辆常规充电任务详情", tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/chargingDetail")
     public R<TaskChargingDetailVO> chargingDetail(Long id) {
@@ -155,32 +163,37 @@
     public R<com.xiaopeng.maintenance.vo.TaskRepairDetailVO> repairDetail(Long id) {
         return xpTaskService.repairDetail(id);
     }
+
     @ApiOperation(value = "车辆常规整备任务详情", tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/preparationDetail")
     public R<com.xiaopeng.maintenance.vo.TaskPreparationDetailVO> preparationDetail(Long id) {
         return xpTaskService.preparationDetail(id);
     }
+
     @ApiOperation(value = "车辆常规检测任务详情", tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/detectionDetail")
     public R<com.xiaopeng.maintenance.vo.TaskDetectionDetailVO> detectionDetail(Long id) {
         return xpTaskService.detectionDetail(id);
     }
+
     @ApiOperation(value = "车辆常规洗车任务详情", tags = "运维APP-任务中心")
     @GetMapping("/api/v1/task/cleanDetail")
     public R<com.xiaopeng.maintenance.vo.TaskCleanDetailVO> cleanDetail(Long id) {
         return xpTaskService.cleanDetail(id);
     }
+
     @ApiOperation(value = "处理车辆事故", tags = "运维APP-任务中心")
     @PostMapping("/api/v1/task/handleVehicleAccident")
     @Transactional
     public R handleVehicleAccident(@RequestBody HandleVehicleAccidentDto dto) {
         LoginOperationUser loginOperationUser = tokenService.getLoginOperationUser();
         XpOperationsUser xpOperationsUser = loginOperationUser.getXpOperationsUser();
-        return xpTaskService.handleVehicleAccident(dto,xpOperationsUser);
+        return xpTaskService.handleVehicleAccident(dto, xpOperationsUser);
     }
 
     /**
      * 通过车辆id查询任务事故分页列表
+     *
      * @return
      */
     @ApiOperation(value = "通过车辆id查询任务事故分页列表", tags = {"管理后台-车辆管理-运营车辆管理"})
@@ -191,15 +204,17 @@
 
     /**
      * 管理后台-车辆管理-运营车辆管理-删除任务/事故
+     *
      * @param id
      * @return
      */
     @ApiOperation(value = "删除删除任务/事故", tags = {"管理后台-车辆管理-运营车辆管理"})
     @DeleteMapping("/api/v1/task/delete/{id}")
-    public R<?> deleteTaskById(@ApiParam(name = "id", value = "任务ID") @PathVariable Long id){
+    public R<?> deleteTaskById(@ApiParam(name = "id", value = "任务ID") @PathVariable Long id) {
         xpTaskService.deleteTaskById(id);
         return R.ok();
     }
+
     @ApiOperation(value = "事故类型列表", response = XpErrorType.class, tags = "管理后台-车辆管理-运营车辆管理")
     @GetMapping("/api/v1/task/errorTypeTreeList")
     public R<List<XpErrorType>> errorTypeTreeList() {
@@ -208,11 +223,15 @@
 
     /**
      * 通过车辆id查询上一次保养记录
+     *
      * @param vehicleId 车辆ID
      */
     @GetMapping("/inner/xpTask/queryInfoByVehicleId")
-    public R<XpTask> queryInfoByVehicleId(@RequestParam("vehicleId") Long vehicleId){
+    public R<XpTask> queryInfoByVehicleId(@RequestParam("vehicleId") Long vehicleId) {
         XpTask xpTask = xpTaskService.queryInfoByVehicleId(vehicleId);
         return R.ok(xpTask);
     }
+
+
+
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
index abf03a9..00db2eb 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java
@@ -77,17 +77,20 @@
     private XpFleetOperationsClient xpFleetOperationsClient;
     @Resource
     private XpVehicleClient xpVehicleClient;
+
     @ApiOperation(value = "事故类型列表", response = XpErrorType.class)
     @GetMapping("/errorTypeList")
     public R<List<XpErrorType>> errorTypeList() {
         return xpErrorTypeService.errorTypeList();
     }
+
     @ApiOperation(value = "任务中心列表", response = TaskManagementPageListVO.class)
     @PostMapping("/pageList")
     public R<PageInfo<TaskManagementPageListVO>> pageListManagement(@RequestBody TaskManagementPageListQuery query) {
         PageInfo<TaskManagementPageListVO> pageList = xpTaskService.pageListManagement(query);
         return R.ok(pageList);
     }
+
     @ApiOperation(value = "任务工单导出")
     @PostMapping(value = "/exportExcel")
     public void exportExcel(@RequestBody TaskManagementPageListQuery query) {
@@ -101,11 +104,11 @@
             xpTaskExportExcel.setTaskTypeName(task.getTaskTypeName());
             xpTaskExportExcel.setTaskUrgencyLevel(task.getTaskUrgencyLevel());
             xpTaskExportExcel.setTaskDescription(task.getTaskDescription());
-            if (StringUtils.hasLength(task.getHandleUserId())){
+            if (StringUtils.hasLength(task.getHandleUserId())) {
                 String[] split = task.getHandleUserId().split(",");
 
                 List<XpOperationsUser> users = operationUserClient.listByIds(Arrays.stream(split).map(Long::parseLong).collect(Collectors.toList())).getData();
-                if (users!=null){
+                if (users != null) {
                     StringBuilder handleUserName = new StringBuilder();
                     for (XpOperationsUser user : users) {
                         handleUserName.append(user.getNickName()).append(";");
@@ -143,23 +146,27 @@
         }
 
     }
+
     /**
      * 管理后台-车辆管理-运营车辆管理-删除任务/事故
+     *
      * @param id
      * @return
      */
     @ApiOperation(value = "删除任务/事故")
     @DeleteMapping("/deleteTaskById")
-    public R<?> deleteTaskById(@ApiParam(name = "id", value = "任务ID")Long id){
+    public R<?> deleteTaskById(@ApiParam(name = "id", value = "任务ID") Long id) {
         xpTaskService.deleteTaskById(id);
         return R.ok();
     }
+
     @ApiOperation(value = "任务分配")
     @GetMapping("/assigneeTask")
-    public R assigneeTask(@ApiParam(name = "id", value = "任务ID") Long id, @ApiParam(name = "handlerUserId", value = "处理人id")Long handlerUserId) {
+    public R assigneeTask(@ApiParam(name = "id", value = "任务ID") Long id, @ApiParam(name = "handlerUserId", value = "处理人id") Long handlerUserId) {
         Long assigneeUserId = tokenService.getLoginUser().getSysUser().getId();
-        return xpTaskService.assigneeTask(id, handlerUserId,assigneeUserId);
+        return xpTaskService.assigneeTask(id, handlerUserId, assigneeUserId);
     }
+
     @ApiOperation(value = "创建任务事故")
     @PostMapping("/saveTask")
     public R saveTask(@RequestBody SaveErrorTaskDto dto) {
@@ -167,23 +174,30 @@
         xpTaskService.saveTask(dto, reportUserId);
         return R.ok();
     }
-    @ApiOperation(value = "异常情况上传车辆事故")
-    @PostMapping("/inner/v1/task/saveVehicleAccidentError")
-    public R saveVehicleAccidentError(@RequestParam Long vehicleId) {
 
+
+    /**
+     * 内部调用-添加车辆异常任务
+     * @param vehicleId
+     * @return
+     */
+    @PostMapping("/saveVehicleAccidentError")
+    public R saveVehicleAccidentError(@RequestParam Long vehicleId) {
         xpTaskService.saveVehicleAccidentError(vehicleId);
         return R.ok();
     }
+
     @ApiOperation(value = "任务详情")
     @GetMapping("/taskDetail")
     public R<TaskManagementDetailVO> taskDetail(Long id) {
         return xpTaskService.taskDetail(id);
     }
+
     @ApiOperation(value = "查询车辆不分页列表")
     @PostMapping("/listVehicle")
     public R<List<XpVehicle>> listVehicle() {
         List<XpVehicle> vehicles = xpVehicleClient.listVehicle().getData();
-        if (vehicles == null){
+        if (vehicles == null) {
             return R.ok(new ArrayList<>());
         }
         return R.ok(vehicles);
@@ -191,6 +205,7 @@
 
     /**
      * 通过车辆id查询任务事故分页列表
+     *
      * @return
      */
     @ApiOperation(value = "通过车辆id查询任务事故分页列表", tags = {"管理后台-车辆管理-运营车辆管理"})
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java
index 69e1cd2..791d46d 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java
@@ -4,13 +4,12 @@
 import com.xiaopeng.api.model.maintenance.XpTaskRule;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
-import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
+import com.xiaopeng.api.vo.maintenance.TaskRuleDetailVO;
 import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
 import com.xiaopeng.maintenance.service.IXpTaskRuleService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -34,7 +33,6 @@
     private IXpTaskRuleRoleService xpTaskRuleRoleService;
     @ApiOperation(value = "任务规则详情")
     @GetMapping("/api/v1/taskRule/taskRuleDetail")
-    @Transactional
     public R<TaskRuleDetailVO> taskRuleDetail() {
         return xpTaskRuleService.taskRuleDetail();
     }
@@ -48,6 +46,17 @@
         return R.ok(taskRule);
     }
 
+
+    /**
+     * 查询任务规则详情
+     * @return
+     */
+    @GetMapping("/inner/v1/taskRule/taskRuleAndRoleDetail")
+    public R<TaskRuleDetailVO> taskRuleAndRoleDetail() {
+        return xpTaskRuleService.taskRuleDetail();
+    }
+
+
     @ApiOperation(value = "保存或修改任务规则")
     @PostMapping("/api/v1/taskRule/saveOrUpdateTaskRule")
     public R saveOrUpdateTaskRule(@RequestBody TaskRuleDetailDto dto) {
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 53b5547..a8275be 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
@@ -82,7 +82,7 @@
                 // 下发命令
                 PushOrderDto pushOrderDto = new PushOrderDto();
                 pushOrderDto.setVin(xpVehicle.getVehicleVin());
-                pushOrderDto.setOrderId(newCruiseOrder.getData().getId());
+                pushOrderDto.setOrderId("XU" + newCruiseOrder.getData().getId());
                 pushOrderDto.setStartLatitude(newCruiseOrder.getData().getStartLat());
                 pushOrderDto.setStartLongitude(newCruiseOrder.getData().getStartLon());
                 pushOrderDto.setEndLatitude(newCruiseOrder.getData().getEndLat());
@@ -95,7 +95,7 @@
 
         }else if(dto.getDepartureStatus()==3){
             // 收车 关闭当前巡游单子 生成新的返程单子  找到收车站点
-            R<String> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin());
+            R<Long> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin());
 
             // redis 获取当前最新经纬度位置
             VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
@@ -107,7 +107,6 @@
                 xpCruiseOrder.setStartLat(y);
             }
 
-            xpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
             xpCruiseOrder.setVehicleId(xpVehicle.getId());
             xpCruiseOrder.setFleetId(xpVehicle.getFleetId());
             xpCruiseOrder.setOrderType(2);
@@ -122,7 +121,7 @@
                 // 下发命令
                 PushOrderDto pushOrderDto = new PushOrderDto();
                 pushOrderDto.setVin(returnCruisePoint.getVehicleVin());
-                pushOrderDto.setOrderId(returnCruisePoint.getId());
+                pushOrderDto.setOrderId("XU" + returnCruisePoint.getId());
                 pushOrderDto.setStartLatitude(returnCruisePoint.getStartLat());
                 pushOrderDto.setStartLongitude(returnCruisePoint.getStartLon());
                 pushOrderDto.setEndLatitude(returnCruisePoint.getEndLat());
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java
index 3eb5df7..9bf881b 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java
@@ -6,24 +6,15 @@
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.common.security.service.TokenService;
-import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
-import com.xiaopeng.maintenance.model.query.TaskManagementPageListQuery;
 import com.xiaopeng.maintenance.model.query.WorkOrderPageListQuery;
-import com.xiaopeng.maintenance.model.vo.TaskManagementPageListVO;
-import com.xiaopeng.maintenance.model.vo.TaskPageListVO;
-import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
-import com.xiaopeng.maintenance.service.IXpTaskRuleService;
 import com.xiaopeng.maintenance.service.IXpWorkOrderLogService;
 import com.xiaopeng.maintenance.service.IXpWorkOrderService;
-import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.List;
 
 /**
  * <p>
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/InsuranceInspectionScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/InsuranceInspectionScheduleTask.java
index 7c91369..ca9a930 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/InsuranceInspectionScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/InsuranceInspectionScheduleTask.java
@@ -9,7 +9,7 @@
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.common.core.domain.R;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutinePreparationScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutinePreparationScheduleTask.java
index c160817..ae922e2 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutinePreparationScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutinePreparationScheduleTask.java
@@ -9,7 +9,7 @@
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.common.core.domain.R;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskExpireCheckScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskExpireCheckScheduleTask.java
index e780bd8..5ae0db2 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskExpireCheckScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskExpireCheckScheduleTask.java
@@ -15,7 +15,7 @@
 import com.xiaopeng.common.core.enums.NotificationTypeEnum;
 import com.xiaopeng.common.core.enums.TaskTypeEnum;
 import com.xiaopeng.common.core.utils.StringUtils;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskNotificationScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskNotificationScheduleTask.java
index eebea79..863bafa 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskNotificationScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskNotificationScheduleTask.java
@@ -13,7 +13,7 @@
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.enums.NotificationTypeEnum;
 import com.xiaopeng.common.core.utils.StringUtils;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java
index 44c4354..7fcf42f 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java
@@ -10,7 +10,7 @@
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.common.core.domain.R;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCleanScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCleanScheduleTask.java
index ac4580e..ee0915c 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCleanScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCleanScheduleTask.java
@@ -9,7 +9,7 @@
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.common.core.domain.R;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
index 4111c79..146fc30 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java
@@ -201,7 +201,7 @@
      */
     private void sendCollectionCommand(XpVehicle xpVehicle) {
         // 收车 关闭当前巡游单子 生成新的返程单子  找到收车站点
-        R<String> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin());
+        R<Long> r = xpCruiseOrderClient.updateCruiseOrder(xpVehicle.getVehicleVin());
 
         // mongodb 获取当前最新经纬度位置
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
@@ -213,7 +213,6 @@
             xpCruiseOrder.setStartLat(y);
         }
 
-        xpCruiseOrder.setId("XU"+ IdUtil.fastUUID());
         xpCruiseOrder.setVehicleId(xpVehicle.getId());
         xpCruiseOrder.setFleetId(xpVehicle.getFleetId());
         xpCruiseOrder.setOrderType(2);
@@ -228,7 +227,7 @@
             // 下发命令
             PushOrderDto pushOrderDto = new PushOrderDto();
             pushOrderDto.setVin(returnCruisePoint.getData().getVehicleVin());
-            pushOrderDto.setOrderId(returnCruisePoint.getData().getId());
+            pushOrderDto.setOrderId("XU" + returnCruisePoint.getData().getId());
             pushOrderDto.setStartLatitude(returnCruisePoint.getData().getStartLat());
             pushOrderDto.setStartLongitude(returnCruisePoint.getData().getStartLon());
             pushOrderDto.setEndLatitude(returnCruisePoint.getData().getEndLat());
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleInspectionScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleInspectionScheduleTask.java
index ac08578..ce5acc0 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleInspectionScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleInspectionScheduleTask.java
@@ -9,7 +9,7 @@
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.common.core.domain.R;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleMaintenanceScheduleTask.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleMaintenanceScheduleTask.java
index 7319f8c..3b81d31 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleMaintenanceScheduleTask.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleMaintenanceScheduleTask.java
@@ -9,7 +9,7 @@
 import com.xiaopeng.api.model.maintenance.XpTaskRuleRole;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.common.core.domain.R;
-import com.xiaopeng.maintenance.constant.TaskScheduleConstants;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.maintenance.mapper.XpTaskMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java
index 0bc884e..bf4a5c1 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java
@@ -4,7 +4,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
-import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
+import com.xiaopeng.api.vo.maintenance.TaskRuleDetailVO;
 
 /**
  * <p>
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java
index 5d98929..ee7c7da 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java
@@ -7,7 +7,7 @@
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.utils.bean.BeanUtils;
 import com.xiaopeng.maintenance.dto.TaskRuleDetailDto;
-import com.xiaopeng.maintenance.vo.TaskRuleDetailVO;
+import com.xiaopeng.api.vo.maintenance.TaskRuleDetailVO;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleMapper;
 import com.xiaopeng.maintenance.mapper.XpTaskRuleRoleMapper;
 import com.xiaopeng.maintenance.service.IXpTaskRuleService;
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
index 31261c9..c681993 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -6,11 +6,14 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO;
 import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
 import com.xiaopeng.api.feignClient.account.SysUserClient;
 import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
 import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetOperationsClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.account.SysUser;
 import com.xiaopeng.api.model.account.XpOperationsRole;
@@ -18,7 +21,9 @@
 import com.xiaopeng.api.model.account.XpOperationsUserNotification;
 import com.xiaopeng.api.model.maintenance.*;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
+import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
+import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
 import com.xiaopeng.common.core.constant.AliPushTypeConstant;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.enums.NotificationTypeEnum;
@@ -40,6 +45,7 @@
 import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
 import com.xiaopeng.maintenance.service.IXpTaskRuleService;
 import com.xiaopeng.maintenance.service.XpTaskService;
+import com.xiaopeng.maintenance.utils.GDMapGeocodingUtil;
 import com.xiaopeng.maintenance.utils.UUIDUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -118,6 +124,15 @@
     private IXpTaskRuleRoleService xpTaskRuleRoleService;
     @Autowired
     private IXpTaskRuleService xpTaskRuleService;
+
+    @Resource
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Resource
+    private XpFleetVehicleClient xpFleetVehicleClient;
+
+    @Resource
+    private XpFleetOperationsClient xpFleetOperationsClient;
 
     @Override
     public PageInfo<WorkBenchVO> workbench(WorkBenchQuery query) {
@@ -1088,50 +1103,50 @@
 
     @Override
     public void saveVehicleAccidentError(Long vehicleId) {
-        XpTask xpTask = new XpTask();
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-        String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
-        xpTask.setTaskCode(code);
-        xpTask.setTaskCategory(2);
-        // todo 事故类型待客户确定
-        xpTask.setTaskTypeId("1");
-        xpTask.setTaskUrgencyLevel(0);
-        xpTask.setTaskDescription("车辆发生异常");
-        XpVehicle vehicle = xpVehicleClient.queryById(xpTask.getVehicleId()).getData();
-        if (vehicle!=null){
-            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
-            if (vehiclePosition != null) {
-                double x = vehiclePosition.getPoint().getX();
-                double y = vehiclePosition.getPoint().getY();
-                xpTask.setVehicleLon(new BigDecimal(x));
-                xpTask.setVehicleLat(new BigDecimal(y));
-            }
-        }
-
-        xpTask.setVehicleId(vehicleId);
-        // 系统上传异常任务标识
-        xpTask.setReportUserId(0L);
-        xpTask.setReportTime(LocalDateTime.now());
-        xpTask.setStatus(0);
-        xpTask.setCreateBy("admin");
+        XpVehicle vehicle = xpVehicleClient.queryById(vehicleId).getData();
         XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
         XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one();
         if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
             throw new ServiceException("未配置车辆事故任务分配规则");
         }
-        R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId());
-        if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) {
-            List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList());
-            xpTask.setHandleUserId(StringUtils.join(userIds, ","));
-        }
-        // 根据事故处理限时配置设置任务截止时间
-        LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit());
-        xpTask.setEndTime(endTime);
-        this.save(xpTask);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        //查找事故处理人,处理角色和车辆所属的车队
+        Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
+        XpOperationsUserQueryDTO dto = new XpOperationsUserQueryDTO();
+        dto.setRoleId(taskRuleRole.getRoleId());
+        List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.queryByConditions(dto).getData();
+        List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();
+        List<XpOperationsUserWithRoleVO> collect = data.stream().filter(x -> ids.contains(x.getId())).collect(Collectors.toList());
+        String belongUserIds = collect.stream().map(XpOperationsUserWithRoleVO::getId).collect(Collectors.toSet()).stream().map(String::valueOf).collect(Collectors.joining(","));
 
+        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(vehiclePosition.getPoint().getX() + "", vehiclePosition.getPoint().getY() + "");
+        String address = geocode.get("address");
+
+        XpTask task = new XpTask();
+        String taskCode = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+        task.setTaskCode(taskCode);
+        task.setTaskCategory(TaskScheduleConstants.TASK_CATEGORY_ACCIDENT);
+        task.setTaskTypeId("8,10");
+        task.setTaskUrgencyLevel(TaskScheduleConstants.URGENCY_LEVEL_P0);
+        String taskDescription = "车辆" + vehicle.getPlateNumber() + "在" + address + "发生紧急事故,请在" + taskRule.getProcessingTimeLimit() + "内到达现场!";
+        task.setTaskDescription(taskDescription);
+        task.setVehicleId(vehicle.getId());
+        task.setVehicleLocation(address);
+        task.setVehicleLat(new BigDecimal(vehiclePosition.getPoint().getY()));
+        task.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
+        task.setHandleUserId(belongUserIds);
+        task.setAssigneeTime(LocalDateTime.now());
+        task.setReportUserId(0L);
+        task.setReportTime(LocalDateTime.now());
+        task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()));
+        task.setExpiredNoticeSent(0);
+        task.setStatus(TaskScheduleConstants.TASK_STATUS_PENDING_ARRIVE);
+        task.setCreateBy("系统自动生成");
+        task.setCreateTime(LocalDateTime.now());
+        this.save(task);
         // 异步发送消息通知
-        String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : "";
-        sendAccidentNotificationAsync(xpTask, plateNumber, taskRule.getProcessingTimeLimit());
+        sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
     }
 
     @Override
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/utils/GDMapGeocodingUtil.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/utils/GDMapGeocodingUtil.java
new file mode 100644
index 0000000..8ebceb4
--- /dev/null
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/utils/GDMapGeocodingUtil.java
@@ -0,0 +1,56 @@
+package com.xiaopeng.maintenance.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xiaopeng.common.core.utils.HttpUtils;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 高德地图的地理编码工具类
+ */
+@Component
+@Lazy
+public class GDMapGeocodingUtil {
+
+    private String key = "66ae577f63898dae3016d599fda57221";
+
+
+
+
+
+    /**
+     * 根据经纬度获取行政区域信息
+     * @param lon
+     * @param lan
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> geocode(String lon, String lan) {
+        String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+        String forObject = HttpUtils.sendGet(url);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        Map<String, String> map = new HashMap<>();
+        if(jsonObject.getString("status").equals("1")){
+            JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+            JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+            String address = regeocode.getString("formatted_address");
+            map.put("address", address);
+            String code = addressComponent.getString("adcode");
+            String province = addressComponent.getString("province");
+            String city = addressComponent.getString("city");
+            String district = addressComponent.getString("district");
+            map.put("province", province);
+            map.put("provinceCode", code.substring(0, 2) + "0000");
+            map.put("city", city);
+            map.put("cityCode", code.substring(0, 4) + "00");
+            map.put("district", district);
+            map.put("districtCode", code);
+        }
+        return map;
+    }
+
+}
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
index 6679c50..633b059 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java
@@ -180,7 +180,6 @@
         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());
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
index 5000456..d232c1c 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -811,7 +811,7 @@
                             continue;
                         }
                         //  关闭巡游单子
-                        R<String> stringR = xpCruiseOrderClient.updateCruiseOrder(vehiclePosition.getVehicleVin());
+                        R<Long> stringR = xpCruiseOrderClient.updateCruiseOrder(vehiclePosition.getVehicleVin());
                         if (stringR == null || stringR.getCode() != 200) {
                             log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
                             continue;
@@ -860,7 +860,7 @@
                             continue;
                         }
                         //  关闭巡游单子
-                        R<String> stringR = xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin());
+                        R<Long> stringR = xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin());
                         if (stringR == null || stringR.getCode() != 200) {
                             log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
                             continue;
@@ -944,7 +944,7 @@
                     continue;
                 }
                 //  关闭巡游单子
-                R<String> stringR = xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin());
+                R<Long> stringR = xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin());
                 if (stringR == null || stringR.getData() == null) {
                     log.info("关闭巡游单子失败");
                     continue;
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
index 240a5bd..3539e74 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
@@ -46,8 +46,8 @@
      * @param
      */
     @PostMapping("/inner/cruiseOrder/updateCruiseOrder")
-    public R<String> updateCruiseOrder(@RequestParam String vin) {
-        String id = xpCruiseOrderService.updateCruiseOrder(vin);
+    public R<Long> updateCruiseOrder(@RequestParam String vin) {
+        Long id = xpCruiseOrderService.updateCruiseOrder(vin);
         return R.ok(id);
     }
     /**
@@ -56,9 +56,20 @@
      * @param
      */
     @PostMapping("/inner/cruiseOrder/closeCruiseOrder")
-    public R<String> closeCruiseOrder(@RequestParam String vin) {
-        String id = xpCruiseOrderService.closeCruiseOrder(vin);
+    public R<Long> closeCruiseOrder(@RequestParam String vin) {
+        Long id = xpCruiseOrderService.closeCruiseOrder(vin);
         return R.ok(id);
+    }
+
+
+    /**
+     * 根据订单ID查询取消订单
+     * @param orderId
+     * @return
+     */
+    @PostMapping("/inner/cruiseOrder/updateCruiseOrderId")
+    public R<Long> updateCruiseOrderId(@RequestParam Long orderId){
+        return xpCruiseOrderService.updateCruiseOrderId(orderId);
     }
 
 
@@ -68,7 +79,7 @@
      * @return
      */
     @PostMapping("/inner/cruiseOrder/getCruiseOrder")
-    public R<XpCruiseOrder> getCruiseOrder(@RequestParam String orderId){
+    public R<XpCruiseOrder> getCruiseOrder(@RequestParam Long orderId){
         return R.ok(xpCruiseOrderService.getById(orderId));
     }
 
@@ -80,8 +91,7 @@
      * @return 订单ID
      */
     @PostMapping("/inner/cruiseOrder/addCruiseOrder")
-    public R<String> addCruiseOrder(@RequestBody XpCruiseOrder order) {
-        order.setId("XU"+ IdUtil.fastUUID());
+    public R<Long> addCruiseOrder(@RequestBody XpCruiseOrder order) {
         boolean save = xpCruiseOrderService.save(order);
         if (!save) {
             return R.fail("新增失败");
@@ -90,7 +100,7 @@
         // 下发命令
         PushOrderDto pushOrderDto = new PushOrderDto();
         pushOrderDto.setVin(order.getVehicleVin());
-        pushOrderDto.setOrderId(order.getId());
+        pushOrderDto.setOrderId("XU" + order.getId());
         pushOrderDto.setStartLatitude(order.getStartLat());
         pushOrderDto.setStartLongitude(order.getStartLon());
         pushOrderDto.setEndLatitude(order.getEndLat());
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java
index 6b8a1f2..486e60f 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java
@@ -36,7 +36,7 @@
 			if(xpVehicleR.getData().getState()==0){
                 PushOrderDto pushOrderDto = new PushOrderDto();
                 pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
-                pushOrderDto.setOrderId(xpCruiseOrder.getId());
+                pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
                 pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat());
                 pushOrderDto.setStartLongitude(xpCruiseOrder.getStartLon());
                 pushOrderDto.setEndLatitude(xpCruiseOrder.getEndLat());
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java
index 035d85e..a778bcd 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java
@@ -38,10 +38,15 @@
  */
 public interface IXpCruiseOrderService extends IService<XpCruiseOrder> {
 
-    String updateCruiseOrder(String vin);
+    Long updateCruiseOrder(String vin);
 
 
-    String closeCruiseOrder(String vin);
+    R updateCruiseOrderId(Long orderId);
+
+
+    Long closeCruiseOrder(String vin);
+
+
 
     /**
      * 巡游订单分页列表
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
index f1bf8a5..49239eb 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
@@ -52,34 +52,50 @@
      * @param vin
      */
     @Override
-    public String updateCruiseOrder(String vin) {
+    public Long updateCruiseOrder(String vin) {
         LambdaQueryWrapper<XpCruiseOrder> wrapper = new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleVin, vin).eq(XpCruiseOrder::getStatus, 1);
         XpCruiseOrder xpCruiseOrder = this.getOne(wrapper);
         if (xpCruiseOrder != null) {
             xpCruiseOrder.setStatus(2);
             this.update(xpCruiseOrder, wrapper);
-            // todo 给XPU下发订单取消报文,如果取消不成功需要重试。两次不成功,则需要换车
             PushOrderDto pushOrderDto = new PushOrderDto();
             pushOrderDto.setVin(vin);
-            pushOrderDto.setOrderId(xpCruiseOrder.getId());
-            pushOrderDto.setOperation_type(OrderOperationType.VEHICLE_CANCEL_ORDER);
+            pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
+            pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
             R<Boolean> booleanR = orderMissionClient.cancelOrder(pushOrderDto);
             if(booleanR==null || !booleanR.getData()){
-                log.error("下发失败重试一次");
-                R<Boolean> booleanR1 = orderMissionClient.cancelOrder(pushOrderDto);
-                if(booleanR1==null || !booleanR1.getData()){
-                    log.error("换车");
-                    return null;
-                }
+                log.error("XPU取消巡游订单失败");
+                return null;
             }
-
             return xpCruiseOrder.getId();
         }
         return null;
     }
 
+
     @Override
-    public String closeCruiseOrder(String vin) {
+    public R updateCruiseOrderId(Long orderId) {
+        XpCruiseOrder xpCruiseOrder = this.getById(orderId);
+        if (xpCruiseOrder != null) {
+            xpCruiseOrder.setStatus(2);
+            xpCruiseOrder.setVehicleId(null);
+            this.updateById(xpCruiseOrder);
+            PushOrderDto pushOrderDto = new PushOrderDto();
+            pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
+            pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
+            pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
+            R<Boolean> booleanR = orderMissionClient.cancelOrder(pushOrderDto);
+            if(booleanR==null || !booleanR.getData()){
+                log.error("XPU取消巡游订单失败");
+                return R.fail("XPU取消巡游订单失败");
+            }
+            return R.ok();
+        }
+        return R.fail("获取订单失败");
+    }
+
+    @Override
+    public Long closeCruiseOrder(String vin) {
         LambdaQueryWrapper<XpCruiseOrder> wrapper = new LambdaQueryWrapper<XpCruiseOrder>().eq(XpCruiseOrder::getVehicleVin, vin).eq(XpCruiseOrder::getStatus, 1);
         XpCruiseOrder xpCruiseOrder = this.getOne(wrapper);
         if (xpCruiseOrder != null) {
@@ -90,6 +106,8 @@
         return null;
     }
 
+
+
     @Override
     public PageInfo<XpCruiseOrderPageVO> pageList(XpCruiseOrderPageQuery query) {
         PageInfo<XpCruiseOrderPageVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index d1ec250..9399092 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -871,7 +871,6 @@
             }
 
             XpCruiseOrder returnOrder = new XpCruiseOrder();
-            returnOrder.setId("XU" + IdUtil.fastUUID());
             returnOrder.setVehicleId(oldVehicle.getId());
             returnOrder.setVehicleVin(oldVehicle.getVehicleVin());
             returnOrder.setFleetId(oldVehicle.getFleetId());
@@ -915,7 +914,7 @@
             // 下发巡游订单到原车辆
             PushOrderDto pushOrderDto = new PushOrderDto();
             pushOrderDto.setVin(oldVehicle.getVehicleVin());
-            pushOrderDto.setOrderId(returnOrder.getId().toString());
+            pushOrderDto.setOrderId("XU" + returnOrder.getId());
             pushOrderDto.setStartLatitude(returnOrder.getStartLat());
             pushOrderDto.setStartLongitude(returnOrder.getStartLon());
             pushOrderDto.setEndLatitude(returnOrder.getEndLat());
@@ -1787,7 +1786,6 @@
         xpCruiseOrder.setStatus(0);
         xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId());
         xpCruiseOrder.setCreateTime(LocalDateTime.now());
-        xpCruiseOrder.setId("XU" + IdUtil.fastUUID());
 
         // 判断当前时分秒是否大于收车时间
         LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime();
@@ -1808,7 +1806,7 @@
         // 添加自动结束行程定时任务job
         Map<String, ? extends Object> jobMaps =
                 new ImmutableMap.Builder<String, String>().
-                        put("id", xpCruiseOrder.getId())
+                        put("id", xpCruiseOrder.getId() + "")
                         .build();
         QuartzManager.addJob(
                 AddCruiseMissionJob.class,
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/SnowFlake.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/SnowFlake.java
deleted file mode 100644
index fb76d2d..0000000
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/SnowFlake.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.xiaopeng.vehicleConvoy.util;
-
-/**
- * see @https://raw.githubusercontent.com/beyondfengyu/SnowFlake/master/SnowFlake.java
- * Created by Lox on 2017/8/21.
- */
-public class SnowFlake {
-    /**
-     * 起始的时间戳
-     */
-    private static long START_STMP = 1503305692631L;
-
-    /**
-     * 每一部分占用的位数
-     */
-    private final static long SEQUENCE_BIT = 12; //序列号占用的位数
-    private final static long MACHINE_BIT = 5;   //机器标识占用的位数
-    private final static long DATACENTER_BIT = 5;//数据中心占用的位数
-
-    /**
-     * 每一部分的最大值
-     */
-    public final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
-    public final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
-    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
-
-    /**
-     * 每一部分向左的位移
-     */
-    private final static long MACHINE_LEFT = SEQUENCE_BIT;
-    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
-    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
-
-    private long datacenterId;  //数据中心
-    private long machineId;     //机器标识
-    private long sequence = 0L; //序列号
-    private long lastStmp = -1L;//上一次时间戳
-
-    public SnowFlake(long datacenterId, long machineId) {
-        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
-            throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
-        }
-        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
-            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
-        }
-        this.datacenterId = datacenterId;
-        this.machineId = machineId;
-    }
-
-    /**
-     * 设置初始时间,各业务方的旧算法有可能初始时间不一致,请使用
-     * @param timestamp 设定的新初始时间戳
-     * @return 当前对象
-     */
-    public SnowFlake withStartTimestamp(long timestamp) {
-        SnowFlake.START_STMP = timestamp;
-        return this;
-    }
-
-    /**
-     * 产生下一个ID
-     *
-     * @return
-     */
-    public synchronized long nextId() {
-        long currStmp = getNewstmp();
-        if (currStmp < lastStmp) {
-            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
-        }
-
-        if (currStmp == lastStmp) {
-            //相同毫秒内,序列号自增
-            sequence = (sequence + 1) & MAX_SEQUENCE;
-            //同一毫秒的序列数已经达到最大
-            if (sequence == 0L) {
-                currStmp = getNextMill();
-            }
-        } else {
-            //不同毫秒内,序列号置为0
-            sequence = 0L;
-        }
-
-        lastStmp = currStmp;
-
-        return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
-                | datacenterId << DATACENTER_LEFT       //数据中心部分
-                | machineId << MACHINE_LEFT             //机器标识部分
-                | sequence;                             //序列号部分
-    }
-
-    private long getNextMill() {
-        long mill = getNewstmp();
-        while (mill <= lastStmp) {
-            mill = getNewstmp();
-        }
-        return mill;
-    }
-
-    private long getNewstmp() {
-        return System.currentTimeMillis();
-    }
-
-//    public static void main(String[] args) {
-//        SnowFlake snowFlake = new SnowFlake(0, 0);
-//        snowFlake.withStartTimestamp(1420041600000L);
-//
-//        for (int i = 0; i < (1 << 5); i++) {
-//            System.out.println(snowFlake.nextId());
-//        }
-//    }
-}
\ No newline at end of file

--
Gitblit v1.7.1