From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java |   97 ++++++++++++++++++++++++++----------------------
 1 files changed, 52 insertions(+), 45 deletions(-)

diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
index 86df48e..5857f88 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -261,20 +261,20 @@
             throw new ServiceException("上报失败,未获取到车辆信息", I18nKeyConstant.TASK_VEHICLE_NOT_EXIST);
         }
         String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicle.getVehicleVin());
-         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
-         if (Objects.isNull(vehiclePosition)) {
-             log.error("事故上报未获取到车辆当前定位");
-             throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
-         }
-         xpTask.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
-         xpTask.setVehicleLat(new BigDecimal(vehiclePosition.getPoint().getY()));
-         Map<String, String> geocode = gdMapGeocodingUtil.geocode(xpTask.getVehicleLon().toString(), xpTask.getVehicleLat().toString());
-         String address = geocode == null ? null : geocode.get("address");
-         if (StringUtils.isBlank(address)) {
-             log.error("事故上报通过车辆定位从高德获取地址信息失败");
-             throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
-         }
-         xpTask.setVehicleLocation(address);
+        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+        if (Objects.isNull(vehiclePosition)) {
+            log.error("事故上报未获取到车辆当前定位");
+            throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
+        }
+        xpTask.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
+        xpTask.setVehicleLat(new BigDecimal(vehiclePosition.getPoint().getY()));
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(xpTask.getVehicleLon().toString(), xpTask.getVehicleLat().toString());
+        String address = geocode == null ? null : geocode.get("address");
+        if (StringUtils.isBlank(address)) {
+            log.error("事故上报通过车辆定位从高德获取地址信息失败");
+            throw new ServiceException("获取车辆实时定位信息失败,请稍后重试", I18nKeyConstant.TASK_SAVE_ERROR);
+        }
+        xpTask.setVehicleLocation(address);
 // 临时处理
 //        xpTask.setVehicleLon(new BigDecimal("104.055683"));
 //        xpTask.setVehicleLat(new BigDecimal("30.585991"));
@@ -298,7 +298,7 @@
             List<Long> userIds = xpOperationsRoleResult.getData().stream().filter(x -> ids.contains(x.getOperationsUserId()))
                     .map(XpOperationsRole::getOperationsUserId)
                     .distinct().collect(Collectors.toList());
-            if(CollUtil.isEmpty(userIds)){
+            if (CollUtil.isEmpty(userIds)) {
                 throw new ServiceException("未配置车队运维人员");
             }
             //获取首选人的实时定位,计算每个人到事故车辆位置的导航距离
@@ -306,33 +306,39 @@
             for (Long userId : userIds) {
                 Operations operations = new Operations();
                 operations.setUserId(userId);
+                //获取运维人员实时定位
                 XpOperationsUserPositionDTO operationsUserPositionDTO = mongoTemplate.findOne(new Query(Criteria.where("id").is(userId)), XpOperationsUserPositionDTO.class);
-                if(null != operationsUserPositionDTO){
+                if (null != operationsUserPositionDTO) {
                     LonLatDto start = new LonLatDto(operationsUserPositionDTO.getLongitude(), operationsUserPositionDTO.getLatitude());
                     LonLatDto end = new LonLatDto(xpTask.getVehicleLon().doubleValue(), xpTask.getVehicleLat().doubleValue());
+                    //获取导航线路
                     RouteVo routeVo = gdMapGeocodingUtil.getDistanceAndTime(start, end, null, null, null, null);
                     operations.setDistance(routeVo.getDistance());
+                    operationsList.add(operations);
                 }
-                operationsList.add(operations);
             }
+            if(operationsList.isEmpty()){
+                throw new ServiceException("未找到合适的运维人员");
+            }
+
             //对距离进行排序,去距离最近的人员
             operationsList.sort((o1, o2) -> o1.getDistance().compareTo(o2.getDistance()) * -1);
             Operations operations = operationsList.get(0);
             Long userId = operations.getUserId();
             //如果多人距离相同,可按照上班状态>空闲状态>工号排序
             List<Operations> collect = operationsList.stream().filter(s -> s.getDistance().equals(operations.getDistance())).collect(Collectors.toList());
-            if(collect.size() > 1){
+            if (collect.size() > 1) {
                 //查询已经上班打卡了的人员
                 List<XpClockIn> xpClockIns = xpClockInService.list(new QueryWrapper<XpClockIn>().in("app_user_id", collect)
-                        .isNull("clock_out_result").last(" and DATE(now()) = DATE(clock_in_time)"));
-                if(xpClockIns.size() == 1){
+                        .isNull("clock_out_result").last(" and DATE(now()) = DATE(clock_in_time) and clock_out_time is null"));
+                if (xpClockIns.size() == 1) {
                     userId = xpClockIns.get(0).getAppUserId();
-                }else if(xpClockIns.size() > 1){
+                } else if (xpClockIns.size() > 1) {
                     //查询有任务的人员
                     List<Long> collect1 = xpClockIns.stream().map(XpClockIn::getAppUserId).collect(Collectors.toList());
                     List<XpTask> list1 = this.list(new QueryWrapper<XpTask>().eq("task_category", 2).in("handle_user_id", collect1)
                             .in("status", Arrays.asList(0, 1, 4)));
-                    if(list1.size() > 0){
+                    if (list1.size() > 0) {
                         //对工号进行排序
                         List<String> collect2 = list1.stream().map(XpTask::getHandleUserId).collect(Collectors.toList());
                         //找出没有任务的人员
@@ -354,7 +360,7 @@
         xpTask.setExpiredNoticeSent(0);
         xpTask.setWillTimeoutNoticeSent(0);
         this.save(xpTask);
-        if (xpTask.getId() == null && StringUtils.isNotBlank(xpTask.getTaskCode())) {
+        if (xpTask.getId() == null && StringUtils.isNotEmpty(xpTask.getTaskCode())) {
             XpTask savedTask = this.getOne(new LambdaQueryWrapper<XpTask>()
                     .eq(XpTask::getTaskCode, xpTask.getTaskCode())
                     .last("limit 1"));
@@ -467,11 +473,11 @@
     }
 
 
-
     /**
      * 异步发送事故通知
-     * @param xpTask 任务信息
-     * @param plateNumber 车牌号
+     *
+     * @param xpTask              任务信息
+     * @param plateNumber         车牌号
      * @param processingTimeLimit 处理时限(分钟)
      */
     private void sendAccidentNotificationAsync(XpTask xpTask, String plateNumber, Integer processingTimeLimit) {
@@ -507,9 +513,9 @@
     /**
      * 异步发送事故任务分配通知
      *
-     * @param xpTask 任务信息
-     * @param handlerUserId 当前分配的处理人
-     * @param plateNumber 车牌号
+     * @param xpTask              任务信息
+     * @param handlerUserId       当前分配的处理人
+     * @param plateNumber         车牌号
      * @param processingTimeLimit 处理时限(分钟)
      */
     private void sendAssignedAccidentNotificationAsync(XpTask xpTask, Long handlerUserId, String plateNumber, Integer processingTimeLimit) {
@@ -539,8 +545,8 @@
     /**
      * 构建事故通知文案
      *
-     * @param xpTask 任务信息
-     * @param plateNumber 车牌号
+     * @param xpTask              任务信息
+     * @param plateNumber         车牌号
      * @param processingTimeLimit 处理时限(分钟)
      * @return 通知内容
      */
@@ -550,8 +556,9 @@
 
     /**
      * 构建事故推送 body JSON
+     *
      * @param content 消息内容
-     * @param xpTask 任务信息
+     * @param xpTask  任务信息
      * @return JSON 字符串
      */
     private String buildAccidentPushBodyJson(String content, XpTask xpTask) {
@@ -566,9 +573,9 @@
     /**
      * 保存事故通知记录并发送阿里云推送
      *
-     * @param data 接收通知的运维人员
+     * @param data    接收通知的运维人员
      * @param content 通知内容
-     * @param xpTask 任务信息
+     * @param xpTask  任务信息
      */
     private void saveAndPushAccidentNotification(List<XpOperationsUser> data, String content, XpTask xpTask) {
         String bodyJson = buildAccidentPushBodyJson(content, xpTask);
@@ -1644,7 +1651,7 @@
         XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
 
         int type = 9;
-        if(task.getTaskCategory() != 2) {
+        if (task.getTaskCategory() != 2) {
             type = Integer.parseInt(task.getTaskTypeId());
         }
 
@@ -1655,7 +1662,7 @@
         }
 
         List<XpTask.Reject> rejects = Optional.ofNullable(task.getExcluded()).orElse(new ArrayList<>());
-        if(msg != null && Strings.isNotBlank(task.getHandleUserId())) {
+        if (msg != null && Strings.isNotBlank(task.getHandleUserId())) {
             XpTask.Reject reject = task.reject(msg);
             rejects.add(reject);
             List<Long> id = Collections.singletonList(Long.parseLong(task.getHandleUserId()));
@@ -1682,13 +1689,13 @@
 //        vehiclePosition.setPoint(new GeoJsonPoint(103.12615621, 30.264561));
         String handlerUser = chooseNearestAvailableOperationsUser(belongUserIds, vehiclePosition);
         task.setHandleUserId(handlerUser);
-        if(handlerUser == null) {
+        if (handlerUser == null) {
             task.setStatus(4);
             task.setReassignmentStatus(1);
             noticeAdministrator(task);//TODO 需要通知管理员手动处理,考虑再AliPushUtil 中给管理员发送消息
         }
         updateById(task);
-        if(StringUtils.isNotBlank(task.getHandleUserId())){
+        if (StringUtils.isNotBlank(task.getHandleUserId())) {
             sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
         }
     }
@@ -1729,7 +1736,7 @@
         task.setVehicleLon(new BigDecimal(vehiclePosition.getPoint().getX()));
         String handlerUser = chooseNearestAvailableOperationsUser(belongUserIds, vehiclePosition);
         task.setHandleUserId(handlerUser);
-        if(handlerUser == null) {
+        if (handlerUser == null) {
             task.setStatus(4);
             task.setReassignmentStatus(1);
             noticeAdministrator(task);
@@ -1745,7 +1752,7 @@
         task.setCreateTime(LocalDateTime.now());
         this.save(task);
         // 异步发送消息通知
-         sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
+        sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
     }
 
     @Override
@@ -1755,7 +1762,7 @@
         XpTask task = getById(Long.valueOf(taskId));
         XpVehicle vehicle = xpVehicleClient.queryById(task.getVehicleId()).getData();
         updateTaskStatus(task.getId(), TaskScheduleConstants.TASK_STATUS_PENDING_ARRIVE, Long.valueOf(task.getHandleUserId()));
-        sendAccidentNotificationAsync(getById(task.getId()), vehicle.getPlateNumber(), (int) Duration.between(LocalDateTime.now(),task.getEndTime()).toMinutes());
+        sendAccidentNotificationAsync(getById(task.getId()), vehicle.getPlateNumber(), (int) Duration.between(LocalDateTime.now(), task.getEndTime()).toMinutes());
     }
 
     @Override
@@ -1855,7 +1862,6 @@
     }
 
 
-
     @Override
     public R assigneeTask(Long id, Long handlerUserId, Long assigneeUserId) {
         XpTask task = this.getById(id);
@@ -1933,7 +1939,7 @@
 
         for (XpTask task : saveTask) {
 
-            reassign(task.getId(),null);
+            reassign(task.getId(), null);
         }
     }
 
@@ -2411,15 +2417,16 @@
 
     /**
      * 任务改派操作
+     *
      * @param vo
      */
     @Override
     public void taskReassignment(TaskReassignmentVo vo) {
         XpTask xpTask = this.getById(vo.getTaskId());
-        if(null == xpTask){
+        if (null == xpTask) {
             throw new ServiceException("无效的任务", I18nKeyConstant.TASK_NOT_EXIST);
         }
-        if(2 == xpTask.getReassignmentStatus()){
+        if (2 == xpTask.getReassignmentStatus()) {
             throw new ServiceException("任务已改派,不能重复操作", I18nKeyConstant.TASK_HAS_BEEN_REASSIGNED);
         }
         xpTask.setReassignmentStatus(2);

--
Gitblit v1.7.1