From d6c0f2ed698d6cdf86a0a3a8893b4d9717f3b7b1 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期五, 08 五月 2026 14:51:54 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  140 +++++++++++++++++++++++++++++++++++-----------
 1 files changed, 105 insertions(+), 35 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 339ca80..b534f5b 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
@@ -3,6 +3,7 @@
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.DesensitizedUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
@@ -48,6 +49,7 @@
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.OrderType;
 import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo;
+import com.xiaopeng.api.vo.account.LoginUser;
 import com.xiaopeng.api.vo.account.UserCouponVo;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType;
@@ -74,6 +76,7 @@
 import com.xiaopeng.common.core.web.domain.BaseModel;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.common.security.service.TokenService;
 import com.xiaopeng.common.security.utils.SecurityUtils;
 import com.xiaopeng.order.constant.I18nKeyConstant;
 import com.xiaopeng.order.dto.MileageDto;
@@ -195,6 +198,9 @@
 
     @Resource
     private OfficialPartnerUtil officialPartnerUtil;
+
+    @Resource
+    private TokenService tokenService;
 
     @Value("${robotaxi.appId:xp_robotaxi_api}")
     private String appid;
@@ -626,6 +632,7 @@
                                           Map<Long, XpFleet> fleetMap,
                                           BigDecimal orderMoney,
                                           BigDecimal couponMoney) {
+        LoginUser loginUser = tokenService.getLoginUser();
         XpOrderPageVO vo = new XpOrderPageVO();
         vo.setId(order.getId());
         vo.setOrderNumber(order.getOrderNumber());
@@ -645,7 +652,10 @@
         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(sysGroupMenuClient.getPhoneDesensitization(userInfo.getMobile()).getData());
+            if(!loginUser.getPhoneDesensitization()){
+                vo.setPhoneNumber(DesensitizedUtil.mobilePhone(userInfo.getMobile()));
+            }
+
         }
 
         // 车辆信息
@@ -2394,7 +2404,68 @@
                 totalPrice = totalPrice.add(xpOrderDetail1.getMoney());
                 xpOrderDetailMapper.insert(xpOrderDetail1);
             }
-            order.setOrderMoney(totalPrice);
+
+            // 默认费率1
+            double priceRate = 1;
+            if (pricing.getIsDynamicPrice() == 1) {
+                // 先判断是否已经调价过了
+                Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid);
+                if (userDynamicPriceObj != null) {
+                    // 是否调价过了
+                    priceRate = Double.parseDouble(userDynamicPriceObj.toString());
+                } else {
+                    // 没有调过
+                    //是否触发动态调价 redis获取
+                    Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId());
+                    if (dynamicPriceObj != null) {
+                        JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson());
+                        // 触发动态调价
+                        // value=时间
+                        String timeStr = dynamicPriceObj.toString();
+                        // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率
+                        Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId()));
+                        // X单上升一次调价
+                        Integer orderNum = getOrderNum(jsonObject, 4);
+                        // 需要调价的次数
+                        int count = num / orderNum;
+                        if (count > 0) {
+                            // 计算每次上升的费率
+                            Integer upRate = getOrderNum(jsonObject, 5);
+                            BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+                            for (int i = count; i > 0; i--) {
+                                // 当前费率+(费率*上升百分比)
+                                priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
+                            }
+
+                            // 天气预报动态调价
+                            JSONArray ws = jsonObject.getJSONArray("weather");
+                            if (null != ws) {
+                                WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
+                                List<WeatherDTO.Lives> lives = data.getLives();
+                                if (lives != null && !lives.isEmpty()) {
+                                    String w = lives.get(0).getWeather();
+                                    for (Object o : ws) {
+                                        JSONObject ele = JSONObject.parseObject(o.toString());
+                                        if (w.contains(ele.getString("weatherType"))) {
+                                            double floatRate = jsonObject.getDouble("ratio");
+                                            priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+
+
+                            // 冷却时间
+                            Integer time = getOrderNum(jsonObject, 6);
+                            // 触发调价了
+                            redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES);
+                        }
+                    }
+                }
+            }
+
+            order.setOrderMoney(totalPrice.multiply(new BigDecimal(priceRate)));
             order.setAppUserId(null);
             baseMapper.updateById(order);
         } else {
@@ -2513,7 +2584,6 @@
                         }
                     }
                 }
-
             }
             // 封装费用明细数据
             for (Map.Entry<String, BigDecimal> stringBigDecimalEntry : bill.entrySet()) {
@@ -3540,6 +3610,7 @@
                 addTaxiPassengerVo.setUid(appUserId.toString());
                 order.setAppUserId(null);
                 this.updateById(order);
+                order.setAppUserId(appUserId);
                 bootCommonService.setCache_orderStatus(order.getId(), order, null);
 
                 //构建推送消息
@@ -3581,19 +3652,18 @@
 
                 //生成前往上车点的导航数据
                 //查询车辆位置
-                //TODO 本地环境默认写死
-                // VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
-                // if (Objects.isNull(vehiclePosition)) {
-                //     throw new RuntimeException("车辆位置信息不存在");
-                // }
+                 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
+                 if (Objects.isNull(vehiclePosition)) {
+                     throw new RuntimeException("车辆位置信息不存在");
+                 }
 
                 LonLatDto destination = new LonLatDto();
                 LonLatDto origin = new LonLatDto();
                 //查询司机当前位置到起点的线路
-                // origin.setLongitude(vehiclePosition.getPoint().getX());
-                // origin.setLatitude(vehiclePosition.getPoint().getY());
-                origin.setLongitude(104.055499);
-                origin.setLatitude(30.586747);
+                 origin.setLongitude(vehiclePosition.getPoint().getX());
+                 origin.setLatitude(vehiclePosition.getPoint().getY());
+//                origin.setLongitude(104.055499);
+//                origin.setLatitude(30.586747);
                 destination.setLongitude(order.getStartLon());
                 destination.setLatitude(order.getStartLat());
 
@@ -3624,25 +3694,25 @@
                         .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());
+                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失败");
@@ -4489,19 +4559,19 @@
         vo.setOrderId(xpOrder.getId());
         vo.setOrderCreatedAt(xpOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         vo.setDispatchStartAt("");
-        vo.setDispatchSuccessAt(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-        vo.setVehicleArrivedAt(xpOrder.getArrivalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        vo.setDispatchSuccessAt(null == xpOrder.getAcceptanceTime() ? "" : xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        vo.setVehicleArrivedAt(null == xpOrder.getArrivalTime() ? "" : xpOrder.getArrivalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         vo.setFreeWaitExpiredAt("");
         vo.setVehicleUnlockedAt("");
         vo.setDoorOpenedAt(Arrays.asList(""));
         vo.setDoorClosedAt(Arrays.asList(""));
-        vo.setTripConfirmedAt(xpOrder.getTripBegin().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        vo.setTripConfirmedAt(null == xpOrder.getTripBegin() ? "" : xpOrder.getTripBegin().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         vo.setSafetybeltUnlockedAt(Arrays.asList(""));
         vo.setArrivedDestinationAt("");
         vo.setDropoffDoorOpenedAt(Arrays.asList(""));
         vo.setDropoffTrunkOpenedAt(Arrays.asList(""));
         vo.setDropoffDoorClosedAt(Arrays.asList(""));
-        vo.setTripEndedAt(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        vo.setTripEndedAt(null == xpOrder.getTripEnd() ? "" : xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         vo.setPaymentCompletedAt("");
         XpOrderEvaluate orderEvaluate = xpOrderEvaluateService.getOne(new QueryWrapper<XpOrderEvaluate>().eq("order_id", xpOrder.getId()));
         if(null != orderEvaluate){

--
Gitblit v1.7.1