puzhibing
2026-04-15 09e0146b9379e06351e7bd5b9bdc5b1700ab133b
Merge remote-tracking branch 'origin/1.0' into 1.0
3个文件已添加
18个文件已修改
534 ■■■■■ 已修改文件
sql/增量sql/xprt_order.sql 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ReassignOrderDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/ReassignOrderClientFallbackFactory.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderReassignClientFallbackFactory.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderReassignClient.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrderReassign.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/CacheConstants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/ReassignOrderController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderReassignController.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/mapper/XpOrderReassignMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderReassignService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderReassignServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderReassignMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/增量sql/xprt_order.sql
@@ -0,0 +1,9 @@
ALTER TABLE `xp_order`.`xp_order_reassign`
ADD COLUMN `reassign_num` int(0) NULL DEFAULT 0 COMMENT '改派次数 默认0' AFTER `update_by`,
ADD COLUMN `is_complete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否完成 0=未完成 1=已完成' AFTER `reassign_num`,
ADD COLUMN `longitude` double(20, 10) NULL COMMENT '经度' AFTER `is_complete`,
ADD COLUMN `latitude` double(20, 10) NULL COMMENT '纬度' AFTER `longitude`,
ADD COLUMN `app_user_id` bigint NULL COMMENT '用户id' AFTER `latitude`;
ALTER TABLE `xp_order`.`xp_order`
    ADD COLUMN `car_abnormal` tinyint(1) NULL DEFAULT 0 COMMENT '车辆是否故障 0-否 1-是' AFTER `change_money_flag`;
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -140,7 +140,7 @@
            return R.ok();
        }
        XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId());
        //状态(1=未使用,2=已使用,3=已过期)
        //状态(1=未使用,2=已使用,3=已过期  0=待领取 4=占用中)
        if(appUserCoupon.getExpirationTime().isAfter(LocalDateTime.now())){
            appUserCoupon.setStatus(3);
        }else{
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ReassignOrderDTO.java
@@ -21,4 +21,7 @@
    @ApiModelProperty(value = "订单号")
    private String orderNo;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/ReassignOrderClientFallbackFactory.java
@@ -23,4 +23,5 @@
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderReassignClientFallbackFactory.java
New file
@@ -0,0 +1,49 @@
package com.xiaopeng.api.factory.order;
import com.xiaopeng.api.feignClient.order.XpOrderReassignClient;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
public class XpOrderReassignClientFallbackFactory implements FallbackFactory<XpOrderReassignClient> {
        private static final Logger log = LoggerFactory.getLogger(XpOrderReassignClientFallbackFactory.class);
        String msg ="订单改派";
        @Override
        public XpOrderReassignClient create(Throwable cause) {
            log.error(msg+"服务调用失败: {}", cause.getMessage());
            return new XpOrderReassignClient(){
                @Override
                public R<List<XpOrderReassign>> findListOrderReassign() {
                    log.error(msg+"获取列表失败: {}", cause.getMessage());
                    return R.fail("获取列表失败");
                }
                @Override
                public R<Long> saveOrderReassign(XpOrderReassign entity) {
                    log.error(msg+"保存失败: {}", cause.getMessage());
                    return R.fail(msg+"保存失败");
                }
                @Override
                public R<Long> updateByIdOrderReassign(XpOrderReassign entity) {
                    log.error(msg+"修改失败: {}", cause.getMessage());
                    return R.fail(msg+"修改失败");
                }
                @Override
                public R<Long> updateCompleteOrderReassign(XpOrderReassign entity) {
                    log.error(msg+"修改失败: {}", cause.getMessage());
                    return R.fail(msg+"修改失败");
                }
            };
        }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -10,7 +10,10 @@
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
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;
/**
 * 订单Feign客户端
@@ -149,4 +152,5 @@
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderReassignClient.java
New file
@@ -0,0 +1,55 @@
package com.xiaopeng.api.feignClient.order;
import com.xiaopeng.api.factory.order.XpOrderClientFallbackFactory;
import com.xiaopeng.api.factory.order.XpOrderReassignClientFallbackFactory;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
 * 订单改派 Feign客户端
 *
 * @author mitao
 */
@FeignClient(contextId = "XpOrderReassignClient",
        value = ServiceNameConstantsEnum.XP_ORDER_SERVICE,
        fallbackFactory = XpOrderReassignClientFallbackFactory.class)
public interface XpOrderReassignClient {
    //-----------------------订单改派---------------------------------------------
    /**
     * 获取获取订单改派数据
     * @return
     */
    @PostMapping("/logan/inner/orderReassign/findList")
    R<List<XpOrderReassign>> findListOrderReassign() ;
    /**
     * 保存(内部接口)
     * @return
     */
    @PostMapping("/logan/inner/orderReassign/save")
    R<Long> saveOrderReassign(@RequestBody XpOrderReassign entity) ;
    /**
     * 修改数据
     * @return
     */
    @PostMapping("/logan/inner/orderReassign/update")
    R<Long> updateByIdOrderReassign(@RequestBody XpOrderReassign entity) ;
    /**
     * 修改是否完成
     * @return
     */
    @PostMapping("/logan/inner/orderReassign/updateComplete")
    R<Long> updateCompleteOrderReassign(@RequestBody XpOrderReassign entity) ;
    //-----------------------订单改派---------------------------------------------
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java
@@ -47,7 +47,7 @@
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private LocalDateTime useTime;
    @ApiModelProperty(value = "状态(1=未使用,2=已使用,3=已过期)")
    @ApiModelProperty(value = "状态(1=未使用,2=已使用,3=已过期  0=待领取 4=占用中)")
    private Integer status;
    @ApiModelProperty(value = "优惠券类型(1=抵扣,2=满减)")
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -235,4 +235,8 @@
    private Integer num;
    @ApiModelProperty(value = "是否改价标识 0-否 1-是")
    private Boolean changeMoneyFlag;
    @ApiModelProperty(value = "车辆是否故障 0-否 1-是")
    private Boolean carAbnormal;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrderReassign.java
@@ -1,8 +1,6 @@
package com.xiaopeng.api.model.order;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -36,6 +34,9 @@
    @ApiModelProperty(value = "订单id")
    private Long orderId;
    @TableField(exist = false)
    @ApiModelProperty(value = "订单号")
    private String orderNumber;
    @ApiModelProperty(value = "操作人员id")
    private Long userId;
@@ -58,4 +59,31 @@
    @ApiModelProperty(value = "改派原因")
    private String reassignReason;
    @ApiModelProperty(value = "改派次数默认为0 改派多次后 还未找到车则标记订单取消")
    private Integer reassignNum;
    @ApiModelProperty(value = "是否完成 0=未完成 1=已完成")
    private Boolean isComplete;
    @ApiModelProperty(value = "经度")
    private Double longitude;
    @ApiModelProperty(value = "纬度")
    private Double latitude;
    @ApiModelProperty(value = "用户id")
    @TableField(updateStrategy = FieldStrategy.NEVER)
    private Long appUserId;
    @ApiModelProperty(value = "备注")
    private String remarks;
    public XpOrderReassign() {
    }
    public XpOrderReassign(Long orderId, Long oldVehicleId, Long oldFleetId,Double longitude,Double latitude, String reassignReason) {
        this.reassignNum = 1;
        this.orderId = orderId;
        this.oldVehicleId = oldVehicleId;
        this.oldFleetId = oldFleetId;
        this.reassignReason = reassignReason;
    }
}
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -106,7 +106,8 @@
            taskBuilder.setSequence(1);
            taskBuilder.setOrderPhase(OrderPhase.ROUTE_TO_CRUISE);
            taskListBuilder.addTasks(taskBuilder.build());
        }else if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.USER_ORDER)){
        }
        else if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.USER_ORDER)){
            //乘客单
            for (int i = 1; i < 3; i++) {
                RtTask.Builder taskBuilder = RtTask.newBuilder();
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -510,8 +510,8 @@
                if (vehicle != null) {
                    // 修改车辆状态
                    XpVehicle vehicle1 = new XpVehicle();
                    vehicle1.setState(0);
                    vehicle1.setOperatingStatus(4);
                    vehicle1.setState(0);//车辆接单状态 1接单中 0空闲
                    vehicle1.setOperatingStatus(4);//运营状态 1运营中 2维修中 3已收车 4车辆异常
                    vehicle1.setId(vehicle.getId());
                    xpVehicleClient.updateVehicleById(vehicle1);
                    log.info("车辆故障,车辆状态修改0 {}", vehicle.getPlateNumber());
@@ -524,20 +524,15 @@
                    userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
                }
                //status 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成
                List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点
                List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点 status=2、3、4、5
                    add(OrderStatusEnum.READY_DEPART.getCode());add(OrderStatusEnum.PICK_UP.getCode());
                    add(OrderStatusEnum.PICK_UP_GUESTS.getCode());add(OrderStatusEnum.PASSENGER_BOARDED.getCode());
                }};
                if(xpOrder.getStatus().equals(OrderStatusEnum.IN_SERVICE.getCode())
                        || xpOrder.getStatus().equals(OrderStatusEnum.SEE_OFF_GUESTS.getCode()) ){ //6=服务中 7=待客下车 在行驶中 修改订单-已完成  需要处理订单金额
                    //单独写个修改订单的方法。
//                    ff
                if(xpOrder.getStatus().equals(OrderStatusEnum.IN_SERVICE.getCode()) ){ //6=服务中  在行驶中 修改订单-已完成  需要处理订单金额
                    //行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额 再将状态修改成8
                    xpOrderClient.carAbnormalUpdateOrderStatus(Long.parseLong(orderId));
                }else if(notDrive.contains(xpOrder.getStatus())){//在接驾中 车辆出现故障 重新派单
                    // TODO 重新派单
                }else if(notDrive.contains(xpOrder.getStatus())){//在接驾中 车辆出现故障 重新派单 改派
                    ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
                    reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
                    reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/constant/CacheConstants.java
@@ -146,4 +146,12 @@
     * 用户默认路线偏好(高德 strategy)
     */
    public static final String USER_ROUTE_PREFERENCE = "USER_ROUTE_PREFERENCE:";
    /**
     * 重新派单 改派
     */
    public static final String reassign_Order = "reassign_order";
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/ReassignOrderController.java
@@ -1,13 +1,20 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.api.dto.operation.ReassignOrderDTO;
import com.xiaopeng.api.feignClient.order.XpOrderReassignClient;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.operation.utils.TaskOrderUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
 * token 控制
@@ -19,11 +26,49 @@
public class ReassignOrderController {
    @Autowired
    private TaskOrderUtil taskOrderUtil;
    @Resource
    private RedisService redisService;
    @Resource
    private XpOrderReassignClient xpOrderReassignClient;
    /**
     * 重新改派
     * @param dto
     * @return
     */
    @PostMapping("/logan/inner/v1/order/reassignOrder")
    public R<String> reassignOrder(@RequestBody ReassignOrderDTO dto) {
        taskOrderUtil.reassignPushOrder(dto.getCount(),dto.getUid(),dto.getLongitude(),dto.getLatitude(),dto.getOrderNo());
        //保存改派记录
        XpOrderReassign reassign = taskOrderUtil.reassignPushOrder(dto.getCount(), dto.getUid(), dto.getLongitude(), dto.getLatitude(), dto.getOrderNo());
        //未找到车 系统强制取消订单,状态流转至“系统自动取消”。 自动退回优惠卷
        xpOrderReassignClient.saveOrderReassign(reassign);
        return R.ok();
    }
    /**
     * 5秒执行一次
     *将需要改派的订单信息保存在redis ,ReassignOrderController 这个类的 taskReassignPushOrder 方法异步 处理信息。
     */
    @Scheduled(cron = "0/3 * * * * ?")
    public void taskReassignPushOrder() {
//        System.out.println("3秒执行一次");
        //从redis 获取数据 同步 处理数据
        R<List<XpOrderReassign>> r = xpOrderReassignClient.findListOrderReassign();
        if(r.getCode()==200 && !r.getData().isEmpty()){
            for (XpOrderReassign reassign : r.getData()) {
                //改派次数小4
                if(!reassign.getIsComplete() && reassign.getReassignNum()<=3){
                    XpOrderReassign reassign2 = taskOrderUtil.reassignPushOrder(10, String.valueOf(reassign.getAppUserId()),reassign.getLongitude(),reassign.getLatitude(),reassign.getOrderNumber());
                    xpOrderReassignClient.saveOrderReassign(reassign2);
                }
            }
        }
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -2,7 +2,6 @@
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSON;
import com.xiaopeng.api.dto.account.UseUserCouponDto;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
@@ -18,6 +17,7 @@
import com.xiaopeng.api.model.operation.XpElectronicFence;
import com.xiaopeng.api.model.operation.XpTradingStrategy;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.OrderType;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
@@ -28,13 +28,13 @@
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.operation.config.UidVinBindingConfig;
import com.xiaopeng.operation.dto.PriorityMatchResult;
import com.xiaopeng.operation.mapper.XpElectronicFenceMapper;
import com.xiaopeng.operation.service.IXpElectronicFenceAreaService;
import com.xiaopeng.operation.service.IXpTradingStrategyService;
import com.xiaopeng.operation.service.XpPointService;
import com.xiaopeng.operation.config.UidVinBindingConfig;
import com.xiaopeng.operation.dto.PriorityMatchResult;
import com.xiaopeng.operation.service.UidVinPriorityMatcher;
import com.xiaopeng.operation.service.XpPointService;
import com.xiaopeng.operation.utils.mango.VehiclePositionService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -1086,31 +1086,43 @@
        return false;
    }
    /**
     * 订单处理
     * 重新改派
     * 1.优化好点 做个倒计时的异步改派多次
     * @param count 轮数
     * @param uid
     * @param uid 用户id
     * @param longitude  经度
     * @param latitude  纬度
     * @param orderNo 订单号
     */
    @SneakyThrows
    public void reassignPushOrder(int count, String uid, Double longitude, Double latitude, String orderNo) {
        System.out.println("进入推单环环节");
    public XpOrderReassign reassignPushOrder(int count, String uid, Double longitude, Double latitude, String orderNo) {
        log.info("进入推单环环节");
        if (count == 0) {
            count = 1;
        }
        // 订单状态
        R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
        if (xpOrderR.getCode() != 200) {
            return;
            return null;
        }
//        List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点 status=2、3、4、5
//            add(OrderStatusEnum.READY_DEPART.getCode());add(OrderStatusEnum.PICK_UP.getCode());
//            add(OrderStatusEnum.PICK_UP_GUESTS.getCode());add(OrderStatusEnum.PASSENGER_BOARDED.getCode());
//        }};
        if (xpOrderR.getData().getStatus() != 1) {
            return;
            return null;
        }
        XpOrder data = xpOrderR.getData();
        XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null);
        boolean orderCarStatus = false;//未派到车 默认
        XpOrderReassign entity = new XpOrderReassign(data.getId(),data.getVehicleId(),data.getFleetId(),longitude,latitude,"接驾故障");
        entity.setIsComplete(false);
        entity.setAppUserId(Long.valueOf(uid));
        //循环找车
        for (int i = 0; i < count; i++) {
            log.info("进入找车环节");
@@ -1158,29 +1170,23 @@
                // 调用推送服务  orderId + carVin
                orderMissionClient.pushOrder(pushOrderDto);
                //接单成功 将 修改 订单的状态=1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)
                orderCarStatus = true;
                entity.setNewVehicleId(vehicleId1.getId());
                entity.setNewFleetId(vehicleId1.getFleetId());
                entity.setIsComplete(true);
//                //接单成功 将 修改 订单的状态=1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)
//                orderCarStatus = true;
                xpOrderClient.updateOrderStatus(data.getId(), OrderStatusEnum.PENDING_ORDER.getCode());
                redisService.setCacheObject("ORDER_STATUS:" + data.getId(), OrderStatusEnum.PENDING_ORDER.getCode(), 24L, TimeUnit.HOURS);
                break;
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
        }
        //未找到车 系统强制取消订单,状态流转至“系统自动取消”。 自动退回优惠卷
        if(!orderCarStatus){
            xpOrderClient.updateOrderStatus(data.getId(),OrderStatusEnum.CANCELED.getCode());
            redisService.setCacheObject("ORDER_STATUS:" + data.getId(), OrderStatusEnum.CANCELED.getCode(), 24L, TimeUnit.HOURS);
            //有优惠卷 自动退回优惠卷
            if(data.getCouponId() != null ){
                UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
                useUserCouponDto.setUserCouponId(data.getCouponId() );
                xpAppUserCouponClient.backUserCoupon(useUserCouponDto);
            }
        }
        //保存改派记录
        return entity;
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderReassignController.java
New file
@@ -0,0 +1,111 @@
package com.xiaopeng.order.controller;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.order.service.IXpOrderReassignService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * <p>
 * 订单改派 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2026-02-03
 */
@RestController
@Api(tags = "订单改派")
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpOrderReassignController {
    @Resource
    private IXpOrderReassignService  xpOrderReassignService;
    /**
     * 获取获取订单改派数据(内部接口)
     *
     * @return
     */
    @ApiOperation(value = "获取获取订单改派数据", tags = {"内部接口"})
    @PostMapping("/logan/inner/orderReassign/findList")
    public R<List<XpOrderReassign>> findListOrderReassign() {
        return R.ok(xpOrderReassignService.findListNotComplete());
    }
    /**
     * 保存(内部接口)
     * @return
     */
    @ApiOperation(value = "保存", tags = {"内部接口"})
    @PostMapping("/logan/inner/orderReassign/save")
    public R<Long> saveOrderReassign(@RequestBody XpOrderReassign entity) {
        entity.setCreateTime(LocalDateTime.now());
        entity.setUpdateTime(LocalDateTime.now());
        boolean save = xpOrderReassignService.saveInfo(entity);
        if (!save) {
            return R.fail("保存失败");
        }
        return R.ok(entity.getId());
    }
    /**
     * 修改数据
     * @return
     */
    @ApiOperation(value = "修改数据", tags = {"内部接口"})
    @PostMapping("/logan/inner/orderReassign/update")
    public R<Long> updateByIdOrderReassign(@RequestBody XpOrderReassign entity) {
        entity.setUpdateTime(LocalDateTime.now());
        boolean save = xpOrderReassignService.updateById(entity);
        if (!save) {
            return R.fail("修改失败");
        }
        return R.ok();
    }
    /**
     * 修改是否完成
     * @return
     */
    @ApiOperation(value = "修改是否完成", tags = {"内部接口"})
    @PostMapping("/logan/inner/orderReassign/updateComplete")
    public R<Long> updateCompleteOrderReassign(@RequestBody XpOrderReassign entity) {
        LambdaUpdateWrapper<XpOrderReassign> update = new LambdaUpdateWrapper<>();
        update.eq(XpOrderReassign::getIsComplete,false);
        update.eq(XpOrderReassign::getReassignNum,3);//改派小于3次
        update.set(XpOrderReassign::getUpdateTime,LocalDateTime.now());
        update.set(XpOrderReassign::getReassignNum,entity.getReassignNum());
        if(entity.getIsComplete()){
            update.set(XpOrderReassign::getNewVehicleId,entity.getNewVehicleId());
            update.set(XpOrderReassign::getNewFleetId,entity.getNewFleetId());
            update.set(XpOrderReassign::getIsComplete,true);
        }
        boolean b = xpOrderReassignService.update(update);
        if (!b) {
            return R.fail("修改失败");
        }
        return R.ok();
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/mapper/XpOrderReassignMapper.java
@@ -3,6 +3,9 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.order.XpOrderReassign;
import java.util.List;
/**
 * <p>
 * 订单改派记录 Mapper 接口
@@ -13,4 +16,7 @@
 */
public interface XpOrderReassignMapper extends BaseMapper<XpOrderReassign> {
    List<XpOrderReassign> findListNotComplete();
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderReassignService.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.order.XpOrderReassign;
import java.util.List;
/**
 * <p>
 * 订单改派记录 服务类
@@ -13,4 +15,7 @@
 */
public interface IXpOrderReassignService extends IService<XpOrderReassign> {
    List<XpOrderReassign> findListNotComplete();
    boolean saveInfo(XpOrderReassign entity);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderReassignServiceImpl.java
@@ -1,10 +1,18 @@
package com.xiaopeng.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.order.XpOrderReassign;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.order.mapper.XpOrderReassignMapper;
import com.xiaopeng.order.service.IXpOrderReassignService;
import com.xiaopeng.order.service.IXpOrderService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * <p>
@@ -17,4 +25,52 @@
@Service
public class XpOrderReassignServiceImpl extends ServiceImpl<XpOrderReassignMapper, XpOrderReassign> implements IXpOrderReassignService {
    @Resource
    private  IXpOrderService xpOrderService;
    /**
     * 获取没有完成的数据
     * @return
     */
    @Override
    public List<XpOrderReassign> findListNotComplete(){
        return baseMapper.findListNotComplete();
    }
    public XpOrderReassign getByOrderId(Long orderId){
        LambdaQueryWrapper<XpOrderReassign> query = new LambdaQueryWrapper<>();
        query.eq(XpOrderReassign::getOrderId,orderId);
        return super.getOne(query);
    }
    @Override
    public boolean saveInfo(XpOrderReassign entity){
        boolean b = false;
        XpOrderReassign byOrderId = getByOrderId(entity.getOrderId());
        entity.setUpdateTime(LocalDateTime.now());
        if(byOrderId == null){
            entity.setCreateTime(LocalDateTime.now());
            b = save(entity);
        }else{
            boolean canceled = false;
            //修改数据 改派大于等于3次后将取消订单
            entity.setId(byOrderId.getId());
            entity.setReassignNum(byOrderId.getReassignNum()+1);
            if(!entity.getIsComplete() && entity.getReassignNum()>=3){//在改派订单中未获取到车辆 并改派次数 >=3 则直接完成
                entity.setIsComplete(true);
                entity.setRemarks("改派3此后未获取匹配车辆,系统强制取消订单");
                canceled = true;
            }
            b = updateById(entity);
            //是否取消订单
            if(canceled){
                xpOrderService.updateOrderStatus(entity.getOrderId(),OrderStatusEnum.CANCELED.getCode());
            }
        }
        return b;
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1806,9 +1806,15 @@
        Long appUserId = xpOrder.getAppUserId();
        // 查询车辆
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
//        订单的状态 status =1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)
        switch (status) {
            case 0://去掉订单 优惠卷需要返回
            case 0://去掉订单 优惠卷需要返回 @todo yyy 这里可能不需要这个步骤
                //取消订单会将优惠卷 从占用修改成未使用
                if(xpOrder.getCouponId() != null){
                    UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
                    useUserCouponDto.setUserCouponId(xpOrder.getCouponId() );
                    xpAppUserCouponClient.backUserCoupon(useUserCouponDto);
                }
                break;
            case 4:
                // 查询起点点位
@@ -1928,6 +1934,8 @@
                        jobMaps
                );
                break;
            default:
                break;
        }
        xpOrder.setStatus(status);
        xpOrder.setAppUserId(null);
@@ -1956,7 +1964,7 @@
        // 查询车辆
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
        Long appUserId = xpOrder.getAppUserId();
        xpOrder.setCarAbnormal(true);//车辆是否故障 0-否 1-是
        xpOrder.setGetoffTime(LocalDateTime.now());
        // 解析下车地点
        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
@@ -1981,6 +1989,7 @@
        this.updateById(xpOrder);
         //结束行程,修改状态和计算费用
        this.endTrip(xpOrder.getId(),appUserId.toString());
        return R.ok();
    }
@@ -2080,7 +2089,8 @@
            order.setOrderMoney(totalPrice);
            order.setAppUserId(null);
            baseMapper.updateById(order);
        } else {
        }
        else {
            //动态计费
            if (pricing.getPricingType() == 1) {
@@ -2865,22 +2875,25 @@
        order.setStatus(9);
        order.setAppUserId(null);
        if(order.getCouponId()!=null){
            UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
            useUserCouponDto.setUserCouponId(order.getCouponId());
            R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto);
            if(decimalR.getCode()==200){
                order.setCouponMoney(decimalR.getData());
                if(order.getCouponMoney().compareTo(order.getOrderMoney())>0){
                    order.setPayMoney(BigDecimal.ZERO);
                    order.setCouponMoney(order.getOrderMoney());
                }else {
                    order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData()));
        if(order.getCarAbnormal()){//是故障单 支付金额未0 @todo yyy 这里应该有问题
            order.setPayMoney(BigDecimal.ZERO);
        }else{
            if(order.getCouponId()!=null){
                UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
                useUserCouponDto.setUserCouponId(order.getCouponId());
                R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto);
                if(decimalR.getCode()==200){
                    order.setCouponMoney(decimalR.getData());
                    if(order.getCouponMoney().compareTo(order.getOrderMoney())>0){
                        order.setPayMoney(BigDecimal.ZERO);
                        order.setCouponMoney(order.getOrderMoney());
                    }else {
                        order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData()));
                    }
                }
            }
        }
        baseMapper.updateById(order);
        redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 9, 24L, TimeUnit.HOURS);
        return R.ok();
xp-robotaxi-order-boot/src/main/resources/mapper/order/XpOrderReassignMapper.xml
@@ -9,4 +9,15 @@
        is_deleted, create_time, update_time, create_by, update_by
    </sql>
    <select id="findListNotComplete" resultType="com.xiaopeng.api.model.order.XpOrderReassign">
        SELECT a.*,b.order_number as order_number
        FROM xp_order_reassign a
        inner join xp_order b on b.id = a.order_id
        WHERE a.is_deleted = 0
          AND a.is_complete = 0
        ORDER BY a.order_id DESC
    </select>
</mapper>