xuhy
2026-04-24 3c88eb9bd41ea647663995fc0f3e62778f8434a0
[fix] 可改派人员设置距离,排序
3个文件已修改
22 ■■■■■ 已修改文件
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/repo/XpOperationsUserRepository.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -56,9 +56,7 @@
import javax.annotation.Resource;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -331,16 +329,21 @@
        List<XpOperationsUserPositionDTO> up = mongoTemplate.find(q, XpOperationsUserPositionDTO.class);
        Map<Long, Double> disMap = up.stream().collect(Collectors.toMap(XpOperationsUserPositionDTO::getId, XpOperationsUserPositionDTO::getDistance));
        // 查询车队下面面所有人员id和up求交集
        List<Long> data = xpFleetClient.idsByFleetName(query.getFleet()).getData();
        List<Long> ids = up.stream().map(XpOperationsUserPositionDTO::getId)
                .filter(e -> data!=null && !data.isEmpty() &&!data.contains(e))
                .filter(e -> data == null || data.isEmpty() || data.contains(e))
                .collect(Collectors.toList());
        query.setIds(ids);
        PageInfo<XpOperationsUserWithRoleVO> ret = operationUserClient.listByQueryIds(query).getData();
        // 设置距离,然后排序
        ret.getRecords().forEach(e -> e.setDis(String.valueOf(disMap.get(e.getId()))));
        List<XpOperationsUserWithRoleVO> sorted = ret.getRecords().stream().sorted(Comparator.comparing(XpOperationsUserWithRoleVO::getDis)).collect(Collectors.toList());
        ret.setRecords(sorted);
        return R.ok(ret);
    }
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/repo/XpOperationsUserRepository.java
@@ -19,7 +19,7 @@
     * @param distance 距离范围
     * @return 符合条件的实体列表
     */
    @Query("{ 'location' : { '$nearSphere' : ?0, '$maxDistance' : ?1 ,distanceFiled:  'distance'}, 'id' : { $in : ?2 } }")
    @Query("{ 'location' : { '$nearSphere' : ?0, '$maxDistance' : ?1, '$distanceField': 'distance' }, 'id' : { $in : ?2 } }")
    List<XpOperationsUserPositionDTO> findWithDistance(
            Point point,
            Integer distance,
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -1409,10 +1409,10 @@
        Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
        List<Long> roleIds = taskRuleRole.stream().map(XpTaskRuleRole::getRoleId).collect(Collectors.toList());
        List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();//TODO 空指针
        List<Long> ids = xpFleetOperationsClient.getOperationsIdsByFleetId(fleetId).getData();
        String belongUserIds = xpOperationUserClient.getXpOperationsRoleByRoleIds(roleIds).getData().stream()
                .map(XpOperationsRole::getOperationsUserId)
                .filter(ids::contains)
                .filter(e -> ids == null || ids.isEmpty() || ids.contains(e))
                .filter(id -> !excludedUserIds.contains(id.toString()))
                .map(String::valueOf).collect(Collectors.joining(","));
@@ -1569,7 +1569,10 @@
        // 让mongo根据[id in ids]返回距离排序的users
//        List<XpOperationsUserPositionDTO> users = mongoTemplate.find(new Query(Criteria.where("_id").in(ids)), XpOperationsUserPositionDTO.class);
        List<XpOperationsUserPositionDTO> XpOperationsUserPositionDTOs = repository.findWithDistance(new Point(vehiclePosition.getPoint().getX(), vehiclePosition.getPoint().getY()), 1000, ids);
        List<XpOperationsUserPositionDTO> XpOperationsUserPositionDTOs = mongoTemplate.find(
                new Query(Criteria.where("_id").in(ids).and("location").nearSphere(new GeoJsonPoint(vehiclePosition.getPoint().getX(), vehiclePosition.getPoint().getY())).maxDistance(1000 / 6378137.0)),
                XpOperationsUserPositionDTO.class
        );
        boolean skipBusy = false;//TODO 获取系统配置,是否开启跳过忙碌