From 3adf8af01c01f19239c2bbb845e2fa5d2d04b168 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 07 三月 2026 14:54:40 +0800
Subject: [PATCH] 合并代码

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/job/base/QuartzManager.java                  |  222 ++++++++++++++++++++++----------------------
 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java |   16 ++
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java                     |   45 +++++---
 3 files changed, 153 insertions(+), 130 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/job/base/QuartzManager.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/job/base/QuartzManager.java
index 735e10d..4296c2f 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/job/base/QuartzManager.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/job/base/QuartzManager.java
@@ -7,122 +7,122 @@
 import java.util.Map;
 
 public class QuartzManager {
-	private static SchedulerFactory factory = new StdSchedulerFactory();
-	private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_";
-	private static final String JOB_NAME_PREFIX = "JOB_PREFIX_";
-	
-	/**
-	 * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息
-	 * 
-	 * @param jobName
-	 *            具体的任务名+ID标识唯一
-	 * @param jobType
-	 * @param date
-	 * @param jp
-	 */
-	public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date,
-                                           Map<String,  ? extends Object> jp) {
-		//logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
-		try {
-			Scheduler sched = factory.getScheduler();
-			JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType())
-					.setJobData(new JobDataMap(jp)).build();
+    private static SchedulerFactory factory = new StdSchedulerFactory();
+    private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_";
+    private static final String JOB_NAME_PREFIX = "JOB_PREFIX_";
 
-			SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
-					.withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build();
-			removeJob(jobName, jobType);
-			
-			sched.scheduleJob(job, trigger);
+    /**
+     * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息
+     *
+     * @param jobName 具体的任务名+ID标识唯一
+     * @param jobType
+     * @param date
+     * @param jp
+     */
+    public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date,
+                                           Map<String, ? extends Object> jp) {
+        //logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+        try {
+            Scheduler sched = factory.getScheduler();
+            JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType())
+                    .setJobData(new JobDataMap(jp)).build();
 
-			if (!sched.isShutdown()) {
-				sched.start();
-			}
-		} catch (Exception e) {
-			//logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
-		}
-	}
-	
-	   /**
-	    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
-	    * @param jobName 
-	    * @param time 
-	    */  
-	    public synchronized static void modifyJobTime(String jobName,TimeJobType jobType, Date time) {  
-	    	 //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
-	        try {  
-	        	JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
-				TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
-				
-				
-	            Scheduler sched = factory.getScheduler();  
-	            SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key);  
-	            if(trigger == null) {  
-	                return;  
-	            }  
-	            Date oldTime = trigger.getStartTime();
-	          
-	            if (oldTime.getTime() != time.getTime()) {  
-	                JobDetail jobDetail = sched.getJobDetail(jobKey);  
-	                Class<? extends Job> objJobClass = jobDetail.getJobClass();  
-	                removeJob(jobName,jobType);  
-	                Map<String, Object> jp = jobDetail.getJobDataMap();
-	                addJob(objJobClass, jobName, jobType, time, jp); 
-	            }  
-	        } catch (Exception e) {  
-	           // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
-	        }  
-	    }
+            SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
+                    .withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build();
+            removeJob(jobName, jobType);
 
-	/**
-	 * 移除一个任务
-	 * 
-	 * @param jobName
-	 */
-	public synchronized static void removeJob(String jobName, TimeJobType jobType) {
-		try {
-			JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
-			TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
-			Scheduler sched = factory.getScheduler();
+            sched.scheduleJob(job, trigger);
 
-			JobDetail detail = sched.getJobDetail(jobKey);
-			if (detail != null) {
-				sched.pauseJob(jobKey);
-				sched.pauseTrigger(key);// 停止触发器
-				sched.unscheduleJob(key);// 移除触发器
-				sched.deleteJob(jobKey);// 删除任务
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new RuntimeException(e);
-		}
-	}
+            if (!sched.isShutdown()) {
+                sched.start();
+            }
+        } catch (Exception e) {
+            //logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+        }
+    }
 
-	/**
-	 * 启动所有定时任务
-	 */
-	public synchronized static void startJobs() {
-		try {
-			Scheduler sched = factory.getScheduler();
-			sched.start();
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new RuntimeException(e);
-		}
-	}
+    /**
+     * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
+     *
+     * @param jobName
+     * @param time
+     */
+    public synchronized static void modifyJobTime(String jobName, TimeJobType jobType, Date time) {
+        //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+        try {
+            JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+            TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
 
-	/**
-	 * 关闭所有定时任务
-	 */
-	public synchronized static void shutdownJobs() {
-		try {
-			Scheduler sched = factory.getScheduler();
-			if (!sched.isShutdown()) {
-				sched.shutdown();
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new RuntimeException(e);
-		}
-	}
+
+            Scheduler sched = factory.getScheduler();
+            SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key);
+            if (trigger == null) {
+                return;
+            }
+            Date oldTime = trigger.getStartTime();
+
+            if (oldTime.getTime() != time.getTime()) {
+                JobDetail jobDetail = sched.getJobDetail(jobKey);
+                Class<? extends Job> objJobClass = jobDetail.getJobClass();
+                removeJob(jobName, jobType);
+                Map<String, Object> jp = jobDetail.getJobDataMap();
+                addJob(objJobClass, jobName, jobType, time, jp);
+            }
+        } catch (Exception e) {
+            // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+        }
+    }
+
+    /**
+     * 移除一个任务
+     *
+     * @param jobName
+     */
+    public synchronized static void removeJob(String jobName, TimeJobType jobType) {
+        try {
+            JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+            TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+            Scheduler sched = factory.getScheduler();
+
+            JobDetail detail = sched.getJobDetail(jobKey);
+            if (detail != null) {
+                sched.pauseJob(jobKey);
+                sched.pauseTrigger(key);// 停止触发器
+                sched.unscheduleJob(key);// 移除触发器
+                sched.deleteJob(jobKey);// 删除任务
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 启动所有定时任务
+     */
+    public synchronized static void startJobs() {
+        try {
+            Scheduler sched = factory.getScheduler();
+            sched.start();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 关闭所有定时任务
+     */
+    public synchronized static void shutdownJobs() {
+        try {
+            Scheduler sched = factory.getScheduler();
+            if (!sched.isShutdown()) {
+                sched.shutdown();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
 
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
index e73ad23..44325f8 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -6,11 +6,13 @@
 import com.xiaopeng.api.dto.map.RouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
+import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
 import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto;
 import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.operation.XpElectronicFence;
@@ -81,6 +83,9 @@
     //
     @Resource
     private OrderMissionClient orderMissionClient;
+
+    @Resource
+    private XpPushMessageClient xpPushMessageClient;
 
     @Resource
     private XpElectronicFenceMapper xpElectronicFenceMapper;
@@ -181,9 +186,15 @@
         // 取消订单
         R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.valueOf(orderId));
         if (xpOrderR.getCode() == 200) {
-            if (xpOrderR.getData().getStatus() == 1) {
+            XpOrder xpOrder = xpOrderR.getData();
+            if (xpOrder.getStatus() == 1) {
                 log.info("五轮推单结束,无车辆接单,执行取消订单 {}", orderNo);
                 xpOrderClient.cancelOrder(orderId);
+                //推送订单状态给乘客
+                SendMessageDTO dto = new SendMessageDTO();
+                dto.setAppUserId(xpOrder.getAppUserId().toString());
+                dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":0}\",\"timestamp\":\"" + System.currentTimeMillis() + "\"}");
+                xpPushMessageClient.sendStatus(dto);
                 //将订单从队列中移除
                 log.info("五轮推单结束,无车辆接单,执行队列移除订单 {}", orderNo);
                 redisService.popFirstElement(quoteName);
@@ -204,7 +215,7 @@
      */
     @SneakyThrows
     private void processPushOrder(String quoteName, int count, int sleepTime, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) {
-        System.out.println("进入推单环节");
+        log.info("进入推单环节 单号 {}", orderNo);
         if (count == 0) {
             count = 1;
         }
@@ -226,13 +237,13 @@
         for (int i = 0; i < count; i++) {
             //等到sleepTime秒钟
             Thread.sleep(sleepTime * 1000);
-            System.out.println("进入找车环节");
+            log.info("进入找车环节 单号 {}", orderNo);
             // 根据距离找车
             // 车多则根据配置找具体车数量 根据距离最近
             // 更改 暂不限制数量
 
             List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount());
-            log.info("根据距离找车 距离 {}KM  经度 {} 维度 {} 查找结果 {}", xpTradingStrategy.getOnePushDistance(), split[0], split[1], positionList);
+            log.info("根据距离找车 {} 距离 {}KM  经度 {} 维度 {} 查找结果 {} 单号 {}", orderNo, xpTradingStrategy.getOnePushDistance(), split[0], split[1], positionList, orderNo);
             // 获取车辆的区域信息
             if (positionList.isEmpty()) {
                 continue;
@@ -241,7 +252,7 @@
 
             // 获取车辆的信息 筛选出可用车辆
             R<List<String>> vehiclePositionVos = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount()));
-            log.info("筛选可用车辆结果 {}", JSON.toJSONString(vehiclePositionVos));
+            log.info("筛选可用车辆结果 {} 单号 {}", JSON.toJSONString(vehiclePositionVos), orderNo);
             if (vehiclePositionVos.getCode() != 200) {
                 continue;
             }
@@ -255,7 +266,7 @@
 
             if (!availableVehiclesNearby.isEmpty()) {
                 if (availableVehiclesNearby.size() > 1) {
-                    log.info("附近有 {} 辆车,进入权重判断流程", availableVehiclesNearby.size());
+                    log.info("附近有 {} 辆车,进入权重判断流程 单号 {}", availableVehiclesNearby.size(), orderNo);
                     // 走权重
 
                     // 订单价值
@@ -738,7 +749,7 @@
 
                     RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
                     lock.lock(10, TimeUnit.SECONDS);
-                    System.err.println("队列:" + quoteName + "  车辆:" + vehiclePositionVo.getVin() + "订单" + orderNo);
+                    log.info("队列 {} 车辆 {} 单号 {}", quoteName, vehiclePositionVo.getVin(), orderNo);
                     try {
 //                        VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
                         R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
@@ -746,15 +757,15 @@
                             continue;
                         }
                         XpVehicle vehiclePosition = vehiclePositionR.getData();
-                        log.info("符合条件的车辆 {} ,直接推单XPU", vehiclePosition.getPlateNumber());
-                        log.info("当前车辆状态 {}", vehiclePosition.getStatus());
+                        log.info("符合条件的车辆 {} ,直接推单XPU。单号 {}", vehiclePosition.getPlateNumber(), orderNo);
+                        log.info("当前车辆状态 {} 单号 {}", vehiclePosition.getStatus(), orderNo);
                         if (vehiclePosition.getStatus() != 1 || vehiclePosition.getState() != 0 || vehiclePosition.getVehicleType()==1) {
                             continue;
                         }
                         //  关闭巡游单子
                         R<String> stringR = xpCruiseOrderClient.updateCruiseOrder(vehiclePosition.getVehicleVin());
                         if(stringR ==null || stringR.getData()==null){
-                            log.info("关闭巡游单子失败");
+                            log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
                             continue;
                         }
 
@@ -770,10 +781,10 @@
                         pushOrderDto.setStage(1);
                         // 调用推送服务  orderId + carVin
 //                        orderMissionClient.pushOrder(pushOrderDto);
-                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
+                        log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
 
                         redisService.popFirstElement(quoteName);
-                        log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName);
+                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                         return;
                     } catch (Exception e) {
                         e.printStackTrace();
@@ -795,15 +806,15 @@
                             continue;
                         }
                         XpVehicle vehicleId1 = vehicleR.getData();
-                        log.info("附近只有一个车辆 {} ,直接推单XPU", vehicleId1.getPlateNumber());
-                        log.info("当前车辆状态 {} 运营状态 {}", vehicleId1.getOperatingStatus(), vehicleId1.getState());
+                        log.info("附近只有一个车辆 {} ,直接推单XPU。单号 {}", vehicleId1.getPlateNumber(), orderNo);
+                        log.info("当前车辆状态 {} 运营状态 {} 单号 {}", vehicleId1.getOperatingStatus(), vehicleId1.getState(), orderNo);
                         if (vehicleId1.getOperatingStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType()==1) {
                             continue;
                         }
                         //  关闭巡游单子
                         R<String> stringR = xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin());
                         if(stringR ==null || stringR.getData()==null){
-                            log.info("关闭巡游单子失败");
+                            log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
                             continue;
                         }
 
@@ -818,9 +829,9 @@
                         pushOrderDto.setStage(1);
                         // 调用推送服务  orderId + carVin
 //                        orderMissionClient.pushOrder(pushOrderDto);
-                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
+                        log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
                         redisService.popFirstElement(quoteName);
-                        log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName);
+                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                         return;
                     } catch (Exception e) {
                         e.printStackTrace();
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
index f63e701..35f3d4d 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -9,7 +9,7 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
+import com.mongodb.client.MongoCollection;import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
 import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
 import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto;
 import com.xiaopeng.api.feignClient.maintenance.XpChargingRecordClient;
@@ -42,7 +42,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
 import org.apache.poi.ss.usermodel.Workbook;
-import org.springframework.beans.BeanUtils;
+import org.bson.Document;import org.springframework.beans.BeanUtils;
 import org.springframework.context.MessageSource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.i18n.LocaleContextHolder;
@@ -742,4 +742,16 @@
         return R.ok();
     }
 
+
+    /**
+     * 删除mongodb中的文档
+     * @param collectionName
+     * @return
+     */
+    @PostMapping("/base/vi/removeMongodb")
+    public R<?> removeMongodb(String collectionName){
+        MongoCollection<Document> collection = mongoTemplate.getCollection(collectionName);
+        collection.drop();
+        return R.ok();
+    }
 }

--
Gitblit v1.7.1