From 560be817c1342d4da523760ba38433c4c0f52983 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 12 五月 2026 10:56:09 +0800
Subject: [PATCH] Merge branch '1.1' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.1

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  246 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 179 insertions(+), 67 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 c3a8207..df0ade1 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;
@@ -51,6 +52,7 @@
 import com.xiaopeng.api.query.order.XpOrderInvoiceQuery;
 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;
@@ -61,6 +63,7 @@
 import com.xiaopeng.api.vo.order.*;
 import com.xiaopeng.api.vo.payFront.CreditOrderCreateVo;
 import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo;
+import com.xiaopeng.api.vo.order.FareBreakdownVo;
 import com.xiaopeng.api.vo.payFront.CreditPrecreateVo;
 import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
 import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo;
@@ -79,6 +82,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;
@@ -86,7 +90,7 @@
 import com.xiaopeng.order.job.base.QuartzManager;
 import com.xiaopeng.order.job.base.TimeJobType;
 import com.xiaopeng.order.job.jobs.*;
-import com.xiaopeng.order.mangodb.model.OrderTrajectory;
+import com.xiaopeng.api.model.order.OrderTrajectory;
 import com.xiaopeng.order.mangodb.service.OrderTrajectoryService;
 import com.xiaopeng.order.mapper.XpCruiseOrderMapper;
 import com.xiaopeng.order.mapper.XpOrderDetailMapper;
@@ -100,10 +104,7 @@
 import com.xiaopeng.order.service.*;
 import com.xiaopeng.order.utils.*;
 import com.xiaopeng.order.utils.holiday.HolidayUtil;
-import com.xiaopeng.order.vo.OrderDetailVo;
-import com.xiaopeng.order.vo.OrderInfoVo;
-import com.xiaopeng.order.vo.UpdateOrderStatusVo;
-import com.xiaopeng.order.vo.UserOrderListVo;
+import com.xiaopeng.order.vo.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
@@ -203,6 +204,9 @@
 
     @Resource
     private OfficialPartnerUtil officialPartnerUtil;
+
+    @Resource
+    private TokenService tokenService;
 
     @Resource
     private XpPayFrontClient xpPayFrontClient;
@@ -637,6 +641,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());
@@ -656,7 +661,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.getPhoneDesensitizationExempt()){
+                vo.setPhoneNumber(DesensitizedUtil.mobilePhone(userInfo.getMobile()));
+            }
+
         }
 
         // 车辆信息
@@ -1191,6 +1199,8 @@
             pushOrderDto.setEndTaskId(order.getXpuEndTaskId());
             pushOrderDto.setVin(newVehicle.getVehicleVin());
             pushOrderDto.setOrderId(order.getId().toString());
+            pushOrderDto.setStartWaypointId(order.getStartPointId());
+            pushOrderDto.setEndWaypointId(order.getEndPointId());
             pushOrderDto.setStartLatitude(order.getStartLat());
             pushOrderDto.setStartLongitude(order.getStartLon());
             pushOrderDto.setEndLatitude(order.getEndLat());
@@ -1326,6 +1336,8 @@
             pushOrderDto.setEndTaskId(returnOrder.getXpuTaskId());
             pushOrderDto.setVin(oldVehicle.getVehicleVin());
             pushOrderDto.setOrderId("XU" + returnOrder.getId());
+            pushOrderDto.setStartWaypointId(returnOrder.getStartPointId());
+            pushOrderDto.setEndWaypointId(returnOrder.getEndPointId());
             pushOrderDto.setStartLatitude(returnOrder.getStartLat());
             pushOrderDto.setStartLongitude(returnOrder.getStartLon());
             pushOrderDto.setEndLatitude(returnOrder.getEndLat());
@@ -1669,10 +1681,19 @@
                     }
             );
         }
-        data = data.stream().sorted(Comparator.comparingInt(XpHistoryStartPointsVo::getNum).reversed()).collect(Collectors.toList());
 
-        return data;
-
+        List<XpHistoryStartPointsVo> objects = new ArrayList<XpHistoryStartPointsVo>();
+        if(!data.isEmpty()){
+            //收藏的数据
+            List<XpHistoryStartPointsVo> collect = data.stream().filter(s -> s.getIsCollect() == 1)
+                    .sorted(Comparator.comparing(XpHistoryStartPointsVo::getDistance)).collect(Collectors.toList());
+            objects.addAll(collect);
+            //非收藏的数据
+            List<XpHistoryStartPointsVo> collect1 = data.stream().filter(s -> s.getIsCollect() == 2)
+                    .sorted(Comparator.comparing(XpHistoryStartPointsVo::getDistance)).collect(Collectors.toList());
+            objects.addAll(collect1);
+        }
+        return objects;
     }
 
     @Override
@@ -1700,9 +1721,18 @@
                     }
             );
         }
-        data = data.stream().sorted(Comparator.comparingInt(XpHistoryEndPointsVo::getNum).reversed()).collect(Collectors.toList());
-
-        return data;
+        List<XpHistoryEndPointsVo> objects = new ArrayList<XpHistoryEndPointsVo>();
+        if(!data.isEmpty()){
+            //收藏的数据
+            List<XpHistoryEndPointsVo> collect = data.stream().filter(s -> s.getIsCollect() == 1)
+                    .sorted(Comparator.comparing(XpHistoryEndPointsVo::getDistance)).collect(Collectors.toList());
+            objects.addAll(collect);
+            //非收藏的数据
+            List<XpHistoryEndPointsVo> collect1 = data.stream().filter(s -> s.getIsCollect() == 2)
+                    .sorted(Comparator.comparing(XpHistoryEndPointsVo::getDistance)).collect(Collectors.toList());
+            objects.addAll(collect1);
+        }
+        return objects;
 
     }
 
@@ -2405,7 +2435,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 {
@@ -2524,7 +2615,6 @@
                         }
                     }
                 }
-
             }
             // 封装费用明细数据
             for (Map.Entry<String, BigDecimal> stringBigDecimalEntry : bill.entrySet()) {
@@ -2833,6 +2923,8 @@
         pushOrderDto.setEndTaskId(xpCruiseOrder.getXpuTaskId());
         pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
         pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
+        pushOrderDto.setStartWaypointId(xpCruiseOrder.getStartPointId());
+        pushOrderDto.setEndWaypointId(xpCruiseOrder.getEndPointId());
         pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat());
         pushOrderDto.setStartLongitude(xpCruiseOrder.getStartLon());
         pushOrderDto.setEndLatitude(xpCruiseOrder.getEndLat());
@@ -2840,7 +2932,7 @@
         pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
         pushOrderDto.setStage(2);
         pushOrderDto.setLastOrderId(order.getId() + "");
-        pushOrderDto.setLastOrderId(order.getXpuEndTaskId());
+        pushOrderDto.setLastXpuTaskId(order.getXpuEndTaskId());
         pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
         orderMissionClient.pushOrder(pushOrderDto);
         log.info("下发XUP巡游订单报文成功");
@@ -2953,6 +3045,8 @@
         pushOrderDto.setEndTaskId(xpCruiseOrder.getXpuTaskId());
         pushOrderDto.setVin(xpCruiseOrder.getVehicleVin());
         pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId());
+        pushOrderDto.setStartWaypointId(xpCruiseOrder.getStartPointId());
+        pushOrderDto.setEndWaypointId(xpCruiseOrder.getEndPointId());
         pushOrderDto.setStartLatitude(xpCruiseOrder.getStartLat());
         pushOrderDto.setStartLongitude(xpCruiseOrder.getStartLon());
         pushOrderDto.setEndLatitude(xpCruiseOrder.getEndLat());
@@ -3229,16 +3323,13 @@
     @Override
     public R payment(XpOrderPayDto dto, String uid) {
 
-
-        HashMap<String, Object> resultMap = new HashMap<>();
-
         // 1.0 免密  //查询是否开通免密
         // 1先查用户是否申请  申请了拿到通过的businessOrderId
         boolean signed = false;
         CreditPaySignQueryDto creditPaySignQueryDto = new CreditPaySignQueryDto();
         creditPaySignQueryDto.setUid(Long.valueOf(uid));
-        creditPaySignQueryDto.setBusinessId("xp-robotaxi");
-        creditPaySignQueryDto.setCategory("009001");
+        creditPaySignQueryDto.setBusinessId(appid);
+        creditPaySignQueryDto.setCategory("xp_robotaxi_api");
         creditPaySignQueryDto.setBusinessOrderId("");
         R<CreditPaySignQueryVo> creditPaySignQueryVoR = xpPayFrontClient.queryCreditPaySign(creditPaySignQueryDto);
         if (creditPaySignQueryVoR.getCode()==200) {
@@ -3255,10 +3346,10 @@
             // y已签约 1.信用下单
             CreditOrderCreateDto creditOrderCreateDto = new CreditOrderCreateDto();
             creditOrderCreateDto.setUid(Long.valueOf(uid));
-            creditOrderCreateDto.setBusinessId("xp-robotaxi");
+            creditOrderCreateDto.setBusinessId(appid);
             creditOrderCreateDto.setCategory("xp_robotaxi_api");
             creditOrderCreateDto.setBusinessOrderId("");
-            creditOrderCreateDto.setSubject("009001");
+            creditOrderCreateDto.setSubject("信用下单");
             creditOrderCreateDto.setPayType("13");
 
 
@@ -3272,9 +3363,7 @@
             R<CreditOrderCreateVo> creditOrderCreateVoR = xpPayFrontClient.createCreditOrder(creditOrderCreateDto);
             if(creditOrderCreateVoR.getCode()==200){
                 CreditOrderCreateVo data = creditOrderCreateVoR.getData();
-                resultMap.put("status", 1);
-                resultMap.put("value", data);
-                return R.ok(resultMap);
+                return R.ok(data.getPackageValue());
             }
 
         }else {
@@ -3284,26 +3373,14 @@
             XpOrder order = this.getById(dto.getOrderId());
             CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto();
             creditPrecreateDto.setUid(uid);
-            creditPrecreateDto.setBizId("xp-robotaxi");
+            creditPrecreateDto.setBizId(appid);
             creditPrecreateDto.setBizOrderId("");
             creditPrecreateDto.setPayScene(99);
             creditPrecreateDto.setAmount(order.getOrderMoney().multiply(new BigDecimal(100)).intValue());
-            creditPrecreateDto.setCategory("009001");
+            creditPrecreateDto.setCategory("信用下单");
             creditPrecreateDto.setTitle("信用下单");
             creditPrecreateDto.setDetail("信用下单");
 
-            HashMap<String, String> businessExtend = new HashMap<>();
-            businessExtend.put("returnUrl", "");
-            businessExtend.put("notifyUrl", "");
-            creditPrecreateDto.setBusinessExtend(businessExtend);
-
-            R<CreditPrecreateVo> creditPrecreateVoR = xpPayFrontClient.precreate(creditPrecreateDto);
-            if (creditPrecreateVoR.getCode()==200) {
-                CreditPrecreateVo data = creditPrecreateVoR.getData();
-                resultMap.put("status", 2);
-                resultMap.put("value", data);
-                return R.ok(resultMap);
-            }
         }
 
 
@@ -3631,6 +3708,7 @@
                 addTaxiPassengerVo.setUid(appUserId.toString());
                 order.setAppUserId(null);
                 this.updateById(order);
+                order.setAppUserId(appUserId);
                 bootCommonService.setCache_orderStatus(order.getId(), order, null);
 
                 //构建推送消息
@@ -3672,19 +3750,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());
 
@@ -3715,25 +3792,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失败");
@@ -4573,6 +4650,41 @@
         return R.ok();
     }
 
+    @Override
+    public UserOrderInfoVo getOrderHistoryInfo(Long orderId) {
+        XpOrder xpOrder = this.getById(orderId);
+        UserOrderInfoVo vo = new UserOrderInfoVo();
+        vo.setOrderId(xpOrder.getId());
+        vo.setOrderCreatedAt(xpOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        vo.setDispatchStartAt("");
+        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(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(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){
+            vo.setUserRatedAt(orderEvaluate.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        }
+        XpOrderCancel xpOrderCancel = xpOrderCancelService.getOne(new QueryWrapper<XpOrderCancel>().eq("order_id", xpOrder.getId()));
+        if(null != xpOrderCancel){
+            vo.setOrderCancelledAt(xpOrderCancel.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            vo.setCancelReasonType(xpOrderCancel.getCancelSource() == 1 ? "用户取消" : xpOrderCancel.getCancelSource() == 4 ? "超时取消" : "系统取消");
+        }
+        vo.setSafetyAlertTriggeredAt("");
+        vo.setRemoteTakeoverAt("");
+        return vo;
+    }
+
 
     /**
      * 发票列表

--
Gitblit v1.7.1