liujie
2026-02-12 7a78cb97f96eea330dff3b222eff8d6dafc5e28a
fix(task-order): 修复推单逻辑中的空指针异常问题

- 在TaskOrderUtil类中添加@SneakyThrows注解处理异常
- 修复processPushOrder方法中count参数为0时的初始化逻辑
- 更新电子围栏查询逻辑,通过service层获取正确的围栏ID
-
2个文件已修改
52 ■■■■■ 已修改文件
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -26,6 +26,7 @@
import com.xiaopeng.operation.service.XpPointService;
import com.xiaopeng.operation.utils.mango.VehiclePositionService;
import com.xiaopeng.api.vo.operation.VehiclePositionVo;
import lombok.SneakyThrows;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
@@ -215,8 +216,12 @@
     * @param orderNo 订单号
     * @param xpTradingStrategy  规则
     */
    @SneakyThrows
    private void processPushOrder(String quoteName, int count, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) {
        System.out.println("进入推单环环节");
        if(count==0){
            count=1;
        }
        // 订单状态
        R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
        if (xpOrderR.getCode() != 200) {
@@ -229,7 +234,8 @@
        // 找出围栏id
        Long xpElectronicFenceAreaId = xpOrder.getXpElectronicFenceAreaId();
        XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(xpElectronicFenceAreaId);
        Long electronicId = xpElectronicFenceAreaService.getById(xpElectronicFenceAreaId).getElectronicId();
        XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(electronicId);
        for (int i = 0; i < count; i++) {
@@ -237,6 +243,7 @@
            // 根据距离找车
            // 车多则根据配置找具体车数量 根据距离最近
            // 更改 暂不限制数量
            List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
            // 获取车辆的区域信息
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
@@ -14,10 +14,10 @@
@Service
public class VehiclePositionService {
    @Resource
    private MongoTemplate mongoTemplate;
    /**
     * 查询附近指定距离内且状态正常的车辆
     * @param longitude 经度
@@ -28,27 +28,26 @@
    public List<VehiclePosition> findAvailableVehiclesNearby(double longitude,
                                                             double latitude,
                                                             double distanceInMeters,int num) {
        // 创建查询点
        Point referencePoint = new Point(longitude, latitude);
        // 设置最大距离(MongoDB使用公里或米,这里转换为公里)
        distanceInMeters = distanceInMeters / 1000;
        try {
            // 创建查询点
            Point referencePoint = new Point(longitude, latitude);
        // 构建查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("point")
                .near(referencePoint)
                .maxDistance(distanceInMeters));
        query.addCriteria(Criteria.where("status").is(1)); // 运营中
        query.addCriteria(Criteria.where("state").is(0));  // 空闲中
        // 可以添加排序,按距离排序
         query.with(Sort.by(Sort.Direction.ASC, "point"));
//        // 可以限制返回数量
//         query.limit(num);
        return mongoTemplate.find(query, VehiclePosition.class);
            // 构建查询条件
            Query query = new Query();
            // 地理位置查询
            query.addCriteria(Criteria.where("point")
                    .near(referencePoint)
                    .maxDistance(distanceInMeters));
            query.with(Sort.by(Sort.Direction.ASC, "point"));
            return mongoTemplate.find(query, VehiclePosition.class);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }