From 915599e28042d8b47774f7fe695a7019d81efbda Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期三, 25 三月 2026 20:42:57 +0800
Subject: [PATCH] bugfix

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java |  167 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 111 insertions(+), 56 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 a60d610..b7604c1 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
@@ -323,38 +323,58 @@
                 }
 
                 // 构建通知内容
-                String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), processingTimeLimit);
-                String bodyJson = buildAccidentPushBodyJson(content, xpTask);
-
-                // 构建通知记录(包含 notificationExt)
-                List<XpOperationsUserNotification> notifications = data.stream().map(item -> {
-                    XpOperationsUserNotification notification = new XpOperationsUserNotification();
-                    notification.setOperationsUserId(item.getId());
-                    notification.setNotificationType(NotificationTypeEnum.ACCIDENT_NEW.getCode());
-                    notification.setNotificationContent(content);
-                    notification.setDataId(xpTask.getId());
-                    notification.setReadStatus(0);
-                    notification.setNotificationExt(bodyJson);
-                    return notification;
-                }).collect(Collectors.toList());
-
-                // 批量保存通知记录
-                xpOperationUserNotificationClient.addNotificationBatch(notifications);
-                log.info("事故通知记录保存成功,共 {} 条", notifications.size());
-
-                // 按设备类型分组发送阿里云推送
-                Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream()
-                        .filter(u -> u.getDeviceType() != null && u.getPhoneNumber() != null)
-                        .collect(Collectors.groupingBy(XpOperationsUser::getDeviceType));
-                for (Map.Entry<Integer, List<XpOperationsUser>> entry : operationUserMap.entrySet()) {
-                    pushAliMessage(entry.getValue(), content, xpTask);
-                }
+                String content = buildAccidentNotificationContent(xpTask, plateNumber, processingTimeLimit);
+                saveAndPushAccidentNotification(data, content, xpTask);
             } catch (Exception e) {
                 log.error("发送事故通知失败,任务ID={}", xpTask.getId(), e);
             }
         });
 
         executor.shutdown();
+    }
+
+    /**
+     * 异步发送事故任务分配通知
+     *
+     * @param xpTask 任务信息
+     * @param handlerUserId 当前分配的处理人
+     * @param plateNumber 车牌号
+     * @param processingTimeLimit 处理时限(分钟)
+     */
+    private void sendAssignedAccidentNotificationAsync(XpTask xpTask, Long handlerUserId, String plateNumber, Integer processingTimeLimit) {
+        ThreadPoolExecutor executor = new ThreadPoolExecutor(
+                1, 1, 0L, TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<Runnable>()
+        );
+
+        executor.execute(() -> {
+            try {
+                R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(Collections.singletonList(handlerUserId));
+                List<XpOperationsUser> data = xpOperationUserResult == null ? Collections.emptyList() : xpOperationUserResult.getData();
+                if (CollUtil.isEmpty(data)) {
+                    return;
+                }
+
+                String content = buildAccidentNotificationContent(xpTask, plateNumber, processingTimeLimit);
+                saveAndPushAccidentNotification(data, content, xpTask);
+            } catch (Exception e) {
+                log.error("发送事故任务分配通知失败,任务ID={}, handlerUserId={}", xpTask.getId(), handlerUserId, e);
+            }
+        });
+
+        executor.shutdown();
+    }
+
+    /**
+     * 构建事故通知文案
+     *
+     * @param xpTask 任务信息
+     * @param plateNumber 车牌号
+     * @param processingTimeLimit 处理时限(分钟)
+     * @return 通知内容
+     */
+    private String buildAccidentNotificationContent(XpTask xpTask, String plateNumber, Integer processingTimeLimit) {
+        return String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), processingTimeLimit);
     }
 
     /**
@@ -370,6 +390,40 @@
         param.put("type", TaskTypeNotificationEnum.ACCIDENT_TASK.getCode());
         param.put("id", xpTask.getId().toString());
         return JSONObject.toJSONString(param);
+    }
+
+    /**
+     * 保存事故通知记录并发送阿里云推送
+     *
+     * @param data 接收通知的运维人员
+     * @param content 通知内容
+     * @param xpTask 任务信息
+     */
+    private void saveAndPushAccidentNotification(List<XpOperationsUser> data, String content, XpTask xpTask) {
+        String bodyJson = buildAccidentPushBodyJson(content, xpTask);
+
+        List<XpOperationsUserNotification> notifications = data.stream().map(item -> {
+            XpOperationsUserNotification notification = new XpOperationsUserNotification();
+            notification.setOperationsUserId(item.getId());
+            notification.setNotificationType(NotificationTypeEnum.ACCIDENT_NEW.getCode());
+            notification.setNotificationContent(content);
+            notification.setDataId(xpTask.getId());
+            notification.setReadStatus(0);
+            notification.setNotificationExt(bodyJson);
+            return notification;
+        }).collect(Collectors.toList());
+
+        if (CollUtil.isNotEmpty(notifications)) {
+            xpOperationUserNotificationClient.addNotificationBatch(notifications);
+            log.info("事故通知记录保存成功,共 {} 条", notifications.size());
+        }
+
+        Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream()
+                .filter(u -> u.getDeviceType() != null && StringUtils.isNotBlank(u.getPhoneNumber()))
+                .collect(Collectors.groupingBy(XpOperationsUser::getDeviceType));
+        for (Map.Entry<Integer, List<XpOperationsUser>> entry : operationUserMap.entrySet()) {
+            pushAliMessage(entry.getValue(), content, xpTask);
+        }
     }
 
     /**
@@ -1523,16 +1577,41 @@
     @Override
     public R assigneeTask(Long id, Long handlerUserId, Long assigneeUserId) {
         XpTask task = this.getById(id);
-        // 查询规则 任务结束时间从任务分配时开始计算
-        XpTaskRule taskRule = xpTaskRuleMapper.selectOne(null);
-        if (taskRule != null) {
-            task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()));
+        if (task == null) {
+            throw new ServiceException(
+                    "任务不存在",
+                    I18nKeyConstant.TASK_NOT_EXIST
+            );
+        }
+
+        boolean isAccidentTask = Integer.valueOf(2).equals(task.getTaskCategory());
+        Long vehicleId = task.getVehicleId();
+        Integer processingTimeLimit = null;
+        String plateNumber = "";
+        if (isAccidentTask) {
+            // 查询规则 任务结束时间从任务分配时开始计算
+            XpTaskRule taskRule = xpTaskRuleMapper.selectOne(null);
+            if (taskRule != null) {
+                processingTimeLimit = taskRule.getProcessingTimeLimit();
+                task.setEndTime(LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit()));
+            }
+            if (vehicleId != null) {
+                XpVehicle vehicle = xpVehicleClient.queryById(vehicleId).getData();
+                if (vehicle != null && StringUtils.isNotBlank(vehicle.getPlateNumber())) {
+                    plateNumber = vehicle.getPlateNumber();
+                }
+            }
+        } else {
+            task.setEndTime(LocalDateTime.now().plusDays(3));
         }
         task.setAssigneeTime(LocalDateTime.now());
         task.setHandleUserId(handlerUserId.toString());
         task.setVehicleId(null);
         task.setAssigneeUserId(assigneeUserId);
         this.updateById(task);
+        if (isAccidentTask && processingTimeLimit != null) {
+            sendAssignedAccidentNotificationAsync(task, handlerUserId, plateNumber, processingTimeLimit);
+        }
         return R.ok();
     }
 
@@ -1585,19 +1664,7 @@
                     I18nKeyConstant.VEHICLE_NOT_EXIST
             );
         }
-        String vehiclePicture = vehicle.getVehiclePictures();
-        if (vehicle.getVehiclePictures() != null) {
-            JSONObject jsonObject = JSONObject.parseObject(vehicle.getVehiclePictures());
-            // 1
-            String downloadUrl = jsonObject.getString("url");
-            try {
-                downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
-            } catch (UnsupportedEncodingException e) {
-                log.error("获取图片下载地址失败", e);
-            }
-            jsonObject.put("url", downloadUrl);
-            vehiclePicture = jsonObject.toJSONString();
-        }
+        String vehiclePicture = aliOssDownloadUtil.getPictureJSONObject(vehicle.getVehiclePictures());
         if (task.getTaskCategory() == 1) {
             // 常规任务
 
@@ -1613,19 +1680,7 @@
                     taskManagementDetectionDetailVO.setVehicleCode(vehicle.getVehicleCode());
                     taskManagementDetectionDetailVO.setVehicleVin(vehicle.getVehicleVin());
                     taskManagementDetectionDetailVO.setVehicleLocation(task.getVehicleLocation());
-
-                    if (vehicle.getVehiclePictures() != null) {
-                        JSONObject jsonObject = JSONObject.parseObject(vehicle.getVehiclePictures());
-                        // 1
-                        String downloadUrl = jsonObject.getString("url");
-                        try {
-                            downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
-                        } catch (UnsupportedEncodingException e) {
-                            log.error("获取图片下载地址失败", e);
-                        }
-                        jsonObject.put("url", downloadUrl);
-                        taskManagementDetectionDetailVO.setVehiclePictures(jsonObject.toJSONString());
-                    }
+                    taskManagementDetectionDetailVO.setVehiclePictures(vehiclePicture);
 
                     taskManagementDetectionDetailVO.setTaskCode(task.getTaskCode());
                     XpVehicleDetection vehicleDetection = vehicleDetectionMapper.selectOne(new LambdaQueryWrapper<XpVehicleDetection>()

--
Gitblit v1.7.1