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; /** * 海拔 单位米 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()); } 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; } } 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; } 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(); } 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; } 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);