From e919aa5e0fca3b90b245c787c160454abd944f8c Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 18 四月 2026 15:23:04 +0800
Subject: [PATCH] 添加蓝牙解锁相关功能接口

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java |   52 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
index e97452f..4775b8b 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -19,10 +19,13 @@
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.order.*;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.utils.WebUtils;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.common.redis.service.RedisService;
 import com.xiaopeng.order.mangodb.model.OrderTrajectory;
+import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
 import com.xiaopeng.order.model.dto.XpOrderCommentDto;
 import com.xiaopeng.order.model.dto.XpOrderOperateDTO;
 import com.xiaopeng.order.model.dto.XpOrderPayDto;
@@ -62,6 +65,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -82,6 +86,7 @@
     private MongoTemplate mongoTemplate;
     @Resource
     private XpVehicleClient xpVehicleClient;
+    private OrderTrajectoryService orderTrajectoryService;
 
     /**
      * 获取订单统计数据(内部接口)
@@ -346,9 +351,9 @@
         String uid = request.getHeader("XP-Uid");
         OrderDetailVo orderDetailVo = xpOrderService.orderDetail(orderId, uid);
         BigDecimal orderMoney = orderDetailVo.getOrderMoney();
-        if(orderMoney==null){
+        if (orderMoney == null) {
             orderDetailVo.setOrderMoneyStr("0.00");
-        }else {
+        } else {
             orderDetailVo.setOrderMoneyStr(orderMoney.setScale(2, RoundingMode.HALF_UP).toString());
         }
         return R.ok(orderDetailVo);
@@ -361,10 +366,10 @@
     @ApiOperation(value = "获取历史下单成功起点10条数据列表", tags = {"小程序-获取历史下单成功起点10条数据列表"})
     @GetMapping("/base/v1/mini-program/history/startPoints")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
-    public R<List<XpHistoryStartPointsVo>> getHistoryStartPoints(double lon, double lat,Long electronicAreaId, HttpServletRequest request) {
+    public R<List<XpHistoryStartPointsVo>> getHistoryStartPoints(double lon, double lat, Long electronicAreaId, HttpServletRequest request) {
         // uid已通过拦截器otp校验,可以直接使用
         String uid = request.getHeader("XP-Uid");
-        return R.ok(xpOrderService.getHistoryStartPoints(uid, lon, lat,electronicAreaId));
+        return R.ok(xpOrderService.getHistoryStartPoints(uid, lon, lat, electronicAreaId));
     }
 
     /**
@@ -373,10 +378,10 @@
     @ApiOperation(value = "获取历史下单成功终点10条数据列表", tags = {"小程序-获取历史下单成功终点10条数据列表"})
     @GetMapping("/base/v1/mini-program/history/endPoints")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
-    public R<List<XpHistoryEndPointsVo>> getHistoryEndPoints(double lon, double lat,Long electronicAreaId, HttpServletRequest request) {
+    public R<List<XpHistoryEndPointsVo>> getHistoryEndPoints(double lon, double lat, Long electronicAreaId, HttpServletRequest request) {
         // uid已通过拦截器otp校验,可以直接使用
         String uid = request.getHeader("XP-Uid");
-        return R.ok(xpOrderService.getHistoryEndPoints(uid, lon, lat,electronicAreaId));
+        return R.ok(xpOrderService.getHistoryEndPoints(uid, lon, lat, electronicAreaId));
     }
 
 
@@ -464,7 +469,6 @@
     }
 
 
-
     /**
      * +
      * 获取行程费用明细
@@ -532,7 +536,7 @@
      */
     @ApiOperation(value = "行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8")
     @PostMapping("/logan/inner/v1/order/carAbnormalUpdateOrderStatus")
-    public R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId ) {
+    public R<String> carAbnormalUpdateOrderStatus(@RequestParam Long orderId) {
 //        Integer status = OrderStatusEnum.SEE_OFF_GUESTS.getCode();
         return xpOrderService.carAbnormalUpdateOrderStatus(orderId);
     }
@@ -567,7 +571,7 @@
     @PostMapping("/api/v1/mini-program/order/queryOrderRoute")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
     public R<RouteVo> queryOrderRoute(@Validated @RequestBody QueryOrderRouteDTO dto, HttpServletRequest request) {
-        if(dto.getOrderId() == null){
+        if (dto.getOrderId() == null) {
             return R.fail("参数不能为空");
         }
         String uid = request.getHeader("XP-Uid");
@@ -592,6 +596,7 @@
         routeVo.setDirection(null != vehiclePosition ? vehiclePosition.getCourse() : 90);
         return R.ok(routeVo);
     }
+
     /**
      * 订单查询轨迹路线
      */
@@ -599,7 +604,7 @@
     @GetMapping("/api/v1/mini-program/order/queryOrderTrajectory")
     @XpClientCheck(checkToken = false, checkOtpToken = true)
     public R<RouteVo> queryOrderTrajectory(@RequestParam String orderId, HttpServletRequest request) {
-        if(orderId == null){
+        if (orderId == null) {
             return R.fail("参数不能为空");
         }
         List<OrderTrajectory> trajectories = mongoTemplate.find(
@@ -610,7 +615,7 @@
         // 封装信息
         RouteVo routeVo = new RouteVo();
         List<LonLatDto> polyline = new ArrayList<>();
-        if(!CollectionUtils.isEmpty(trajectories)){
+        if (!CollectionUtils.isEmpty(trajectories)) {
             for (OrderTrajectory trajectory : trajectories) {
                 LonLatDto lonLatDto = new LonLatDto();
                 String[] split = trajectory.getLocation().split(",");
@@ -624,7 +629,6 @@
     }
 
 
-
     /**
      * 当日取消订单次数
      *
@@ -632,13 +636,31 @@
      * @return 订单数量
      */
     @PostMapping("/inner/order/todayCancellationCount")
-    public R<Integer> todayCancellationCount(@RequestParam Long userId){
+    public R<Integer> todayCancellationCount(@RequestParam Long userId) {
         long count = xpOrderService.count(new QueryWrapper<XpOrder>().eq("app_user_id", userId).eq("status", 0)
                 .eq("is_deleted", 0).last(" and DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')"));
-        return R.ok((int)count);
+        return R.ok((int) count);
     }
 
 
 
 
-}
+    @ApiOperation(value = "通过订单id获取蓝牙开锁秘钥", tags = {"小程序-业务流程"})
+    @GetMapping("/api/v1/mini-program/order/getBluetoothToken/{orderId}")
+    @XpClientCheck(checkToken = false, checkOtpToken = true)
+    public R<String> getBluetoothToken(@PathVariable("orderId") Long orderId, HttpServletRequest request) {
+        String uid = request.getHeader("XP-Uid");
+        XpOrder xpOrder = xpOrderService.getById(orderId);
+        if (!Objects.equals(xpOrder.getAppUserId(), Long.valueOf(uid))) {
+            throw new ServiceException("解锁失败");
+        }
+        if(!Arrays.asList(4, 5, 6, 7, 8).contains(xpOrder.getStatus())){
+            throw new ServiceException("解锁失败");
+        }
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + orderId);
+        if (StringUtils.isBlank(token)) {
+            throw new ServiceException("解锁失败");
+        }
+        return R.ok(token);
+    }
+}
\ No newline at end of file

--
Gitblit v1.7.1