From b92a2bf0fdb56b51066c2d484f8880d1b05941de Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期六, 18 四月 2026 17:33:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  125 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 116 insertions(+), 9 deletions(-)

diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index 835c4f9..381eda9 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -27,6 +27,7 @@
 import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
 import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
 import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
+import com.xiaopeng.api.feignClient.account.SysGroupMenuClient;
 import com.xiaopeng.api.feignClient.account.UserResourcesClient;
 import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
 import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
@@ -35,10 +36,7 @@
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.operation.*;
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
-import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
-import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient;
-import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient;
-import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.*;
 import com.xiaopeng.api.model.maintenance.XpTaskRule;
 import com.xiaopeng.api.model.operation.*;
 import com.xiaopeng.api.model.order.*;
@@ -52,6 +50,7 @@
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.order.*;
 import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
+import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo;
 import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
 import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.constant.Constants;
@@ -85,10 +84,7 @@
 import com.xiaopeng.order.model.query.XpOrderPageQuery;
 import com.xiaopeng.order.model.vo.*;
 import com.xiaopeng.order.service.*;
-import com.xiaopeng.order.utils.GDMapGeocodingUtil;
-import com.xiaopeng.order.utils.RegionCodeFilterUtil;
-import com.xiaopeng.order.utils.TaxiPricingDemoService;
-import com.xiaopeng.order.utils.XpPricingUtil;
+import com.xiaopeng.order.utils.*;
 import com.xiaopeng.order.utils.holiday.HolidayUtil;
 import com.xiaopeng.order.vo.OrderDetailVo;
 import lombok.RequiredArgsConstructor;
@@ -163,12 +159,20 @@
     @Resource
     @Lazy
     private BootCommonService bootCommonService;
+    @Autowired
+    private SysGroupMenuClient sysGroupMenuClient;
 
 
     @Autowired
     private MongoTemplate mongoTemplate;
     @Autowired
     private HolidayUtil holidayUtil;
+
+    @Autowired
+    private BluetoothUnlockTokenUtil bluetoothUnlockTokenUtil;
+
+    @Resource
+    private BluetoothUnlockClient bluetoothUnlockClient;
 
     @Value("${robotaxi.appId:xp_robotaxi_api}")
     private String appid;
@@ -597,7 +601,7 @@
         if (Objects.nonNull(order.getAppUserId()) && userInfoMap != null && userInfoMap.containsKey(order.getAppUserId().toString())) {
             UcUserInfo userInfo = userInfoMap.get(order.getAppUserId().toString());
             vo.setNickName(userInfo.getNickName());
-            vo.setPhoneNumber(userInfo.getMobile());
+            vo.setPhoneNumber(sysGroupMenuClient.getPhoneDesensitization(userInfo.getMobile()).getData());
         }
 
         // 车辆信息
@@ -641,9 +645,25 @@
         Long userId = order.getAppUserId();
         if (order.getStatus() == 1) {
             order.setStatus(0);
+            Long appUserId = order.getAppUserId();
             order.setAppUserId(null);
             baseMapper.updateById(order);
+            order.setAppUserId(appUserId);
             redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+            //删除蓝牙秘钥
+            String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+            if(StringUtils.isNotBlank(token)){
+                redisService.deleteObject("rt:bluetooth:unlock:" + token);
+                redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+                XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+                BluetoothDeliverVo vo = new BluetoothDeliverVo();
+                vo.setVim(xpVehicle.getVehicleVin());
+                vo.setPassengerUid(order.getAppUserId());
+                BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+                if(null == delete || delete.getCode() != 0){
+                    log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+                }
+            }
             // 消息推送
             Map<String, Object> params = new HashMap<>();
             Map<String, Object> content = new HashMap<>();
@@ -1669,9 +1689,25 @@
             addCruiseMission(xpVehicle.getId());
         }
         order.setStatus(0);
+        Long appUserId = order.getAppUserId();
         order.setAppUserId(null);
         baseMapper.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
 
         XpOrderCancel xpOrderCancel = new XpOrderCancel();
         xpOrderCancel.setOrderId(orderId);
@@ -1695,7 +1731,23 @@
         order.setStatus(0);
         order.setAppUserId(null);
         baseMapper.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId());
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId());
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
+
         XpOrderCancel xpOrderCancel = new XpOrderCancel();
         xpOrderCancel.setOrderId(Long.valueOf(orderId));
         xpOrderCancel.setUserId(1l);
@@ -2043,10 +2095,26 @@
             throw new RuntimeException("订单状态错误");
         }
         order.setStatus(8);
+        Long appUserId = order.getAppUserId();
         order.setAppUserId(null);
         order.setTripEnd(LocalDateTime.now());
         baseMapper.updateById(order);
+        order.setAppUserId(appUserId);
         redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 8, 24L, TimeUnit.HOURS);
+        //删除蓝牙秘钥
+        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + orderId);
+        if(StringUtils.isNotBlank(token)){
+            redisService.deleteObject("rt:bluetooth:unlock:" + token);
+            redisService.deleteObject("rt:bluetooth:unlock:order:" + orderId);
+            XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
+            BluetoothDeliverVo vo = new BluetoothDeliverVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPassengerUid(order.getAppUserId());
+            BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo);
+            if(null == delete || delete.getCode() != 0){
+                log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber());
+            }
+        }
 
         // 根据订单所属开通城市id 查询定价
         XpPricing pricing = bootCommonService.getXpPricing(order.getCityId(),order.getVehicleId());
@@ -3295,6 +3363,45 @@
 
                 //推送乘客车辆到达预约点的导航数据
                 sendRoute(addTaxiPassengerVo.getUid(), orderId, "ORDER_NAVIGATION_START_DATA", dto.getXpVehicleVin());
+
+                //生成蓝牙token
+                //生成过期时间 (接单时间+到达上车点预估时间+上车点等待时间+行程预估时间+下车点等待时间+30分钟)
+                XpPoint startPoint = xpPointClient.queryById(order.getStartPointId()).getData();
+                Object cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + appUserId);
+                RouteVo routeVo1 = JSON.parseObject(cacheObject.toString(), RouteVo.class);
+                XpPoint endPoint = xpPointClient.queryById(order.getEndPointId()).getData();
+                LocalDateTime localDateTime = order.getAcceptanceTime().plusMinutes(routeVo.getDuration()).plusMinutes(startPoint.getParkingTimeLimit())
+                        .plusMinutes(routeVo1.getDuration()).plusMinutes(endPoint.getParkingTimeLimit()).plusMinutes(30);
+                long expirationTime = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
+                //生成token
+                String token = bluetoothUnlockTokenUtil.generateBluetoothUnlockToken(order.getAppUserId(),
+                        order.getId(), order.getVehicleId(), expirationTime);
+                log.info("生成蓝牙token:{} 有效期:{} 订单号: {}", token, expirationTime, order.getOrderNumber());
+                //存储缓存
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("userId", order.getAppUserId());
+                jsonObject.put("orderId", order.getId());
+                jsonObject.put("vehicleId", order.getVehicleId());
+                jsonObject.put("expirationTime", expirationTime);
+                jsonObject.put("orderNumber", order.getOrderNumber());
+                jsonObject.put("vehicleVin", vehicle.getVehicleVin());
+                jsonObject.put("createTime", System.currentTimeMillis());
+                redisService.setCacheObject("rt:bluetooth:unlock:" + token, jsonObject.toJSONString(), expirationTime, TimeUnit.SECONDS);
+                redisService.setCacheObject("rt:bluetooth:unlock:order:" + order.getId(), token, expirationTime, TimeUnit.SECONDS);
+                //开始下发蓝牙token
+                BluetoothDeliverVo vo = new BluetoothDeliverVo();
+                vo.setCredential(token);
+                vo.setVim(vehicle.getVehicleVin());
+                vo.setPassengerUid(order.getAppUserId());
+                BaseVehicleUserDto deliver = bluetoothUnlockClient.deliver(vo);
+                if(null == deliver){
+                    throw new ServiceException("下发蓝牙token失败");
+                }
+                if(deliver.getCode() != 0){
+                    log.error("下发蓝牙token失败:{} {}", deliver.getMsg(), order.getOrderNumber());
+                    throw new ServiceException(deliver.getMsg());
+                }
+                log.info("下发蓝牙token成功:{} {}", deliver.getData(), order.getOrderNumber());
             }
 
             if(order.getStatus() == 2){

--
Gitblit v1.7.1