From a6f0b69caf5c1913b6fec8b94d2454b33d15d649 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 07 三月 2026 21:00:56 +0800
Subject: [PATCH] 修改mongodb查询

---
 /dev/null                                                                                                     |   92 -----------------------
 xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java |    6 
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java                           |    5 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java       |   56 ++++++++------
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java |   75 ++++++++++--------
 5 files changed, 82 insertions(+), 152 deletions(-)

diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java
index fa0c729..e084621 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java
@@ -5,12 +5,11 @@
 import com.xiaopeng.itinerary.repository.XpGeoQueryEntityRepository;
 import com.xiaopeng.itinerary.service.IXpGeoQueryEntityService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.geo.Circle;
-import org.springframework.data.geo.Distance;
-import org.springframework.data.geo.Metrics;
+import org.springframework.data.geo.*;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.NearQuery;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
@@ -18,6 +17,7 @@
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * MongoDB 地理查询服务实现类
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java
deleted file mode 100644
index df3ffa6..0000000
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.xiaopeng.itinerary.utils.mango;
-
-import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.geo.GeoResults;
-import org.springframework.data.geo.Metrics;
-import org.springframework.data.geo.Point;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.NearQuery;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@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) {
-        try {
-            // 1. 创建查询点
-            Point referencePoint = new Point(longitude, latitude);
-
-            // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
-            NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
-                    .maxDistance(distanceInMeters / 1000)  // 转成公里
-                    .spherical(true);
-
-
-            // 4. 执行查询 - 明确指定集合名
-            GeoResults<VehiclePosition> geoResults = mongoTemplate.geoNear(
-                    nearQuery,
-                    VehiclePosition.class,
-                    "vehicle_position"  // 明确指定集合名,避免映射错误
-            );
-
-            // 5. 提取结果
-            return geoResults.getContent().stream()
-                    .map(geoResult -> geoResult.getContent())
-                    .collect(Collectors.toList());
-
-        } catch (Exception e) {
-            e.printStackTrace();
-            return new ArrayList<>();
-        }
-    }
-
-
-    /**
-     * 根据车辆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);
-    }
-
-}
\ No newline at end of file
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
index 26f640a..1365c3b 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
@@ -3,8 +3,11 @@
 
 import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
 import com.xiaopeng.api.dto.map.RouteAndFareDto;
+import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.model.order.XpOrder;
 import com.xiaopeng.api.vo.map.PointByIpVo;
+import com.xiaopeng.api.vo.map.XpDistanceAndDurationVo;
 import com.xiaopeng.api.vo.operation.RouteVo;
 import com.xiaopeng.common.core.constant.CacheConstants;
 import com.xiaopeng.common.core.domain.R;
@@ -13,6 +16,7 @@
 import com.xiaopeng.map.mangodb.service.XpGeoFencingPolygonService;
 import com.xiaopeng.map.utils.AmapWalkingRouteUtil;
 import com.xiaopeng.map.utils.GDMapGeocodingUtil;
+import com.xiaopeng.map.utils.mangoUtils.MongoGeoFenceUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +29,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Slf4j
 @RestController
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
index 3740056..1b5f6b9 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
@@ -5,11 +5,9 @@
 import com.xiaopeng.operation.repository.XpGeoQueryEntityRepository;
 import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.geo.Distance;
-import org.springframework.data.geo.GeoResults;
-import org.springframework.data.geo.Metrics;
-import org.springframework.data.geo.Point;
+import org.springframework.data.geo.*;
 import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.NearQuery;
 import org.springframework.data.mongodb.core.query.Query;
@@ -52,37 +50,48 @@
         calendar.add(Calendar.DAY_OF_YEAR, -7);
         Long startTime = calendar.getTime().getTime();
 
-        // 1. 创建查询点
-        Point referencePoint = new Point(longitude, latitude);
-
-        // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
-        NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
-                .maxDistance(0.5)  // 转成公里
-                .spherical(true);
-
-
-        // 3.时间>startTime time = time参数
-        // 3. 创建额外的查询条件
-        Query query = new Query();
+//        // 1. 创建查询点
+//        Point referencePoint = new Point(longitude, latitude);
+//
+//        // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
+//        NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
+//                .maxDistance(0.5)  // 转成公里
+//                .spherical(true);
+//
+//
+//        // 3.时间>startTime time = time参数
+//        // 3. 创建额外的查询条件
+//        Query query = new Query();
+//        query.addCriteria(Criteria.where("timestamp").gte(startTime));
+//        query.addCriteria(Criteria.where("time").is(time));
+//
+//        // 将 NearQuery 和额外的查询条件合并
+//        nearQuery.query(query);
+//
+//
+//        // 4. 执行查询 - 明确指定集合名
+//        GeoResults<XpGeoQueryEntity> geoResults = mongoTemplate.geoNear(
+//                nearQuery,
+//                XpGeoQueryEntity.class,
+//                "xp_geo_query_entity"  // 明确指定集合名,避免映射错误
+//        );
+//
+//        // 5. 提取结果
+//        return geoResults.getContent().stream()
+//                .map(geoResult -> geoResult.getContent())
+//                .collect(Collectors.toList());
+        //找到中心点
+        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
+        //构造半径
+        Distance distanceR = new Distance(0.5, Metrics.KILOMETERS);
+        //画圆
+        Circle circle = new Circle(geoJsonPoint, distanceR);
+        // 构造query对象
+        Query query = Query.query(Criteria.where("location").withinSphere(circle));
         query.addCriteria(Criteria.where("timestamp").gte(startTime));
         query.addCriteria(Criteria.where("time").is(time));
-
-        // 将 NearQuery 和额外的查询条件合并
-        nearQuery.query(query);
-
-
-        // 4. 执行查询 - 明确指定集合名
-        GeoResults<XpGeoQueryEntity> geoResults = mongoTemplate.geoNear(
-                nearQuery,
-                XpGeoQueryEntity.class,
-                "xp_geo_query_entity"  // 明确指定集合名,避免映射错误
-        );
-
-        // 5. 提取结果
-        return geoResults.getContent().stream()
-                .map(geoResult -> geoResult.getContent())
-                .collect(Collectors.toList());
-
+        List<XpGeoQueryEntity> xpGeoQueryEntities = mongoTemplate.find(query, XpGeoQueryEntity.class);
+        return xpGeoQueryEntities;
     }
 
     /**
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
index 5fc94c8..fed8f2a 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
@@ -2,11 +2,9 @@
 
 import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
 import org.springframework.data.domain.Sort;
-import org.springframework.data.geo.GeoResults;
-import org.springframework.data.geo.Point;
-import org.springframework.data.geo.Distance;
-import org.springframework.data.geo.Metrics;
+import org.springframework.data.geo.*;
 import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.NearQuery;
 import org.springframework.data.mongodb.core.query.Query;
@@ -33,27 +31,37 @@
                                                              double latitude,
                                                              double distanceInMeters,int num) {
         try {
-            // 1. 创建查询点
-            Point referencePoint = new Point(longitude, latitude);
+//            // 1. 创建查询点
+//            Point referencePoint = new Point(longitude, latitude);
+//
+//            // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
+//            NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
+//                    .maxDistance(distanceInMeters / 1000)  // 转成公里
+//                    .spherical(true);
+//
+//
+//            // 4. 执行查询 - 明确指定集合名
+//            GeoResults<VehiclePosition> geoResults = mongoTemplate.geoNear(
+//                    nearQuery,
+//                    VehiclePosition.class,
+//                    "vehicle_position"  // 明确指定集合名,避免映射错误
+//            );
+//
+//            // 5. 提取结果
+//            return geoResults.getContent().stream()
+//                    .map(geoResult -> geoResult.getContent())
+//                    .collect(Collectors.toList());
 
-            // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
-            NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
-                    .maxDistance(distanceInMeters / 1000)  // 转成公里
-                    .spherical(true);
-
-
-            // 4. 执行查询 - 明确指定集合名
-            GeoResults<VehiclePosition> geoResults = mongoTemplate.geoNear(
-                    nearQuery,
-                    VehiclePosition.class,
-                    "vehicle_position"  // 明确指定集合名,避免映射错误
-            );
-
-            // 5. 提取结果
-            return geoResults.getContent().stream()
-                    .map(geoResult -> geoResult.getContent())
-                    .collect(Collectors.toList());
-
+            //找到中心点
+            GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
+            //构造半径
+            Distance distanceR = new Distance(distanceInMeters / 1000, Metrics.KILOMETERS);
+            //画圆
+            Circle circle = new Circle(geoJsonPoint, distanceR);
+            // 构造query对象
+            Query query = Query.query(Criteria.where("point").withinSphere(circle));
+            List<VehiclePosition> vehiclePositions = mongoTemplate.find(query, VehiclePosition.class);
+            return vehiclePositions;
         } catch (Exception e) {
             e.printStackTrace();
             return new ArrayList<>();

--
Gitblit v1.7.1