liujie
2026-02-13 e7311db7b916fb597ef3fa23b54222a1ca96dcc8
feat(order): 添加订单弹出功能和地理查询实体迁移

- 在IXpOrderService中添加popOrder方法用于处理订单成功下发后的队列弹出
- 新增PopOrderDto数据传输对象用于传递订单弹出相关参数
- 将XpGeoQueryEntity从operation模块迁移到api公共模块
- 修改RedisService的popFirstElement方法返回类型为String
- 在XpOrderServiceImpl中实现popOrder业务逻辑,包括订单状态更新和MongoDB数据存储
- 添加内部接口用于保存地理查询实体数据
- 更新相关控制器和Feign客户端以支持新的订单弹出功能
1 文件已重命名
1个文件已添加
13个文件已修改
136 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/order/PopOrderDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpPricingClient.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/operation/XpGeoQueryEntity.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpGeoQueryEntityController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/repository/XpGeoQueryEntityRepository.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpGeoQueryEntityService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/order/PopOrderDto.java
New file
@@ -0,0 +1,20 @@
package com.xiaopeng.api.dto.order;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "订单成功下发命令信息")
public class PopOrderDto {
    @ApiModelProperty(value = "队列名称")
    private String queueName;
    @ApiModelProperty(value = "订单Id")
    private Long orderId;
    @ApiModelProperty(value = "车辆Id")
    private Long xpVehicleId;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpPricingClient.java
@@ -3,6 +3,7 @@
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.factory.operation.XpPricingClientFallbackFactory;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpPricing;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
@@ -18,7 +19,16 @@
     */
    @PostMapping("/base/v1/mini-program/pricing/getWaitTime")
    R<Integer> getWaitTime(@RequestBody LonLatDto dto);
    // 根据开通城市 获取定价
    @GetMapping("/base/v1/mini-program/getPricingByCityId/{cityId}")
     R<XpPricing> getPricingByCityId(@PathVariable("cityId")Long cityId);
    /**
     * 保存XpGeoQueryEntity
     */
    @PostMapping("/inner/saveXpGeoQueryEntity")
    R<?> saveXpGeoQueryEntity(@RequestBody XpGeoQueryEntity xpGeoQueryEntity);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -1,6 +1,7 @@
package com.xiaopeng.api.feignClient.order;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.factory.order.XpOrderClientFallbackFactory;
@@ -84,4 +85,10 @@
    R<Integer> getOrderNum(@RequestBody GetOrderNumDto dto);
    /**
     * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
     */
    @PostMapping("/inner/order/popOrder")
    R<?> popOrder(@RequestBody PopOrderDto dto);
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpGeoQueryEntity.java
File was renamed from xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/entity/XpGeoQueryEntity.java
@@ -1,4 +1,4 @@
package com.xiaopeng.operation.entity;
package com.xiaopeng.api.model.operation;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
xp-robotaxi-automaticPilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -28,6 +28,8 @@
    }
    @PostMapping("/inner/pushOrder")
    public R<Boolean> pushOrder(@RequestParam Long orderId) {
xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java
@@ -179,8 +179,8 @@
    }
    // 获取第一个元素并删除(弹出)
    public Object popFirstElement(String key) {
        return redisTemplate.opsForList().leftPop(key);
    public String popFirstElement(String key) {
        return (String)redisTemplate.opsForList().leftPop(key);
    }
    /**
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpGeoQueryEntityController.java
@@ -1,11 +1,10 @@
package com.xiaopeng.operation.controller;
import com.xiaopeng.operation.entity.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPricingController.java
@@ -3,12 +3,14 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpPricing;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
import com.xiaopeng.common.core.web.domain.AjaxResult;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.operation.dto.XpOrderDto;
import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
import com.xiaopeng.operation.service.XpPricingService;
import com.xiaopeng.api.vo.operation.RouteAndFareVo;
import com.xiaopeng.operation.vo.SaveOrderVo;
@@ -38,10 +40,12 @@
public class XpPricingController extends BaseController {
    private final XpPricingService xpPricingService;
    private final IXpGeoQueryEntityService xpGeoQueryEntityService;
    public XpPricingController(XpPricingService xpPricingService) {
    public XpPricingController(XpPricingService xpPricingService, IXpGeoQueryEntityService xpGeoQueryEntityService) {
        this.xpPricingService = xpPricingService;
        this.xpGeoQueryEntityService = xpGeoQueryEntityService;
    }
@@ -87,6 +91,18 @@
    /**
     * 保存信息
     * @param xpGeoQueryEntity
     * @return
     */
    @PostMapping("/inner/saveXpGeoQueryEntity")
    public R<?> saveXpGeoQueryEntity(@RequestBody XpGeoQueryEntity xpGeoQueryEntity){
        xpGeoQueryEntityService.save(xpGeoQueryEntity);
        return R.ok();
    }
    /**
     * 播单
     */
    @PostMapping("/base/v1/mini-program/order/save")
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/repository/XpGeoQueryEntityRepository.java
@@ -1,6 +1,6 @@
package com.xiaopeng.operation.repository;
import com.xiaopeng.operation.entity.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.repository.MongoRepository;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpGeoQueryEntityService.java
@@ -1,7 +1,6 @@
package com.xiaopeng.operation.service;
import com.xiaopeng.operation.entity.XpGeoQueryEntity;
import org.springframework.data.geo.Point;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import java.util.List;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
@@ -1,6 +1,6 @@
package com.xiaopeng.operation.service.impl;
import com.xiaopeng.operation.entity.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import com.xiaopeng.operation.repository.XpGeoQueryEntityRepository;
import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
import org.springframework.beans.factory.annotation.Autowired;
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPricingServiceImpl.java
@@ -16,7 +16,6 @@
import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.account.UserCouponVo;
import com.xiaopeng.api.vo.operation.FareVo;
import com.xiaopeng.api.vo.operation.RouteAndFareVo;
@@ -29,7 +28,7 @@
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.operation.constant.I18nKeyConstant;
import com.xiaopeng.operation.dto.XpOrderDto;
import com.xiaopeng.operation.entity.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import com.xiaopeng.operation.mapper.*;
import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
import com.xiaopeng.operation.service.XpPricingService;
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -5,6 +5,7 @@
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.model.order.XpOrder;
@@ -115,6 +116,18 @@
        return R.ok(xpOrderService.getOrderNum(dto));
    }
    /**
     * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
     */
    @PostMapping("/inner/order/popOrder")
    public  R<?> popOrder(@RequestBody PopOrderDto dto){
        xpOrderService.popOrder(dto);
        return R.ok();
    }
    /**
     * 新增订单
     *
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.model.order.XpOrder;
@@ -186,4 +187,10 @@
     * @param orderTrajectory
     */
    void saveVehicleLocation(OrderTrajectory orderTrajectory);
    /**
     * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
     * @param dto
     */
    void popOrder(PopOrderDto dto);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -12,6 +12,7 @@
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.HistoryEndPointsDto;
import com.xiaopeng.api.dto.order.HistoryStartPointsDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.dto.statistics.DailyCountDTO;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
@@ -28,6 +29,7 @@
import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
import com.xiaopeng.api.model.operation.XpPoint;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.order.XpOrderCancel;
@@ -71,11 +73,13 @@
import com.xiaopeng.order.utils.holiday.HolidayUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.transaction.core.TransactionType;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Sort;
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.stereotype.Service;
@@ -1590,6 +1594,42 @@
    /**
     * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
     * @param dto
     */
    @Override
    @Transactional
//    @ShardingTransactionType(TransactionType.BASE)
    public void popOrder(PopOrderDto dto) {
        XpOrder order = this.getById(dto.getOrderId());
        order.setAcceptanceTime(LocalDateTime.now());
        order.setVehicleId(dto.getXpVehicleId());
        order.setStatus(2);
        // Redis弹出这个队列元素
        // value 订单Id_经纬度_状态_用户id_订单编号_距离_时间
        String popFirstElement = redisService.popFirstElement(dto.getQueueName());
        XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
        String[] split = popFirstElement.split("_");
        xpGeoQueryEntity.setOrderId(split[0]);
        String[] split1 = split[1].split(",");
        xpGeoQueryEntity.setLocation(new GeoJsonPoint(Double.parseDouble(split1[0]), Double.parseDouble(split1[1])));
        xpGeoQueryEntity.setTimestamp(new Date());
        // 计算2个时间的秒数
        LocalDateTime createTime = order.getCreateTime();
        LocalDateTime acceptanceTime = order.getAcceptanceTime();
        xpGeoQueryEntity.setSeconds((int) Duration.between(createTime, acceptanceTime).getSeconds());
        String currentTimeSlot = DateUtils.getCurrentTimeSlot();
        xpGeoQueryEntity.setTime(currentTimeSlot);
        // 存mongo数据
        xpPricingClient.saveXpGeoQueryEntity(xpGeoQueryEntity);
        this.updateById(order);
    }
    /**
     * 获取当前用户正在执行的订单
     *
     * @param uid