From 98d664b2ebd508d170283312eccdc99b7d6a40ef Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 01 五月 2026 01:32:30 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0

---
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java |   73 ++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 1 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 fadf140..1ef432c 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
@@ -5,14 +5,18 @@
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.xiaopeng.api.dto.account.XpOperationsUserPositionDTO;
+import com.xiaopeng.api.dto.account.XpOperationsUserQueryDTO;
+import com.xiaopeng.api.dto.operation.LonLatDto;
 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.map.XpMapClient;
 import com.xiaopeng.api.feignClient.operation.SmsClient;
 import com.xiaopeng.api.feignClient.pushMessage.WebSocketMessageClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpAliPushMessageClient;
@@ -26,8 +30,10 @@
 import com.xiaopeng.api.model.maintenance.*;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.XpTaskVO;
+import com.xiaopeng.api.vo.account.XpOperationsUserWithRoleVO;
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import com.xiaopeng.api.vo.maintenance.TaskScheduleConstants;
+import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.api.vo.operation.SmsVo;
 import com.xiaopeng.common.core.constant.AliPushTypeConstant;
 import com.xiaopeng.common.core.domain.R;
@@ -49,6 +55,7 @@
 import com.xiaopeng.maintenance.model.query.XpTaskRecordPageQuery;
 import com.xiaopeng.maintenance.model.vo.*;
 import com.xiaopeng.maintenance.repo.XpOperationsUserRepository;
+import com.xiaopeng.maintenance.service.IXpClockInService;
 import com.xiaopeng.maintenance.service.IXpTaskRuleRoleService;
 import com.xiaopeng.maintenance.service.IXpTaskRuleService;
 import com.xiaopeng.maintenance.service.XpTaskService;
@@ -58,6 +65,7 @@
 import com.xiaopeng.maintenance.vo.TaskCleanDetailVO;
 import com.xiaopeng.maintenance.vo.TaskDetectionDetailVO;
 import com.xiaopeng.maintenance.vo.TaskReassignmentVo;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
@@ -159,6 +167,9 @@
 
     @Resource
     private WebSocketMessageClient xpWebSocketMessageClient;
+
+    @Resource
+    private IXpClockInService xpClockInService;
 
     @Override
     public PageInfo<WorkBenchVO> workbench(WorkBenchQuery query) throws UnsupportedEncodingException {
@@ -285,7 +296,52 @@
             List<Long> userIds = xpOperationsRoleResult.getData().stream().filter(x -> ids.contains(x.getOperationsUserId()))
                     .map(XpOperationsRole::getOperationsUserId)
                     .distinct().collect(Collectors.toList());
-            xpTask.setHandleUserId(StringUtils.join(userIds, ","));
+            //获取首选人的实时定位,计算每个人到事故车辆位置的导航距离
+            List<Operations> operationsList = new ArrayList<>();
+            for (Long userId : userIds) {
+                Operations operations = new Operations();
+                operations.setUserId(userId);
+                XpOperationsUserPositionDTO vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("id").is(userId)), XpOperationsUserPositionDTO.class);
+                if(null != vehiclePosition){
+                    LonLatDto start = new LonLatDto(vehiclePosition.getLongitude(), vehiclePosition.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.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){
+                //查询已经上班打卡了的人员
+                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){
+                    userId = xpClockIns.get(0).getAppUserId();
+                }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){
+                        //对工号进行排序
+                        List<String> collect2 = list1.stream().map(XpTask::getHandleUserId).collect(Collectors.toList());
+                        //找出没有任务的人员
+                        List<Long> collect3 = collect1.stream().filter(s -> !collect2.contains(s.toString())).collect(Collectors.toList());
+                        //查询人员数据,对其进行工号排序
+                        XpOperationsUserQueryDTO dto1 = new XpOperationsUserQueryDTO();
+                        dto1.setIds(collect3);
+                        List<XpOperationsUserWithRoleVO> data = xpOperationUserClient.findList(dto1).getData();
+                        data.sort((o1, o2) -> o1.getUniqueNumber().compareTo(o2.getUniqueNumber()) * -1);
+                        userId = data.get(0).getId();
+                    }
+                }
+            }
+            xpTask.setHandleUserId(userId.toString());
         }
         // 根据事故处理限时配置设置任务截止时间
         LocalDateTime endTime = LocalDateTime.now().plusMinutes(taskRule.getProcessingTimeLimit());
@@ -308,6 +364,21 @@
         return xpTask;
     }
 
+
+    @Data
+    class Operations {
+        /**
+         * 候选人id
+         */
+        private Long userId;
+        /**
+         * 距离
+         */
+        private Integer distance;
+    }
+
+
+
     /**
      * 异步发送事故通知
      * @param xpTask 任务信息

--
Gitblit v1.7.1