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