From b59bca62353f93424818a4dd39068b10948c5267 Mon Sep 17 00:00:00 2001
From: yyy <1083599556@qq.com>
Date: 星期三, 06 五月 2026 11:27:09 +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 |  977 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 673 insertions(+), 304 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 637535f..2bdfd0c 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
@@ -172,7 +172,7 @@
     private final IXpTestOrderService xpTestOrderService;
     private final XpMapClient xpMapClient;
     @Resource
-    private  XpRoutePlanClient xpRoutePlanClient;
+    private XpRoutePlanClient xpRoutePlanClient;
     @Resource
     @Lazy
     private BootCommonService bootCommonService;
@@ -194,6 +194,9 @@
 
     @Resource
     private XpTradingStrategyClient tradingStrategyClient;
+
+    @Resource
+    private OfficialPartnerUtil officialPartnerUtil;
 
     @Value("${robotaxi.appId:xp_robotaxi_api}")
     private String appid;
@@ -264,7 +267,7 @@
         }
         wrapper.eq(Objects.nonNull(query.getUid()), XpOrder::getAppUserId, query.getUid());
         wrapper.orderByDesc(XpOrder::getCreateTime);
-        if(null != query.getActivityId()){
+        if (null != query.getActivityId()) {
             wrapper.eq(XpOrder::getActivityId, query.getActivityId());
         }
 
@@ -573,7 +576,7 @@
     @Override
     @Transactional
     @ShardingSphereTransactionType(TransactionType.BASE)
-    public void cancelOrCloseOrder(Long orderId, Integer type,Boolean isFree) {
+    public void cancelOrCloseOrder(Long orderId, Integer type, Boolean isFree) {
         // 1. 校验订单是否存在
         XpOrder order = this.getById(orderId);
         if (Objects.isNull(order)) {
@@ -594,7 +597,7 @@
                 throw new ServiceException("当前订单状态不允许取消,只有待接单、待出发、接驾中状态的订单可以取消", I18nKeyConstant.ORDER_CANCEL_FAILED);
             }
         } else {
-            if(isFree == null){
+            if (isFree == null) {
                 throw new ServiceException("是否豁免费用不能为空", I18nKeyConstant.ORDER_CLOSE_FAILED);
             }
             // 关闭订单:0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中 状态可以关闭
@@ -610,7 +613,7 @@
         } else {
             // 关闭订单
             closeOrder(order);
-            if(isFree){
+            if (isFree) {
                 this.setFree(order.getId());
             }
         }
@@ -668,22 +671,6 @@
      */
     private void cancelOrder(XpOrder order) {
         redisService.removeByPattern(order.getQueueName(), order.getOrderNumber());
-        //判断还原车辆状态
-        if (null == order.getVehicleId()) {
-            Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString());
-            if (null != cacheObject1) {
-                com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(cacheObject1.toString());
-                String vin = jsonObject.getString("vin");
-                XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData();
-                if (null != vehicle && 0 != vehicle.getState()) {
-                    XpVehicle vehicle1 = new XpVehicle();
-                    vehicle1.setId(vehicle.getId());
-                    vehicle1.setState(0);
-                    xpVehicleClient.updateVehicleById(vehicle1);
-                    log.info("管理后台取消订单,车辆状态修改0 {}", vehicle.getPlateNumber());
-                }
-            }
-        }
 
         Long userId = order.getAppUserId();
         Integer status = order.getStatus();
@@ -693,19 +680,21 @@
             order.setAppUserId(null);
             baseMapper.updateById(order);
             order.setAppUserId(appUserId);
-            bootCommonService.setCache_orderStatus(order.getId(),order,null);
-            //删除蓝牙秘钥
-            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());
+            bootCommonService.setCache_orderStatus(order.getId(), order, null);
+            if(null == order.getOfficialPartnerId()){
+                //删除蓝牙秘钥
+                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());
+                    }
                 }
             }
             // 消息推送
@@ -723,12 +712,12 @@
             R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
 
             //推送失败,重试3次
-            if(stringR.getCode() != Constants.SUCCESS){
+            if (stringR.getCode() != Constants.SUCCESS) {
                 ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
                 executor.execute(() -> {
                     for (int i = 0; i < 3; i++) {
                         R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
-                        if(stringR1.getCode() == Constants.SUCCESS){
+                        if (stringR1.getCode() == Constants.SUCCESS) {
                             break;
                         }
                         try {
@@ -748,7 +737,7 @@
                 .eq(XpOrder::getId, order.getId()).update();
         order.setStatus(OrderStatusEnum.CANCELED.getCode());
 
-        bootCommonService.setCache_orderStatus(order.getId(),order,null);
+        bootCommonService.setCache_orderStatus(order.getId(), order, null);
 
         // 2. 保存取消记录
         XpOrderCancel orderCancel = new XpOrderCancel();
@@ -771,12 +760,12 @@
         sendMessageDTO.setAppUserId(String.valueOf(userId));
         R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
         //推送失败,重试3次
-        if(stringR.getCode() != Constants.SUCCESS){
+        if (stringR.getCode() != Constants.SUCCESS) {
             ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
             executor.execute(() -> {
                 for (int i = 0; i < 3; i++) {
                     R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
-                    if(stringR1.getCode() == Constants.SUCCESS){
+                    if (stringR1.getCode() == Constants.SUCCESS) {
                         break;
                     }
                     try {
@@ -790,45 +779,68 @@
         }
         log.info("运营人员取消订单成功,推送乘客消息完成");
 
-        //查询车辆信息
-        R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId());
-        if (xpVehicleR.getCode() == HttpStatus.SUCCESS && Objects.nonNull(xpVehicleR.getData())) {
-            XpVehicle xpVehicle = xpVehicleR.getData();
-            // 组装调用车机参数
-            CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
-            cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin());
-            cancelTaxiPassengerVo.setUid(userId.toString());
-            cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber());
-            cancelTaxiPassengerVo.setAppId(appid);
-            BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
-            if (baseVehicleUserDto == null) {
-                // TODO 本地无法调通
+        if(null == order.getOfficialPartnerId()){
+            //判断还原车辆状态
+            if (null == order.getVehicleId()) {
+                Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString());
+                if (null != cacheObject1) {
+                    com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(cacheObject1.toString());
+                    String vin = jsonObject.getString("vin");
+                    XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData();
+                    if (null != vehicle && 0 != vehicle.getState()) {
+                        XpVehicle vehicle1 = new XpVehicle();
+                        vehicle1.setId(vehicle.getId());
+                        vehicle1.setState(0);
+                        xpVehicleClient.updateVehicleById(vehicle1);
+                        log.info("管理后台取消订单,车辆状态修改0 {}", vehicle.getPlateNumber());
+                    }
+                }
+            }
+
+            //查询车辆信息
+            R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId());
+            if (xpVehicleR.getCode() == HttpStatus.SUCCESS && Objects.nonNull(xpVehicleR.getData())) {
+                XpVehicle xpVehicle = xpVehicleR.getData();
+                // 组装调用车机参数
+                CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
+                cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin());
+                cancelTaxiPassengerVo.setUid(userId.toString());
+                cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber());
+                cancelTaxiPassengerVo.setAppId(appid);
+                BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+                if (baseVehicleUserDto == null) {
+                    // TODO 本地无法调通
 //            throw new RuntimeException("取消订单失败");
-            }
+                }
 
-            //还原车辆状态
-            if(1 == xpVehicle.getState()){
-                XpVehicle vehicle1 = new XpVehicle();
-                vehicle1.setId(xpVehicle.getId());
-                vehicle1.setState(0);
-                xpVehicleClient.updateVehicleById(vehicle1);
-                log.info("管理后台取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber());
-            }
+                //还原车辆状态
+                if (1 == xpVehicle.getState()) {
+                    XpVehicle vehicle1 = new XpVehicle();
+                    vehicle1.setId(xpVehicle.getId());
+                    vehicle1.setState(0);
+                    xpVehicleClient.updateVehicleById(vehicle1);
+                    log.info("管理后台取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber());
+                }
 
-            // 下发命令
+                // 下发命令
 //            PushOrderDto pushOrderDto = new PushOrderDto();
 //            pushOrderDto.setOrderId(order.getId().toString());
 //            pushOrderDto.setVin(xpVehicle.getVehicleVin());
 //            pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
 //            orderMissionClient.cancelOrder(pushOrderDto);
 //            log.info("运营人员取消订单成功,开始执行巡游订单 {}", order.getId());
-            //车辆继续巡游
-            addCruiseMission(order, status);
+                //车辆继续巡游
+                addCruiseMission(order, status);
 
-        } else {
-            log.info("查询车辆信息失败,订单ID: {}, 下发取消订单命令失败", order.getId());
+            } else {
+                log.info("查询车辆信息失败,订单ID: {}, 下发取消订单命令失败", order.getId());
+            }
+            log.info("订单取消成功,订单ID: {}, 操作人: {}", order.getId(), SecurityUtils.getUsername());
+        }else{
+            //流量接入-订单推送 推送取消订单
+            officialPartnerUtil.pushCancelOrder(order.getOfficialPartnerId(), orderCancel, order.getStatus());
         }
-        log.info("订单取消成功,订单ID: {}, 操作人: {}", order.getId(), SecurityUtils.getUsername());
+
     }
 
     /**
@@ -840,9 +852,9 @@
         order.setGetoffTime(LocalDateTime.now());
         // 解析下车地点
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
-        if(Objects.nonNull(vehiclePosition)){
+        if (Objects.nonNull(vehiclePosition)) {
             GeoJsonPoint point = vehiclePosition.getPoint();
-            if(Objects.nonNull(point)){
+            if (Objects.nonNull(point)) {
                 double x = point.getX();
                 double y = point.getY();
                 Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
@@ -859,7 +871,7 @@
         order.setAppUserId(null);
         this.updateById(order);
 
-        bootCommonService.setCache_orderStatus(order.getId(),order,null);
+        bootCommonService.setCache_orderStatus(order.getId(), order, null);
 
         // 消息推送
         Map<String, Object> params1 = new HashMap<>();
@@ -875,12 +887,12 @@
         sendMessageDTO1.setAppUserId(appUserId.toString());
         R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO1);
         //推送失败,重试3次
-        if(stringR1.getCode() != Constants.SUCCESS){
+        if (stringR1.getCode() != Constants.SUCCESS) {
             ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
             executor.execute(() -> {
                 for (int i = 0; i < 3; i++) {
                     R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO1);
-                    if(stringR2.getCode() == Constants.SUCCESS){
+                    if (stringR2.getCode() == Constants.SUCCESS) {
                         break;
                     }
                     try {
@@ -907,12 +919,12 @@
         sendMessageDTO.setAppUserId(appUserId.toString());
         R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
         //推送失败,重试3次
-        if(stringR.getCode() != Constants.SUCCESS){
+        if (stringR.getCode() != Constants.SUCCESS) {
             ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
             executor.execute(() -> {
                 for (int i = 0; i < 3; i++) {
                     R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO);
-                    if(stringR2.getCode() == Constants.SUCCESS){
+                    if (stringR2.getCode() == Constants.SUCCESS) {
                         break;
                     }
                     try {
@@ -949,12 +961,12 @@
         sendMessageDTO2.setAppUserId(appUserId.toString());
         R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO2);
         //推送失败,重试3次
-        if(stringR2.getCode() != Constants.SUCCESS){
+        if (stringR2.getCode() != Constants.SUCCESS) {
             ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
             executor.execute(() -> {
                 for (int i = 0; i < 3; i++) {
                     R<String> stringR3 = xpPushMessageClient.sendStatus(sendMessageDTO2);
-                    if(stringR3.getCode() == Constants.SUCCESS){
+                    if (stringR3.getCode() == Constants.SUCCESS) {
                         break;
                     }
                     try {
@@ -967,20 +979,25 @@
             });
         }
 
-        //创建定时任务执行延迟驶离终点和下发巡游单
-        XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData();
-        Map<String, ? extends Object> jobMaps =
-                new ImmutableMap.Builder<String, String>()
-                        .put("id", order.getId().toString())
-                        .put("appid", appid)
-                        .build();
-        QuartzManager.addJob(
-                AddCruiseMissionJob.class,
-                (AddCruiseMissionJob.name + order.getId()).toUpperCase(),
-                TimeJobType.ADD_CRUISE_MISSION,
-                DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
-                jobMaps
-        );
+        if(order.getOfficialPartnerId() == null){
+            //创建定时任务执行延迟驶离终点和下发巡游单
+            XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData();
+            Map<String, ? extends Object> jobMaps =
+                    new ImmutableMap.Builder<String, String>()
+                            .put("id", order.getId().toString())
+                            .put("appid", appid)
+                            .build();
+            QuartzManager.addJob(
+                    AddCruiseMissionJob.class,
+                    (AddCruiseMissionJob.name + order.getId()).toUpperCase(),
+                    TimeJobType.ADD_CRUISE_MISSION,
+                    DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
+                    jobMaps
+            );
+        }else{
+            //流量接入-订单推送 推送关闭订单
+            officialPartnerUtil.pushEndOrder(order.getOfficialPartnerId(), order, "运维人员关闭订单");
+        }
     }
 
     /**
@@ -1017,14 +1034,14 @@
         if (Objects.isNull(newVehicle.getState()) || newVehicle.getState() != 0) {
             throw new ServiceException("新车辆已接单,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_NOT_FREE);
         }
-        if (newVehicle.getOperatingStatus() != 1){
+        if (newVehicle.getOperatingStatus() != 1) {
             throw new ServiceException("新车辆状态为非运营状态,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_NOT_OPERATIONAL);
         }
         VehiclePosition vehiclePosition = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(newVehicle.getVehicleVin())), VehiclePosition.class);
-        if(null == vehiclePosition){
+        if (null == vehiclePosition) {
             throw new ServiceException("未能获取到新车的定位数据,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_NOT_POSITION);
         }
-        if(vehiclePosition.getCurrentElectricity() < 20){
+        if (vehiclePosition.getCurrentElectricity() < 20) {
             throw new ServiceException("新车电量不足,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_BATTERY_LOW);
         }
 
@@ -1231,7 +1248,7 @@
      * - 其他状态,默认返回原出发点
      * </p>
      *
-     * @param order      当前订单信息
+     * @param order 当前订单信息
      */
     private void createReturnCruiseOrder(Long vehicleId, XpOrder order) {
         XpVehicle oldVehicle = xpVehicleClient.queryById(vehicleId).getData();
@@ -1364,6 +1381,7 @@
 
     @Resource
     private XpAppUserCollectAddrClient xpAppUserCollectAddrClient;
+
     @Override
     public NearestNextVo quickCapsule(String uid, Long startPointId) {
 
@@ -1405,7 +1423,7 @@
                 ret.setTime(endPoint.getParkingTimeLimit());
                 ret.setElectronicAreaId(endPoint.getElectronicAreaId());
                 // 判断是否收藏
-                if(pointIdsByUserId.contains(endPoint.getId())){
+                if (pointIdsByUserId.contains(endPoint.getId())) {
                     ret.setIsCollect(1);
                 }
                 return ret;
@@ -1611,9 +1629,9 @@
     }
 
     @Override
-    public List<XpHistoryStartPointsVo> getHistoryStartPoints(String uid, double lon, double lat,Long electronicAreaId) {
+    public List<XpHistoryStartPointsVo> getHistoryStartPoints(String uid, double lon, double lat, Long electronicAreaId) {
         //
-        List<XpOrder> xpOrders = this.baseMapper.getHistoryStartPoints(Long.valueOf(uid),electronicAreaId);
+        List<XpOrder> xpOrders = this.baseMapper.getHistoryStartPoints(Long.valueOf(uid), electronicAreaId);
 //        selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 10"));
         if (xpOrders.isEmpty()) {
             return Collections.emptyList();
@@ -1621,7 +1639,7 @@
         // 获取点位信息
         List<Long> startPointsIds = xpOrders.stream().map(XpOrder::getStartPointId).collect(Collectors.toList());
 
-        R<List<XpHistoryStartPointsVo>> r = xpPointClient.getHistoryStartPoints(new HistoryStartPointsDto(startPointsIds, lon, lat,Long.valueOf(uid)));
+        R<List<XpHistoryStartPointsVo>> r = xpPointClient.getHistoryStartPoints(new HistoryStartPointsDto(startPointsIds, lon, lat, Long.valueOf(uid)));
 
 
         List<XpHistoryStartPointsVo> data = r.getData();
@@ -1649,7 +1667,7 @@
     }
 
     @Override
-    public List<XpHistoryEndPointsVo> getHistoryEndPoints(String uid, double lon, double lat,Long electronicAreaId) {
+    public List<XpHistoryEndPointsVo> getHistoryEndPoints(String uid, double lon, double lat, Long electronicAreaId) {
         //
         List<XpOrder> xpOrders = this.baseMapper.getHistoryEndPoints(Long.valueOf(uid), electronicAreaId);
 //        selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 10"));
@@ -1659,7 +1677,7 @@
         // 获取点位信息
         List<Long> endPointsIds = xpOrders.stream().map(XpOrder::getEndPointId).collect(Collectors.toList());
 
-        R<List<XpHistoryEndPointsVo>> r = xpPointClient.getHistoryEndPoints(new HistoryEndPointsDto(endPointsIds, lon, lat,Long.valueOf(uid)));
+        R<List<XpHistoryEndPointsVo>> r = xpPointClient.getHistoryEndPoints(new HistoryEndPointsDto(endPointsIds, lon, lat, Long.valueOf(uid)));
 
         List<XpHistoryEndPointsVo> data = r.getData();
 
@@ -1774,78 +1792,13 @@
             e.printStackTrace();
         }
         Integer status = order.getStatus();
-        //判断还原车辆状态
-        if (null == order.getVehicleId()) {
-            Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString());
-            if (null != cacheObject1) {
-                JSONObject jsonObject = JSON.parseObject(cacheObject1.toString());
-                String vin = jsonObject.getString("vin");
-                XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData();
-                if (null != vehicle && 0 != vehicle.getState()) {
-                    XpVehicle vehicle1 = new XpVehicle();
-                    vehicle1.setId(vehicle.getId());
-                    vehicle1.setState(0);
-                    xpVehicleClient.updateVehicleById(vehicle1);
-                    log.info("用户取消订单,车辆状态修改0 {}", vehicle.getPlateNumber());
-                }
-            }
-        }
-        else{// 下发命令
-            R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId());
-            XpVehicle xpVehicle = xpVehicleR.getData();
-            if (xpVehicle == null) {
-                throw new ServiceException("车辆不存在", I18nKeyConstant.VEHICLE_NOT_EXISTS);
-            }
-            //是否能取消行程
-            boolean cancelShow = this.isCancelShow(order,xpVehicle.getVehicleVin());
-            if(cancelShow){
-                throw new ServiceException("当前订单状态不允许取消,行程即将完成", I18nKeyConstant.ORDER_CANCEL_FAILED);
-            }
 
-            // 组装调用车机参数
-            CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
-            cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin());
-            cancelTaxiPassengerVo.setUid(uid);
-            cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber());
-            cancelTaxiPassengerVo.setAppId(appid);
-
-            BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
-            if (baseVehicleUserDto == null) {
-                // TODO 本地无法调通
-//            throw new RuntimeException("取消订单失败");
-            }
-
-            //还原车辆状态
-            if (1 == xpVehicle.getState()) {
-                XpVehicle vehicle1 = new XpVehicle();
-                vehicle1.setId(xpVehicle.getId());
-                vehicle1.setState(0);
-                xpVehicleClient.updateVehicleById(vehicle1);
-                log.info("用户取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber());
-            }
-            //车辆继续巡游
-            addCruiseMission(order, status);
-        }
         order.setStatus(0);
         Long appUserId = order.getAppUserId();
         order.setAppUserId(null);
         baseMapper.updateById(order);
         order.setAppUserId(appUserId);
-        bootCommonService.setCache_orderStatus(order.getId(),order,null);
-        //删除蓝牙秘钥
-        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());
-            }
-        }
+        bootCommonService.setCache_orderStatus(order.getId(), order, null);
 
         XpOrderCancel xpOrderCancel = new XpOrderCancel();
         xpOrderCancel.setOrderId(orderId);
@@ -1855,6 +1808,78 @@
         xpOrderCancelService.save(xpOrderCancel);
         // 移除mongo数据
         xpPricingClient.deleteXpGeoQueryEntity(order.getId().toString());
+
+        if(null == order.getOfficialPartnerId()){
+            //判断还原车辆状态
+            if (null == order.getVehicleId()) {
+                Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString());
+                if (null != cacheObject1) {
+                    JSONObject jsonObject = JSON.parseObject(cacheObject1.toString());
+                    String vin = jsonObject.getString("vin");
+                    XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData();
+                    if (null != vehicle && 0 != vehicle.getState()) {
+                        XpVehicle vehicle1 = new XpVehicle();
+                        vehicle1.setId(vehicle.getId());
+                        vehicle1.setState(0);
+                        xpVehicleClient.updateVehicleById(vehicle1);
+                        log.info("用户取消订单,车辆状态修改0 {}", vehicle.getPlateNumber());
+                    }
+                }
+            } else {// 下发命令
+                R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId());
+                XpVehicle xpVehicle = xpVehicleR.getData();
+                if (xpVehicle == null) {
+                    throw new ServiceException("车辆不存在", I18nKeyConstant.VEHICLE_NOT_EXISTS);
+                }
+                //是否能取消行程
+                boolean cancelShow = this.isCancelShow(order, xpVehicle.getVehicleVin());
+                if (cancelShow) {
+                    throw new ServiceException("当前订单状态不允许取消,行程即将完成", I18nKeyConstant.ORDER_CANCEL_FAILED);
+                }
+
+                // 组装调用车机参数
+                CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
+                cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin());
+                cancelTaxiPassengerVo.setUid(uid);
+                cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber());
+                cancelTaxiPassengerVo.setAppId(appid);
+
+                BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
+                if (baseVehicleUserDto == null) {
+                    // TODO 本地无法调通
+//            throw new RuntimeException("取消订单失败");
+                }
+
+                //还原车辆状态
+                if (1 == xpVehicle.getState()) {
+                    XpVehicle vehicle1 = new XpVehicle();
+                    vehicle1.setId(xpVehicle.getId());
+                    vehicle1.setState(0);
+                    xpVehicleClient.updateVehicleById(vehicle1);
+                    log.info("用户取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber());
+                }
+                //车辆继续巡游
+                addCruiseMission(order, status);
+            }
+
+            //删除蓝牙秘钥
+            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());
+                }
+            }
+        }else{
+            //流量接入-订单推送 推送取消订单
+            officialPartnerUtil.pushCancelOrder(order.getOfficialPartnerId(), xpOrderCancel, order.getStatus());
+        }
     }
 
     @Override
@@ -1870,19 +1895,21 @@
         order.setAppUserId(null);
         baseMapper.updateById(order);
         order.setAppUserId(appUserId);
-        bootCommonService.setCache_orderStatus(order.getId(),order,null);
-        //删除蓝牙秘钥
-        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());
+        bootCommonService.setCache_orderStatus(order.getId(), order, null);
+        if(null == order.getOfficialPartnerId()){
+            //删除蓝牙秘钥
+            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());
+                }
             }
         }
 
@@ -1910,12 +1937,12 @@
         sendMessageDTO.setAppUserId(String.valueOf(appUserId));
         R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
         //推送失败,重试3次
-        if(stringR.getCode() != Constants.SUCCESS){
+        if (stringR.getCode() != Constants.SUCCESS) {
             ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
             executor.execute(() -> {
                 for (int i = 0; i < 3; i++) {
                     R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
-                    if(stringR1.getCode() == Constants.SUCCESS){
+                    if (stringR1.getCode() == Constants.SUCCESS) {
                         break;
                     }
                     try {
@@ -1933,6 +1960,11 @@
 
         // 移除mongo数据
         xpPricingClient.deleteXpGeoQueryEntity(order.getId().toString());
+
+        //流量接入-订单推送 推送取消订单
+        if(Objects.nonNull(order.getOfficialPartnerId())){
+            officialPartnerUtil.pushCancelOrder(order.getOfficialPartnerId(), xpOrderCancel, order.getStatus());
+        }
         return order;
     }
 
@@ -1959,7 +1991,7 @@
         xpOrder.setAppUserId(null);
         xpOrder.setStatus(10);
         baseMapper.updateById(xpOrder);
-        bootCommonService.setCache_orderStatus(xpOrder.getId(),xpOrder,null);
+        bootCommonService.setCache_orderStatus(xpOrder.getId(), xpOrder, null);
 
         XpOrderEvaluate evaluate = new XpOrderEvaluate();
         evaluate.setOrderId(xpOrder.getId());
@@ -1983,19 +2015,20 @@
         if (xpOrder.getStatus() == 0) {
             return R.fail("订单已取消");
         }
-        if(xpOrder.getStatus() >= 8){
+        if (xpOrder.getStatus() >= 8) {
             return R.fail("订单已结束");
         }
         Long appUserId = xpOrder.getAppUserId();
         // 查询车辆
         XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
 //        订单的状态 status =1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)
         switch (status) {
             case 0://去掉订单 优惠卷需要返回 @todo yyy 这里可能不需要这个步骤
                 //取消订单会将优惠卷 从占用修改成未使用
-                if(xpOrder.getCouponId() != null){
+                if (xpOrder.getCouponId() != null) {
                     UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
-                    useUserCouponDto.setUserCouponId(xpOrder.getCouponId() );
+                    useUserCouponDto.setUserCouponId(xpOrder.getCouponId());
                     xpAppUserCouponClient.backUserCoupon(useUserCouponDto);
                 }
                 break;
@@ -2021,6 +2054,17 @@
             case 5:
                 LocalDateTime now = LocalDateTime.now();
                 xpOrder.setBoardingTime(now);
+                if (Objects.nonNull(vehiclePosition)) {
+                    GeoJsonPoint point = vehiclePosition.getPoint();
+                    if (Objects.nonNull(point)) {
+                        double x = point.getX();
+                        double y = point.getY();
+                        Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
+                        xpOrder.setBoardingLon(x);
+                        xpOrder.setBoardingLat(y);
+                        xpOrder.setBoardingAddress(geocode.get("address"));
+                    }
+                }
                 xpOrder.setRideTime(now);
                 //推送行起点到终点的驶轨迹给乘客端
                 sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", xpVehicle.getVehicleVin());
@@ -2029,7 +2073,7 @@
                 //乘客已上车,重新倒计时不开始行程取消订单
                 XpPoint xpPoint1 = xpPointClient.queryById(xpOrder.getStartPointId()).getData();
                 XpTradingStrategy tradingStrategy = tradingStrategyClient.getTradingStrategyByCityCode(xpPoint1.getCityCode()).getData();
-                if(null != tradingStrategy){
+                if (null != tradingStrategy) {
                     Map<String, ? extends Object> cancelJobMaps1 =
                             new ImmutableMap.Builder<String, Long>().
                                     put("id", xpOrder.getId())
@@ -2042,9 +2086,6 @@
                             cancelJobMaps1
                     );
                 }
-
-                // 车辆到达上车点时间
-                xpOrder.setArrivalTime(LocalDateTime.now());
                 break;
             case 6:
                 // 删除定时任务job
@@ -2053,7 +2094,7 @@
                 xpOrder.setTripBegin(LocalDateTime.now());
                 //添加预估到达时间
                 String cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId());
-                if(StringUtils.isNotBlank(cacheObject)){
+                if (StringUtils.isNotBlank(cacheObject)) {
                     RouteVo routeVo = JSONObject.parseObject(cacheObject, RouteVo.class);
                     xpOrder.setEstimatedArrivalTime(LocalDateTime.now().plusSeconds(routeVo.getDuration()));
                 }
@@ -2062,10 +2103,9 @@
             case 7:
                 xpOrder.setGetoffTime(LocalDateTime.now());
                 // 解析下车地点
-                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
-                if(Objects.nonNull(vehiclePosition)){
+                if (Objects.nonNull(vehiclePosition)) {
                     GeoJsonPoint point = vehiclePosition.getPoint();
-                    if(Objects.nonNull(point)){
+                    if (Objects.nonNull(point)) {
                         double x = point.getX();
                         double y = point.getY();
                         Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
@@ -2093,12 +2133,12 @@
                 sendMessageDTO.setAppUserId(String.valueOf(xpOrder.getAppUserId()));
                 R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
                 //推送失败,重试3次
-                if(stringR.getCode() != Constants.SUCCESS){
+                if (stringR.getCode() != Constants.SUCCESS) {
                     ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
                     executor.execute(() -> {
                         for (int i = 0; i < 3; i++) {
                             R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
-                            if(stringR1.getCode() == Constants.SUCCESS){
+                            if (stringR1.getCode() == Constants.SUCCESS) {
                                 break;
                             }
                             try {
@@ -2140,15 +2180,15 @@
 
                 //判断是否有连环单
                 String json = redisService.getCacheObject(CacheConstants.nextOrder(xpOrder.getId().toString()));
-                if (StringUtils.isNotEmpty(json)){
+                if (StringUtils.isNotEmpty(json)) {
                     JSONObject jsonObject = JSON.parseObject(json);
                     Long id = jsonObject.getLong("orderId");
                     jobMaps = new ImmutableMap.Builder<String, String>()
-                                    .put("id", id.toString())
-                                    .put("oldOrderId", xpOrder.getId().toString())
-                                    .put("appid", appid)
-                                    .put("orderType", OrderType.USER_ORDER)
-                                    .build();
+                            .put("id", id.toString())
+                            .put("oldOrderId", xpOrder.getId().toString())
+                            .put("appid", appid)
+                            .put("orderType", OrderType.USER_ORDER)
+                            .build();
 
                     QuartzManager.addJob(
                             PushChainReactionOrderJob.class,
@@ -2173,17 +2213,16 @@
         xpOrder.setStatus(status);
         xpOrder.setAppUserId(null);
         this.updateById(xpOrder);
-        bootCommonService.setCache_orderStatus(xpOrder.getId(),xpOrder,null);
+        bootCommonService.setCache_orderStatus(xpOrder.getId(), xpOrder, null);
         return R.ok();
     }
-
 
 
     /**
      * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8
      */
     @Override
-    public R<String> carAbnormalUpdateOrderStatus(Long orderId){
+    public R<String> carAbnormalUpdateOrderStatus(Long orderId) {
         XpOrder xpOrder = this.getById(orderId);
         if (Objects.isNull(xpOrder)) {
             return R.fail("订单不存在");
@@ -2191,7 +2230,7 @@
         if (xpOrder.getStatus() == 0) {
             return R.fail("订单已取消");
         }
-        if(xpOrder.getStatus() >= 8){
+        if (xpOrder.getStatus() >= 8) {
             return R.fail("订单已结束");
         }
         // 查询车辆
@@ -2201,9 +2240,9 @@
         xpOrder.setGetoffTime(LocalDateTime.now());
         // 解析下车地点
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
-        if(Objects.nonNull(vehiclePosition)){
+        if (Objects.nonNull(vehiclePosition)) {
             GeoJsonPoint point = vehiclePosition.getPoint();
-            if(Objects.nonNull(point)){
+            if (Objects.nonNull(point)) {
                 double x = point.getX();
                 double y = point.getY();
                 Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
@@ -2220,8 +2259,8 @@
         xpOrder.setStatus(OrderStatusEnum.SEE_OFF_GUESTS.getCode());//待客下车
         xpOrder.setAppUserId(null);
         this.updateById(xpOrder);
-         //结束行程,修改状态和计算费用
-        this.endTrip(xpOrder.getId(),appUserId.toString());
+        //结束行程,修改状态和计算费用
+        this.endTrip(xpOrder.getId(), appUserId.toString());
 
         //将支付金额修改成0 并将状态修改成 订单状态9
         setFree(xpOrder.getId());
@@ -2231,20 +2270,19 @@
     /**
      * 豁免
      */
-    public void setFree(Long id){
+    public void setFree(Long id) {
 
         //将支付金额修改成0 并将状态修改成 订单状态9
         XpOrder xpOrder1 = new XpOrder();
         xpOrder1.setId(id);
-        xpOrder1.setIsFree( true);//豁免
+        xpOrder1.setIsFree(true);//豁免
         xpOrder1.setPayMoney(BigDecimal.ZERO);
         xpOrder1.setStatus(OrderStatusEnum.PENDING_PAYMENT.getCode());
         xpOrder1.setUpdateTime(LocalDateTime.now());
         baseMapper.updateById(xpOrder1);
-        bootCommonService.setCache_orderStatus(xpOrder1.getId(),xpOrder1,null);
+        bootCommonService.setCache_orderStatus(xpOrder1.getId(), xpOrder1, null);
 
     }
-
 
 
     @Override
@@ -2272,7 +2310,7 @@
         order.setTripEnd(LocalDateTime.now());
         baseMapper.updateById(order);
         order.setAppUserId(appUserId);
-        bootCommonService.setCache_orderStatus(order.getId(),order,null);
+        bootCommonService.setCache_orderStatus(order.getId(), order, null);
         //删除蓝牙秘钥
 //        String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + orderId);
 //        if(StringUtils.isNotBlank(token)){
@@ -2289,7 +2327,7 @@
 //        }
 
         // 根据订单所属开通城市id 查询定价
-        XpPricing pricing = bootCommonService.getXpPricing(order.getCityId(),order.getVehicleId());
+        XpPricing pricing = bootCommonService.getXpPricing(order.getCityId(), order.getVehicleId());
         if (pricing == null) {
             throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS);
         }
@@ -2341,10 +2379,10 @@
             xpOrderDetail.setDetailType(2);
             xpOrderDetail.setOrderId(orderId);
             xpOrderDetail.setType(1);
-            xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2,RoundingMode.HALF_UP));
+            xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2, RoundingMode.HALF_UP));
             xpOrderDetails.add(xpOrderDetail);
             //时长费不是必填项
-            if(null != xpPricingCardVo.getDurationPrice() && xpPricingCardVo.getDurationPrice() > 0){
+            if (null != xpPricingCardVo.getDurationPrice() && xpPricingCardVo.getDurationPrice() > 0) {
                 xpOrderDetail = new XpOrderDetail();
                 xpOrderDetail.setDetailType(3);
                 xpOrderDetail.setOrderId(orderId);
@@ -2353,7 +2391,7 @@
                 xpOrderDetails.add(xpOrderDetail);
             }
 
-            BigDecimal totalPrice =BigDecimal.ZERO;
+            BigDecimal totalPrice = BigDecimal.ZERO;
             for (XpOrderDetail xpOrderDetail1 : xpOrderDetails) {
                 totalPrice = totalPrice.add(xpOrderDetail1.getMoney());
                 xpOrderDetailMapper.insert(xpOrderDetail1);
@@ -2361,8 +2399,7 @@
             order.setOrderMoney(totalPrice);
             order.setAppUserId(null);
             baseMapper.updateById(order);
-        }
-        else {
+        } else {
             //动态计费
             if (pricing.getPricingType() == 1) {
                 for (int i = 0; i < startingFareJsonArray.size(); i++) {
@@ -2454,14 +2491,14 @@
 
                             // 天气预报动态调价
                             JSONArray ws = jsonObject.getJSONArray("weather");
-                            if(null != ws){
+                            if (null != ws) {
                                 WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
                                 List<WeatherDTO.Lives> lives = data.getLives();
-                                if(lives!=null && !lives.isEmpty()){
+                                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"))){
+                                        if (w.contains(ele.getString("weatherType"))) {
                                             double floatRate = jsonObject.getDouble("ratio");
                                             priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                             break;
@@ -2550,16 +2587,16 @@
                 // 封装时长费
                 FareBreakdownDetailVo timeDetail = new FareBreakdownDetailVo();
                 if (key.contains("时长费")) {
-                    if(key.contains("普通时段")){
+                    if (key.contains("普通时段")) {
                         timeDetail.setType(1);
                     }
-                    if(key.contains("夜间行驶")){
+                    if (key.contains("夜间行驶")) {
                         timeDetail.setType(2);
                     }
-                    if(key.contains("高峰")){
+                    if (key.contains("高峰")) {
                         timeDetail.setType(3);
                     }
-                    if(key.contains("节假")){
+                    if (key.contains("节假")) {
                         timeDetail.setType(4);
                     }
 
@@ -2661,17 +2698,17 @@
         UserCouponVo userCouponVo = userCouponVoR.getData();
 
         // 提示是否换券
-        boolean tip =false;
+        boolean tip = false;
         if (userCouponVo != null) {
             // 重新选券
-            if(userCouponVo.getStatus()==2){
+            if (userCouponVo.getStatus() == 2) {
                 getUserCouponDto.setUserId(Long.valueOf(uid));
                 getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue());
                 getUserCouponDto.setUserCouponId(order.getCouponId());
                 getUserCouponDto.setOpenCityId(order.getCityId());
                 userCouponVoR = xpAppUserCouponClient.getUserCoupon(getUserCouponDto);
                 userCouponVo = userCouponVoR.getData();
-                tip=true;
+                tip = true;
             }
             order.setCouponId(userCouponVo.getId());
             order.setCouponMoney(BigDecimal.valueOf(userCouponVo.getMoney()));
@@ -2726,11 +2763,11 @@
         xpCruiseOrder.setXpuTaskId(snowflake.nextId() + "");
 
         // 完成的直接走终点   终止的走起点
-        if(null != xpCruiseOrders){
+        if (null != xpCruiseOrders) {
             if (temp == 0) {
                 //当上一笔单有起点点位,才需要将上一笔巡游单的起点作为本次的终点导航
                 //上一笔单没有起点点位,统一用后面的巡游计划的第一个点位作为本次的终点导航
-                if(null != xpCruiseOrders.getStartPointId()){
+                if (null != xpCruiseOrders.getStartPointId()) {
                     xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId());
                     xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName());
                     xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon());
@@ -2747,7 +2784,7 @@
             xpCruiseOrder.setMissionId(xpCruiseOrders.getMissionId());
         }
         //所有没有赋值终点点位的情况,全部导航到巡游计划的第一个点位开始执行巡游任务
-        if(null == xpCruiseOrder.getEndPointId()){
+        if (null == xpCruiseOrder.getEndPointId()) {
             // 先找计划
             List<XpCruisePlanPoint> planPointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId()).getData();
             XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0);
@@ -2764,7 +2801,7 @@
         xpCruiseOrder.setCreateTime(LocalDateTime.now());
 
         // 判断当前时分秒是否大于收车时间&&收车配置开启
-        if(null != xpTaskRule && xpTaskRule.getVehicleCollection()){
+        if (null != xpTaskRule && xpTaskRule.getVehicleCollection()) {
             LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime();
             if (vehicleCollectionTime.isBefore(LocalTime.now())) {
                 XpVehicle vehicle1 = new XpVehicle();
@@ -2773,7 +2810,7 @@
                 xpVehicleClient.updateVehicleById(vehicle1);
                 //找到车辆的收车点位 更新终点点位
                 R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder);
-                if(200 != returnCruisePoint.getCode()){
+                if (200 != returnCruisePoint.getCode()) {
                     xpCruiseOrder = returnCruisePoint.getData();
                     xpCruiseOrder.setOrderType(2);
                     xpCruiseOrder.setOrderReverse(1);
@@ -2842,11 +2879,11 @@
         xpCruiseOrder.setStartLat(vehiclePosition.getPoint().getY());
 
         // 完成的直接走终点   终止的走起点
-        if(null != xpCruiseOrders){
+        if (null != xpCruiseOrders) {
             if (temp == 0) {
                 //当上一笔单有起点点位,才需要将上一笔巡游单的起点作为本次的终点导航
                 //上一笔单没有起点点位,统一用后面的巡游计划的第一个点位作为本次的终点导航
-                if(null != xpCruiseOrders.getStartPointId()){
+                if (null != xpCruiseOrders.getStartPointId()) {
                     xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId());
                     xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName());
                     xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon());
@@ -2863,7 +2900,7 @@
             xpCruiseOrder.setMissionId(xpCruiseOrders.getMissionId());
         }
         //所有没有赋值终点点位的情况,全部导航到巡游计划的第一个点位开始执行巡游任务
-        if(null == xpCruiseOrder.getEndPointId()){
+        if (null == xpCruiseOrder.getEndPointId()) {
             // 先找计划
             List<XpCruisePlanPoint> planPointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId()).getData();
             XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0);
@@ -2882,7 +2919,7 @@
         xpCruiseOrder.setCreateTime(LocalDateTime.now());
 
         // 判断当前时分秒是否大于收车时间&&收车配置开启
-        if(null != xpTaskRule && xpTaskRule.getVehicleCollection()){
+        if (null != xpTaskRule && xpTaskRule.getVehicleCollection()) {
             LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime();
             if (vehicleCollectionTime.isBefore(LocalTime.now())) {
                 XpVehicle vehicle1 = new XpVehicle();
@@ -2891,7 +2928,7 @@
                 xpVehicleClient.updateVehicleById(vehicle1);
                 //找到车辆的收车点位 更新终点点位
                 R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder);
-                if(200 != returnCruisePoint.getCode()){
+                if (200 != returnCruisePoint.getCode()) {
                     xpCruiseOrder = returnCruisePoint.getData();
                     xpCruiseOrder.setOrderType(2);
                     xpCruiseOrder.setOrderReverse(1);
@@ -3121,7 +3158,7 @@
     public R<FareBreakdownVo> fareBreakdown(com.xiaopeng.order.vo.FareBreakdownVo vo, String uid) {
         XpOrder order = this.getById(vo.getOrderId());
         //根据新的优惠券计算优惠金额
-        if(null != order.getCouponId()){
+        if (null != order.getCouponId()) {
             CalculateDiscountAmountVo discountAmountVo = new CalculateDiscountAmountVo();
             BigDecimal data = xpAppUserCouponClient.calculateDiscountAmount(discountAmountVo).getData();
             order.setCouponId(vo.getUserCouponId());
@@ -3142,15 +3179,15 @@
             detail.setType(xpOrderDetail.getType());
             detail.setTime(xpOrderDetail.getTime());
             detail.setMileage(xpOrderDetail.getMileage());
-            detail.setDuration((xpOrderDetail.getDuration() == null ? 0 : xpOrderDetail.getDuration())*60);
+            detail.setDuration((xpOrderDetail.getDuration() == null ? 0 : xpOrderDetail.getDuration()) * 60);
             detail.setMoney(xpOrderDetail.getMoney());
             if (xpOrderDetail.getDetailType() == 1) {
                 start.add(detail);
-            } else if(xpOrderDetail.getDetailType()==2){
+            } else if (xpOrderDetail.getDetailType() == 2) {
                 mileage.add(detail);
-            }else if(xpOrderDetail.getDetailType()==3){
+            } else if (xpOrderDetail.getDetailType() == 3) {
                 duration.add(detail);
-            }else if(xpOrderDetail.getDetailType()==4){
+            } else if (xpOrderDetail.getDetailType() == 4) {
                 longDistance.add(detail);
             }
         }
@@ -3173,12 +3210,11 @@
         }
         res.setTime(new BigDecimal(order.getDuration() == null ? 0 : order.getDuration()).multiply(new BigDecimal(60)).setScale(0, RoundingMode.HALF_UP));
         XpSystemSetting xpSystemSetting = xpSystemSettingClient.getSystemSettingOne().getData();
-        if(null != xpSystemSetting){
+        if (null != xpSystemSetting) {
             res.setOperateFree(xpSystemSetting.getOperateFree());
         }
         return R.ok(res);
     }
-
 
 
     @Override
@@ -3187,22 +3223,22 @@
         XpOrder order = this.getById(dto.getOrderId());
         order.setStatus(9);
         order.setAppUserId(null);
-        if(order.getCouponId()!=null){
+        if (order.getCouponId() != null) {
             UseUserCouponDto useUserCouponDto = new UseUserCouponDto();
             useUserCouponDto.setUserCouponId(order.getCouponId());
             R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto);
-            if(decimalR.getCode()==200){
+            if (decimalR.getCode() == 200) {
                 order.setCouponMoney(decimalR.getData());
-                if(order.getCouponMoney().compareTo(order.getOrderMoney())>0){
+                if (order.getCouponMoney().compareTo(order.getOrderMoney()) > 0) {
                     order.setPayMoney(BigDecimal.ZERO);
                     order.setCouponMoney(order.getOrderMoney());
-                }else {
+                } else {
                     order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData()));
                 }
             }
         }
         baseMapper.updateById(order);
-        bootCommonService.setCache_orderStatus(order.getId(),order,null);
+        bootCommonService.setCache_orderStatus(order.getId(), order, null);
         return R.ok();
     }
 
@@ -3256,7 +3292,7 @@
     public void saveVehicleLocation(OrderTrajectory orderTrajectory) {
         // 查询订单信息
         Integer status = redisService.getCacheObject("ORDER_STATUS:" + orderTrajectory.getOrderId());
-        if(status < 6 || status > 8){
+        if (status < 6 || status > 8) {
             return;
         }
 
@@ -3448,18 +3484,18 @@
                 vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId()));
                 vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
                 vehicleEventDTO.setEventTime(System.currentTimeMillis());
-                Map<String,Object> attributes = new HashMap<>();
-                attributes.put("vin",vehicleEventDTO.getVin());
-                attributes.put("order_id",vehicleEventDTO.getOrderId());
-                attributes.put("order_type","cruise_order");
-                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                Map<String, Object> attributes = new HashMap<>();
+                attributes.put("vin", vehicleEventDTO.getVin());
+                attributes.put("order_id", vehicleEventDTO.getOrderId());
+                attributes.put("order_type", "cruise_order");
+                attributes.put("timestamp", vehicleEventDTO.getEventTime());
                 attributes.put("current_main_status", OrderStatus.ORDER_STARTED);
-                attributes.put("current_sub_status","");
+                attributes.put("current_sub_status", "");
                 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
-                if(Objects.nonNull(vehiclePosition)){
-                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
-                }else {
-                    attributes.put("odometer_km","");
+                if (Objects.nonNull(vehiclePosition)) {
+                    attributes.put("odometer_km", vehiclePosition.getTotalOdometer());
+                } else {
+                    attributes.put("odometer_km", "");
                 }
                 vehicleEventDTO.setAttributes(attributes);
                 vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
@@ -3506,7 +3542,7 @@
                 addTaxiPassengerVo.setUid(appUserId.toString());
                 order.setAppUserId(null);
                 this.updateById(order);
-                bootCommonService.setCache_orderStatus(order.getId(),order,null);
+                bootCommonService.setCache_orderStatus(order.getId(), order, null);
 
                 //构建推送消息
                 Map<String, Object> params = new HashMap<>();
@@ -3523,12 +3559,12 @@
                 R<String> stringR = xpPushMessageClient.sendStatus(dto1);
 
                 //推送失败,重试3次
-                if(stringR.getCode() != Constants.SUCCESS){
+                if (stringR.getCode() != Constants.SUCCESS) {
                     ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
                     executor.execute(() -> {
                         for (int i = 0; i < 3; i++) {
                             R<String> stringR1 = xpPushMessageClient.sendStatus(dto1);
-                            if(stringR1.getCode() == Constants.SUCCESS){
+                            if (stringR1.getCode() == Constants.SUCCESS) {
                                 break;
                             }
                             try {
@@ -3620,7 +3656,7 @@
 //                log.info("下发蓝牙token成功:{} {}", deliver.getData(), order.getOrderNumber());
             }
 
-            if(order.getStatus() == 2){
+            if (order.getStatus() == 2) {
                 // 封装埋点消息实体
                 VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
                 vehicleEventDTO.setVin(dto.getXpVehicleVin());
@@ -3628,18 +3664,18 @@
                 vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId()));
                 vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
                 vehicleEventDTO.setEventTime(System.currentTimeMillis());
-                Map<String,Object> attributes = new HashMap<>();
-                attributes.put("vin",vehicleEventDTO.getVin());
-                attributes.put("order_id",vehicleEventDTO.getOrderId());
-                attributes.put("order_type","user_order");
-                attributes.put("timestamp",vehicleEventDTO.getEventTime());
-                attributes.put("current_main_status",OrderStatus.ORDER_EN_ROUTE_TO_PICKUP);
-                attributes.put("current_sub_status","");
+                Map<String, Object> attributes = new HashMap<>();
+                attributes.put("vin", vehicleEventDTO.getVin());
+                attributes.put("order_id", vehicleEventDTO.getOrderId());
+                attributes.put("order_type", "user_order");
+                attributes.put("timestamp", vehicleEventDTO.getEventTime());
+                attributes.put("current_main_status", OrderStatus.ORDER_EN_ROUTE_TO_PICKUP);
+                attributes.put("current_sub_status", "");
                 VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
-                if(Objects.nonNull(vehiclePosition)){
-                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
-                }else {
-                    attributes.put("odometer_km","");
+                if (Objects.nonNull(vehiclePosition)) {
+                    attributes.put("odometer_km", vehiclePosition.getTotalOdometer());
+                } else {
+                    attributes.put("odometer_km", "");
                 }
                 vehicleEventDTO.setAttributes(attributes);
                 vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
@@ -3734,12 +3770,12 @@
             R<String> stringR = xpPushMessageClient.sendRoute(messageDTO);
             XpOrder xpOrder = this.getById(orderId);
             //推送失败,重试3次
-            if(stringR.getCode() != Constants.SUCCESS){
+            if (stringR.getCode() != Constants.SUCCESS) {
                 ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
                 executor.execute(() -> {
                     for (int i = 0; i < 3; i++) {
                         R<String> stringR1 = xpPushMessageClient.sendStatus(messageDTO);
-                        if(stringR1.getCode() == Constants.SUCCESS){
+                        if (stringR1.getCode() == Constants.SUCCESS) {
                             break;
                         }
                         try {
@@ -3802,7 +3838,7 @@
             xpOrderDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
         }
         Integer status = xpOrder.getStatus();
-        if(status > 2 && status < 8){
+        if (status > 2 && status < 8) {
 //            Boolean data = xpVehicleClient.getVehicleTrunkOpenStatus(xpOrder.getAppUserId(), xpOrder.getVehicleId()).getData();
 //            xpOrder.setOpenTrunk(data ? 1 : 2);
 //            xpOrderDetailVO.setOpenTrunk(data ? 1 : 2);
@@ -3815,7 +3851,7 @@
     }
 
     @Override
-    public XpOrderDetailVO getActiveOrder_itineraryManage(String uid){
+    public XpOrderDetailVO getActiveOrder_itineraryManage(String uid) {
         XpOrderDetailVO xpOrderDetailVO = new XpOrderDetailVO();
         XpOrder xpOrder = this.baseMapper.selectOne(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).in(XpOrder::getStatus, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1"));
         if (xpOrder == null) {
@@ -3832,24 +3868,26 @@
 
             xpOrderDetailVO.setVehiclePictures(vehicle.getVehiclePictures());
         }
-        Boolean cancelShow = isCancelShow(xpOrder,xpOrderDetailVO.getVehicleVin()); //是否能取消行程
+        Boolean cancelShow = isCancelShow(xpOrder, xpOrderDetailVO.getVehicleVin()); //是否能取消行程
         xpOrderDetailVO.setCancelShow(cancelShow);
         return xpOrderDetailVO;
     }
+
     /**
      * 取消行程:若处于“送驾中”且离目的地小于10分钟路程(后台配置),【取消行程】按钮应置灰;
      * 修改行程:
      * 1. 当前剩余里程 < 800米 (后台配置)或 剩余时间 < 5分钟(后台配置)(以先到者为准),禁止修改,按钮置灰。
      * 2. 单次行程最多允许修改 2次 (后台配置)目的地,防恶意高频调用
      * 特殊豁免:若系统检测到车辆在当前坐标时速 < 3km/h 且持续时间 > 3分钟(后台配置)(判定为极度拥堵或异常停滞),此时解除限制,允许用户修改目的地或新增途径点以寻找更近的下车位置。
+     *
      * @return
      */
-    private boolean isCancelShow(XpOrder xpOrder,String vehicleVin) {
+    private boolean isCancelShow(XpOrder xpOrder, String vehicleVin) {
         boolean isCancel = false;
 
         //获取系统配置
         XpSystemSetting systemSetting = xpSystemSettingClient.getSystemSettingOne().getData();
-        if(systemSetting == null){
+        if (systemSetting == null) {
             throw new ServiceException("获取行程配置错误");
         }
         //获取配置文件
@@ -3861,17 +3899,17 @@
 
 
         List<OrderTrajectory> orderTrajectories = queryOrderTrajectories(xpOrder.getId());
-        if(!orderTrajectories.isEmpty()){// 减少3分钟 获取3分账内的 行程数据
+        if (!orderTrajectories.isEmpty()) {// 减少3分钟 获取3分账内的 行程数据
             //3千米/小时 转换成分钟 50米/分钟
             BigDecimal suduDefault = new BigDecimal(xczSpeedPerHour);//3千米/小时
-            BigDecimal suduDefault1 = suduDefault.multiply(BigDecimal.valueOf(1000)) ;
-            BigDecimal suduDefaultNew =suduDefault1.divide(BigDecimal.valueOf(60),2,RoundingMode.HALF_EVEN);
+            BigDecimal suduDefault1 = suduDefault.multiply(BigDecimal.valueOf(1000));
+            BigDecimal suduDefaultNew = suduDefault1.divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_EVEN);
 
             LocalDateTime minutesBefore = LocalDateTime.now().minusMinutes(xczHmDuration);
             long milliseconds = DateUtils.getMilliseconds(minutesBefore);
             List<OrderTrajectory> orderTrajectoriesNew = new ArrayList<>();
             for (OrderTrajectory orderTrajectory : orderTrajectories) {
-                if(orderTrajectory.getLocatetime() > milliseconds){
+                if (orderTrajectory.getLocatetime() > milliseconds) {
                     orderTrajectoriesNew.add(orderTrajectory);
                 }
             }
@@ -3880,24 +3918,24 @@
              */
             //计算行驶总距离和时长
             Double reduce = orderTrajectoriesNew.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum);
-            BigDecimal xcsudu = new BigDecimal(reduce).divide(new BigDecimal(xczHmDuration),2, RoundingMode.HALF_EVEN);//米/分钟
+            BigDecimal xcsudu = new BigDecimal(reduce).divide(new BigDecimal(xczHmDuration), 2, RoundingMode.HALF_EVEN);//米/分钟
 
             //特殊豁免:若系统检测到车辆在当前坐标时速 < 3km/h 且持续时间 > 3分钟(后台配置)(判定为极度拥堵或异常停滞),此时解除限制,允许用户修改目的地或新增途径点以寻找更近的下车位置。
-            if(xcsudu.compareTo(suduDefaultNew)<0){
+            if (xcsudu.compareTo(suduDefaultNew) < 0) {
                 return true;
             }
         }
 
         try {
             RouteVo routeVo = this.getRouteVo(xpOrder, vehicleVin);
-            if(routeVo.getDistance() <sylc){
+            if (routeVo.getDistance() < sylc) {
                 isCancel = true;
             }
-            if(routeVo.getDuration() < sysj){
+            if (routeVo.getDuration() < sysj) {
                 isCancel = true;
             }
         } catch (Exception e) {
-            log.error("获取两个点位车的距离错误",e);
+            log.error("获取两个点位车的距离错误", e);
             throw new ServiceException("获取两个点位车的距离错误");
         }
 
@@ -3907,11 +3945,12 @@
 
     /**
      * 获取两个点位车的距离 和时间
+     *
      * @param xpOrder
      * @param vehicleVin
      * @return
      */
-    private RouteVo getRouteVo(XpOrder xpOrder,String vehicleVin){
+    private RouteVo getRouteVo(XpOrder xpOrder, String vehicleVin) {
 
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicleVin)), VehiclePosition.class);
         // 计算距离 和 时间
@@ -3933,7 +3972,7 @@
             routeAndFareDto.setRoutePlanRule(xpRoutePlan.getRoutePlanRule());
         }
         R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto);
-        if(distanceAndDuration.getCode()!=200){
+        if (distanceAndDuration.getCode() != 200) {
             throw new ServiceException("未找到路径", I18nKeyConstant.PATH_NOT_FOUND);
         }
         return distanceAndDuration.getData();
@@ -3993,12 +4032,12 @@
         sendMessageDTO.setAppUserId(String.valueOf(appUserId));
         R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
         //推送失败,重试3次
-        if(stringR.getCode() != Constants.SUCCESS){
+        if (stringR.getCode() != Constants.SUCCESS) {
             ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
             executor.execute(() -> {
                 for (int i = 0; i < 3; i++) {
                     R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
-                    if(stringR1.getCode() == Constants.SUCCESS){
+                    if (stringR1.getCode() == Constants.SUCCESS) {
                         break;
                     }
                     try {
@@ -4016,6 +4055,7 @@
 
     /**
      * 获取待支付订单数量
+     *
      * @param uid
      * @return
      */
@@ -4032,6 +4072,7 @@
 
     /**
      * 根据 UID 查询用户是否有 RT 订单 & 订单列表
+     *
      * @param dto
      * @return
      */
@@ -4062,6 +4103,7 @@
 
     /**
      * 获取订单详情
+     *
      * @param orderId
      * @return
      */
@@ -4076,13 +4118,13 @@
         XpPoint endPoint = xpPointClient.queryById(xpOrder.getEndPointId()).getData();
         vo.setDestAddress(endPoint.getPointAddress());
         vo.setPullOverAddress(xpOrder.getGetoffAddress());
-        if(null != xpOrder.getEstimatedArrivalTime()){
+        if (null != xpOrder.getEstimatedArrivalTime()) {
             vo.setEstimatedArrivalTime(xpOrder.getEstimatedArrivalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         }
-        if(null != xpOrder.getGetoffTime()){
+        if (null != xpOrder.getGetoffTime()) {
             vo.setActualArrivalTime(xpOrder.getGetoffTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         }
-        if(null == xpOrder.getMileageKilometers()){
+        if (null == xpOrder.getMileageKilometers()) {
             vo.setActualMileage(BigDecimal.valueOf(xpOrder.getMileageKilometers()));
         }
         vo.setTotalPrice(xpOrder.getOrderMoney());
@@ -4094,11 +4136,11 @@
         vo.setCouponDiscount(xpOrder.getCouponMoney());
         vo.setActualPayment(xpOrder.getPayMoney());
         XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
-        if(null != xpVehicle){
+        if (null != xpVehicle) {
             vo.setVin(xpVehicle.getVehicleVin());
         }
         XpOrderCancel orderCancel = xpOrderCancelService.getOne(new QueryWrapper<XpOrderCancel>().eq("order_id", orderId));
-        if(null != orderCancel){
+        if (null != orderCancel) {
             vo.setCancelReasonType(orderCancel.getCancelReason());
         }
         return vo;
@@ -4108,10 +4150,337 @@
     /**
      *
      * 合作商更新订单状态
+     *
      * @param vo
      */
     @Override
-    public void officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo) {
+    public R<?> officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo, Integer officialPartnerId) {
+        XpOrder xpOrder = this.getOne(new QueryWrapper<XpOrder>().eq("order_number", vo.getOrderNum()));
+        if (null == xpOrder) {
+            return R.fail("无效的订单编号");
+        }
+        if (xpOrder.getStatus() >= 8) {
+            return R.fail("订单已结束,无法修改");
+        }
 
+        switch (vo.getOrderStatus()) {
+            case 2:
+                if (xpOrder.getStatus() != 1) {
+                    return R.fail("订单状态不允许改为已接单");
+                }
+                if (StringUtils.isEmpty(vo.getVehiclePlateNumber())) {
+                    return R.fail("车牌号不能为空");
+                }
+                if (null == vo.getAcceptanceTime()) {
+                    return R.fail("接单时间不能为空");
+                }
+                XpVehicle xpVehicle = xpVehicleClient.getVehicleByPlateNumber(vo.getVehiclePlateNumber(), officialPartnerId).getData();
+                if (null == xpVehicle) {
+                    return R.fail("车牌号不存在");
+                }
+                xpOrder.setOfficialPartnerId(officialPartnerId);
+                xpOrder.setVehicleId(xpVehicle.getId());
+                xpOrder.setAcceptanceTime(vo.getAcceptanceTime());
+                redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.READY_DEPART.getCode(), 24L, TimeUnit.HOURS);
+                //将订单弹出队列
+                try {
+                    redisService.popFirstElement(xpOrder.getQueueName());
+                } catch (Exception e) {
+                    log.error("Redis弹出队列元素出错");
+                }
+                // 存mongo数据
+                xpPricingClient.updateXpGeoQueryEntity(xpOrder.getId().toString());
+                bootCommonService.setCache_orderStatus(xpOrder.getId(), xpOrder, null);
+
+                //生成前往上车点的导航数据
+                //查询车辆位置
+                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), 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());
+                destination.setLongitude(xpOrder.getStartLon());
+                destination.setLatitude(xpOrder.getStartLat());
+
+                OrderRouteAndFareDto dto2 = new OrderRouteAndFareDto();
+                dto2.setOrderId(xpOrder.getId());
+                dto2.setOrigin(origin);
+                dto2.setDestination(destination);
+                dto2.setRouteType(1);
+                dto2.setVehicleId(xpVehicle.getId());
+                R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto2);
+                if (200 != routeVoR.getCode()) {
+                    throw new RuntimeException("获取订单线路和运费失败");
+                }
+                RouteVo routeVo = routeVoR.getData();
+                //缓存数据,用于后续推给乘客导航线路
+                redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS);
+
+                //推送乘客车辆到达预约点的导航数据
+                sendRoute(xpOrder.getAppUserId() + "", xpOrder.getId(), "ORDER_NAVIGATION_START_DATA", xpVehicle.getVehicleVin());
+                break;
+            case 3:
+                if (xpOrder.getStatus() != 2) {
+                    return R.fail("订单状态不允许改为接驾中");
+                }
+                if (null == vo.getTripBegin()) {
+                    return R.fail("行程开始时间不能为空");
+                }
+                xpOrder.setTripBegin(vo.getTripBegin());
+                redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.PICK_UP.getCode(), 24L, TimeUnit.HOURS);
+                break;
+            case 4:
+                if (xpOrder.getStatus() != 3) {
+                    return R.fail("订单状态不允许改为到达上车点");
+                }
+                if (null == vo.getArrivalTime()) {
+                    return R.fail("车辆到达上车点时间不能为空");
+                }
+
+                // 查询起点点位
+                Long startPointId = xpOrder.getStartPointId();
+                XpPoint xpPoint = xpPointClient.queryById(startPointId).getData();
+                // 添加取消订单定时任务job  时间为点位限停时长
+                Map<String, ? extends Object> cancelJobMaps =
+                        new ImmutableMap.Builder<String, Long>().
+                                put("id", xpOrder.getId())
+                                .build();
+                QuartzManager.addJob(
+                        OrderCancelJob.class,
+                        (OrderCancelJob.name + xpOrder.getId()).toUpperCase(),
+                        TimeJobType.ORDER_CANCEL,
+                        DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(xpPoint.getParkingTimeLimit())),
+                        cancelJobMaps
+                );
+
+                xpOrder.setArrivalTime(vo.getArrivalTime());
+                redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.PICK_UP_GUESTS.getCode(), 24L, TimeUnit.HOURS);
+                break;
+            case 5:
+                if (xpOrder.getStatus() != 4) {
+                    return R.fail("订单状态不允许改为乘客已上车");
+                }
+                if (null == vo.getBoardingLon()) {
+                    return R.fail("上车点经度不能为空");
+                }
+                if (null == vo.getBoardingLat()) {
+                    return R.fail("上车点纬度不能为空");
+                }
+                if (StringUtils.isEmpty(vo.getBoardingAddress())) {
+                    return R.fail("上车点地址不能为空");
+                }
+                if (null == vo.getBoardingTime()) {
+                    return R.fail("上车时间不能为空");
+                }
+                xpOrder.setBoardingLon(vo.getBoardingLon());
+                xpOrder.setBoardingLat(vo.getBoardingLat());
+                xpOrder.setBoardingAddress(vo.getBoardingAddress());
+                xpOrder.setBoardingTime(vo.getBoardingTime());
+                xpOrder.setRideTime(vo.getBoardingTime());
+                redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.PASSENGER_BOARDED.getCode(), 24L, TimeUnit.HOURS);
+
+                XpVehicle xpVehicle1 = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+
+                //推送行起点到终点的驶轨迹给乘客端
+                sendRoute(xpOrder.getAppUserId() + "", xpOrder.getId(), "ORDER_NAVIGATION_END_DATA", xpVehicle1.getVehicleVin());
+                // 删除定时任务job
+                QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL);
+                //乘客已上车,重新倒计时不开始行程取消订单
+                XpPoint xpPoint1 = xpPointClient.queryById(xpOrder.getStartPointId()).getData();
+                XpTradingStrategy tradingStrategy = tradingStrategyClient.getTradingStrategyByCityCode(xpPoint1.getCityCode()).getData();
+                if (null != tradingStrategy) {
+                    Map<String, ? extends Object> cancelJobMaps1 =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", xpOrder.getId())
+                                    .build();
+                    QuartzManager.addJob(
+                            OrderCancelJob.class,
+                            (OrderCancelJob.name + xpOrder.getId()).toUpperCase(),
+                            TimeJobType.ORDER_CANCEL,
+                            DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(tradingStrategy.getBdNotBoardedTime())),
+                            cancelJobMaps1
+                    );
+                }
+                break;
+            case 6:
+                if (xpOrder.getStatus() != 5) {
+                    return R.fail("订单状态不允许改为服务中");
+                }
+                // 删除定时任务job
+                QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL);
+                xpOrder.setTripBegin(vo.getTripBegin());
+                redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.IN_SERVICE.getCode(), 24L, TimeUnit.HOURS);
+                String cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId());
+                if (StringUtils.isNotBlank(cacheObject)) {
+                    RouteVo routeVo1 = JSONObject.parseObject(cacheObject, RouteVo.class);
+                    xpOrder.setEstimatedArrivalTime(LocalDateTime.now().plusSeconds(routeVo1.getDuration()));
+                }
+                redisService.deleteObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId());
+                break;
+            case 7:
+                if (xpOrder.getStatus() != 6) {
+                    return R.fail("订单状态不允许改为待乘客下车");
+                }
+                if (null == vo.getTripEnd()) {
+                    return R.fail("行程结束时间不能为空");
+                }
+                if (null == vo.getGetoffLon()) {
+                    return R.fail("下车点经度不能为空");
+                }
+                if (null == vo.getGetoffLat()) {
+                    return R.fail("下车点纬度不能为空");
+                }
+                if (StringUtils.isEmpty(vo.getGetoffAddress())) {
+                    return R.fail("下车点地址不能为空");
+                }
+                if (null == vo.getGetoffTime()) {
+                    return R.fail("下车时间不能为空");
+                }
+                xpOrder.setGetoffTime(vo.getGetoffTime());
+                xpOrder.setGetoffLon(vo.getGetoffLon());
+                xpOrder.setGetoffLat(vo.getGetoffLat());
+                xpOrder.setGetoffAddress(vo.getGetoffAddress());
+                xpOrder.setTripEnd(vo.getTripEnd());
+                //计算行驶总距离和时长
+                List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(new Query().addCriteria(Criteria.where("orderId").is(xpOrder.getId())), OrderTrajectory.class);
+                Double reduce = orderTrajectoryList.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum);
+                xpOrder.setMileageKilometers(new BigDecimal(reduce).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN).doubleValue());
+                long duration = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - xpOrder.getTripBegin().toEpochSecond(ZoneOffset.of("+8"));
+                xpOrder.setDuration(new BigDecimal(duration).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
+
+                // 推送倒计时消息
+                Map<String, Object> params = new HashMap<>();
+                Map<String, Object> content = new HashMap<>();
+                content.put("orderId", xpOrder.getId().toString());
+                content.put("isOpen", 1);
+                params.put("type", PushMessageTypeEnum.OPEN_TRUNK.getDesc());
+                params.put("content", JSONObject.toJSONString(content));
+                params.put("timestamp", new Date().getTime() + "");
+                String message = JSONObject.toJSONString(params);
+                SendMessageDTO sendMessageDTO = new SendMessageDTO();
+                sendMessageDTO.setMessage(message);
+                sendMessageDTO.setAppUserId(String.valueOf(xpOrder.getAppUserId()));
+                R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
+                //推送失败,重试3次
+                if (stringR.getCode() != Constants.SUCCESS) {
+                    ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+                    executor.execute(() -> {
+                        for (int i = 0; i < 3; i++) {
+                            R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
+                            if (stringR1.getCode() == Constants.SUCCESS) {
+                                break;
+                            }
+                            try {
+                                Thread.sleep(1000);
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
+                            log.info("推送倒计时消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(sendMessageDTO), xpOrder.getOrderNumber());
+                        }
+                    });
+                }
+
+                Integer arriveTime = xpSystemSettingClient.getOrderFinishTime().getData();
+                // 添加自动结束行程定时任务job
+                Map<String, ? extends Object> endTripJobMaps =
+                        new ImmutableMap.Builder<String, String>()
+                                .put("id", xpOrder.getId().toString())
+                                .put("appid", appid)
+                                .put("orderType", OrderType.USER_ORDER)
+                                .build();
+                QuartzManager.addJob(
+                        EndTripJob.class,
+                        (EndTripJob.name + xpOrder.getId()).toUpperCase(),
+                        TimeJobType.END_TRIP,
+                        DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(arriveTime)),
+                        endTripJobMaps
+                );
+
+
+                // 添加车辆到达终点后限停时间到后驶离的定时任务
+                //时间到后将车辆状态回滚到空闲、添加巡游订单,解绑用户和车辆关系,车辆驶离点位
+                XpPoint point = xpPointClient.queryById(xpOrder.getEndPointId()).getData();
+                Map<String, ? extends Object> jobMaps =
+                        new ImmutableMap.Builder<String, String>()
+                                .put("id", xpOrder.getId().toString())
+                                .put("appid", appid)
+                                .put("orderType", OrderType.USER_ORDER)
+                                .build();
+
+                //判断是否有连环单
+                String json = redisService.getCacheObject(CacheConstants.nextOrder(xpOrder.getId().toString()));
+                if (StringUtils.isNotEmpty(json)) {
+                    JSONObject jsonObject = JSON.parseObject(json);
+                    Long id = jsonObject.getLong("orderId");
+                    jobMaps = new ImmutableMap.Builder<String, String>()
+                            .put("id", id.toString())
+                            .put("oldOrderId", xpOrder.getId().toString())
+                            .put("appid", appid)
+                            .put("orderType", OrderType.USER_ORDER)
+                            .build();
+
+                    QuartzManager.addJob(
+                            PushChainReactionOrderJob.class,
+                            (PushChainReactionOrderJob.name + id).toUpperCase(),
+                            TimeJobType.ADD_CHAIN_REACTION_ORDER_MISSION,
+                            DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
+                            jobMaps
+                    );
+                } else {
+                    QuartzManager.addJob(
+                            AddCruiseMissionJob.class,
+                            (AddCruiseMissionJob.name + xpOrder.getId()).toUpperCase(),
+                            TimeJobType.ADD_CRUISE_MISSION,
+                            DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
+                            jobMaps
+                    );
+                }
+                redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.SEE_OFF_GUESTS.getCode(), 24L, TimeUnit.HOURS);
+                break;
+            default:
+                return R.fail("无效的订单状态");
+        }
+        xpOrder.setStatus(vo.getOrderStatus());
+        this.updateById(xpOrder);
+        //推送订单状态给乘客端
+        Map<String, Object> params = new HashMap<>();
+        Map<String, Object> content = new HashMap<>();
+        content.put("orderId", xpOrder.toString());
+        content.put("status", vo.getOrderStatus());
+        params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
+        params.put("content", JSONObject.toJSONString(content));
+        params.put("timestamp", System.currentTimeMillis() + "");
+        String message = JSONObject.toJSONString(params);
+        SendMessageDTO dto1 = new SendMessageDTO();
+        dto1.setAppUserId(xpOrder.getAppUserId() + "");
+        dto1.setMessage(message);
+        R<String> stringR = xpPushMessageClient.sendStatus(dto1);
+
+        //推送失败,重试3次
+        if (stringR.getCode() != Constants.SUCCESS) {
+            ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+            executor.execute(() -> {
+                for (int i = 0; i < 3; i++) {
+                    R<String> stringR1 = xpPushMessageClient.sendStatus(dto1);
+                    if (stringR1.getCode() == Constants.SUCCESS) {
+                        break;
+                    }
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException(e);
+                    }
+                    log.info("推送订单状态消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(dto1), xpOrder.getOrderNumber());
+                }
+            });
+        }
+
+
+        return R.ok();
     }
 }

--
Gitblit v1.7.1