puzhibing
2026-05-01 98d664b2ebd508d170283312eccdc99b7d6a40ef
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -47,6 +47,7 @@
import org.apache.shardingsphere.transaction.core.TransactionType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.mongodb.core.MongoTemplate;
@@ -358,30 +359,29 @@
    @ApiOperation(value = "可改派的运维人员列表", tags = {"管理后台-运维执行-任务工单-待改派工单"})
    @PostMapping("/api/v1/task/reassign/availableUsers")
    public R<PageInfo<XpOperationsUserWithRoleVO>> availableReassignUsers(@RequestBody OptionalUsersPageListQuery query) {
    public R<PageInfo<XpOperationsUserWithRoleVO>> availableReassignUsers(@RequestBody OptionalUsersPageListQuery query1) {
        XpTask task = xpTaskService.getById(query1.getTaskId());
        // 找到中心点
        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(task.getVehicleLon().doubleValue(), task.getVehicleLat().doubleValue());
        // 构造半径
        Distance distanceR = new Distance(10, Metrics.KILOMETERS);
        // 画圆
        Circle circle = new Circle(geoJsonPoint, distanceR);
        Query query = Query.query(new Criteria().andOperator(
                Criteria.where("location").withinSphere(circle)
        ));
        List<XpOperationsUserPositionDTO> vehiclePositions = mongoTemplate.find(query, XpOperationsUserPositionDTO.class);
        Map<Long, Double> disMap = vehiclePositions.stream().collect(Collectors.toMap(XpOperationsUserPositionDTO::getId, XpOperationsUserPositionDTO::getDistance));
        XpTask task = xpTaskService.getById(query.getTaskId());
        GeoJsonPoint point =
                new GeoJsonPoint(
                        task.getVehicleLon().doubleValue(),
                        task.getVehicleLat().doubleValue()
                );
        Query q = new Query(Criteria.where("location").near(point)
                .maxDistance(new Distance(10, Metrics.KILOMETERS).getNormalizedValue()));
        q.with(Sort.by(Sort.Direction.ASC, "dis"));
        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> data = xpFleetClient.idsByFleetName(query1.getFleet()).getData();
        List<Long> ids = up.stream().map(XpOperationsUserPositionDTO::getId)
        List<Long> ids = vehiclePositions.stream().map(XpOperationsUserPositionDTO::getId)
                .filter(e -> data == null || data.isEmpty() || data.contains(e))
                .collect(Collectors.toList());
        query.setIds(ids);
        PageInfo<XpOperationsUserWithRoleVO> ret = operationUserClient.listByQueryIds(query).getData();
        query1.setIds(ids);
        PageInfo<XpOperationsUserWithRoleVO> ret = operationUserClient.listByQueryIds(query1).getData();
        // 设置距离,然后排序