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; } }