From d8440cc93f48e5a4b932d8daf740023e16d65008 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期一, 18 五月 2026 00:07:54 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0

---
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java                                |    3 +
 xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java               |    5 +-
 xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java                             |   12 +++---
 xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/handler/GlobalExceptionHandler.java |    3 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java          |    4 +
 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java         |   33 +++++++++-------
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java                         |   12 +++---
 7 files changed, 41 insertions(+), 31 deletions(-)

diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
index b2702a0..dbbdeb5 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
@@ -1,6 +1,7 @@
 package com.xiaopeng.api.vo.automaticPilot;
 
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.index.CompoundIndex;
@@ -33,11 +34,13 @@
     /**
      * 车辆实时位置信息
      */
+    @ApiModelProperty("经纬度")
     @GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)
     private GeoJsonPoint point;
     /**
      * 航向,单位:度,北零顺时针。范围:[0-360)。0 => 北, 90 => 东, 180 => 南, 270 => 西
      */
+    @ApiModelProperty("航向角")
     private Double course;
     /**
      * 海拔 单位米
diff --git a/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/handler/GlobalExceptionHandler.java b/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/handler/GlobalExceptionHandler.java
index 87871e9..5a5dd86 100644
--- a/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/handler/GlobalExceptionHandler.java
+++ b/xp-robotaxi-common/xp-common-security/src/main/java/com/xiaopeng/common/security/handler/GlobalExceptionHandler.java
@@ -196,7 +196,8 @@
             if (sb.length() > 0) {
                 sb.append("; ");
             }
-            sb.append(fieldError.getField()).append(": ").append(message);
+            sb.append(message);
+//            sb.append(fieldError.getField()).append(": ").append(message);
         });
         return AjaxResult.error(sb.toString());
     }
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
index 1e4a56c..bce091f 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -1182,6 +1182,7 @@
             pricingDto.setOpenCityId(routeAndFareDto.getOpenCityId());
             pricingDto.setUserCouponId(routeAndFareDto.getUserCouponId());
             pricingDto.setVehicleId(routeAndFareDto.getVehicleId());
+            //计算导航对应的费用
             RouteAndFareVo part = pricingForRoute(pricingDto, routePoint, xpPricing, userId);
             RouteOptionVo opt = new RouteOptionVo();
             opt.setPathFingerprint(routePoint.getRouteID());
@@ -1494,8 +1495,8 @@
             for (int i = 0; i < queueItems.size(); i++) {
                 currentPosition++;
                 String item = queueItems.get(i);
-                String[] split = item.split("-");
-                if (split[1].equals(orderId + "")) {
+                String[] split = item.split("_");
+                if (split[0].equals(orderId + "")) {
                     break;
                 }
             }
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
index e553206..342f76e 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/XpPricingUtil.java
@@ -116,7 +116,7 @@
                                 priceRate =  new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue();
                             }
                             //天气动态调价
-                            JSONArray ws = jsonObject.getJSONArray("weather");
+                            JSONArray ws = jsonObject.getJSONArray("weatherRules");
                             if(null != ws){
                                 XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
                                 WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
@@ -125,8 +125,8 @@
                                     String w = lives.get(0).getWeather();
                                     for (Object o : ws) {
                                         JSONObject ele = JSONObject.parseObject(o.toString());
-                                        if(w.contains(ele.getString("weatherType"))){
-                                            double floatRate = jsonObject.getDouble("ratio");
+                                        if(w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)){
+                                            double floatRate = ele.getDouble("ratio");
                                             priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                             break;
                                         }
@@ -227,7 +227,7 @@
                             }
 
                             // 天气预报动态调价
-                            JSONArray ws = jsonObject.getJSONArray("weather");
+                            JSONArray ws = jsonObject.getJSONArray("weatherRules");
                             if (null != ws) {
                                 XpOpenCity openCity = openCityClient.getXpOpenCityById(openCityId).getData();
                                 WeatherDTO data = xpMapClient.wether(openCity.getCityCode()).getData();
@@ -236,8 +236,8 @@
                                     String w = lives.get(0).getWeather();
                                     for (Object o : ws) {
                                         JSONObject ele = JSONObject.parseObject(o.toString());
-                                        if (w.contains(ele.getString("weatherType"))) {
-                                            double floatRate = jsonObject.getDouble("ratio");
+                                        if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+                                            double floatRate = ele.getDouble("ratio");
                                             priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                             break;
                                         }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
index 9b1e104..7e39de8 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
@@ -13,6 +13,8 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+
 /**
  * <p>
  * 交易策略配置 前端控制器
@@ -55,7 +57,7 @@
      */
     @ApiOperation(value = "修改交易策略", tags = {"管理后台-交易管理-交易策略配置"})
     @PostMapping("/api/v1/tradingStrategy/edit")
-    public R<?> edit(@Validated @RequestBody XpTradingStrategyEditDTO dto) {
+    public R<?> edit(@Valid @RequestBody XpTradingStrategyEditDTO dto) {
         tradingStrategyService.editStrategy(dto);
         return R.ok();
     }
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index a041974..a2f865c 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -2542,7 +2542,7 @@
                             }
 
                             // 天气预报动态调价
-                            JSONArray ws = jsonObject.getJSONArray("weather");
+                            JSONArray ws = jsonObject.getJSONArray("weatherRules");
                             if (null != ws) {
                                 WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
                                 List<WeatherDTO.Lives> lives = data.getLives();
@@ -2550,8 +2550,8 @@
                                     String w = lives.get(0).getWeather();
                                     for (Object o : ws) {
                                         JSONObject ele = JSONObject.parseObject(o.toString());
-                                        if (w.contains(ele.getString("weatherType"))) {
-                                            double floatRate = jsonObject.getDouble("ratio");
+                                        if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+                                            double floatRate = ele.getDouble("ratio");
                                             priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                             break;
                                         }
@@ -2663,7 +2663,7 @@
                             }
 
                             // 天气预报动态调价
-                            JSONArray ws = jsonObject.getJSONArray("weather");
+                            JSONArray ws = jsonObject.getJSONArray("weatherRules");
                             if (null != ws) {
                                 WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData();
                                 List<WeatherDTO.Lives> lives = data.getLives();
@@ -2671,8 +2671,8 @@
                                     String w = lives.get(0).getWeather();
                                     for (Object o : ws) {
                                         JSONObject ele = JSONObject.parseObject(o.toString());
-                                        if (w.contains(ele.getString("weatherType"))) {
-                                            double floatRate = jsonObject.getDouble("ratio");
+                                        if (w.contains(ele.getString("weatherType")) || ele.getString("weatherType").contains(w)) {
+                                            double floatRate = ele.getDouble("ratio");
                                             priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue();
                                             break;
                                         }
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
index 85d95f2..7d04162 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -10,6 +10,7 @@
 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.core.conditions.update.LambdaUpdateWrapper;
 import com.mongodb.client.MongoCollection;
 import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
@@ -20,6 +21,7 @@
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.account.XpOperationsUser;import com.xiaopeng.api.model.maintenance.XpTask;
 import com.xiaopeng.api.model.maintenance.XpTaskRule;
+import com.xiaopeng.api.model.operation.XpGeoQueryEntity;
 import com.xiaopeng.api.model.maintenance.XpVehicleModel;
 import com.xiaopeng.api.model.operation.XpOfficialPartner;
 import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
@@ -65,11 +67,11 @@
 import org.springframework.context.MessageSource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.i18n.LocaleContextHolder;
-import org.springframework.data.geo.Distance;
-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;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -1261,31 +1263,32 @@
     @GetMapping("/api/v1/mini-program/vehicle/nearby")
     @XpClientCheck(checkToken = false, checkOtpToken = false)
     public R<List<XpVehicleVO>> carAround(@RequestParam double lon, @RequestParam double lat) {
-
-        Point point = new Point(lon, lat);
-        Distance distance = new Distance(3, Metrics.KILOMETERS);
-        Criteria criteria = Criteria.where("point")
-                .nearSphere(point)
-                .maxDistance(distance.getNormalizedValue());
-        Query query = new Query(criteria);
-        List<VehiclePositionVo> vehiclePositions = mongoTemplate.find(query, VehiclePositionVo.class);
+        //找到中心点
+        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(lon, lat);
+        //构造半径
+        Distance distanceR = new Distance(3, 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);
         if (CollectionUtils.isEmpty(vehiclePositions)) {
             return R.ok(new ArrayList<>());
         }
         List<XpVehicleVO> xpVehicleList = vehiclePositions.stream()
-                .sorted(Comparator.comparingDouble(VehiclePositionVo::getDistance))
                 .map(vp -> {
-                    XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().in(XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(vp.getVin())));
+                    XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getState, 0).eq(XpVehicle::getOperatingStatus, 1)
+                            .eq(XpVehicle::getAcceptOrTest, 1).eq(XpVehicle::getDeleted, 0).in(XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(vp.getVin())));
                     if (xpVehicle == null) {
                         return null;
                     }
                     XpVehicleVO vo = new XpVehicleVO();
-                    BeanUtils.copyProperties(xpVehicle, vo);
+                    vo.setLongitude(vp.getPoint().getX());
+                    vo.setLatitude(vp.getPoint().getY());
                     vo.setDirection(vp.getCourse());
                     return vo;
                 })
                 .filter(Objects::nonNull)
-                .filter(v -> v.getState() != null && v.getState() == 0)
                 .limit(5)
                 .collect(Collectors.toList());
         return R.ok(xpVehicleList);

--
Gitblit v1.7.1