xuhy
2026-04-15 406ae5451ecde0b4b40a9ecfee07f2171fda80bc
Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
8个文件已添加
18个文件已修改
456 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/MiniprogramConfigurer.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpUserRoutePlanRuleController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpUserRoutePlanRuleMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpUserRoutePlanRuleService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpUserRoutePlanRuleServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpUserRoutePlanRuleMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/UserRoutePlanRuleClientFallbackFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/UserRoutePlanRuleClient.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpUserRoutePlanRule.java 29 ●●●●● 补丁 | 查看 | 原始文档 | 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/vo/operation/RouteAndFareVo.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/MiniprogramConfigurer.java
@@ -1,33 +1,33 @@
package com.xiaopeng.account.config;
import com.xiaopeng.unifiedverification.interceptor.CheckForClientInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import javax.annotation.Resource;
@Slf4j
@Configuration
public class MiniprogramConfigurer extends WebMvcConfigurerAdapter {
    @Resource
    @Lazy
    private CheckForClientInterceptor checkForClientInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        try {
            log.info("正在注册小程序拦截器...");
            // 统一验证服务拦截器
            registry.addInterceptor(checkForClientInterceptor)
                    .addPathPatterns("/base/v1/mini-program/**", "/api/v1/mini-program/**");
            log.info("小程序拦截器注册成功");
        } catch (Exception e) {
            log.warn("小程序拦截器注册失败: {}", e.getMessage());
        }
    }
}
//package com.xiaopeng.account.config;
//
//import com.xiaopeng.unifiedverification.interceptor.CheckForClientInterceptor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Lazy;
//import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
//
//import javax.annotation.Resource;
//
//@Slf4j
//@Configuration
//public class MiniprogramConfigurer extends WebMvcConfigurerAdapter {
//
//    @Resource
//    @Lazy
//    private CheckForClientInterceptor checkForClientInterceptor;
//
//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        try {
//            log.info("正在注册小程序拦截器...");
//            // 统一验证服务拦截器
////            registry.addInterceptor(checkForClientInterceptor)
////                    .addPathPatterns("/base/v1/mini-program/**", "/api/v1/mini-program/**");
//            log.info("小程序拦截器注册成功");
//        } catch (Exception e) {
//            log.warn("小程序拦截器注册失败: {}", e.getMessage());
//        }
//    }
//
//}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -129,6 +129,29 @@
        return R.ok(appUserCoupon.getMoney());
    }
    /**
     * 退回用户的优惠卷
     * @param dto
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/backUserCoupon")
    public R<BigDecimal> backUserCoupon(@RequestBody UseUserCouponDto dto) {
        if(dto.getUserCouponId() == null){
            return R.ok();
        }
        XpAppUserCoupon appUserCoupon = xpAppUserCouponService.getById(dto.getUserCouponId());
        //状态(1=未使用,2=已使用,3=已过期)
        if(appUserCoupon.getExpirationTime().isAfter(LocalDateTime.now())){
            appUserCoupon.setStatus(3);
        }else{
            appUserCoupon.setStatus(1);
        }
        appUserCoupon.setUseTime(null);
        appUserCoupon.setAppUserId(null);
        xpAppUserCouponService.updateById(appUserCoupon);
        return R.ok();
    }
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpUserRoutePlanRuleController.java
New file
@@ -0,0 +1,36 @@
package com.xiaopeng.account.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaopeng.account.service.IXpUserRoutePlanRuleService;
import com.xiaopeng.api.model.account.XpUserRoutePlanRule;
import com.xiaopeng.common.core.domain.R;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * 用户规划线路偏好
 */
@RestController
@RequestMapping("")
public class XpUserRoutePlanRuleController {
    @Resource
    private IXpUserRoutePlanRuleService xpUserRoutePlanRuleService;
    /**
     * 根据用户id获取导航偏好设置
     * @param uid
     * @return
     */
    @GetMapping("/logan/inner/userRoutePlanRule/getXpUserRoutePlanRule/{uid}")
    public R<XpUserRoutePlanRule> getXpUserRoutePlanRule(@PathVariable("uid") String uid){
        XpUserRoutePlanRule one = xpUserRoutePlanRuleService.getOne(new LambdaQueryWrapper<XpUserRoutePlanRule>().eq(XpUserRoutePlanRule::getUserId, uid)
                .eq(XpUserRoutePlanRule::getDeleted, 0));
        return R.ok(one);
    }
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpUserRoutePlanRuleMapper.java
New file
@@ -0,0 +1,7 @@
package com.xiaopeng.account.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaopeng.api.model.account.XpUserRoutePlanRule;
public interface XpUserRoutePlanRuleMapper extends BaseMapper<XpUserRoutePlanRule> {
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpUserRoutePlanRuleService.java
New file
@@ -0,0 +1,7 @@
package com.xiaopeng.account.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.model.account.XpUserRoutePlanRule;
public interface IXpUserRoutePlanRuleService extends IService<XpUserRoutePlanRule> {
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpUserRoutePlanRuleServiceImpl.java
New file
@@ -0,0 +1,11 @@
package com.xiaopeng.account.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.account.mapper.XpUserRoutePlanRuleMapper;
import com.xiaopeng.account.service.IXpUserRoutePlanRuleService;
import com.xiaopeng.api.model.account.XpUserRoutePlanRule;
import org.springframework.stereotype.Service;
@Service
public class XpUserRoutePlanRuleServiceImpl extends ServiceImpl<XpUserRoutePlanRuleMapper, XpUserRoutePlanRule> implements IXpUserRoutePlanRuleService {
}
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpUserRoutePlanRuleMapper.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaopeng.account.mapper.XpUserRoutePlanRuleMapper">
</mapper>
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/UserRoutePlanRuleClientFallbackFactory.java
New file
@@ -0,0 +1,22 @@
package com.xiaopeng.api.factory.account;
import com.xiaopeng.api.feignClient.account.UserRoutePlanRuleClient;
import com.xiaopeng.api.model.account.XpUserRoutePlanRule;
import com.xiaopeng.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
@Slf4j
public class UserRoutePlanRuleClientFallbackFactory implements FallbackFactory<UserRoutePlanRuleClient> {
    @Override
    public UserRoutePlanRuleClient create(Throwable cause) {
        return new UserRoutePlanRuleClient() {
            @Override
            public R<XpUserRoutePlanRule> getXpUserRoutePlanRule(String uid) {
                log.error("根据用户id获取导航偏好设置失败:" + cause);
                return R.fail("根据用户id获取导航偏好设置失败:" + cause);
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/account/XpAppUserCouponClientFallbackFactory.java
@@ -12,6 +12,7 @@
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList;
/**
@@ -39,6 +40,12 @@
                return R.fail("优惠券使用失败,"+cause.getMessage());
            }
            @Override
            public R<BigDecimal> backUserCoupon(UseUserCouponDto dto) {
                log.error("优惠券退回失败,原因: {}", cause.getMessage());
                return null;
            }
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/XpOrderClientFallbackFactory.java
@@ -108,6 +108,12 @@
                return R.fail("更新订单状态失败");
            }
            @Override
            public R<String> carAbnormalUpdateOrderStatus(Long orderId) {
                return null;
            }
            @Override
            public R<String> saveVehicleLocation(OrderTrajectoryVo orderTrajectory) {
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/UserRoutePlanRuleClient.java
New file
@@ -0,0 +1,25 @@
package com.xiaopeng.api.feignClient.account;
import com.xiaopeng.api.factory.account.UserRoutePlanRuleClientFallbackFactory;
import com.xiaopeng.api.model.account.XpUserRoutePlanRule;
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.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(contextId = "UserRoutePlanRuleClient",
        value = ServiceNameConstantsEnum.XP_ACCOUNT_SERVICE,
        fallbackFactory = UserRoutePlanRuleClientFallbackFactory.class)
public interface UserRoutePlanRuleClient {
    /**
     * 根据用户id获取导航偏好设置
     * @param uid
     * @return
     */
    @GetMapping("/logan/inner/userRoutePlanRule/getXpUserRoutePlanRule/{uid}")
    R<XpUserRoutePlanRule> getXpUserRoutePlanRule(@PathVariable("uid") String uid);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/account/XpAppUserCouponClient.java
@@ -9,7 +9,6 @@
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
@@ -30,4 +29,13 @@
    R<BigDecimal> useUserCoupon(@RequestBody UseUserCouponDto dto);
    /**
     * 退回用户的优惠卷
     * @param dto
     * @return
     */
    @PostMapping("/logan/inner/appUserCoupon/backUserCoupon")
    R<BigDecimal> backUserCoupon(@RequestBody UseUserCouponDto dto);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -130,6 +130,13 @@
    @PostMapping("/logan/inner/v1/order/updateOrderStatus")
    R<String> updateOrderStatus(@RequestParam Long orderId,
                                       @RequestParam Integer status);
    /**
     * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8
     * @param orderId
     * @return
     */
    @PostMapping("/logan/inner/v1/order/carAbnormalUpdateOrderStatus")
    R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId);
    /**
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java
@@ -1,12 +1,6 @@
package com.xiaopeng.api.model.account;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
@@ -14,6 +8,9 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
@@ -47,6 +44,7 @@
    @ApiModelProperty(value = "使用时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private LocalDateTime useTime;
    @ApiModelProperty(value = "状态(1=未使用,2=已使用,3=已过期)")
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpUserRoutePlanRule.java
New file
@@ -0,0 +1,29 @@
package com.xiaopeng.api.model.account;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xiaopeng.common.core.web.domain.BaseModel;
import lombok.Data;
@Data
@TableName("xp_user_route_plan_rule")
public class XpUserRoutePlanRule extends BaseModel {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.NONE)
    private Long id;
    /**
     * 用户id
     */
    @TableField("user_id")
    private String userId;
    /**
     * 路线规划规则 0:速度优先(只返回一条路线),此路线不一定距离最短 1:费用优先(只返回一条路线),不走收费路段,且耗时最少的路线 2:常规最快(只返回一条路线)综合距离/耗时规划结果 32:默认,高德推荐,同高德地图APP默认 33:躲避拥堵 34:高速优先 35:不走高速 36:少收费 37:大路优先 38:速度最快 39:躲避拥堵+高速优先 40:躲避拥堵+不走高速 41:躲避拥堵+少收费 42:少收费+不走高速 43:躲避拥堵+少收费+不走高速 44:与躲避拥堵+大路优先 45:躲避拥堵+速度最快
     */
    @TableField("route_plan_rule")
    private String routePlanRule;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -1,6 +1,7 @@
package com.xiaopeng.api.model.order;
import com.baomidou.mybatisplus.annotation.*;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -170,6 +171,9 @@
    @ApiModelProperty(value = "优惠券id")
    private Long couponId;
    /**
     * {@link OrderStatusEnum }
     */
    @ApiModelProperty(value = "状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成")
    private Integer status;
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/RouteAndFareVo.java
@@ -2,6 +2,7 @@
import com.xiaopeng.api.vo.order.XpPricingCardVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@lombok.Data
@ApiModel(description = "线路和运费")
@@ -14,4 +15,18 @@
    private XpPricingCardVo xpPricingCard;
    /**
     * 导航策略ID
     */
    private String routePlan;
    @ApiModelProperty(value = "导航策略偏好(1是 2否)")
    private Integer preference=2;
    @ApiModelProperty(value = "导航策略名称")
    private String routePlanName;
}
xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -51,3 +51,4 @@
com.xiaopeng.api.factory.operation.XpRoutePlanClientFallbackFactory
com.xiaopeng.api.factory.order.XpTestOrderClientFallbackFactory
com.xiaopeng.api.factory.map.AdcFencePushClientFallbackFactory
com.xiaopeng.api.factory.account.UserRoutePlanRuleClientFallbackFactory
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -498,7 +498,13 @@
                    log.info("车辆故障,车辆状态修改0 {}", vehicle.getPlateNumber());
                }
            }else {
                //正常订单
                //正常订单 车辆故障
                /*
                1.将订单信息车辆的 查询出来 设置故障状态
                2.解除用户和车的关系
                3.如果是 接驾中的车需要重新派车
                4.如果是行驶中的车需要将订单结束 计算金额
                 */
                XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
                vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
                if (vehicle != null) {
@@ -517,6 +523,20 @@
                    cancelTaxiPassengerVo.setAppId(appid);
                    userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
                }
                //status 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成
                List<Integer> notDrive = new ArrayList<Integer>(){{ //未行驶的情况下订单故障状态点
                    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
                    xpOrderClient.carAbnormalUpdateOrderStatus(Long.parseLong(orderId));
                }else if(notDrive.contains(xpOrder.getStatus())){//在接驾中 车辆出现故障 重新派单
                // TODO 重新派单
                ReassignOrderDTO reassignOrderDTO = new ReassignOrderDTO();
                reassignOrderDTO.setUid(xpOrder.getAppUserId().toString());
@@ -529,6 +549,7 @@
                reassignOrderDTO.setLongitude(longitude);
                reassignOrderDTO.setLatitude(latitude);
                reassignOrderClient.reassignOrder(reassignOrderDTO);
                }
            }
            //添加车辆异常任务和发送消息
            xpTaskClient.saveVehicleAccidentError(vehicle.getId());
@@ -1284,8 +1305,12 @@
                            if(xpOrder.getStatus() == 0 || xpOrder.getStatus() >= 8){
                                return;
                            }
                            if(xpOrder.getStatus() > 5 && xpOrder.getStatus() < 8){
                                //行程中取消订单,按照行程结束处理
                            List<Integer>  xczqx = new ArrayList<Integer>(){{
                                add(OrderStatusEnum.IN_SERVICE.getCode());//服务中
                                add(OrderStatusEnum.SEE_OFF_GUESTS.getCode());//SEE_OFF_GUESTS
                            }};
                            if(xczqx.contains(xpOrder.getStatus())){//行程中取消订单,按照行程结束处理
                                buildPushOrderStatus(cmd, orderId, OrderStatusEnum.SEE_OFF_GUESTS, sequence);
                                xpOrderClient.updateOrderStatus(Long.parseLong(orderId), OrderStatusEnum.SEE_OFF_GUESTS.getCode());
                                redisService.setCacheObject("ORDER_STATUS:" + orderId, OrderStatusEnum.SEE_OFF_GUESTS.getCode(), 24L, TimeUnit.HOURS);
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -67,7 +67,7 @@
    @PostMapping("/base/v1/mini-program/navigation/route-and-fare")
    @ApiOperation(value = "导航-获取路线和费用", tags = {"小程序-获取路线和费用"}, response = RouteAndFareVo.class)
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<RouteAndFareVo> getRouteAndFare(@RequestBody @Valid RouteAndFareDto routeAndFareDto, HttpServletRequest request) {
    public R<List<RouteAndFareVo>> getRouteAndFare(@RequestBody @Valid RouteAndFareDto routeAndFareDto, HttpServletRequest request) {
        // uid已通过拦截器otp校验,可以直接使用
        String uid = request.getHeader("XP-Uid");
        return R.ok(xpPricingService.getRouteAndFare(routeAndFareDto, uid));
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java
@@ -32,7 +32,7 @@
     * @param userId 用户id
     * @return
     */
    RouteAndFareVo getRouteAndFare(RouteAndFareDto routeAndFareDto, String userId);
    List<RouteAndFareVo> getRouteAndFare(RouteAndFareDto routeAndFareDto, String userId);
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -202,7 +202,7 @@
    @Override
    public RouteAndFareVo getRouteAndFare(RouteAndFareDto routeAndFareDto, String userId) {
    public List<RouteAndFareVo> getRouteAndFare(RouteAndFareDto routeAndFareDto, String userId) {
//        // 判断是否5分钟内进行了查询 相同站点的起始点  并且是同时段
//        String key = "xp-map-query-" + routeAndFareDto.getOpenCityId()
//                + "-" + routeAndFareDto.getOrigin().getLongitude() + "-" + routeAndFareDto.getOrigin().getLatitude()
@@ -213,6 +213,8 @@
//            RouteAndFareVo RouteAndFareVo = JSONObject.parseObject(jsonStr, RouteAndFareVo.class);
//            return (RouteAndFareVo);
//        }
        ArrayList<RouteAndFareVo> routeAndFareVos = new ArrayList<>(3);
        // 1. 基础数据查询
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(routeAndFareDto.getOrigin().getLongitude().toString(), routeAndFareDto.getOrigin().getLatitude().toString());
@@ -226,9 +228,15 @@
        }
        XpOpenCity xpOpenCity = openCities;
        routeAndFareDto.setOpenCityId(xpOpenCity.getId());
        XpRoutePlan xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, cityCode));
        List<XpRoutePlan> xpRoutePlan = xpRoutePlanMapper.selectList(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, cityCode));
        // 找出用户偏好
        Object cacheObject = redisService.getCacheObject(CacheConstants.USER_ROUTE_PREFERENCE + userId);
        for (XpRoutePlan routePlan : xpRoutePlan) {
        if (xpRoutePlan != null) {
            routeAndFareDto.setRoutePlanRule(xpRoutePlan.getRoutePlanRule());
                routeAndFareDto.setRoutePlanRule(routePlan.getRoutePlanRule());
        }
        Object userPref = redisService.getCacheObject(CacheConstants.USER_ROUTE_PREFERENCE + userId);
        if (userPref != null) {
@@ -248,7 +256,8 @@
        // 算距离
        R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
        if (distanceAndDuration.getCode() != 200) {
            throw new ServiceException("获取导肮信息失败", I18nKeyConstant.PATH_NOT_FOUND);
//                throw new ServiceException("获取导肮信息失败", I18nKeyConstant.PATH_NOT_FOUND);
                continue;
        }
@@ -417,7 +426,24 @@
//        redisService.setCacheObject(key, voJsonStr, 5l, TimeUnit.MINUTES);
        //缓存导航数据,用于下单后推送导航给车端和乘客端
        redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + userId, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
        return routeAndFareVo;
            if(cacheObject!=null){
                if (cacheObject.toString().equals(routePlan.getRoutePlanRule().toString())) {
                    routeAndFareVo.setPreference(1);
                }
            }
            routeAndFareVo.setRoutePlanName(routePlan.getPlanName());
            routeAndFareVos.add(routeAndFareVo);
        }
        if(routeAndFareVos.isEmpty()){
            throw new ServiceException("获取导肮信息失败", I18nKeyConstant.PATH_NOT_FOUND);
        }
        return routeAndFareVos;
    }
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -2,11 +2,13 @@
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;
import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
@@ -24,6 +26,7 @@
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.constant.Constants;
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.mapper.XpElectronicFenceMapper;
import com.xiaopeng.operation.service.IXpElectronicFenceAreaService;
@@ -97,6 +100,8 @@
    @Resource
    private UidVinPriorityMatcher uidVinPriorityMatcher;
    @Resource
    private  XpAppUserCouponClient xpAppUserCouponClient;
    // 自定义线程池
@@ -1106,6 +1111,8 @@
        }
        XpOrder data = xpOrderR.getData();
        XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null);
        boolean orderCarStatus = false;//未派到车 默认
        //循环找车
        for (int i = 0; i < count; i++) {
            log.info("进入找车环节");
            List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(longitude, latitude, xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
@@ -1152,12 +1159,29 @@
                // 调用推送服务  orderId + carVin
                orderMissionClient.pushOrder(pushOrderDto);
                //接单成功 将 修改 订单的状态=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);
            } 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);
            }
        }
    }
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -516,6 +516,16 @@
    }
    /**
     * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8
     */
    @ApiOperation(value = "行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8")
    @PostMapping("/logan/inner/v1/order/carAbnormalUpdateOrderStatus")
    public R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId ) {
//        Integer status = OrderStatusEnum.SEE_OFF_GUESTS.getCode();
        return xpOrderService.carAbnormalUpdateOrderStatus(orderId);
    }
    /**
     * 业务流程-通过订单id查询车辆信息
     */
    @ApiOperation(value = "通过订单id查询车辆信息", tags = {"小程序-业务流程"})
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -159,6 +159,11 @@
     */
    R<String> updateOrderStatus(Long orderId, Integer status);
    /**
     * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8
     */
    R<String> carAbnormalUpdateOrderStatus(Long orderId);
    Boolean endTrip(Long orderId, String uid);
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1807,6 +1807,9 @@
        // 查询车辆
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
        switch (status) {
            case 0://去掉订单 优惠卷需要返回
                break;
            case 4:
                // 查询起点点位
                Long startPointId = xpOrder.getStartPointId();
@@ -1933,6 +1936,56 @@
        return R.ok();
    }
    /**
     * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8
     */
    @Override
    public R<String> carAbnormalUpdateOrderStatus(Long orderId){
        XpOrder xpOrder = this.getById(orderId);
        if (Objects.isNull(xpOrder)) {
            return R.fail("订单不存在");
        }
        if (xpOrder.getStatus() == 0) {
            return R.fail("订单已取消");
        }
        if(xpOrder.getStatus() >= 8){
            return R.fail("订单已结束");
        }
        // 查询车辆
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
        Long appUserId = xpOrder.getAppUserId();
        xpOrder.setGetoffTime(LocalDateTime.now());
        // 解析下车地点
        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
        if(Objects.nonNull(vehiclePosition)){
            GeoJsonPoint point = vehiclePosition.getPoint();
            if(Objects.nonNull(point)){
                double x = point.getX();
                double y = point.getY();
                Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
                xpOrder.setGetoffAddress(geocode.get("address"));
            }
        }
        //计算行驶总距离和时长
        List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(new Query().addCriteria(Criteria.where("orderId").is(xpOrder.getId())), OrderTrajectory.class);
        Double reduce = orderTrajectoryList.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum);
        xpOrder.setMileageKilometers(new BigDecimal(reduce).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN).doubleValue());
        long duration = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - xpOrder.getTripBegin().toEpochSecond(ZoneOffset.of("+8"));
        xpOrder.setDuration(new BigDecimal(duration).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        xpOrder.setStatus(OrderStatusEnum.SEE_OFF_GUESTS.getCode());//待客下车
        xpOrder.setAppUserId(null);
        this.updateById(xpOrder);
         //结束行程,修改状态和计算费用
        this.endTrip(xpOrder.getId(),appUserId.toString());
        return R.ok();
    }
    @Override
    public Boolean endTrip(Long orderId, String uid) {
        List<XpOrderDetail> xpOrderDetails = new ArrayList<>();