liujie
2026-02-12 d80a20a9458abdbd601779c4ed8474ca092027bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.xiaopeng.operation.utils.mango;
 
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import org.springframework.data.domain.Sort;
import org.springframework.data.geo.Point;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
 
@Service
public class VehiclePositionService {
    
    @Resource
    private MongoTemplate mongoTemplate;
    
    /**
     * 查询附近指定距离内且状态正常的车辆
     * @param longitude 经度
     * @param latitude 纬度
     * @param distanceInMeters 距离(米)
     * @return 符合条件的车辆列表
     */
    public List<VehiclePosition> findAvailableVehiclesNearby(double longitude,
                                                             double latitude,
                                                             double distanceInMeters,int num) {
        // 创建查询点
        Point referencePoint = new Point(longitude, latitude);
        
        // 设置最大距离(MongoDB使用公里或米,这里转换为公里)
        distanceInMeters = distanceInMeters / 1000;
 
        // 构建查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("point")
                .near(referencePoint)
                .maxDistance(distanceInMeters));
        query.addCriteria(Criteria.where("status").is(1)); // 运营中
        query.addCriteria(Criteria.where("state").is(0));  // 空闲中
        
        // 可以添加排序,按距离排序
         query.with(Sort.by(Sort.Direction.ASC, "point"));
        
//        // 可以限制返回数量
//         query.limit(num);
        
        return mongoTemplate.find(query, VehiclePosition.class);
    }
 
 
    /**
     * 根据车辆ID查询车辆信息
     * @param vehicleId 车辆ID
     * @return 车辆信息,不存在则返回null
     */
    public VehiclePosition findByVehicleId(Long vehicleId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("vehicle_id").is(vehicleId));
        return mongoTemplate.findOne(query, VehiclePosition.class);
    }
 
 
    /**
     * 所有的车辆
     */
    public List<VehiclePosition> findAll() {
 
        // 构建查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("status").is(1)); // 运营中
        query.addCriteria(Criteria.where("state").is(1));  // 接单中
 
        // 可以添加排序,按距离排序
        query.with(Sort.by(Sort.Direction.ASC, "point"));
 
        return mongoTemplate.find(query, VehiclePosition.class);
    }
 
}