liujie
2026-03-11 8fb7dde57b835463a6786a2e038f0ecd3dba827b
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi
2个文件已删除
2 文件已重命名
1个文件已添加
35个文件已修改
934 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/maintenance/XpTaskRuleClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpCruiseOrderClientFallbackFactory.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpOperationUserNotificationClient.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskClient.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/maintenance/XpTaskRuleClient.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpCruiseOrderClient.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpCruiseOrder.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskRuleDetailVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskScheduleConstants.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/SnowFlake.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskManagementController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskRuleController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpWorkOrderController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/InsuranceInspectionScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutinePreparationScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskExpireCheckScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/RoutineTaskNotificationScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleChargingScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCleanScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleCollectionScheduleTask.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleInspectionScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/schedule/VehicleMaintenanceScheduleTask.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpTaskRuleService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskRuleServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/utils/GDMapGeocodingUtil.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCruisePlanController.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/job/jobs/AddCruiseMissionJob.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/SnowFlake.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
            }
        };
    }
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());
            }
        };
    }
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;
            }
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);
}
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);
}
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();
}
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);
}
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;
}
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")
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskRuleDetailVO.java
File was renamed from xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/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;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/maintenance/TaskScheduleConstants.java
File was renamed from xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/constant/TaskScheduleConstants.java
@@ -1,4 +1,4 @@
package com.xiaopeng.maintenance.constant;
package com.xiaopeng.api.vo.maintenance;
/**
 * 定时任务常量类
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) {
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));
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/utils/SnowFlake.java
File was deleted
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);
    }
}
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 = {"管理后台-车辆管理-运营车辆管理"})
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) {
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());
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>
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;
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;
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;
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;
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;
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;
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());
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;
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;
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>
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;
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
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/utils/GDMapGeocodingUtil.java
New file
@@ -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;
    }
}
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());
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;
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());
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());
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);
    /**
     * 巡游订单分页列表
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());
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -872,7 +872,6 @@
            }
            XpCruiseOrder returnOrder = new XpCruiseOrder();
            returnOrder.setId("XU" + IdUtil.fastUUID());
            returnOrder.setVehicleId(oldVehicle.getId());
            returnOrder.setVehicleVin(oldVehicle.getVehicleVin());
            returnOrder.setFleetId(oldVehicle.getFleetId());
@@ -916,7 +915,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());
@@ -1793,7 +1792,6 @@
        xpCruiseOrder.setStatus(0);
        xpCruiseOrder.setLastOrderId(xpCruiseOrders.getId());
        xpCruiseOrder.setCreateTime(LocalDateTime.now());
        xpCruiseOrder.setId("XU" + IdUtil.fastUUID());
        // 判断当前时分秒是否大于收车时间
        LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime();
@@ -1814,7 +1812,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,
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/SnowFlake.java
File was deleted