From 6ea173d8ab701176f2ea09ff6fcdf8e16ecf0ae0 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 27 二月 2026 20:46:56 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java |   98 ++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 81 insertions(+), 17 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 d91c63f..f21f1eb 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
@@ -1,17 +1,27 @@
 package com.xiaopeng.maintenance.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiaopeng.api.dto.pushMessage.AliPushMessageDTO;
 import com.xiaopeng.api.feignClient.account.SysUserClient;
 import com.xiaopeng.api.feignClient.account.XpOperationUserClient;
+import com.xiaopeng.api.feignClient.account.XpOperationUserNotificationClient;
+import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.account.SysUser;
+import com.xiaopeng.api.model.account.XpOperationsRole;
 import com.xiaopeng.api.model.account.XpOperationsUser;
+import com.xiaopeng.api.model.account.XpOperationsUserNotification;
 import com.xiaopeng.api.model.maintenance.*;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
+import com.xiaopeng.common.core.constant.AliPushTypeConstant;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.enums.NotificationTypeEnum;
 import com.xiaopeng.common.core.enums.TaskTypeEnum;
+import com.xiaopeng.common.core.enums.TaskTypeNotificationEnum;
 import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.maintenance.constant.I18nKeyConstant;
@@ -25,6 +35,8 @@
 import com.xiaopeng.maintenance.model.query.WorkBenchQuery;
 import com.xiaopeng.maintenance.model.query.XpTaskRecordPageQuery;
 import com.xiaopeng.maintenance.model.vo.*;
+import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
+import com.xiaopeng.maintenance.service.IXpTaskRuleService;
 import com.xiaopeng.maintenance.service.XpTaskService;
 import com.xiaopeng.maintenance.utils.UUIDUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -57,22 +69,6 @@
     private RedissonClient redissonClient;
     @Autowired
     private XpErrorTypeMapper errorTypeMapper;
-    /**
-     * 常规任务类型映射
-     */
-    private static final Map<String, String> TASK_TYPE_MAP = new java.util.HashMap<>();
-
-    static {
-        TASK_TYPE_MAP.put("1", "车辆检查");
-        TASK_TYPE_MAP.put("2", "车辆充电");
-        TASK_TYPE_MAP.put("3", "车辆整备");
-        TASK_TYPE_MAP.put("4", "整备洗车");
-        TASK_TYPE_MAP.put("5", "车辆维修");
-        TASK_TYPE_MAP.put("6", "车辆保养");
-        TASK_TYPE_MAP.put("7", "车辆保险到期");
-        TASK_TYPE_MAP.put("8", "车辆年检到期");
-        TASK_TYPE_MAP.put("9", "车辆运营资质到期");
-    }
 
     @Autowired
     private XpTaskHandleDetailMapper xpTaskHandleDetailMapper;
@@ -98,6 +94,14 @@
     private XpVehicleClient xpVehicleClient;
     @Autowired
     private XpTaskRuleMapper xpTaskRuleMapper;
+    @Autowired
+    private XpAliPushMessageClient xpAliPushMessageClient;
+    @Autowired
+    private XpOperationUserNotificationClient xpOperationUserNotificationClient;
+    @Autowired
+    private IXpTaskRuleRoleService xpTaskRuleRoleService;
+    @Autowired
+    private IXpTaskRuleService xpTaskRuleService;
 
     @Override
     public PageInfo<WorkBenchVO> workbench(WorkBenchQuery query) {
@@ -162,14 +166,74 @@
         xpTask.setTaskDescription(dto.getTaskDescription());
         // todo 获取车辆当前位置
 //        xpTask.setVehicleLocation();
-//        xpTask.setVehicleId();
+       xpTask.setVehicleId(dto.getId());
 //        xpTask.setVehicleLon();
 //        xpTask.setVehicleLat();
         xpTask.setReportUserId(xpOperationsUser.getId());
         xpTask.setReportTime(LocalDateTime.now());
         xpTask.setStatus(0);
         xpTask.setCreateBy(xpOperationsUser.getNickName());
+        XpTaskRule taskRule = xpTaskRuleService.lambdaQuery().last("limit 1").one();
+        XpTaskRuleRole taskRuleRole = xpTaskRuleRoleService.lambdaQuery().eq(XpTaskRuleRole::getRuleType, 9).last("limit 1").one();
+        if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
+            throw new ServiceException("未配置车辆事故任务分配规则", I18nKeyConstant.TASK_RULE_NOT_CONFIG);
+        }
+        R<List<XpOperationsRole>> xpOperationsRoleResult = xpOperationUserClient.getXpOperationsRoleByRoleId(taskRuleRole.getRoleId());
+        if (CollUtil.isNotEmpty(xpOperationsRoleResult.getData())) {
+            List<Long> userIds = xpOperationsRoleResult.getData().stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toList());
+            xpTask.setHandleUserId(StringUtils.join(userIds, ","));
+        }
         this.save(xpTask);
+
+        //发送消息通知
+        List<Long> userIds = Arrays.stream(xpTask.getHandleUserId().split(",")).map(Long::valueOf).collect(Collectors.toList());
+        if (CollUtil.isNotEmpty(userIds)) {
+            R<List<XpOperationsUser>> xpOperationUserResult = xpOperationUserClient.listByIds(userIds);
+            List<XpOperationsUser> data = xpOperationUserResult.getData();
+            if (CollUtil.isNotEmpty(data)) {
+                R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(dto.getId());
+                XpVehicle vehicle = xpVehicleR.getData();
+                String plateNumber = Objects.nonNull(vehicle) ? vehicle.getPlateNumber() : "";
+                // 车辆${车牌号}在${车辆位置信息}发生了紧急事故,请在${到达现场限时}内到达现场!${APP链接}
+                String content = String.format("车辆%s在%s发生了紧急事故,请在%d分钟内到达现场!", plateNumber, xpTask.getVehicleLocation(), taskRule.getProcessingTimeLimit());
+                List<XpOperationsUserNotification> notifications = data.stream().map(item -> {
+                    XpOperationsUserNotification notification = new XpOperationsUserNotification();
+                    notification.setOperationsUserId(item.getId());
+                    notification.setNotificationContent(content);
+                    notification.setReadStatus(0);
+                    notification.setCreateTime(LocalDateTime.now());
+                    return notification;
+                }).collect(Collectors.toList());
+                xpOperationUserNotificationClient.addNotificationBatch(notifications);
+                // 发送阿里云推送
+                Map<Integer, List<XpOperationsUser>> operationUserMap = data.stream().collect(Collectors.groupingBy(XpOperationsUser::getDeviceType));
+                for (Map.Entry<Integer, List<XpOperationsUser>> integerListEntry : operationUserMap.entrySet()) {
+                    List<XpOperationsUser> value = integerListEntry.getValue();
+                    pushAliMessage(data, content, xpTask);
+                }
+            }
+        }
+    }
+
+    /**
+     * 推送阿里云通知
+     * @param data
+     * @param content
+     * @param xpTask
+     */
+    private void pushAliMessage(List<XpOperationsUser> data, String content, XpTask xpTask) {
+        String account = data.stream().map(XpOperationsUser::getPhoneNumber).filter(Objects::nonNull).collect(Collectors.joining(","));
+        Map<String, Object> param = new HashMap<>();
+        param.put("content", content);
+        param.put("strategy", NotificationTypeEnum.ACCIDENT_NEW.getCode());
+        param.put("type", TaskTypeNotificationEnum.ACCIDENT_TASK.getCode());
+        param.put("id", xpTask.getId());
+        xpAliPushMessageClient.pushMessage(AliPushMessageDTO.builder()
+                .body(JSONObject.toJSONString(param))
+                .account(account).title("车辆事故警示")
+                .pushType(AliPushTypeConstant.NOTICE)
+                        .deviceType(data.get(0).getDeviceType())
+                .build());
     }
 
     @Override

--
Gitblit v1.7.1