kong
2026-04-12 f0d97dc44df544cb810a820dee7cc83de01588db
add 排队信息
1个文件已添加
3个文件已修改
154 ■■■■■ 已修改文件
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/vo/QueueStatusVo.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -20,6 +20,7 @@
import com.xiaopeng.itinerary.service.XpPricingService;
import com.xiaopeng.api.vo.HotFixInfoVo;
import com.xiaopeng.itinerary.utils.ImageTagProcessor;
import com.xiaopeng.itinerary.vo.QueueStatusVo;
import com.xiaopeng.itinerary.vo.SaveOrderVo;
import com.xiaopeng.unifiedverification.interceptor.XpClientCheck;
import io.swagger.annotations.Api;
@@ -196,4 +197,17 @@
        xpPricingService.saveUserRoutePreference(dto.getCode(), uid);
        return R.ok();
    }
    /**
     * 查询排队状态
     * @param orderId 订单ID
     * @return 排队状态信息
     */
    @GetMapping("/base/v1/mini-program/order/queue-status")
    @ApiOperation(value = "查询排队状态", tags = {"小程序-排队状态"}, response = QueueStatusVo.class)
    @XpClientCheck(checkToken = false, checkOtpToken = true)
    public R<QueueStatusVo> getQueueStatus(@RequestParam String orderId, HttpServletRequest request) {
        String uid = request.getHeader("XP-Uid");
        return R.ok(xpPricingService.getQueueStatus(orderId, uid));
    }
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/XpPricingService.java
@@ -11,6 +11,7 @@
import com.xiaopeng.api.vo.operation.RoutePreferenceItemVo;
import com.xiaopeng.api.vo.operation.RouteStaleCheckVo;
import com.xiaopeng.itinerary.dto.XpOrderDto;
import com.xiaopeng.itinerary.vo.QueueStatusVo;
import java.util.List;
@@ -77,4 +78,12 @@
     */
    void saveUserRoutePreference(String code, String userId);
    /**
     * 查询排队状态
     * @param orderId 订单ID
     * @param uid 用户ID
     * @return 排队状态信息
     */
    QueueStatusVo getQueueStatus(String orderId, String uid);
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -43,11 +43,13 @@
import com.xiaopeng.itinerary.service.IXpGeoQueryEntityService;
import com.xiaopeng.itinerary.service.XpPointService;
import com.xiaopeng.itinerary.service.XpPricingService;
import com.xiaopeng.itinerary.vo.QueueStatusVo;
import com.xiaopeng.itinerary.utils.XpPricingUtil;
import com.xiaopeng.itinerary.utils.holiday.HolidayUtil;
import com.xiaopeng.itinerary.utils.map.FastDistanceCalculator;
import com.xiaopeng.itinerary.utils.map.GDMapGeocodingUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
@@ -1142,4 +1144,73 @@
        return Integer.compare(da, db);
    }
    @Override
    public QueueStatusVo getQueueStatus(String orderId, String uid) {
        QueueStatusVo queueStatusVo = new QueueStatusVo();
        try {
            // 从订单服务获取订单信息,获取queueName
            R<XpOrder> orderR = xpOrderClient.queryOrderById(Long.valueOf(orderId));
            if (orderR.getCode() != R.SUCCESS || orderR.getData() == null) {
                throw new ServiceException("订单不存在");
            }
            XpOrder xpOrder = orderR.getData();
            String queueName = xpOrder.getQueueName();
            if (StringUtils.isBlank(queueName)) {
                // 订单不在排队中
                queueStatusVo.setStatus(1);
                queueStatusVo.setCurrentPosition(0);
                queueStatusVo.setTotalCount(0);
                queueStatusVo.setEstimatedWaitTime(0);
                return queueStatusVo;
            }
            // 从Redis获取队列数据
            List<String> queueItems = redisService.getCacheList(queueName);
            if (queueItems == null || queueItems.isEmpty()) {
                // 队列为空,说明已分配车辆
                queueStatusVo.setStatus(1);
                queueStatusVo.setCurrentPosition(0);
                queueStatusVo.setTotalCount(0);
                queueStatusVo.setEstimatedWaitTime(0);
                return queueStatusVo;
            }
            // 遍历队列,找到当前订单的位置
            int currentPosition = 0;
            int totalCount = queueItems.size();
            for (int i = 0; i < queueItems.size(); i++) {
                String item = queueItems.get(i);
                if (item.startsWith(orderId + "_")) {
                    currentPosition = i + 1; // 位置从1开始
                    break;
                }
            }
            // 计算预计等待时间(假设每辆车平均需要3分钟)
            int estimatedWaitTime = (currentPosition - 1) * 3;
            if (estimatedWaitTime < 0) {
                estimatedWaitTime = 0;
            }
            queueStatusVo.setStatus(0); // 0-排队中
            queueStatusVo.setCurrentPosition(currentPosition);
            queueStatusVo.setTotalCount(totalCount);
            queueStatusVo.setEstimatedWaitTime(estimatedWaitTime);
        } catch (Exception e) {
            log.error("查询排队状态失败: {}", e.getMessage(), e);
            // 异常情况下返回默认值
            queueStatusVo.setStatus(0);
            queueStatusVo.setCurrentPosition(0);
            queueStatusVo.setTotalCount(0);
            queueStatusVo.setEstimatedWaitTime(0);
        }
        return queueStatusVo;
    }
}
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/vo/QueueStatusVo.java
New file
@@ -0,0 +1,60 @@
package com.xiaopeng.itinerary.vo;
/**
 * 排队状态信息
 *
 * @author kong
 */
public class QueueStatusVo {
    /**
     * 当前排队位置
     */
    private Integer currentPosition;
    /**
     * 总排队人数
     */
    private Integer totalCount;
    /**
     * 预计等待时间(分钟)
     */
    private Integer estimatedWaitTime;
    /**
     * 排队状态:0-排队中,1-已分配车辆
     */
    private Integer status;
    public Integer getCurrentPosition() {
        return currentPosition;
    }
    public void setCurrentPosition(Integer currentPosition) {
        this.currentPosition = currentPosition;
    }
    public Integer getTotalCount() {
        return totalCount;
    }
    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }
    public Integer getEstimatedWaitTime() {
        return estimatedWaitTime;
    }
    public void setEstimatedWaitTime(Integer estimatedWaitTime) {
        this.estimatedWaitTime = estimatedWaitTime;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
}