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