From 443acea3113ba7680d1247a36f3ef73da80778e0 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期四, 16 四月 2026 23:31:25 +0800
Subject: [PATCH] [feat]工单改派接口

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 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 aa94db6..0841363 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
@@ -1371,7 +1371,9 @@
     @Autowired
     private XpOperationsUserRepository repository;
 
-    public void reassign(Long taskId,String msg) {
+    @Override
+    @Transactional
+    public void reassign(Long taskId, String msg) {
 
         XpTask task = getById(taskId);
         XpVehicle vehicle = xpVehicleClient.queryById(task.getVehicleId()).getData();
@@ -1380,15 +1382,19 @@
         if (Objects.isNull(taskRuleRole) || Objects.isNull(taskRule)) {
             throw new ServiceException("未配置车辆事故任务分配规则");
         }
+        List<Long> excludedUserIds = Optional.ofNullable(task.getExcluded()).orElse(new ArrayList<>());
+        excludedUserIds.add(Long.valueOf(task.getHandleUserId()));
+        task.setExcluded(excludedUserIds);
         Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
         List<Long> roleIds = taskRuleRole.stream().map(XpTaskRuleRole::getRoleId).collect(Collectors.toList());
-        List<XpOperationsRole> data = xpOperationUserClient.getXpOperationsRoleByRoleIds(roleIds).getData();
         List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();
-        List<XpOperationsRole> collect = data.stream().filter(x -> ids.contains(x.getOperationsUserId())).collect(Collectors.toList());
-        String belongUserIds = collect.stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toSet()).stream().map(String::valueOf).collect(Collectors.joining(","));
-        String idsWithoutMe = belongUserIds.replace(task.getHandleUserId(), "");
+        String belongUserIds = xpOperationUserClient.getXpOperationsRoleByRoleIds(roleIds).getData().stream()
+                .map(XpOperationsRole::getOperationsUserId)
+                .filter(ids::contains)
+                .filter(id -> !excludedUserIds.contains(id))
+                .map(String::valueOf).collect(Collectors.joining(","));
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
-        String handlerUser = chooseNearestAvailableOperationsUser(idsWithoutMe, vehiclePosition);
+        String handlerUser = chooseNearestAvailableOperationsUser(belongUserIds, vehiclePosition);
         task.setHandleUserId(handlerUser);
         if(handlerUser == null) {
             task.setStatus(4);
@@ -1414,10 +1420,11 @@
         }
         Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
         List<Long> roleIds = taskRuleRole.stream().map(XpTaskRuleRole::getRoleId).collect(Collectors.toList());
-        List<XpOperationsRole> data = xpOperationUserClient.getXpOperationsRoleByRoleIds(roleIds).getData();
         List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();
-        List<XpOperationsRole> collect = data.stream().filter(x -> ids.contains(x.getOperationsUserId())).collect(Collectors.toList());
-        String belongUserIds = collect.stream().map(XpOperationsRole::getOperationsUserId).collect(Collectors.toSet()).stream().map(String::valueOf).collect(Collectors.joining(","));
+        String belongUserIds = xpOperationUserClient.getXpOperationsRoleByRoleIds(roleIds).getData().stream()
+                .map(XpOperationsRole::getOperationsUserId)
+                .filter(ids::contains)
+                .map(String::valueOf).collect(Collectors.joining(","));
 
         VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
         Map<String, String> geocode = gdMapGeocodingUtil.geocode(vehiclePosition.getPoint().getX() + "", vehiclePosition.getPoint().getY() + "");
@@ -1477,6 +1484,7 @@
 
     private String chooseNearestAvailableOperationsUser(String belongUserIds, VehiclePosition vehiclePosition) {
 
+        if (StringUtils.isBlank(belongUserIds)) return null;
         List<Long> ids = Arrays.stream(belongUserIds.split(",")).filter(StringUtils::isNotBlank).map(Long::valueOf).collect(Collectors.toList());
 
         // 让mongo根据[id in ids]返回距离排序的users

--
Gitblit v1.7.1