Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0
| | |
| | | //package com.xiaopeng.account.config; |
| | | // |
| | | //import com.xiaopeng.unifiedverification.interceptor.CheckForClientInterceptor; |
| | | //import lombok.extern.slf4j.Slf4j; |
| | | //import org.springframework.context.annotation.Configuration; |
| | | //import org.springframework.context.annotation.Lazy; |
| | | //import org.springframework.web.servlet.config.annotation.InterceptorRegistry; |
| | | //import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; |
| | | // |
| | | //import javax.annotation.Resource; |
| | | // |
| | | //@Slf4j |
| | | //@Configuration |
| | | //public class MiniprogramConfigurer extends WebMvcConfigurerAdapter { |
| | | // |
| | | // @Resource |
| | | // @Lazy |
| | | // private CheckForClientInterceptor checkForClientInterceptor; |
| | | // |
| | | // @Override |
| | | // public void addInterceptors(InterceptorRegistry registry) { |
| | | // try { |
| | | // log.info("正在注册小程序拦截器..."); |
| | | // // 统一验证服务拦截器 |
| | | //// registry.addInterceptor(checkForClientInterceptor) |
| | | //// .addPathPatterns("/base/v1/mini-program/**", "/api/v1/mini-program/**"); |
| | | // log.info("小程序拦截器注册成功"); |
| | | // } catch (Exception e) { |
| | | // log.warn("小程序拦截器注册失败: {}", e.getMessage()); |
| | | // } |
| | | // } |
| | | // |
| | | //} |
| | | package com.xiaopeng.account.config; |
| | | |
| | | import com.xiaopeng.unifiedverification.interceptor.CheckForClientInterceptor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; |
| | | import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | @Slf4j |
| | | @Configuration |
| | | public class MiniprogramConfigurer extends WebMvcConfigurerAdapter { |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private CheckForClientInterceptor checkForClientInterceptor; |
| | | |
| | | @Override |
| | | public void addInterceptors(InterceptorRegistry registry) { |
| | | try { |
| | | log.info("正在注册小程序拦截器..."); |
| | | // 统一验证服务拦截器 |
| | | registry.addInterceptor(checkForClientInterceptor) |
| | | .addPathPatterns("/base/v1/mini-program/**", "/api/v1/mini-program/**"); |
| | | log.info("小程序拦截器注册成功"); |
| | | } catch (Exception e) { |
| | | log.warn("小程序拦截器注册失败: {}", e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | @ApiModelProperty(value = "订单号") |
| | | private String orderNo; |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | @ApiModelProperty(value = "方向角 0-359") |
| | | private Integer direction; |
| | | |
| | | @ApiModelProperty(value = "消息类型") |
| | | private String messageType; |
| | | |
| | | } |
| | |
| | | |
| | | // 根据开通城市 获取定价 |
| | | @GetMapping("/logan/inner/v1/getPricingByCid") |
| | | R<XpPricing> getPricingByCid(@RequestParam Long cityId,@RequestParam(required = false) String vehicleModelId); |
| | | R<XpPricing> getPricingByCid(@RequestParam(value = "cityId") Long cityId,@RequestParam(value = "vehicleModelId",required = false) String vehicleModelId); |
| | | |
| | | /** |
| | | * 保存XpGeoQueryEntity |
| New file |
| | |
| | | package com.xiaopeng.api.vo.operation; |
| | | |
| | | import lombok.Data; |
| | | import org.springframework.data.annotation.Id; |
| | | import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; |
| | | import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; |
| | | import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; |
| | | import org.springframework.data.mongodb.core.mapping.Document; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * 禁行地理围栏-多边形 |
| | | * @author zhibing.pu |
| | | * @date 2023/4/29 23:53 |
| | | */ |
| | | @Data |
| | | @Document(collection = "xp_log_message") |
| | | public class XpLogMessage implements Serializable { |
| | | private static final long serialVersionUID = 4508868382007529971L; |
| | | |
| | | @Id |
| | | private String id; |
| | | /** |
| | | * 端口 |
| | | */ |
| | | private String type; |
| | | /** |
| | | * 消息日志主题 |
| | | */ |
| | | private Object response; |
| | | |
| | | /** |
| | | * 时间戳 |
| | | */ |
| | | private Long timestamp; |
| | | } |
| | |
| | | com.xiaopeng.api.factory.order.XpOrderReassignClientFallbackFactory |
| | | com.xiaopeng.api.factory.map.XpStationClientFallbackFactory |
| | | com.xiaopeng.api.factory.pushMessage.SubscribeMessageClientFallbackFactory |
| | | com.xiaopeng.api.factory.account.UserSubscribeMessageClientFallbackFactory |
| | | com.xiaopeng.api.factory.account.UserSubscribeMessageClientFallbackFactory |
| | | com.xiaopeng.api.service.BootCommonService |
| | |
| | | taskBuilder.setSequence(1); |
| | | taskBuilder.setOrderPhase(OrderPhase.ROUTE_TO_CRUISE); |
| | | taskListBuilder.addTasks(taskBuilder.build()); |
| | | } |
| | | else if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.USER_ORDER)){ |
| | | }else if(dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.USER_ORDER)){ |
| | | //乘客单 |
| | | for (int i = 1; i < 3; i++) { |
| | | RtTask.Builder taskBuilder = RtTask.newBuilder(); |
| | |
| | | dto.setDuration(10.0); |
| | | dto.setDistance(2.0); |
| | | dto.setDirection(60); |
| | | dto.setMessageType(PushMessageTypeEnum.ORDER_ROUTE.getDesc()); |
| | | xpPushMessageClient.pushOrderRoute(dto); |
| | | } |
| | | |
| | |
| | | dto.setDuration(20.0); |
| | | dto.setDistance(10.0); |
| | | dto.setDirection(60); |
| | | dto.setMessageType(PushMessageTypeEnum.ORDER_ROUTE.getDesc()); |
| | | xpPushMessageClient.pushOrderRoute(dto); |
| | | |
| | | //存储历史轨迹 |
| | |
| | | import com.xiaopeng.common.core.utils.uuid.UUID; |
| | | import com.xiaopeng.common.redis.service.RedisService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RTopic; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.data.geo.Point; |
| | | import org.springframework.data.mongodb.core.MongoTemplate; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | import java.util.concurrent.*; |
| | | import java.util.function.Consumer; |
| | | import java.util.concurrent.LinkedBlockingQueue; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | |
| | | /** |
| | |
| | | |
| | | @Resource |
| | | private XpTestOrderClient testOrderClient; |
| | | |
| | | @Resource |
| | | private RedissonClient redissonClient; |
| | | |
| | | private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer() |
| | | .printingEnumsAsInts() |
| | |
| | | if (xpuResPingEnable) { |
| | | responseMessage(cmd, sequence, vin); |
| | | } |
| | | //保存车辆实时位置到redis |
| | | if(0 != longitude && 0 != latitude){ |
| | | redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new Point(longitude, latitude), vin); |
| | | } |
| | | |
| | | VehicleStatus vehicleStatus = systemRuntimeStatus.getVehicleStatus(); |
| | | OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunningOrderStatusInfo(); |
| | | String order_id = runningOrderStatusInfo.getOrderId(); |
| | | //车辆动态信息 |
| | | VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamicStatus(); |
| | | Long orderId = null; |
| | | Integer hasOrder = 0; |
| | | if (StringUtils.isNotEmpty(order_id)) { |
| | | if (order_id.contains("XU")) { |
| | | hasOrder = 1; |
| | | orderId = Long.parseLong(order_id.substring(2)); |
| | | } else if(order_id.contains("TEST")) { |
| | | orderId = Long.parseLong(order_id.substring(4)); |
| | | }else{ |
| | | orderId = Long.parseLong(order_id); |
| | | RLock lock = redissonClient.getLock("PUSH_ORDER_ROUTE_LOCK:" + order_id); |
| | | try { |
| | | boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS); |
| | | if (!tryLock) { |
| | | log.info("获取锁失败,订单ID:{} 无法完成车辆实时位置的逻辑处理。", order_id); |
| | | return; |
| | | } |
| | | } |
| | | //保存车辆实时信息到mongodb |
| | | if(0 != longitude && 0 != latitude){ |
| | | //缓存车辆历史定位,用户辅助获取导航抓路用 |
| | | List<HistoryPointDto> history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId()); |
| | | if(history.size() >= 10){ |
| | | history = new ArrayList<>(history.subList(history.size() - 9, history.size())); |
| | | } |
| | | HistoryPointDto historyPointDto = new HistoryPointDto(); |
| | | historyPointDto.setLocation(longitude + "," + latitude); |
| | | historyPointDto.setLocateTime(System.currentTimeMillis() + ""); |
| | | historyPointDto.setAccuracy(naviPose.getPosAcc()); |
| | | historyPointDto.setDirection(course); |
| | | historyPointDto.setSpeed(dynamicStatus.getSpeed()); |
| | | historyPointDto.setHeight(naviPose.getAlt()); |
| | | history.add(historyPointDto); |
| | | redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId(), history); |
| | | |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class); |
| | | if (null == vehiclePosition) { |
| | | vehiclePosition = new VehiclePosition(); |
| | | vehiclePosition.setVin(vin); |
| | | vehiclePosition.setPoint(new GeoJsonPoint(longitude, latitude)); |
| | | vehiclePosition.setCourse(course); |
| | | vehiclePosition.setAlt(alt); |
| | | vehiclePosition.setSpeed(dynamicStatus.getSpeed()); |
| | | vehiclePosition.setCurrentElectricity(dynamicStatus.getBmsSocDisp()); |
| | | vehiclePosition.setMileageRange(dynamicStatus.getDstBatDisp()); |
| | | vehiclePosition.setOrderId(orderId); |
| | | vehiclePosition.setTotalOdometer(dynamicStatus.getTotalOdometer()); |
| | | vehiclePosition.setAddTime(System.currentTimeMillis()); |
| | | mongoTemplate.save(vehiclePosition); |
| | | }else{ |
| | | vehiclePosition.setOrderId(orderId); |
| | | Update update = new Update() |
| | | .set("point", new GeoJsonPoint(longitude, latitude)) |
| | | .set("course", course) |
| | | .set("alt", alt) |
| | | .set("speed", dynamicStatus.getSpeed()) |
| | | .set("currentElectricity", dynamicStatus.getBmsSocDisp()) |
| | | .set("mileageRange", dynamicStatus.getDstBatDisp()) |
| | | .set("hasOrder", hasOrder) |
| | | .set("orderId", orderId) |
| | | .set("totalOdometer", dynamicStatus.getTotalOdometer()) |
| | | .set("addTime", System.currentTimeMillis()); |
| | | mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(vin)), update, VehiclePosition.class); |
| | | } |
| | | //调用推送服务接口,给乘客推送剩余轨迹和里程时长 |
| | | RtTripInfo rtTripInfo = systemRuntimeStatus.getRunningOrderStatusInfo().getRtTripInfo(); |
| | | if (null != orderId && !order_id.contains("XU")) { |
| | | PushOrderRouteDTO dto = new PushOrderRouteDTO(); |
| | | dto.setOrderId(orderId); |
| | | dto.setRouteType(1); |
| | | dto.setLongitude(longitude); |
| | | dto.setLatitude(latitude); |
| | | if (rtTripInfo.hasCurrentTask() && rtTripInfo.getCurrentTask().hasNaviProgressInfo()) { |
| | | dto.setDuration(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainTime()); |
| | | dto.setDistance(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainDist()); |
| | | dto.setDirection(course.intValue()); |
| | | } |
| | | |
| | | OrderTrajectoryVo orderTrajectory = new OrderTrajectoryVo(); |
| | | orderTrajectory.setOrderId(orderId); |
| | | orderTrajectory.setLocation(longitude + "," + latitude); |
| | | orderTrajectory.setDirection(dto.getDirection()); |
| | | orderTrajectory.setSpeed((double) dynamicStatus.getSpeed()); |
| | | orderTrajectory.setLocatetime(System.currentTimeMillis()); |
| | | orderTrajectory.setCreateTime(new Date()); |
| | | //只有乘客订单需要推送剩余导航数据 |
| | | if(!order_id.contains("TEST")){ |
| | | xpPushMessageClient.pushOrderRoute(dto);//存储历史轨迹 |
| | | // 给连环派单的用户推送 |
| | | Long nextOrderId = redisService.getCacheObject(CacheConstants.nextOrder(order_id)); |
| | | if (null != nextOrderId){ |
| | | dto.setOrderId(nextOrderId); |
| | | xpPushMessageClient.pushOrderRoute(dto); |
| | | } |
| | | xpOrderClient.saveVehicleLocation(orderTrajectory); |
| | | //车辆动态信息 |
| | | VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamicStatus(); |
| | | Long orderId = null; |
| | | Integer hasOrder = 0; |
| | | if (StringUtils.isNotEmpty(order_id)) { |
| | | if (order_id.contains("XU")) { |
| | | hasOrder = 1; |
| | | orderId = Long.parseLong(order_id.substring(2)); |
| | | } else if(order_id.contains("TEST")) { |
| | | orderId = Long.parseLong(order_id.substring(4)); |
| | | }else{ |
| | | testOrderClient.saveVehicleLocation(orderTrajectory); |
| | | orderId = Long.parseLong(order_id); |
| | | } |
| | | } |
| | | //保存车辆实时信息到mongodb |
| | | if(0 != longitude && 0 != latitude){ |
| | | //缓存车辆历史定位,用户辅助获取导航抓路用 |
| | | // List<HistoryPointDto> history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId()); |
| | | // if(history.size() >= 10){ |
| | | // history = new ArrayList<>(history.subList(history.size() - 9, history.size())); |
| | | // } |
| | | // HistoryPointDto historyPointDto = new HistoryPointDto(); |
| | | // historyPointDto.setLocation(longitude + "," + latitude); |
| | | // historyPointDto.setLocateTime(System.currentTimeMillis() + ""); |
| | | // historyPointDto.setAccuracy(naviPose.getPosAcc()); |
| | | // historyPointDto.setDirection(new BigDecimal(course).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); |
| | | // historyPointDto.setSpeed(dynamicStatus.getSpeed()); |
| | | // historyPointDto.setHeight(naviPose.getAlt()); |
| | | // history.add(historyPointDto); |
| | | // redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + xpVehicle.getId(), history); |
| | | |
| | | redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new Point(longitude, latitude), vin); |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class); |
| | | if (null == vehiclePosition) { |
| | | vehiclePosition = new VehiclePosition(); |
| | | vehiclePosition.setVin(vin); |
| | | vehiclePosition.setPoint(new GeoJsonPoint(longitude, latitude)); |
| | | vehiclePosition.setCourse(course); |
| | | vehiclePosition.setAlt(alt); |
| | | vehiclePosition.setSpeed(dynamicStatus.getSpeed()); |
| | | vehiclePosition.setCurrentElectricity(dynamicStatus.getBmsSocDisp()); |
| | | vehiclePosition.setMileageRange(dynamicStatus.getDstBatDisp()); |
| | | vehiclePosition.setOrderId(orderId); |
| | | vehiclePosition.setTotalOdometer(dynamicStatus.getTotalOdometer()); |
| | | vehiclePosition.setAddTime(System.currentTimeMillis()); |
| | | mongoTemplate.save(vehiclePosition); |
| | | }else{ |
| | | vehiclePosition.setOrderId(orderId); |
| | | Update update = new Update() |
| | | .set("point", new GeoJsonPoint(longitude, latitude)) |
| | | .set("course", course) |
| | | .set("alt", alt) |
| | | .set("speed", dynamicStatus.getSpeed()) |
| | | .set("currentElectricity", dynamicStatus.getBmsSocDisp()) |
| | | .set("mileageRange", dynamicStatus.getDstBatDisp()) |
| | | .set("hasOrder", hasOrder) |
| | | .set("orderId", orderId) |
| | | .set("totalOdometer", dynamicStatus.getTotalOdometer()) |
| | | .set("addTime", System.currentTimeMillis()); |
| | | mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(vin)), update, VehiclePosition.class); |
| | | } |
| | | //调用推送服务接口,给乘客推送剩余轨迹和里程时长 |
| | | RtTripInfo rtTripInfo = systemRuntimeStatus.getRunningOrderStatusInfo().getRtTripInfo(); |
| | | if (null != orderId && !order_id.contains("XU")) { |
| | | PushOrderRouteDTO dto = new PushOrderRouteDTO(); |
| | | dto.setOrderId(orderId); |
| | | dto.setRouteType(1); |
| | | dto.setLongitude(longitude); |
| | | dto.setLatitude(latitude); |
| | | if (rtTripInfo.hasCurrentTask() && rtTripInfo.getCurrentTask().hasNaviProgressInfo()) { |
| | | dto.setDuration(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainTime()); |
| | | dto.setDistance(rtTripInfo.getCurrentTask().getNaviProgressInfo().getRouteRemainDist()); |
| | | dto.setDirection(course.intValue()); |
| | | } |
| | | |
| | | OrderTrajectoryVo orderTrajectory = new OrderTrajectoryVo(); |
| | | orderTrajectory.setOrderId(orderId); |
| | | orderTrajectory.setLocation(longitude + "," + latitude); |
| | | orderTrajectory.setDirection(dto.getDirection()); |
| | | orderTrajectory.setSpeed((double) dynamicStatus.getSpeed()); |
| | | orderTrajectory.setLocatetime(System.currentTimeMillis()); |
| | | orderTrajectory.setCreateTime(new Date()); |
| | | //只有乘客订单需要推送剩余导航数据 |
| | | if(!order_id.contains("TEST")){ |
| | | xpPushMessageClient.pushOrderRoute(dto);//存储历史轨迹 |
| | | // 给连环派单的用户推送 |
| | | Long nextOrderId = redisService.getCacheObject(CacheConstants.nextOrder(order_id)); |
| | | if (null != nextOrderId){ |
| | | dto.setOrderId(nextOrderId); |
| | | xpPushMessageClient.pushOrderRoute(dto); |
| | | } |
| | | xpOrderClient.saveVehicleLocation(orderTrajectory); |
| | | }else{ |
| | | testOrderClient.saveVehicleLocation(orderTrajectory); |
| | | } |
| | | } |
| | | } |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | }finally { |
| | | lock.unlock(); |
| | | } |
| | | } |
| | | |
| | |
| | | LonLatDto destination = new LonLatDto(); |
| | | LonLatDto origin = new LonLatDto(); |
| | | RouteVo routeVo = null; |
| | | if (orderId.contains("XU")) { |
| | | orderType = OrderType.CRUISE_ORDER; |
| | | String key = ""; |
| | | |
| | | R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2))); |
| | | XpCruiseOrder xpCruiseOrder = cruiseOrder.getData(); |
| | | |
| | | //构建导航数据给到车端 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(xpCruiseOrder.getEndLon()); |
| | | destination.setLatitude(xpCruiseOrder.getEndLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(2))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(3); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | //添加redis锁,用于在发生偏航后重新规划线路与正常推送剩余导航数据之间的冲突 |
| | | RLock lock = redissonClient.getLock("PUSH_ORDER_ROUTE_LOCK:" + orderId); |
| | | try { |
| | | boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS); |
| | | if(!tryLock){ |
| | | log.info("获取锁失败,订单ID:{} 无法完成偏航后的逻辑处理。", orderId); |
| | | return; |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | if (orderId.contains("XU")) { |
| | | orderType = OrderType.CRUISE_ORDER; |
| | | |
| | | |
| | | vehicleId = xpCruiseOrder.getVehicleId(); |
| | | } else if(orderId.contains("TEST")){ |
| | | R<XpTestOrder> cruiseOrder = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4))); |
| | | XpTestOrder testOrder = cruiseOrder.getData(); |
| | | //区分测试单和测试巡游单 |
| | | if(1 == testOrder.getOrderType()){ |
| | | orderType = OrderType.TEST_ORDER; |
| | | //驶往上车点的行程 |
| | | if (3 == testOrder.getStatus()) { |
| | | //查询司机当前位置到起点的线路 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(testOrder.getStartLon()); |
| | | destination.setLatitude(testOrder.getStartLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(4))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(1); |
| | | dto.setVehicleId(testOrder.getVehicleId()); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | //缓存数据,用于后续推给乘客导航线路 |
| | | redisService.setCacheObject("TEST_ORDER_NAVIGATION_START_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); |
| | | } |
| | | //驶往下车点的行程 |
| | | if (6 == testOrder.getStatus()) { |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(testOrder.getEndLon()); |
| | | destination.setLatitude(testOrder.getEndLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(4))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(2); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据 |
| | | redisService.setCacheObject("TEST_ORDER_NAVIGATION_END_DATA:" + testOrder.getVehicleId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); |
| | | } |
| | | |
| | | }else{ |
| | | orderType = OrderType.TEST_CRUISE_ORDER; |
| | | R<XpCruiseOrder> cruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(orderId.substring(2))); |
| | | XpCruiseOrder xpCruiseOrder = cruiseOrder.getData(); |
| | | |
| | | //构建导航数据给到车端 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(testOrder.getEndLon()); |
| | | destination.setLatitude(testOrder.getEndLat()); |
| | | destination.setLongitude(xpCruiseOrder.getEndLon()); |
| | | destination.setLatitude(xpCruiseOrder.getEndLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(4))); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(2))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(3); |
| | |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | |
| | | vehicleId = testOrder.getVehicleId(); |
| | | } |
| | | } else { |
| | | orderType = OrderType.USER_ORDER; |
| | | //正常单 |
| | | R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId)); |
| | | if (200 != xpOrderR.getCode()) { |
| | | throw new RuntimeException("订单不存在"); |
| | | } |
| | | XpOrder xpOrder = xpOrderR.getData(); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | //驶往上车点的行程 |
| | | if (3 == xpOrder.getStatus()) { |
| | | //查询司机当前位置到起点的线路 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(xpOrder.getStartLon()); |
| | | destination.setLatitude(xpOrder.getStartLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId)); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(1); |
| | | dto.setVehicleId(xpOrder.getVehicleId()); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | //缓存数据,用于后续推给乘客导航线路 |
| | | redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); |
| | | } |
| | | //驶往下车点的行程 |
| | | if (6 == xpOrder.getStatus()) { |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(xpOrder.getEndLon()); |
| | | destination.setLatitude(xpOrder.getEndLat()); |
| | | vehicleId = xpCruiseOrder.getVehicleId(); |
| | | } else if(orderId.contains("TEST")){ |
| | | R<XpTestOrder> cruiseOrder = testOrderClient.queryOrderById(Long.parseLong(orderId.substring(4))); |
| | | XpTestOrder testOrder = cruiseOrder.getData(); |
| | | //区分测试单和测试巡游单 |
| | | if(1 == testOrder.getOrderType()){ |
| | | orderType = OrderType.TEST_ORDER; |
| | | //驶往上车点的行程 |
| | | if (3 == testOrder.getStatus()) { |
| | | //查询司机当前位置到起点的线路 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(testOrder.getStartLon()); |
| | | destination.setLatitude(testOrder.getStartLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId)); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(2); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据 |
| | | redisService.setCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); |
| | | } |
| | | vehicleId = xpOrder.getVehicleId(); |
| | | } |
| | | //直接响应回最新导航数据 |
| | | if(StringUtils.isNotEmpty(routeID)){ |
| | | //推送小程序新的导航数据 |
| | | if(orderType.equals(OrderType.USER_ORDER)){ |
| | | PushOrderRouteDTO dto = new PushOrderRouteDTO(); |
| | | dto.setOrderId(Long.parseLong(orderId)); |
| | | dto.setRouteType(1); |
| | | dto.setLongitude(longitude); |
| | | dto.setLatitude(latitude); |
| | | if (null != routeVo) { |
| | | dto.setDuration(null == routeVo.getDuration() ? 0 : routeVo.getDuration().doubleValue()); |
| | | dto.setDistance(null == routeVo.getDistance() ? 0 : routeVo.getDistance().doubleValue()); |
| | | dto.setDirection(null == routeVo.getDirection() ? 0 : routeVo.getDirection().intValue()); |
| | | } |
| | | xpPushMessageClient.pushOrderRoute(dto); |
| | | log.info("完成小程序下发导航偏离后的新轨迹:" + orderId); |
| | | } |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(4))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(1); |
| | | dto.setVehicleId(testOrder.getVehicleId()); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | key = "TEST_ORDER_NAVIGATION_START_DATA:" + testOrder.getVehicleId(); |
| | | } |
| | | //驶往下车点的行程 |
| | | if (6 == testOrder.getStatus()) { |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(testOrder.getEndLon()); |
| | | destination.setLatitude(testOrder.getEndLat()); |
| | | |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData(); |
| | | R<String> stringR = xpMapClient.queryRouted(routeID); |
| | | if (200 != stringR.getCode()) { |
| | | throw new RuntimeException("根据导航ID获取车端需要的导航数据失败"); |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(4))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(2); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | key = "TEST_ORDER_NAVIGATION_END_DATA:" + testOrder.getVehicleId(); |
| | | } |
| | | |
| | | }else{ |
| | | orderType = OrderType.TEST_CRUISE_ORDER; |
| | | |
| | | //构建导航数据给到车端 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(testOrder.getEndLon()); |
| | | destination.setLatitude(testOrder.getEndLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId.substring(4))); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(3); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | |
| | | vehicleId = testOrder.getVehicleId(); |
| | | } |
| | | } else { |
| | | orderType = OrderType.USER_ORDER; |
| | | //正常单 |
| | | R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.parseLong(orderId)); |
| | | if (200 != xpOrderR.getCode()) { |
| | | throw new RuntimeException("订单不存在"); |
| | | } |
| | | XpOrder xpOrder = xpOrderR.getData(); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | //驶往上车点的行程 |
| | | if (3 == xpOrder.getStatus()) { |
| | | //查询司机当前位置到起点的线路 |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(xpOrder.getStartLon()); |
| | | destination.setLatitude(xpOrder.getStartLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId)); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(1); |
| | | dto.setVehicleId(xpOrder.getVehicleId()); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | key = "ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(); |
| | | } |
| | | //驶往下车点的行程 |
| | | if (6 == xpOrder.getStatus()) { |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | destination.setLongitude(xpOrder.getEndLon()); |
| | | destination.setLatitude(xpOrder.getEndLat()); |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(Long.parseLong(orderId)); |
| | | dto.setOrigin(origin); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(2); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | routeVo = routeVoR.getData(); |
| | | routeID = routeVo.getRouteID(); |
| | | key = "ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(); |
| | | } |
| | | vehicleId = xpOrder.getVehicleId(); |
| | | } |
| | | log.info("开始下发XPU导航偏离后新的导航数据:" + orderId); |
| | | //构建响应导航数据给车端 |
| | | cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId(), taskId); |
| | | log.info("完成下发XPU导航偏离后新的导航数据:" + orderId); |
| | | //直接响应回最新导航数据 |
| | | if(StringUtils.isNotEmpty(routeID)){ |
| | | //推送小程序新的导航数据 |
| | | if(orderType.equals(OrderType.USER_ORDER)){ |
| | | //缓存导航数据,用于后面的逻辑中给乘客端推送导航数据 |
| | | redisService.setCacheObject(key, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); |
| | | PushOrderRouteDTO dto = new PushOrderRouteDTO(); |
| | | dto.setOrderId(Long.parseLong(orderId)); |
| | | dto.setRouteType(1); |
| | | dto.setLongitude(longitude); |
| | | dto.setLatitude(latitude); |
| | | if (null != routeVo) { |
| | | dto.setDuration(null == routeVo.getDuration() ? 0 : routeVo.getDuration().doubleValue()); |
| | | dto.setDistance(null == routeVo.getDistance() ? 0 : routeVo.getDistance().doubleValue()); |
| | | dto.setDirection(null == routeVo.getDirection() ? 0 : routeVo.getDirection().intValue()); |
| | | } |
| | | dto.setMessageType(PushMessageTypeEnum.ORDER_UPDATE_LINE.getDesc()); |
| | | xpPushMessageClient.pushOrderRoute(dto); |
| | | log.info("完成小程序下发导航偏离后的新轨迹:" + orderId); |
| | | } |
| | | |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(vehicleId).getData(); |
| | | R<String> stringR = xpMapClient.queryRouted(routeID); |
| | | if (200 != stringR.getCode()) { |
| | | throw new RuntimeException("根据导航ID获取车端需要的导航数据失败"); |
| | | } |
| | | log.info("开始下发XPU导航偏离后新的导航数据:" + orderId); |
| | | //构建响应导航数据给车端 |
| | | cloudPushNavigationInfo(requestId, routeID, stringR.getData(), orderType, orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId(), taskId); |
| | | log.info("完成下发XPU导航偏离后新的导航数据:" + orderId); |
| | | } |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | }finally { |
| | | lock.unlock(); |
| | | } |
| | | } |
| | | |
| New file |
| | |
| | | package com.xiaopeng.automaticPilot.util; |
| | | |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | 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.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Slf4j |
| | | @Component |
| | | public class TaskUtil { |
| | | |
| | | @Resource |
| | | private MongoTemplate mongoTemplate; |
| | | |
| | | //删除过期的车辆定位数据 |
| | | @Scheduled(cron = "0/30 * * * * ?") |
| | | public void task() { |
| | | log.info("执行删除无效的车辆定位数据"); |
| | | mongoTemplate.remove(Query.query(Criteria.where("addTime").isNull()), VehiclePosition.class); |
| | | mongoTemplate.remove(Query.query(Criteria.where("addTime").lte(LocalDateTime.now().minusMinutes(1))), VehiclePosition.class); |
| | | } |
| | | } |
| | |
| | | ORDER_ROUTE("ORDER_ROUTE"), |
| | | ORDER_UPDATE_PRICE("ORDER_UPDATE_PRICE"), |
| | | OPEN_TRUNK("OPEN_TRUNK"), |
| | | ORDER_REASSIGN("ORDER_REASSIGN"); |
| | | ORDER_REASSIGN("ORDER_REASSIGN"), |
| | | ORDER_UPDATE_LINE("ORDER_UPDATE_LINE"); |
| | | |
| | | @Getter |
| | | private String desc; |
| | |
| | | @NotNull(message = "下单地址不能为空") |
| | | private String placementAddress; |
| | | |
| | | @ApiModelProperty("路线规划规则") |
| | | @NotNull(message = "路线规划规则不能为空") |
| | | private Integer routePlanRule; |
| | | |
| | | @ApiModelProperty("用户优惠券主键:null 或 0 表示不使用券;>0 为具体券 id") |
| | | private Long userCouponId; |
| | | |
| New file |
| | |
| | | package com.xiaopeng.itinerary.service; |
| | | |
| | | import com.xiaopeng.api.feignClient.operation.XpPricingClient; |
| | | import com.xiaopeng.api.feignClient.order.XpOrderClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.operation.XpPricing; |
| | | import com.xiaopeng.api.model.order.XpOrder; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | import com.xiaopeng.common.core.exception.ServiceException; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | @Service |
| | | public class BootCommonService { |
| | | |
| | | @Resource |
| | | private XpPricingClient xpPricingClient; |
| | | @Resource |
| | | private XpVehicleClient xpVehicleClient; |
| | | @Resource |
| | | private XpOrderClient xpOrderClient; |
| | | // @Override 测试 |
| | | public XpOrder getXpOrder(Long orderId) { |
| | | |
| | | R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(orderId); |
| | | if (xpOrderR.getCode() != R.SUCCESS || xpOrderR.getData() == null) { |
| | | throw new ServiceException("订单不存在"); |
| | | } |
| | | return xpOrderR.getData(); |
| | | } |
| | | // @Override |
| | | public XpVehicle getXpVehicle(Long vehicleId) { |
| | | |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId); |
| | | if (xpVehicleR.getCode() != R.SUCCESS || xpVehicleR.getData() == null) { |
| | | throw new ServiceException("车型不存在"); |
| | | } |
| | | return xpVehicleR.getData(); |
| | | } |
| | | // @Override |
| | | public String getVehicleModelId(Long orderId) { |
| | | if(orderId!= null){ |
| | | XpOrder xpOrder = getXpOrder(orderId); |
| | | XpVehicle xpVehicle = getXpVehicle(xpOrder.getVehicleId()); |
| | | return xpVehicle.getVehicleModel(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getPricingByCid(Long cityId, String vehicleModelId) { |
| | | R<XpPricing> xpPricingR = xpPricingClient.getPricingByCid(cityId,vehicleModelId); |
| | | if (xpPricingR.getCode() != R.SUCCESS || xpPricingR.getData() == null) { |
| | | throw new ServiceException("当前城市未配置定价规则"); |
| | | // throw new ServiceException("当前区域未开通服务"); |
| | | } |
| | | return xpPricingR.getData(); |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getXpPricing(Long orderId) { |
| | | if(orderId != null){ |
| | | XpOrder xpOrder = getXpOrder(orderId); |
| | | return getXpPricing(xpOrder.getCityId(),xpOrder.getVehicleId()); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getXpPricing(Long cityId, Long vehicleId) { |
| | | String vehicleModelId = null; |
| | | if(vehicleId != null){ |
| | | XpVehicle xpVehicle = getXpVehicle(vehicleId); |
| | | vehicleModelId = xpVehicle.getVehicleModel(); |
| | | } |
| | | return getPricingByCid(cityId, vehicleModelId); |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getXpPricing(Long cityId, Long orderId, Long vehicleId) { |
| | | String vehicleModelId = null; |
| | | if(vehicleId != null ){ |
| | | XpVehicle xpVehicle = getXpVehicle(vehicleId); |
| | | vehicleModelId = xpVehicle.getVehicleModel(); |
| | | } |
| | | if(vehicleModelId != null){ |
| | | if(orderId != null ){ |
| | | vehicleModelId = getVehicleModelId(orderId); |
| | | } |
| | | } |
| | | return getPricingByCid(cityId, vehicleModelId); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | import com.xiaopeng.api.dto.map.RouteStaleCheckDto; |
| | | import com.xiaopeng.api.dto.map.SelectNavigationRouteDto; |
| | | import com.xiaopeng.api.enums.RouteStrategyKind; |
| | | import com.xiaopeng.api.feignClient.account.UserRoutePlanRuleClient; |
| | | import com.xiaopeng.api.feignClient.account.XpAppUserClient; |
| | | import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | |
| | | import com.xiaopeng.api.feignClient.order.XpOrderClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.account.XpUserRoutePlanRule; |
| | | import com.xiaopeng.api.model.operation.*; |
| | | import com.xiaopeng.api.model.order.XpOrder; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.service.BootCommonService; |
| | | import com.xiaopeng.api.vo.account.UserCouponVo; |
| | | import com.xiaopeng.api.vo.operation.FareVo; |
| | | import com.xiaopeng.api.vo.operation.MultiRouteAndFareVo; |
| | | import com.xiaopeng.api.vo.operation.RouteAndFareVo; |
| | | import com.xiaopeng.api.vo.operation.RouteOptionVo; |
| | | import com.xiaopeng.api.vo.operation.RoutePreferenceItemVo; |
| | | import com.xiaopeng.api.vo.operation.RouteStaleCheckVo; |
| | | import com.xiaopeng.api.vo.operation.RouteVo; |
| | | import com.xiaopeng.api.vo.operation.*; |
| | | import com.xiaopeng.api.vo.order.XpPricingCardVo; |
| | | import com.xiaopeng.common.core.constant.CacheConstants; |
| | | import com.xiaopeng.common.core.domain.R; |
| | |
| | | import com.xiaopeng.common.redis.service.RedisService; |
| | | import com.xiaopeng.itinerary.constant.I18nKeyConstant; |
| | | import com.xiaopeng.itinerary.dto.XpOrderDto; |
| | | import com.xiaopeng.itinerary.navigation.MultiRouteSnapshotPayload; |
| | | import com.xiaopeng.itinerary.mapper.*; |
| | | import com.xiaopeng.itinerary.navigation.MultiRouteSnapshotPayload; |
| | | import com.xiaopeng.itinerary.service.BootCommonService; |
| | | import com.xiaopeng.itinerary.service.IXpGeoQueryEntityService; |
| | | import com.xiaopeng.itinerary.service.XpPointService; |
| | | import com.xiaopeng.itinerary.service.XpPricingService; |
| | | import com.xiaopeng.itinerary.vo.QueueStatusVo; |
| | | import com.xiaopeng.itinerary.utils.XpPricingUtil; |
| | | import com.xiaopeng.itinerary.utils.holiday.HolidayUtil; |
| | | import com.xiaopeng.itinerary.utils.map.FastDistanceCalculator; |
| | | import com.xiaopeng.itinerary.utils.map.GDMapGeocodingUtil; |
| | | import com.xiaopeng.itinerary.vo.QueueStatusVo; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | @Resource |
| | | private XpPointClient xpPointClient; |
| | | |
| | | @Resource |
| | | private UserRoutePlanRuleClient userRoutePlanRuleClient; |
| | | |
| | | @Value("${navigation.route.stale-seconds:60}") |
| | | private int navigationStaleSeconds; |
| | | |
| | |
| | | if(vehicleModel != null){ |
| | | queryWrapper.eq(XpPricing::getVehicleModel, vehicleModel); |
| | | } |
| | | return super.getOne(queryWrapper,true); |
| | | return super.getOne(queryWrapper); |
| | | } |
| | | |
| | | |
| | |
| | | if (openCities == null ) { |
| | | throw new ServiceException("获取城市信息失败", I18nKeyConstant.CITY_NOT_FOUND); |
| | | } |
| | | routeAndFareDto.setOpenCityId(openCities.getId()); |
| | | //根据订单获取车型 获取定价策略 |
| | | String vehicleModel = bootCommonService.getVehicleModelId(routeAndFareDto.getOrderId()); |
| | | |
| | | XpPricing xpPricing = this.getInfo(routeAndFareDto.getOpenCityId(),vehicleModel); |
| | | XpPricing xpPricing = bootCommonService.getXpPricing(routeAndFareDto.getOpenCityId(), routeAndFareDto.getOrderId(), null); |
| | | if (xpPricing == null) { |
| | | throw new ServiceException("当前区域未开通服务", I18nKeyConstant.NO_CURRENT_REGION); |
| | | } |
| | | |
| | | |
| | | XpOpenCity xpOpenCity = openCities; |
| | | routeAndFareDto.setOpenCityId(xpOpenCity.getId()); |
| | | List<XpRoutePlan> xpRoutePlan = xpRoutePlanMapper.selectList(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, cityCode)); |
| | | |
| | | // 找出用户偏好 |
| | |
| | | XpOpenCity xpOpenCity = openCities; |
| | | dto.setOpenCityId(xpOpenCity.getId()); |
| | | xpOrder.setCityCode(xpOpenCity.getCityCode()); |
| | | XpRoutePlan xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2).eq(XpRoutePlan::getCityCode, xpOpenCity.getCityCode())); |
| | | XpUserRoutePlanRule xpUserRoutePlanRule = userRoutePlanRuleClient.getXpUserRoutePlanRule(uid).getData(); |
| | | XpRoutePlan xpRoutePlan = null; |
| | | if(null != xpUserRoutePlanRule){ |
| | | xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2) |
| | | .eq(XpRoutePlan::getCityCode, xpOpenCity.getCityCode()).eq(XpRoutePlan::getRoutePlanRule, xpUserRoutePlanRule.getRoutePlanRule())); |
| | | xpRoutePlanMapper.selectById(xpUserRoutePlanRule.getRoutePlanRule()); |
| | | }else{ |
| | | xpRoutePlan = xpRoutePlanMapper.selectOne(new LambdaQueryWrapper<XpRoutePlan>().eq(XpRoutePlan::getAuditStatus, 2) |
| | | .eq(XpRoutePlan::getCityCode, xpOpenCity.getCityCode()).last(" limit 1")); |
| | | } |
| | | |
| | | Integer distance = 0; |
| | | Integer duration = 0; |
| | |
| | | package com.xiaopeng.map.controller; |
| | | |
| | | |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.xiaopeng.api.dto.WeatherDTO; |
| | | import com.xiaopeng.api.dto.map.HistoryPointDto; |
| | | import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; |
| | | import com.xiaopeng.api.dto.map.RouteAndFareDto; |
| | | import com.xiaopeng.api.feignClient.order.XpOrderClient; |
| | | import com.xiaopeng.api.dto.WeatherDTO; |
| | | import com.xiaopeng.api.vo.map.PointByIpVo; |
| | | import com.xiaopeng.api.vo.operation.RouteVo; |
| | | import com.xiaopeng.common.core.domain.R; |
| | |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | |
| | | @Slf4j |
| | | @RestController |
| | |
| | | List<Document> pointsInFence = xpGeoFencingPolygonService.findPointsByParentId(fenceId, "fenceId", "prohibited_area"); |
| | | |
| | | // 避让区域 |
| | | ArrayList<String> pointStrParam = new ArrayList<>(); |
| | | ArrayList<JSONObject> pointStrParam = new ArrayList<>(); |
| | | try { |
| | | for (Document document : pointsInFence) { |
| | | // 获取points字段(它是GeoJSON对象) |
| | |
| | | if (coordinates != null && !coordinates.isEmpty()) { |
| | | // 获取第一个多边形环(通常只有一个) |
| | | List<List<Double>> polygonPoints = coordinates.get(0); |
| | | |
| | | List<String> coordinatesList = new ArrayList<>(); |
| | | // 转换为经纬度字符串 |
| | | for (List<Double> point : polygonPoints) { |
| | | if (point.size() >= 2) { |
| | | pointStrParam.add(point.get(0) + "," + point.get(1)); |
| | | coordinatesList.add(point.get(0) + "," + point.get(1)); |
| | | } |
| | | } |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("coordinates", coordinatesList); |
| | | pointStrParam.add(jsonObject); |
| | | } |
| | | } |
| | | } |
| | | |
| | | List<HistoryPointDto> history = new ArrayList<>(); |
| | | if(null != dto.getVehicleId()){ |
| | | history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId()); |
| | | // history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId()); |
| | | // if(history.size() > 10){ |
| | | // history = history.subList(history.size() - 10, history.size()); |
| | | // } |
| | | // history.forEach(s->{ |
| | | // s.setDirection(new BigDecimal(s.getDirection()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); |
| | | // }); |
| | | // redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId(), history); |
| | | } |
| | | if(history.size() > 10){ |
| | | history = history.subList(history.size() - 10, history.size()); |
| | | } |
| | | redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId(), history); |
| | | RouteVo routeVo = gdMapGeocodingUtil.getDistanceAndTime(dto.getOrigin(), dto.getDestination(), pointStrParam, fenceId,dto.getRoutePlanRule(), history); |
| | | if(routeVo==null){ |
| | | return R.fail("没有找到路线"); |
| | |
| | | GeoPoint startPoint = new GeoPoint(dto.getOrigin().getLongitude(),dto.getOrigin().getLatitude()); |
| | | List<String> operatingArea = xpGeoFencingPolygonService.findFencesContainingPoint(startPoint, "operating_area", "points"); |
| | | // 避让区域 |
| | | ArrayList<String> pointStrParam = new ArrayList<>(); |
| | | ArrayList<JSONObject> pointStrParam = new ArrayList<>(); |
| | | String fenceId = null; |
| | | if(!operatingArea.isEmpty()){ |
| | | fenceId = operatingArea.get(0); |
| | | List<Document> pointsInFence = xpGeoFencingPolygonService.findPointsByParentId(fenceId, "parentId", "prohibited_area"); |
| | | for (Document document : pointsInFence) { |
| | | List<GeoPoint> points = document.getList("points", GeoPoint.class); |
| | | List<String> coordinatesList = new ArrayList<>(); |
| | | // 一个区域的点位 |
| | | for (GeoPoint point : points) { |
| | | pointStrParam.add(point.getLongitude()+","+point.getLatitude()); |
| | | coordinatesList.add(point.getLongitude()+","+point.getLatitude()); |
| | | } |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("coordinates", coordinatesList); |
| | | pointStrParam.add(jsonObject); |
| | | } |
| | | } |
| | | List<HistoryPointDto> history = new ArrayList<>(); |
| | | if(null != dto.getVehicleId()){ |
| | | history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId()); |
| | | // history = redisService.getCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId()); |
| | | // if(history.size() > 10){ |
| | | // history = history.subList(history.size() - 10, history.size()); |
| | | // } |
| | | // history.forEach(s->{ |
| | | // s.setDirection(new BigDecimal(s.getDirection()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); |
| | | // }); |
| | | // redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId(), history); |
| | | } |
| | | if(history.size() > 10){ |
| | | history = history.subList(history.size() - 10, history.size()); |
| | | } |
| | | redisService.setCacheList("VEHICLE_HISTORY_POINT_LIST:" + dto.getVehicleId(), history); |
| | | RouteVo routeVo = gdMapGeocodingUtil.getDistanceAndTime(dto.getOrigin(), dto.getDestination(), pointStrParam, fenceId,dto.getRoutePlanRule(), history); |
| | | if(routeVo==null){ |
| | | return R.fail("没有找到路线"); |
| | |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | public RouteVo getDistanceAndTime(LonLatDto start, LonLatDto end,List<String> avoidRoads,String fenceId,Integer routePlanRule, List<HistoryPointDto> history) { |
| | | public RouteVo getDistanceAndTime(LonLatDto start, LonLatDto end,ArrayList<JSONObject> avoidRoads,String fenceId,Integer routePlanRule, List<HistoryPointDto> history) { |
| | | RouteVo routeVo = new RouteVo(); |
| | | |
| | | String url = "https://tsapi.amap.com/v1/route/price?key=" + key + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude(); |
| | |
| | | params.put("end", end.getLongitude() + "," + end.getLatitude()); |
| | | params.put("routeUserType", 2); |
| | | if (avoidRoads != null && !avoidRoads.isEmpty()) { |
| | | JSONArray avoidPolygons = new JSONArray(); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("coordinates", avoidRoads); |
| | | avoidPolygons.add(jsonObject); |
| | | params.put("avoidPolygons", avoidPolygons); |
| | | params.put("avoidPolygons", avoidRoads); |
| | | } |
| | | if (routePlanRule != null) { |
| | | params.put("strategy", routePlanRule); |
| | |
| | | "/base/v1/mini-program/open/t-region/getProvince", |
| | | "/base/v1/mini-program/privacy/content/*", |
| | | "/base/v1/mini-program/privacy/contentAll", |
| | | "/base/v1/mini-program/guide/list"); |
| | | "/base/v1/mini-program/guide/list", |
| | | "/base/v1/mini-program/miniLog/uploadLog", |
| | | "/base/v1/mini-program/miniLog/getMiniLogUploadLog"); |
| | | log.info("小程序拦截器注册成功"); |
| | | } catch (Exception e) { |
| | | log.warn("小程序拦截器注册失败: {}", e.getMessage()); |
| New file |
| | |
| | | package com.xiaopeng.operation.controller; |
| | | |
| | | |
| | | import com.xiaopeng.api.vo.operation.XpLogMessage; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | 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.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | | |
| | | @RequestMapping |
| | | @RestController |
| | | public class LogController { |
| | | |
| | | @Resource |
| | | private MongoTemplate mongoTemplate; |
| | | |
| | | |
| | | /** |
| | | * 保存小程序日志 |
| | | * @param message |
| | | * @return |
| | | */ |
| | | @PostMapping("/base/v1/mini-program/miniLog/uploadLog") |
| | | public R<?> miniLogUploadLog(@RequestBody XpLogMessage message){ |
| | | message.setType("mini-program"); |
| | | mongoTemplate.save(message); |
| | | return R.ok(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 查询日志记录 |
| | | * @param type |
| | | * @param startTime |
| | | * @param endTime |
| | | * @return |
| | | */ |
| | | @PostMapping("/base/v1/mini-program/miniLog/getMiniLogUploadLog") |
| | | public R<List<XpLogMessage>> getMiniLogUploadLog(@RequestParam("type") String type, |
| | | @RequestParam("startTime") Long startTime, |
| | | @RequestParam("endTime") Long endTime){ |
| | | Query query = new Query().addCriteria(Criteria.where("type").is(type)); |
| | | if(null != startTime && null != endTime){ |
| | | query.addCriteria(Criteria.where("timestamp").gte(startTime).lte(endTime)); |
| | | } |
| | | List<XpLogMessage> type1 = mongoTemplate.find(query, XpLogMessage.class); |
| | | return R.ok(type1); |
| | | } |
| | | } |
| | |
| | | */ |
| | | @Api(tags = "阿里云文件上传") |
| | | @RestController |
| | | @RequestMapping("/base/v1/oss") |
| | | @RequestMapping("") |
| | | public class OssController { |
| | | |
| | | @Resource |
| | | private AliOssService aliOssService; |
| | | |
| | | @PostMapping(value = "/upload",headers = "content-type=multipart/form-data") |
| | | @PostMapping(value = "/base/v1/oss/upload",headers = "content-type=multipart/form-data") |
| | | @ApiOperation(value = "文件上传",tags = "文件上传") |
| | | public R<FileUploadVO> uploadOSS(@RequestParam("file") MultipartFile file) { |
| | | try { |
| | |
| | | |
| | | |
| | | |
| | | @PostMapping(value = "/getUploadOSSUrl") |
| | | |
| | | @PostMapping(value = "/maintenance-app/base/v1/oss/upload",headers = "content-type=multipart/form-data") |
| | | @ApiOperation(value = "文件上传",tags = "文件上传") |
| | | public R<FileUploadVO> uploadOSS1(@RequestParam("file") MultipartFile file) { |
| | | try { |
| | | // 上传并返回访问地址 |
| | | String fileName = file.getOriginalFilename(); |
| | | String prefix = fileName.substring(fileName.lastIndexOf(".")); |
| | | long fileSize = file.getSize(); |
| | | String fileId = UUID.randomUUID().toString(); |
| | | //上传文件 |
| | | aliOssService.uploadFile(file.getBytes(), fileId); |
| | | String downloadUrl = aliOssService.getDownloadUrl(fileId, fileName,true); |
| | | FileUploadVO fileUploadVO = new FileUploadVO(); |
| | | fileUploadVO.setId(fileId); |
| | | fileUploadVO.setName(fileName); |
| | | fileUploadVO.setUrl(downloadUrl); |
| | | |
| | | // FileUploadVO fileUploadVO = new FileUploadVO(); |
| | | // fileUploadVO.setId(UUID.randomUUID().toString()); |
| | | // fileUploadVO.setName("测试.jpg"); |
| | | // fileUploadVO.setUrl("https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/552a3a31-e4dd-4a28-8748-fd8b87dd3055.png"); |
| | | return R.ok(fileUploadVO); |
| | | } catch (Exception e) { |
| | | System.err.println("上传文件失败"+e); |
| | | return R.fail(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | @PostMapping(value = "/maintenance-app/base/v1/oss/getUploadOSSUrl") |
| | | @ApiOperation(value = "获取文件上传地址",tags = "文件上传") |
| | | public R<String> getUploadOSSUrl(@RequestParam("fileId") String fileId) { |
| | | try { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | @PostMapping(value = "/base/v1/oss/getUploadOSSUrl") |
| | | @ApiOperation(value = "获取文件上传地址",tags = "文件上传") |
| | | public R<String> getUploadOSSUrl1(@RequestParam("fileId") String fileId) { |
| | | try { |
| | | // 上传并返回访问地址 |
| | | String uploadUrl = aliOssService.getUploadUrl(fileId, true); |
| | | return R.ok(uploadUrl); |
| | | } catch (Exception e) { |
| | | System.err.println("上传文件失败"+e); |
| | | return R.fail(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | // 根据开通城市 获取定价 |
| | | @GetMapping("/logan/inner/v1/getPricingByCid") |
| | | public R<XpPricing> getPricingByCid(@RequestParam Long cityId,@RequestParam(required = false) String vehicleModelId) { |
| | | public R<XpPricing> getPricingByCid(@RequestParam("cityId") Long cityId,@RequestParam(value = "vehicleModelId", required = false) String vehicleModelId) { |
| | | LambdaQueryWrapper<XpPricing> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(XpPricing::getDeleted, 0); |
| | | queryWrapper.eq(XpPricing::getCityId, cityId); |
| | | if(null != vehicleModelId){ |
| | | queryWrapper.eq(XpPricing::getVehicleModel, vehicleModelId); |
| | |
| | | package com.xiaopeng.operation.utils.task; |
| | | |
| | | import com.xiaopeng.api.model.operation.XpBanner; |
| | | import com.xiaopeng.api.vo.operation.XpLogMessage; |
| | | import com.xiaopeng.common.core.constant.CacheConstants; |
| | | import com.xiaopeng.operation.service.XpBannerService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | 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.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneOffset; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * @author 无关风月 |
| | |
| | | |
| | | @Autowired |
| | | private XpBannerService bannerService; |
| | | |
| | | @Resource |
| | | private MongoTemplate mongoTemplate; |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 删除移动端日志 |
| | | */ |
| | | @Scheduled(cron = "0 0 0 * * ?") |
| | | public void removeLogMessage() { |
| | | //删除大于2天的日志记录 |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | LocalDateTime twoDayAgo = now.minusDays(2); |
| | | mongoTemplate.remove(new Query(Criteria.where("timestamp").lt(twoDayAgo.toEpochSecond(ZoneOffset.of("+8")))), XpLogMessage.class); |
| | | } |
| | | } |
| | |
| | | import org.springframework.boot.SpringApplication; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.boot.web.servlet.ServletComponentScan; |
| | | import org.springframework.context.annotation.ComponentScan; |
| | | import org.springframework.context.annotation.ComponentScans; |
| | | import org.springframework.scheduling.annotation.EnableScheduling; |
| | | import org.springframework.transaction.annotation.EnableTransactionManagement; |
| | | |
| New file |
| | |
| | | package com.xiaopeng.order.service; |
| | | |
| | | import com.xiaopeng.api.feignClient.operation.XpPricingClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.operation.XpPricing; |
| | | import com.xiaopeng.api.model.order.XpOrder; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | import com.xiaopeng.common.core.exception.ServiceException; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | @Service |
| | | public class BootCommonService { |
| | | |
| | | @Resource |
| | | private XpPricingClient xpPricingClient; |
| | | @Resource |
| | | private XpVehicleClient xpVehicleClient; |
| | | @Resource |
| | | @Lazy |
| | | private IXpOrderService xpOrderService; |
| | | // @Override |
| | | public XpOrder getXpOrder(Long orderId) { |
| | | |
| | | XpOrder xpOrder = xpOrderService.getById(orderId); |
| | | if (xpOrder == null) { |
| | | throw new ServiceException("订单不存在"); |
| | | } |
| | | return xpOrder; |
| | | } |
| | | // @Override |
| | | public XpVehicle getXpVehicle(Long vehicleId) { |
| | | |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(vehicleId); |
| | | if (xpVehicleR.getCode() != R.SUCCESS || xpVehicleR.getData() == null) { |
| | | throw new ServiceException("车型不存在"); |
| | | } |
| | | return xpVehicleR.getData(); |
| | | } |
| | | // @Override |
| | | public String getVehicleModelId(Long orderId) { |
| | | if(orderId!= null){ |
| | | XpOrder xpOrder = getXpOrder(orderId); |
| | | XpVehicle xpVehicle = getXpVehicle(xpOrder.getVehicleId()); |
| | | return xpVehicle.getVehicleModel(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getPricingByCid(Long cityId, String vehicleModelId) { |
| | | R<XpPricing> xpPricingR = xpPricingClient.getPricingByCid(cityId,vehicleModelId); |
| | | if (xpPricingR.getCode() != R.SUCCESS || xpPricingR.getData() == null) { |
| | | throw new ServiceException("当前城市未配置定价规则"); |
| | | // throw new ServiceException("当前区域未开通服务"); |
| | | } |
| | | return xpPricingR.getData(); |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getXpPricing(Long orderId) { |
| | | if(orderId != null){ |
| | | XpOrder xpOrder = getXpOrder(orderId); |
| | | return getXpPricing(xpOrder.getCityId(),xpOrder.getVehicleId()); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getXpPricing(Long cityId, Long vehicleId) { |
| | | String vehicleModelId = null; |
| | | if(vehicleId != null){ |
| | | XpVehicle xpVehicle = getXpVehicle(vehicleId); |
| | | vehicleModelId = xpVehicle.getVehicleModel(); |
| | | } |
| | | return getPricingByCid(cityId, vehicleModelId); |
| | | } |
| | | |
| | | // @Override |
| | | public XpPricing getXpPricing(Long cityId, Long orderId, Long vehicleId) { |
| | | String vehicleModelId = null; |
| | | if(vehicleId != null ){ |
| | | XpVehicle xpVehicle = getXpVehicle(vehicleId); |
| | | vehicleModelId = xpVehicle.getVehicleModel(); |
| | | } |
| | | if(vehicleModelId != null){ |
| | | if(orderId != null ){ |
| | | vehicleModelId = getVehicleModelId(orderId); |
| | | } |
| | | } |
| | | return getPricingByCid(cityId, vehicleModelId); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.IdUtil; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | | import com.xiaopeng.api.feignClient.operation.*; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.*; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.maintenance.XpTaskRule; |
| | | import com.xiaopeng.api.model.operation.*; |
| | | import com.xiaopeng.api.model.order.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleet; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.service.BootCommonService; |
| | | import com.xiaopeng.api.vo.OrderType; |
| | | import com.xiaopeng.api.vo.account.UserCouponVo; |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | |
| | | import com.xiaopeng.order.model.vo.*; |
| | | import com.xiaopeng.order.service.*; |
| | | import com.xiaopeng.order.utils.GDMapGeocodingUtil; |
| | | import com.xiaopeng.order.utils.TaxiPricingDemoService; |
| | | import com.xiaopeng.order.utils.RegionCodeFilterUtil; |
| | | import com.xiaopeng.order.utils.TaxiPricingDemoService; |
| | | import com.xiaopeng.order.utils.XpPricingUtil; |
| | | import com.xiaopeng.order.utils.holiday.HolidayUtil; |
| | | import com.xiaopeng.order.vo.OrderDetailVo; |
| | |
| | | @Resource |
| | | private XpRoutePlanClient xpRoutePlanClient; |
| | | @Resource |
| | | @Lazy |
| | | private BootCommonService bootCommonService; |
| | | |
| | | |
| | |
| | | if (pricing == null) { |
| | | throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS); |
| | | } |
| | | |
| | | |
| | | |
| | | // 费用 |
| | |
| | | import com.xiaopeng.api.model.order.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleet; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.service.BootCommonService; |
| | | import com.xiaopeng.api.vo.OrderType; |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | | import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType; |
| | |
| | | import com.xiaopeng.order.model.vo.AddTestOrderVo; |
| | | import com.xiaopeng.order.model.vo.XpTestOrderDetailVO; |
| | | import com.xiaopeng.order.model.vo.XpTestOrderPageVO; |
| | | import com.xiaopeng.order.service.IXpOrderEvaluateService; |
| | | import com.xiaopeng.order.service.IXpOrderReassignService; |
| | | import com.xiaopeng.order.service.IXpTestOrderCancelService; |
| | | import com.xiaopeng.order.service.IXpTestOrderService; |
| | | import com.xiaopeng.order.service.*; |
| | | import com.xiaopeng.order.utils.GDMapGeocodingUtil; |
| | | import com.xiaopeng.order.utils.TaxiPricingDemoService; |
| | | import com.xiaopeng.order.utils.XpPricingUtil; |
| | |
| | | import com.xiaopeng.common.core.enums.PushMessageTypeEnum; |
| | | import com.xiaopeng.common.redis.service.RedisService; |
| | | import com.xiaopeng.pushMessage.utils.MapMatchingUtil; |
| | | import com.xiaopeng.pushMessage.utils.TrackPoint; |
| | | import com.xiaopeng.pushMessage.utils.TrajectoryDensifier; |
| | | import io.swagger.annotations.Api; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.time.Instant; |
| | | import java.util.*; |
| | | import java.util.concurrent.LinkedBlockingQueue; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | |
| | | Integer routeType = dto.getRouteType(); |
| | | //正常订单 |
| | | if(routeType == 1){ |
| | | Long pushTime = redisService.getCacheObject("PUSH_TIME:" + dto.getOrderId()); |
| | | if(null != pushTime && System.currentTimeMillis() - pushTime < 1500){ |
| | | return R.ok(); |
| | | //非导航偏离才需要限频 |
| | | if(PushMessageTypeEnum.ORDER_ROUTE.getDesc().equals(dto.getMessageType())){ |
| | | Long pushTime = redisService.getCacheObject("PUSH_TIME:" + dto.getOrderId()); |
| | | if(null != pushTime && System.currentTimeMillis() - pushTime < 1500){ |
| | | return R.ok(); |
| | | } |
| | | redisService.setCacheObject("PUSH_TIME:" + dto.getOrderId(), System.currentTimeMillis()); |
| | | } |
| | | redisService.setCacheObject("PUSH_TIME:" + dto.getOrderId(), System.currentTimeMillis()); |
| | | XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrderId()).getData(); |
| | | if(xpOrder.getStatus() <= 1 || xpOrder.getStatus() >= 8){ |
| | | return R.ok(); |
| | |
| | | // 获取路线规划 |
| | | String key = ""; |
| | | //接驾情况,获取车辆位置到起点的导航 |
| | | if(xpOrder.getStatus() == 2 || xpOrder.getStatus() == 3){ |
| | | if(xpOrder.getStatus() >= 2 && xpOrder.getStatus() <= 4){ |
| | | key = "ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(); |
| | | }else{ |
| | | key = "ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(); |
| | |
| | | |
| | | // 封装轨迹信息 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("type", PushMessageTypeEnum.ORDER_ROUTE.getDesc()); |
| | | params.put("type", dto.getMessageType()); |
| | | params.put("content", JSONObject.toJSONString(content)); |
| | | params.put("timestamp", new Date().getTime()+""); |
| | | |
| | |
| | | package com.xiaopeng.pushMessage.utils; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.gavaghan.geodesy.Ellipsoid; |
| | |
| | | GeodeticCurve geoCurve3 = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, source3, target3); |
| | | double distance3 =geoCurve3.getEllipsoidalDistance(); |
| | | |
| | | //车辆位置在第一个点位的后面 |
| | | //这种情况不需要截取数据,只需要等到车辆位置移到两点之间,再进行截取数据 |
| | | if(distance1 < distance2 && distance2 > distance3){ |
| | | map.put("unserved", polyline); |
| | | map.put("served", new ArrayList<>()); |
| | | // System.err.println("车辆在第一个点位后面,等待车辆位移 " + lonLatDto1.getLongitude() + "," + lonLatDto1.getLatitude() + " " + longitude + "," + latitude); |
| | | return map; |
| | | } |
| | | //车辆位置在第二个点位的前面 |
| | | //这种情况需要从第二个点位开始截取,最终剩余的轨迹从第三个点位开始 |
| | | if(distance1 > distance2 && distance1 > distance3){ |
| | |
| | | map.put("unserved", unserved); |
| | | map.put("served", served); |
| | | |
| | | // System.err.println("车辆在两点之间,从第二个开始截取"); |
| | | System.err.println("车辆在两点之间,从第二个开始截取 : " + i); |
| | | return map; |
| | | } |
| | | } |
| | | //所有数据遍历完后任然没有合适的数据则返回原始数据 |
| | | map.put("unserved", polyline); |
| | | map.put("served", new ArrayList<>()); |
| | | return map; |
| | |
| | | |
| | | |
| | | public static void main(String[] args) { |
| | | String ysgj = "[{\"latitude\":23.162022,\"longitude\":113.382319},{\"latitude\":23.163358,\"longitude\":113.382345},{\"latitude\":23.164174,\"longitude\":113.382312},{\"latitude\":23.164227,\"longitude\":113.382302},{\"latitude\":23.164464,\"longitude\":113.382275},{\"latitude\":23.164624,\"longitude\":113.382259},{\"latitude\":23.16507,\"longitude\":113.382227},{\"latitude\":23.165418,\"longitude\":113.382227},{\"latitude\":23.165665,\"longitude\":113.382243},{\"latitude\":23.166159,\"longitude\":113.382302},{\"latitude\":23.166368,\"longitude\":113.382339},{\"latitude\":23.167945,\"longitude\":113.382613},{\"latitude\":23.167988,\"longitude\":113.382414},{\"latitude\":23.167988,\"longitude\":113.382414},{\"latitude\":23.167768,\"longitude\":113.382361},{\"latitude\":23.16618,\"longitude\":113.382076},{\"latitude\":23.165966,\"longitude\":113.382044},{\"latitude\":23.165751,\"longitude\":113.382034},{\"latitude\":23.165627,\"longitude\":113.382044},{\"latitude\":23.165456,\"longitude\":113.382082},{\"latitude\":23.165064,\"longitude\":113.382082},{\"latitude\":23.164517,\"longitude\":113.38213},{\"latitude\":23.164442,\"longitude\":113.382136},{\"latitude\":23.164346,\"longitude\":113.382146},{\"latitude\":23.164174,\"longitude\":113.382162},{\"latitude\":23.164018,\"longitude\":113.382168},{\"latitude\":23.163771,\"longitude\":113.382184},{\"latitude\":23.163385,\"longitude\":113.3822},{\"latitude\":23.163165,\"longitude\":113.3822},{\"latitude\":23.162243,\"longitude\":113.382189},{\"latitude\":23.162205,\"longitude\":113.382189},{\"latitude\":23.161663,\"longitude\":113.382168},{\"latitude\":23.161406,\"longitude\":113.382157},{\"latitude\":23.160156,\"longitude\":113.382119},{\"latitude\":23.159641,\"longitude\":113.382125},{\"latitude\":23.159179,\"longitude\":113.38213},{\"latitude\":23.158933,\"longitude\":113.382136},{\"latitude\":23.158176,\"longitude\":113.382168},{\"latitude\":23.158048,\"longitude\":113.382173},{\"latitude\":23.156894,\"longitude\":113.382216},{\"latitude\":23.156234,\"longitude\":113.382184},{\"latitude\":23.156063,\"longitude\":113.382162},{\"latitude\":23.155736,\"longitude\":113.382076},{\"latitude\":23.155119,\"longitude\":113.381851},{\"latitude\":23.154631,\"longitude\":113.381626},{\"latitude\":23.154631,\"longitude\":113.381626},{\"latitude\":23.154529,\"longitude\":113.381481},{\"latitude\":23.153381,\"longitude\":113.380682},{\"latitude\":23.153263,\"longitude\":113.380623},{\"latitude\":23.153198,\"longitude\":113.380623},{\"latitude\":23.153198,\"longitude\":113.380623},{\"latitude\":23.153144,\"longitude\":113.38066},{\"latitude\":23.153107,\"longitude\":113.380735},{\"latitude\":23.153107,\"longitude\":113.380735},{\"latitude\":23.153112,\"longitude\":113.3808},{\"latitude\":23.153161,\"longitude\":113.38088},{\"latitude\":23.153295,\"longitude\":113.380982},{\"latitude\":23.154218,\"longitude\":113.381615},{\"latitude\":23.154432,\"longitude\":113.381733},{\"latitude\":23.15462,\"longitude\":113.381733},{\"latitude\":23.154851,\"longitude\":113.381841},{\"latitude\":23.155414,\"longitude\":113.38206},{\"latitude\":23.156138,\"longitude\":113.382275},{\"latitude\":23.156353,\"longitude\":113.382302},{\"latitude\":23.156353,\"longitude\":113.382302},{\"latitude\":23.155564,\"longitude\":113.383632},{\"latitude\":23.155564,\"longitude\":113.383632},{\"latitude\":23.155312,\"longitude\":113.383648},{\"latitude\":23.155081,\"longitude\":113.383713},{\"latitude\":23.154856,\"longitude\":113.383825},{\"latitude\":23.154593,\"longitude\":113.384002},{\"latitude\":23.154384,\"longitude\":113.38419},{\"latitude\":23.153869,\"longitude\":113.384732},{\"latitude\":23.153606,\"longitude\":113.385081},{\"latitude\":23.153397,\"longitude\":113.385402},{\"latitude\":23.153252,\"longitude\":113.385671},{\"latitude\":23.15308,\"longitude\":113.386036},{\"latitude\":23.15306,\"longitude\":113.386128}]"; |
| | | List<LonLatDto> polyline = TrajectoryDensifier.densify(JSON.parseArray(ysgj, LonLatDto.class), 15); |
| | | |
| | | // String dhgj = "[{\"latitude\":23.162022,\"longitude\":113.382319},{\"latitude\":23.162067140932074,\"longitude\":113.38231987849119},{\"latitude\":23.16211228186415,\"longitude\":113.38232075698238},{\"latitude\":23.162157422796223,\"longitude\":113.38232163547357},{\"latitude\":23.162202563728297,\"longitude\":113.38232251396477},{\"latitude\":23.162247704660373,\"longitude\":113.38232339245596},{\"latitude\":23.162292845592447,\"longitude\":113.38232427094715},{\"latitude\":23.16233798652452,\"longitude\":113.38232514943834},{\"latitude\":23.162383127456597,\"longitude\":113.38232602792954},{\"latitude\":23.16242826838867,\"longitude\":113.38232690642073},{\"latitude\":23.162473409320743,\"longitude\":113.38232778491192},{\"latitude\":23.162518550252816,\"longitude\":113.38232866340311},{\"latitude\":23.162563691184893,\"longitude\":113.38232954189431},{\"latitude\":23.162608832116966,\"longitude\":113.38233042038551},{\"latitude\":23.16265397304904,\"longitude\":113.38233129887671},{\"latitude\":23.162699113981116,\"longitude\":113.3823321773679},{\"latitude\":23.16274425491319,\"longitude\":113.38233305585909},{\"latitude\":23.162789395845262,\"longitude\":113.38233393435029},{\"latitude\":23.16283453677734,\"longitude\":113.38233481284148},{\"latitude\":23.162879677709412,\"longitude\":113.38233569133267},{\"latitude\":23.162924818641486,\"longitude\":113.38233656982386},{\"latitude\":23.162969959573562,\"longitude\":113.38233744831506},{\"latitude\":23.163015100505636,\"longitude\":113.38233832680625},{\"latitude\":23.16306024143771,\"longitude\":113.38233920529744},{\"latitude\":23.163105382369785,\"longitude\":113.38234008378863},{\"latitude\":23.16315052330186,\"longitude\":113.38234096227983},{\"latitude\":23.163195664233932,\"longitude\":113.38234184077102},{\"latitude\":23.16324080516601,\"longitude\":113.38234271926221},{\"latitude\":23.163285946098082,\"longitude\":113.3823435977534},{\"latitude\":23.163331087030155,\"longitude\":113.3823444762446},{\"latitude\":23.163358,\"longitude\":113.382345},{\"latitude\":23.163403116702963,\"longitude\":113.38234317542745},{\"latitude\":23.16344823340593,\"longitude\":113.3823413508549},{\"latitude\":23.163493350108894,\"longitude\":113.38233952628237},{\"latitude\":23.163538466811858,\"longitude\":113.38233770170982},{\"latitude\":23.16358358351482,\"longitude\":113.38233587713727},{\"latitude\":23.16362870021779,\"longitude\":113.38233405256472},{\"latitude\":23.163673816920753,\"longitude\":113.38233222799218},{\"latitude\":23.163718933623716,\"longitude\":113.38233040341963},{\"latitude\":23.163764050326684,\"longitude\":113.38232857884708},{\"latitude\":23.163809167029648,\"longitude\":113.38232675427453},{\"latitude\":23.16385428373261,\"longitude\":113.382324929702},{\"latitude\":23.16389940043558,\"longitude\":113.38232310512944},{\"latitude\":23.163944517138543,\"longitude\":113.3823212805569},{\"latitude\":23.163989633841506,\"longitude\":113.38231945598434},{\"latitude\":23.16403475054447,\"longitude\":113.38231763141181},{\"latitude\":23.164079867247438,\"longitude\":113.38231580683926},{\"latitude\":23.1641249839504,\"longitude\":113.38231398226671},{\"latitude\":23.164170100653365,\"longitude\":113.38231215769416},{\"latitude\":23.164174,\"longitude\":113.382312},{\"latitude\":23.164218476482535,\"longitude\":113.38230360821083},{\"latitude\":23.164227,\"longitude\":113.382302},{\"latitude\":23.1642718998196,\"longitude\":113.38229688483068},{\"latitude\":23.164316799639195,\"longitude\":113.38229176966136},{\"latitude\":23.164361699458794,\"longitude\":113.38228665449203},{\"latitude\":23.16440659927839,\"longitude\":113.38228153932272},{\"latitude\":23.16445149909799,\"longitude\":113.3822764241534},{\"latitude\":23.164624,\"longitude\":113.382259},{\"latitude\":23.16466904920537,\"longitude\":113.38225576777002},{\"latitude\":23.16471409841074,\"longitude\":113.38225253554005},{\"latitude\":23.16475914761611,\"longitude\":113.38224930331006},{\"latitude\":23.16480419682148,\"longitude\":113.38224607108008},{\"latitude\":23.164849246026847,\"longitude\":113.38224283885009},{\"latitude\":23.16489429523222,\"longitude\":113.38223960662012},{\"latitude\":23.164939344437588,\"longitude\":113.38223637439013},{\"latitude\":23.164984393642957,\"longitude\":113.38223314216015},{\"latitude\":23.165029442848326,\"longitude\":113.38222990993016},{\"latitude\":23.16507,\"longitude\":113.382227},{\"latitude\":23.165115148225038,\"longitude\":113.382227},{\"latitude\":23.165160296450075,\"longitude\":113.382227},{\"latitude\":23.165205444675117,\"longitude\":113.382227},{\"latitude\":23.165250592900154,\"longitude\":113.382227},{\"latitude\":23.165295741125192,\"longitude\":113.382227},{\"latitude\":23.16534088935023,\"longitude\":113.382227},{\"latitude\":23.165386037575267,\"longitude\":113.382227},{\"latitude\":23.165418,\"longitude\":113.382227},{\"latitude\":23.165463067461392,\"longitude\":113.38222991934973},{\"latitude\":23.16550813492278,\"longitude\":113.38223283869945},{\"latitude\":23.165553202384174,\"longitude\":113.38223575804918},{\"latitude\":23.165598269845564,\"longitude\":113.3822386773989},{\"latitude\":23.165643337306957,\"longitude\":113.38224159674863},{\"latitude\":23.165665,\"longitude\":113.382243},{\"latitude\":23.165709875433432,\"longitude\":113.38224835961654},{\"latitude\":23.165754750866867,\"longitude\":113.38225371923309},{\"latitude\":23.1657996263003,\"longitude\":113.38225907884963},{\"latitude\":23.165844501733734,\"longitude\":113.38226443846618},{\"latitude\":23.165889377167165,\"longitude\":113.38226979808272},{\"latitude\":23.165934252600596,\"longitude\":113.38227515769925},{\"latitude\":23.16597912803403,\"longitude\":113.3822805173158},{\"latitude\":23.166024003467463,\"longitude\":113.38228587693234},{\"latitude\":23.166068878900898,\"longitude\":113.3822912365489},{\"latitude\":23.16611375433433,\"longitude\":113.38229659616543},{\"latitude\":23.16615862976776,\"longitude\":113.38230195578197},{\"latitude\":23.166368,\"longitude\":113.382339},{\"latitude\":23.166412576674787,\"longitude\":113.38234674509124},{\"latitude\":23.16645715334958,\"longitude\":113.3823544901825},{\"latitude\":23.16650173002437,\"longitude\":113.38236223527373},{\"latitude\":23.166546306699157,\"longitude\":113.38236998036498},{\"latitude\":23.16659088337395,\"longitude\":113.38237772545622},{\"latitude\":23.166635460048738,\"longitude\":113.38238547054748},{\"latitude\":23.16668003672353,\"longitude\":113.38239321563871},{\"latitude\":23.16672461339832,\"longitude\":113.38240096072995},{\"latitude\":23.166769190073108,\"longitude\":113.3824087058212},{\"latitude\":23.1668137667479,\"longitude\":113.38241645091244},{\"latitude\":23.16685834342269,\"longitude\":113.3824241960037},{\"latitude\":23.166902920097478,\"longitude\":113.38243194109494},{\"latitude\":23.16694749677227,\"longitude\":113.38243968618617},{\"latitude\":23.16699207344706,\"longitude\":113.38244743127743},{\"latitude\":23.167036650121847,\"longitude\":113.38245517636867},{\"latitude\":23.16708122679664,\"longitude\":113.38246292145992},{\"latitude\":23.16712580347143,\"longitude\":113.38247066655116},{\"latitude\":23.16717038014622,\"longitude\":113.38247841164241},{\"latitude\":23.16721495682101,\"longitude\":113.38248615673365},{\"latitude\":23.1672595334958,\"longitude\":113.38249390182489},{\"latitude\":23.16730411017059,\"longitude\":113.38250164691614},{\"latitude\":23.16734868684538,\"longitude\":113.38250939200738},{\"latitude\":23.167393263520168,\"longitude\":113.38251713709863},{\"latitude\":23.16743784019496,\"longitude\":113.38252488218987},{\"latitude\":23.16748241686975,\"longitude\":113.38253262728112},{\"latitude\":23.16752699354454,\"longitude\":113.38254037237236},{\"latitude\":23.16757157021933,\"longitude\":113.3825481174636},{\"latitude\":23.16761614689412,\"longitude\":113.38255586255485},{\"latitude\":23.16766072356891,\"longitude\":113.38256360764609},{\"latitude\":23.1677053002437,\"longitude\":113.38257135273734},{\"latitude\":23.16774987691849,\"longitude\":113.38257909782858},{\"latitude\":23.16779445359328,\"longitude\":113.38258684291982},{\"latitude\":23.16783903026807,\"longitude\":113.38259458801107},{\"latitude\":23.16788360694286,\"longitude\":113.38260233310231},{\"latitude\":23.16792818361765,\"longitude\":113.38261007819357},{\"latitude\":23.167945,\"longitude\":113.382613},{\"latitude\":23.16795527443984,\"longitude\":113.38256545084818},{\"latitude\":23.167965548879685,\"longitude\":113.38251790169635},{\"latitude\":23.167975823319527,\"longitude\":113.38247035254452},{\"latitude\":23.16798609775937,\"longitude\":113.38242280339269},{\"latitude\":23.167988,\"longitude\":113.382414},{\"latitude\":23.167988,\"longitude\":113.382414},{\"latitude\":23.167943931765734,\"longitude\":113.38240338356174},{\"latitude\":23.167899863531467,\"longitude\":113.38239276712349},{\"latitude\":23.167855795297204,\"longitude\":113.38238215068523},{\"latitude\":23.167811727062936,\"longitude\":113.38237153424699},{\"latitude\":23.16618,\"longitude\":113.382076},{\"latitude\":23.166135277205374,\"longitude\":113.3820693124793},{\"latitude\":23.166090554410744,\"longitude\":113.3820626249586},{\"latitude\":23.166045831616117,\"longitude\":113.38205593743793},{\"latitude\":23.166001108821487,\"longitude\":113.38204924991723},{\"latitude\":23.165966,\"longitude\":113.382044},{\"latitude\":23.16592089346987,\"longitude\":113.38204190202185},{\"latitude\":23.165875786939736,\"longitude\":113.3820398040437},{\"latitude\":23.165830680409606,\"longitude\":113.38203770606556},{\"latitude\":23.165785573879475,\"longitude\":113.38203560808742},{\"latitude\":23.165751,\"longitude\":113.382034},{\"latitude\":23.165705976767857,\"longitude\":113.38203763090581},{\"latitude\":23.165660953535717,\"longitude\":113.38204126181164},{\"latitude\":23.165627,\"longitude\":113.382044},{\"latitude\":23.16558277564532,\"longitude\":113.38205382763437},{\"latitude\":23.16553855129064,\"longitude\":113.38206365526874},{\"latitude\":23.16549432693596,\"longitude\":113.38207348290311},{\"latitude\":23.165064,\"longitude\":113.382082},{\"latitude\":23.1650189996499,\"longitude\":113.38208594884242},{\"latitude\":23.1649739992998,\"longitude\":113.38208989768484},{\"latitude\":23.164928998949698,\"longitude\":113.38209384652727},{\"latitude\":23.164883998599596,\"longitude\":113.38209779536969},{\"latitude\":23.164838998249497,\"longitude\":113.38210174421211},{\"latitude\":23.164793997899395,\"longitude\":113.38210569305453},{\"latitude\":23.164748997549292,\"longitude\":113.38210964189696},{\"latitude\":23.164703997199194,\"longitude\":113.38211359073938},{\"latitude\":23.16465899684909,\"longitude\":113.3821175395818},{\"latitude\":23.16461399649899,\"longitude\":113.38212148842422},{\"latitude\":23.164568996148887,\"longitude\":113.38212543726665},{\"latitude\":23.16452399579879,\"longitude\":113.38212938610907},{\"latitude\":23.164517,\"longitude\":113.38213},{\"latitude\":23.16447197477946,\"longitude\":113.38213360201765},{\"latitude\":23.164442,\"longitude\":113.382136},{\"latitude\":23.1643970597319,\"longitude\":113.38214068127793},{\"latitude\":23.1643521194638,\"longitude\":113.38214536255586},{\"latitude\":23.164346,\"longitude\":113.382146},{\"latitude\":23.164301017849287,\"longitude\":113.38215018438612},{\"latitude\":23.164256035698575,\"longitude\":113.38215436877222},{\"latitude\":23.16421105354786,\"longitude\":113.38215855315833},{\"latitude\":23.164018,\"longitude\":113.382168},{\"latitude\":23.16397293253119,\"longitude\":113.3821709193502},{\"latitude\":23.163927865062387,\"longitude\":113.38217383870041},{\"latitude\":23.16388279759358,\"longitude\":113.38217675805062},{\"latitude\":23.163837730124772,\"longitude\":113.38217967740081},{\"latitude\":23.16379266265597,\"longitude\":113.38218259675102},{\"latitude\":23.163771,\"longitude\":113.382184},{\"latitude\":23.163725884888247,\"longitude\":113.38218587005645},{\"latitude\":23.163680769776494,\"longitude\":113.38218774011288},{\"latitude\":23.16363565466474,\"longitude\":113.38218961016933},{\"latitude\":23.163590539552988,\"longitude\":113.38219148022579},{\"latitude\":23.163545424441235,\"longitude\":113.38219335028222},{\"latitude\":23.163500309329482,\"longitude\":113.38219522033867},{\"latitude\":23.163455194217732,\"longitude\":113.38219709039512},{\"latitude\":23.16341007910598,\"longitude\":113.38219896045156},{\"latitude\":23.163385,\"longitude\":113.3822},{\"latitude\":23.163339851763688,\"longitude\":113.3822},{\"latitude\":23.163294703527374,\"longitude\":113.3822},{\"latitude\":23.163249555291063,\"longitude\":113.3822},{\"latitude\":23.16320440705475,\"longitude\":113.3822},{\"latitude\":23.163165,\"longitude\":113.3822},{\"latitude\":23.16311985450723,\"longitude\":113.38219946138783},{\"latitude\":23.16307470901446,\"longitude\":113.38219892277566},{\"latitude\":23.163029563521693,\"longitude\":113.38219838416349},{\"latitude\":23.162984418028923,\"longitude\":113.38219784555132},{\"latitude\":23.162939272536153,\"longitude\":113.38219730693915},{\"latitude\":23.162894127043383,\"longitude\":113.38219676832698},{\"latitude\":23.162848981550614,\"longitude\":113.38219622971481},{\"latitude\":23.162803836057847,\"longitude\":113.38219569110264},{\"latitude\":23.162758690565077,\"longitude\":113.38219515249047},{\"latitude\":23.162713545072307,\"longitude\":113.3821946138783},{\"latitude\":23.162668399579537,\"longitude\":113.38219407526613},{\"latitude\":23.16262325408677,\"longitude\":113.38219353665396},{\"latitude\":23.162578108594,\"longitude\":113.38219299804179},{\"latitude\":23.16253296310123,\"longitude\":113.38219245942962},{\"latitude\":23.16248781760846,\"longitude\":113.38219192081745},{\"latitude\":23.16244267211569,\"longitude\":113.38219138220528},{\"latitude\":23.162397526622925,\"longitude\":113.38219084359311},{\"latitude\":23.162352381130155,\"longitude\":113.38219030498094},{\"latitude\":23.162307235637385,\"longitude\":113.38218976636877},{\"latitude\":23.162262090144615,\"longitude\":113.3821892277566},{\"latitude\":23.162205,\"longitude\":113.382189},{\"latitude\":23.162159880700983,\"longitude\":113.38218725183528},{\"latitude\":23.162114761401966,\"longitude\":113.38218550367056},{\"latitude\":23.16206964210295,\"longitude\":113.38218375550584},{\"latitude\":23.162024522803932,\"longitude\":113.3821820073411},{\"latitude\":23.161979403504915,\"longitude\":113.38218025917638},{\"latitude\":23.1619342842059,\"longitude\":113.38217851101166},{\"latitude\":23.16188916490688,\"longitude\":113.38217676284694},{\"latitude\":23.161844045607864,\"longitude\":113.38217501468222},{\"latitude\":23.161798926308848,\"longitude\":113.3821732665175},{\"latitude\":23.16175380700983,\"longitude\":113.38217151835278},{\"latitude\":23.161708687710814,\"longitude\":113.38216977018806},{\"latitude\":23.161663568411797,\"longitude\":113.38216802202332},{\"latitude\":23.161663,\"longitude\":113.382168},{\"latitude\":23.161617887069024,\"longitude\":113.38216606909633},{\"latitude\":23.16157277413805,\"longitude\":113.38216413819268},{\"latitude\":23.161527661207074,\"longitude\":113.38216220728901},{\"latitude\":23.161482548276098,\"longitude\":113.38216027638536},{\"latitude\":23.16143743534512,\"longitude\":113.3821583454817},{\"latitude\":23.161406,\"longitude\":113.382157},{\"latitude\":23.16136086957518,\"longitude\":113.3821556280351},{\"latitude\":23.161315739150357,\"longitude\":113.38215425607018},{\"latitude\":23.161270608725538,\"longitude\":113.38215288410527},{\"latitude\":23.161225478300715,\"longitude\":113.38215151214035},{\"latitude\":23.161180347875895,\"longitude\":113.38215014017543},{\"latitude\":23.161135217451072,\"longitude\":113.38214876821051},{\"latitude\":23.161090087026253,\"longitude\":113.3821473962456},{\"latitude\":23.16104495660143,\"longitude\":113.38214602428069},{\"latitude\":23.16099982617661,\"longitude\":113.38214465231577},{\"latitude\":23.160954695751787,\"longitude\":113.38214328035086},{\"latitude\":23.160909565326968,\"longitude\":113.38214190838595},{\"latitude\":23.160864434902148,\"longitude\":113.38214053642103},{\"latitude\":23.160819304477325,\"longitude\":113.38213916445612},{\"latitude\":23.160774174052506,\"longitude\":113.3821377924912},{\"latitude\":23.160729043627683,\"longitude\":113.38213642052628},{\"latitude\":23.160683913202863,\"longitude\":113.38213504856137},{\"latitude\":23.16063878277804,\"longitude\":113.38213367659645},{\"latitude\":23.16059365235322,\"longitude\":113.38213230463154},{\"latitude\":23.160548521928398,\"longitude\":113.38213093266663},{\"latitude\":23.16050339150358,\"longitude\":113.38212956070171},{\"latitude\":23.160458261078755,\"longitude\":113.3821281887368},{\"latitude\":23.160413130653936,\"longitude\":113.38212681677189},{\"latitude\":23.160368000229116,\"longitude\":113.38212544480697},{\"latitude\":23.160322869804293,\"longitude\":113.38212407284206},{\"latitude\":23.160277739379474,\"longitude\":113.38212270087713},{\"latitude\":23.16023260895465,\"longitude\":113.38212132891222},{\"latitude\":23.16018747852983,\"longitude\":113.3821199569473},{\"latitude\":23.160156,\"longitude\":113.382119},{\"latitude\":23.160110854363822,\"longitude\":113.38211952596858},{\"latitude\":23.16006570872764,\"longitude\":113.38212005193715},{\"latitude\":23.16002056309146,\"longitude\":113.38212057790574},{\"latitude\":23.15997541745528,\"longitude\":113.38212110387431},{\"latitude\":23.1599302718191,\"longitude\":113.38212162984289},{\"latitude\":23.159885126182918,\"longitude\":113.38212215581146},{\"latitude\":23.15983998054674,\"longitude\":113.38212268178005},{\"latitude\":23.159794834910556,\"longitude\":113.38212320774862},{\"latitude\":23.159749689274378,\"longitude\":113.3821237337172},{\"latitude\":23.159704543638195,\"longitude\":113.38212425968577},{\"latitude\":23.159659398002017,\"longitude\":113.38212478565434},{\"latitude\":23.159179,\"longitude\":113.38213},{\"latitude\":23.159133863216738,\"longitude\":113.38213110089715},{\"latitude\":23.159088726433477,\"longitude\":113.3821322017943},{\"latitude\":23.159043589650214,\"longitude\":113.38213330269146},{\"latitude\":23.15899845286695,\"longitude\":113.38213440358861},{\"latitude\":23.15895331608369,\"longitude\":113.38213550448576},{\"latitude\":23.158933,\"longitude\":113.382136},{\"latitude\":23.158887886186253,\"longitude\":113.38213790705686},{\"latitude\":23.158842772372505,\"longitude\":113.38213981411371},{\"latitude\":23.15879765855876,\"longitude\":113.38214172117057},{\"latitude\":23.158752544745013,\"longitude\":113.38214362822742},{\"latitude\":23.158707430931265,\"longitude\":113.38214553528428},{\"latitude\":23.158662317117518,\"longitude\":113.38214744234114},{\"latitude\":23.158617203303773,\"longitude\":113.38214934939799},{\"latitude\":23.158572089490026,\"longitude\":113.38215125645485},{\"latitude\":23.158526975676278,\"longitude\":113.3821531635117},{\"latitude\":23.15848186186253,\"longitude\":113.38215507056856},{\"latitude\":23.158436748048786,\"longitude\":113.38215697762541},{\"latitude\":23.158391634235038,\"longitude\":113.38215888468227},{\"latitude\":23.15834652042129,\"longitude\":113.38216079173912},{\"latitude\":23.158301406607542,\"longitude\":113.38216269879598},{\"latitude\":23.158256292793798,\"longitude\":113.38216460585284},{\"latitude\":23.15821117898005,\"longitude\":113.38216651290969},{\"latitude\":23.158176,\"longitude\":113.382168},{\"latitude\":23.158130881156072,\"longitude\":113.38216976245484},{\"latitude\":23.158085762312144,\"longitude\":113.38217152490968},{\"latitude\":23.158048,\"longitude\":113.382173},{\"latitude\":23.158002878504817,\"longitude\":113.38217468130354},{\"latitude\":23.157957757009633,\"longitude\":113.38217636260708},{\"latitude\":23.15791263551445,\"longitude\":113.38217804391064},{\"latitude\":23.157867514019266,\"longitude\":113.38217972521419},{\"latitude\":23.157822392524082,\"longitude\":113.38218140651773},{\"latitude\":23.1577772710289,\"longitude\":113.38218308782128},{\"latitude\":23.157732149533715,\"longitude\":113.38218476912482},{\"latitude\":23.15768702803853,\"longitude\":113.38218645042836},{\"latitude\":23.157641906543347,\"longitude\":113.38218813173192},{\"latitude\":23.157596785048163,\"longitude\":113.38218981303547},{\"latitude\":23.15755166355298,\"longitude\":113.38219149433901},{\"latitude\":23.157506542057796,\"longitude\":113.38219317564256},{\"latitude\":23.157461420562612,\"longitude\":113.3821948569461},{\"latitude\":23.157416299067428,\"longitude\":113.38219653824964},{\"latitude\":23.157371177572244,\"longitude\":113.3821982195532},{\"latitude\":23.15732605607706,\"longitude\":113.38219990085675},{\"latitude\":23.157280934581877,\"longitude\":113.38220158216029},{\"latitude\":23.15723581308669,\"longitude\":113.38220326346384},{\"latitude\":23.157190691591506,\"longitude\":113.38220494476738},{\"latitude\":23.157145570096322,\"longitude\":113.38220662607094},{\"latitude\":23.15710044860114,\"longitude\":113.38220830737448},{\"latitude\":23.157055327105954,\"longitude\":113.38220998867803},{\"latitude\":23.15701020561077,\"longitude\":113.38221166998157},{\"latitude\":23.156965084115587,\"longitude\":113.38221335128512},{\"latitude\":23.156919962620403,\"longitude\":113.38221503258866},{\"latitude\":23.156234,\"longitude\":113.382184},{\"latitude\":23.156189167850428,\"longitude\":113.3821782321211},{\"latitude\":23.15614433570085,\"longitude\":113.3821724642422},{\"latitude\":23.156099503551278,\"longitude\":113.38216669636331},{\"latitude\":23.156063,\"longitude\":113.382162},{\"latitude\":23.156019130315098,\"longitude\":113.38215046240703},{\"latitude\":23.155975260630193,\"longitude\":113.38213892481406},{\"latitude\":23.15593139094529,\"longitude\":113.38212738722108},{\"latitude\":23.15588752126039,\"longitude\":113.38211584962811},{\"latitude\":23.155843651575484,\"longitude\":113.38210431203514},{\"latitude\":23.155799781890583,\"longitude\":113.38209277444217},{\"latitude\":23.15575591220568,\"longitude\":113.3820812368492},{\"latitude\":23.155736,\"longitude\":113.382076},{\"latitude\":23.155693218477253,\"longitude\":113.38206039895847},{\"latitude\":23.155650436954506,\"longitude\":113.38204479791696},{\"latitude\":23.15560765543176,\"longitude\":113.38202919687544},{\"latitude\":23.15556487390901,\"longitude\":113.38201359583391},{\"latitude\":23.15552209238626,\"longitude\":113.3819979947924},{\"latitude\":23.155479310863512,\"longitude\":113.38198239375087},{\"latitude\":23.155436529340765,\"longitude\":113.38196679270935},{\"latitude\":23.155393747818017,\"longitude\":113.38195119166784},{\"latitude\":23.15535096629527,\"longitude\":113.38193559062631},{\"latitude\":23.155308184772522,\"longitude\":113.38191998958479},{\"latitude\":23.155265403249775,\"longitude\":113.38190438854328},{\"latitude\":23.155222621727027,\"longitude\":113.38188878750175},{\"latitude\":23.155179840204276,\"longitude\":113.38187318646023},{\"latitude\":23.15513705868153,\"longitude\":113.38185758541871},{\"latitude\":23.155119,\"longitude\":113.381851},{\"latitude\":23.15507746869614,\"longitude\":113.38183185134555},{\"latitude\":23.15503593739228,\"longitude\":113.38181270269111},{\"latitude\":23.15499440608842,\"longitude\":113.38179355403666},{\"latitude\":23.154952874784563,\"longitude\":113.38177440538223},{\"latitude\":23.154911343480702,\"longitude\":113.38175525672779},{\"latitude\":23.154869812176845,\"longitude\":113.38173610807334},{\"latitude\":23.154828280872984,\"longitude\":113.3817169594189},{\"latitude\":23.154786749569126,\"longitude\":113.38169781076445},{\"latitude\":23.154745218265266,\"longitude\":113.38167866211},{\"latitude\":23.154703686961405,\"longitude\":113.38165951345556},{\"latitude\":23.154662155657547,\"longitude\":113.38164036480111},{\"latitude\":23.154631,\"longitude\":113.381626},{\"latitude\":23.154603664607798,\"longitude\":113.38158714086403},{\"latitude\":23.154576329215597,\"longitude\":113.38154828172806},{\"latitude\":23.154548993823397,\"longitude\":113.38150942259207},{\"latitude\":23.154529,\"longitude\":113.381481},{\"latitude\":23.154491034683293,\"longitude\":113.38145457640414},{\"latitude\":23.154453069366586,\"longitude\":113.38142815280827},{\"latitude\":23.154415104049875,\"longitude\":113.38140172921241},{\"latitude\":23.154377138733167,\"longitude\":113.38137530561654},{\"latitude\":23.15433917341646,\"longitude\":113.38134888202069},{\"latitude\":23.154301208099753,\"longitude\":113.38132245842482},{\"latitude\":23.154263242783045,\"longitude\":113.38129603482896},{\"latitude\":23.154225277466338,\"longitude\":113.3812696112331},{\"latitude\":23.154187312149627,\"longitude\":113.38124318763724},{\"latitude\":23.15414934683292,\"longitude\":113.38121676404137},{\"latitude\":23.154111381516213,\"longitude\":113.38119034044551},{\"latitude\":23.154073416199505,\"longitude\":113.38116391684964},{\"latitude\":23.154035450882798,\"longitude\":113.38113749325379},{\"latitude\":23.153997485566087,\"longitude\":113.38111106965792},{\"latitude\":23.15395952024938,\"longitude\":113.38108464606206},{\"latitude\":23.153921554932673,\"longitude\":113.3810582224662},{\"latitude\":23.153883589615965,\"longitude\":113.38103179887034},{\"latitude\":23.153845624299258,\"longitude\":113.38100537527448},{\"latitude\":23.15380765898255,\"longitude\":113.38097895167861},{\"latitude\":23.15376969366584,\"longitude\":113.38095252808276},{\"latitude\":23.153731728349133,\"longitude\":113.38092610448689},{\"latitude\":23.153693763032425,\"longitude\":113.38089968089103},{\"latitude\":23.153655797715718,\"longitude\":113.38087325729516},{\"latitude\":23.15361783239901,\"longitude\":113.38084683369931},{\"latitude\":23.153579867082303,\"longitude\":113.38082041010344},{\"latitude\":23.153541901765593,\"longitude\":113.38079398650758},{\"latitude\":23.153503936448885,\"longitude\":113.38076756291171},{\"latitude\":23.153465971132178,\"longitude\":113.38074113931586},{\"latitude\":23.15342800581547,\"longitude\":113.38071471571999},{\"latitude\":23.153390040498763,\"longitude\":113.38068829212413},{\"latitude\":23.153381,\"longitude\":113.380682},{\"latitude\":23.153340019804524,\"longitude\":113.38066150990225},{\"latitude\":23.153299039609053,\"longitude\":113.38064101980453},{\"latitude\":23.153263,\"longitude\":113.380623},{\"latitude\":23.153217851706156,\"longitude\":113.380623},{\"latitude\":23.153198,\"longitude\":113.380623},{\"latitude\":23.15315986224701,\"longitude\":113.38064913142335},{\"latitude\":23.153144,\"longitude\":113.38066},{\"latitude\":23.153122748306433,\"longitude\":113.38070307775723},{\"latitude\":23.153107,\"longitude\":113.380735},{\"latitude\":23.153107,\"longitude\":113.380735},{\"latitude\":23.153110742841605,\"longitude\":113.38078365694088},{\"latitude\":23.153161,\"longitude\":113.38088},{\"latitude\":23.15319791963072,\"longitude\":113.3809081030025},{\"latitude\":23.153234839261444,\"longitude\":113.38093620600499},{\"latitude\":23.153271758892163,\"longitude\":113.38096430900747},{\"latitude\":23.153295,\"longitude\":113.380982},{\"latitude\":23.153333127881456,\"longitude\":113.38100814837374},{\"latitude\":23.153371255762913,\"longitude\":113.38103429674749},{\"latitude\":23.153409383644366,\"longitude\":113.38106044512122},{\"latitude\":23.153447511525822,\"longitude\":113.38108659349496},{\"latitude\":23.15348563940728,\"longitude\":113.3811127418687},{\"latitude\":23.153523767288736,\"longitude\":113.38113889024244},{\"latitude\":23.15356189517019,\"longitude\":113.38116503861617},{\"latitude\":23.153600023051645,\"longitude\":113.38119118698991},{\"latitude\":23.1536381509331,\"longitude\":113.38121733536366},{\"latitude\":23.153676278814558,\"longitude\":113.38124348373739},{\"latitude\":23.153714406696015,\"longitude\":113.38126963211113},{\"latitude\":23.153752534577468,\"longitude\":113.38129578048488},{\"latitude\":23.153790662458924,\"longitude\":113.38132192885861},{\"latitude\":23.15382879034038,\"longitude\":113.38134807723235},{\"latitude\":23.153866918221837,\"longitude\":113.3813742256061},{\"latitude\":23.153905046103294,\"longitude\":113.38140037397983},{\"latitude\":23.153943173984747,\"longitude\":113.38142652235356},{\"latitude\":23.153981301866203,\"longitude\":113.38145267072731},{\"latitude\":23.15401942974766,\"longitude\":113.38147881910105},{\"latitude\":23.154057557629116,\"longitude\":113.38150496747478},{\"latitude\":23.15409568551057,\"longitude\":113.38153111584853},{\"latitude\":23.154133813392026,\"longitude\":113.38155726422227},{\"latitude\":23.154171941273482,\"longitude\":113.381583412596},{\"latitude\":23.15421006915494,\"longitude\":113.38160956096974},{\"latitude\":23.154218,\"longitude\":113.381615},{\"latitude\":23.154258221738367,\"longitude\":113.38163717834172},{\"latitude\":23.154298443476733,\"longitude\":113.38165935668343},{\"latitude\":23.1543386652151,\"longitude\":113.38168153502515},{\"latitude\":23.15437888695347,\"longitude\":113.38170371336686},{\"latitude\":23.154419108691837,\"longitude\":113.38172589170858},{\"latitude\":23.154432,\"longitude\":113.381733},{\"latitude\":23.15447714828643,\"longitude\":113.381733},{\"latitude\":23.15452229657286,\"longitude\":113.381733},{\"latitude\":23.15456744485929,\"longitude\":113.381733},{\"latitude\":23.15461259314572,\"longitude\":113.381733},{\"latitude\":23.154851,\"longitude\":113.381841},{\"latitude\":23.15489348364943,\"longitude\":113.38185752561141},{\"latitude\":23.15493596729886,\"longitude\":113.38187405122282},{\"latitude\":23.154978450948292,\"longitude\":113.38189057683424},{\"latitude\":23.155020934597722,\"longitude\":113.38190710244565},{\"latitude\":23.155063418247153,\"longitude\":113.38192362805705},{\"latitude\":23.155105901896587,\"longitude\":113.38194015366847},{\"latitude\":23.155148385546017,\"longitude\":113.38195667927988},{\"latitude\":23.155190869195447,\"longitude\":113.3819732048913},{\"latitude\":23.155233352844878,\"longitude\":113.38198973050271},{\"latitude\":23.155275836494308,\"longitude\":113.38200625611412},{\"latitude\":23.15531832014374,\"longitude\":113.38202278172554},{\"latitude\":23.15536080379317,\"longitude\":113.38203930733695},{\"latitude\":23.1554032874426,\"longitude\":113.38205583294835},{\"latitude\":23.155414,\"longitude\":113.38206},{\"latitude\":23.155457536736396,\"longitude\":113.38207292872697},{\"latitude\":23.15550107347279,\"longitude\":113.38208585745393},{\"latitude\":23.155544610209187,\"longitude\":113.3820987861809},{\"latitude\":23.155588146945583,\"longitude\":113.38211171490786},{\"latitude\":23.155631683681975,\"longitude\":113.38212464363484},{\"latitude\":23.15567522041837,\"longitude\":113.38213757236181},{\"latitude\":23.155718757154766,\"longitude\":113.38215050108877},{\"latitude\":23.15576229389116,\"longitude\":113.38216342981575},{\"latitude\":23.155805830627557,\"longitude\":113.38217635854272},{\"latitude\":23.155849367363952,\"longitude\":113.38218928726968},{\"latitude\":23.155892904100348,\"longitude\":113.38220221599666},{\"latitude\":23.155936440836744,\"longitude\":113.38221514472362},{\"latitude\":23.15597997757314,\"longitude\":113.38222807345059},{\"latitude\":23.15602351430953,\"longitude\":113.38224100217757},{\"latitude\":23.156067051045927,\"longitude\":113.38225393090453},{\"latitude\":23.156110587782322,\"longitude\":113.3822668596315},{\"latitude\":23.156138,\"longitude\":113.382275},{\"latitude\":23.15618284692457,\"longitude\":113.38228063193937},{\"latitude\":23.156227693849143,\"longitude\":113.38228626387873},{\"latitude\":23.156272540773713,\"longitude\":113.3822918958181},{\"latitude\":23.156317387698287,\"longitude\":113.38229752775746},{\"latitude\":23.156353,\"longitude\":113.382302},{\"latitude\":23.155564,\"longitude\":113.383632},{\"latitude\":23.155564,\"longitude\":113.383632},{\"latitude\":23.155518929327766,\"longitude\":113.38363486162999},{\"latitude\":23.155473858655537,\"longitude\":113.38363772325997},{\"latitude\":23.155428787983304,\"longitude\":113.38364058488995},{\"latitude\":23.15538371731107,\"longitude\":113.38364344651993},{\"latitude\":23.15533864663884,\"longitude\":113.3836463081499},{\"latitude\":23.155312,\"longitude\":113.383648},{\"latitude\":23.155268306517378,\"longitude\":113.38366029470289},{\"latitude\":23.155224613034754,\"longitude\":113.3836725894058},{\"latitude\":23.155180919552134,\"longitude\":113.3836848841087},{\"latitude\":23.15513722606951,\"longitude\":113.3836971788116},{\"latitude\":23.15509353258689,\"longitude\":113.38370947351451},{\"latitude\":23.155081,\"longitude\":113.383713},{\"latitude\":23.155039987680738,\"longitude\":113.38373341502114},{\"latitude\":23.154998975361476,\"longitude\":113.3837538300423},{\"latitude\":23.15495796304221,\"longitude\":113.38377424506344},{\"latitude\":23.15491695072295,\"longitude\":113.38379466008458},{\"latitude\":23.154875938403688,\"longitude\":113.38381507510572},{\"latitude\":23.154593,\"longitude\":113.384002},{\"latitude\":23.15455828954525,\"longitude\":113.38403322280139},{\"latitude\":23.1545235790905,\"longitude\":113.3840644456028},{\"latitude\":23.154488868635756,\"longitude\":113.3840956684042},{\"latitude\":23.154454158181007,\"longitude\":113.3841268912056},{\"latitude\":23.15441944772626,\"longitude\":113.38415811400701},{\"latitude\":23.15438473727151,\"longitude\":113.3841893368084},{\"latitude\":23.154384,\"longitude\":113.38419},{\"latitude\":23.154351644202578,\"longitude\":113.38422405212079},{\"latitude\":23.15431928840516,\"longitude\":113.38425810424157},{\"latitude\":23.154286932607736,\"longitude\":113.38429215636235},{\"latitude\":23.154254576810317,\"longitude\":113.38432620848313},{\"latitude\":23.154222221012894,\"longitude\":113.38436026060391},{\"latitude\":23.15418986521547,\"longitude\":113.3843943127247},{\"latitude\":23.154157509418052,\"longitude\":113.38442836484548},{\"latitude\":23.15412515362063,\"longitude\":113.38446241696626},{\"latitude\":23.154092797823207,\"longitude\":113.38449646908704},{\"latitude\":23.154060442025788,\"longitude\":113.38453052120781},{\"latitude\":23.154028086228365,\"longitude\":113.38456457332859},{\"latitude\":23.153995730430946,\"longitude\":113.38459862544937},{\"latitude\":23.153963374633523,\"longitude\":113.38463267757015},{\"latitude\":23.1539310188361,\"longitude\":113.38466672969093},{\"latitude\":23.15389866303868,\"longitude\":113.38470078181172},{\"latitude\":23.153869,\"longitude\":113.384732},{\"latitude\":23.15384047810847,\"longitude\":113.38476984844161},{\"latitude\":23.15381195621694,\"longitude\":113.38480769688323},{\"latitude\":23.153783434325412,\"longitude\":113.38484554532484},{\"latitude\":23.153754912433882,\"longitude\":113.38488339376644},{\"latitude\":23.153726390542353,\"longitude\":113.38492124220805},{\"latitude\":23.153697868650823,\"longitude\":113.38495909064967},{\"latitude\":23.153669346759294,\"longitude\":113.38499693909128},{\"latitude\":23.153640824867765,\"longitude\":113.38503478753289},{\"latitude\":23.153612302976235,\"longitude\":113.3850726359745},{\"latitude\":23.153606,\"longitude\":113.385081},{\"latitude\":23.153580007305504,\"longitude\":113.38512092179394},{\"latitude\":23.153554014611007,\"longitude\":113.38516084358788},{\"latitude\":23.15352802191651,\"longitude\":113.38520076538181},{\"latitude\":23.153502029222015,\"longitude\":113.38524068717575},{\"latitude\":23.15347603652752,\"longitude\":113.3852806089697},{\"latitude\":23.153450043833022,\"longitude\":113.38532053076364},{\"latitude\":23.153424051138526,\"longitude\":113.38536045255758},{\"latitude\":23.15339805844403,\"longitude\":113.3854003743515},{\"latitude\":23.153397,\"longitude\":113.385402},{\"latitude\":23.15337426278349,\"longitude\":113.38544418145683},{\"latitude\":23.153351525566986,\"longitude\":113.38548636291365},{\"latitude\":23.15332878835048,\"longitude\":113.38552854437049},{\"latitude\":23.15330605113397,\"longitude\":113.38557072582732},{\"latitude\":23.153283313917466,\"longitude\":113.38561290728414},{\"latitude\":23.15326057670096,\"longitude\":113.38565508874098},{\"latitude\":23.153252,\"longitude\":113.385671},{\"latitude\":23.153231500448506,\"longitude\":113.3857145019552},{\"latitude\":23.153211000897016,\"longitude\":113.38575800391041},{\"latitude\":23.153190501345524,\"longitude\":113.3858015058656},{\"latitude\":23.15317000179403,\"longitude\":113.3858450078208},{\"latitude\":23.153149502242538,\"longitude\":113.38588850977601},{\"latitude\":23.15312900269105,\"longitude\":113.38593201173121},{\"latitude\":23.153108503139556,\"longitude\":113.3859755136864},{\"latitude\":23.153088003588064,\"longitude\":113.38601901564161},{\"latitude\":23.15308,\"longitude\":113.386036},{\"latitude\":23.153069667565724,\"longitude\":113.38608352919768},{\"latitude\":23.15306,\"longitude\":113.386128}]"; |
| | | // List<LonLatDto> polyline = JSON.parseArray(dhgj, LonLatDto.class); |
| | | |
| | | String xcgj = "[{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234944444444,\"latitude\":23.161759444444446},{\"longitude\":113.38234916666667,\"latitude\":23.16176111111111},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235416666667,\"latitude\":23.161767222222224},{\"longitude\":113.38235361111111,\"latitude\":23.16176777777778},{\"longitude\":113.38235166666666,\"latitude\":23.161770555555556},{\"longitude\":113.38234805555555,\"latitude\":23.16177611111111},{\"longitude\":113.38234805555555,\"latitude\":23.161779166666665},{\"longitude\":113.38234666666666,\"latitude\":23.16179222222222},{\"longitude\":113.38234305555555,\"latitude\":23.16180388888889},{\"longitude\":113.3823338888889,\"latitude\":23.161819722222223},{\"longitude\":113.3823225,\"latitude\":23.161844722222224},{\"longitude\":113.3823113888889,\"latitude\":23.161887222222223},{\"longitude\":113.38230333333334,\"latitude\":23.161976666666668},{\"longitude\":113.3823,\"latitude\":23.162066944444444},{\"longitude\":113.3823,\"latitude\":23.162176388888888},{\"longitude\":113.3823011111111,\"latitude\":23.162300277777778},{\"longitude\":113.38230472222222,\"latitude\":23.162575},{\"longitude\":113.38230861111111,\"latitude\":23.162716666666668},{\"longitude\":113.38231333333333,\"latitude\":23.162852222222224},{\"longitude\":113.38231916666666,\"latitude\":23.162992777777777},{\"longitude\":113.38232388888889,\"latitude\":23.16313111111111},{\"longitude\":113.38232777777777,\"latitude\":23.163259166666666},{\"longitude\":113.38233027777778,\"latitude\":23.163385833333333},{\"longitude\":113.38233083333333,\"latitude\":23.1635075},{\"longitude\":113.38232916666666,\"latitude\":23.163630277777777},{\"longitude\":113.38232527777778,\"latitude\":23.163750833333335},{\"longitude\":113.38231777777777,\"latitude\":23.1638725},{\"longitude\":113.3823075,\"latitude\":23.163999722222222},{\"longitude\":113.38229472222223,\"latitude\":23.16413111111111},{\"longitude\":113.38228111111111,\"latitude\":23.164259722222223},{\"longitude\":113.3822663888889,\"latitude\":23.164390277777777},{\"longitude\":113.38225361111111,\"latitude\":23.164513055555556},{\"longitude\":113.38224222222222,\"latitude\":23.164638055555557},{\"longitude\":113.38222805555556,\"latitude\":23.164780277777776},{\"longitude\":113.3822161111111,\"latitude\":23.164913333333335},{\"longitude\":113.38220472222223,\"latitude\":23.16504972222222},{\"longitude\":113.38219638888889,\"latitude\":23.165189444444444},{\"longitude\":113.3821936111111,\"latitude\":23.165328055555555},{\"longitude\":113.38219527777778,\"latitude\":23.165463333333335},{\"longitude\":113.38220277777778,\"latitude\":23.165585555555555},{\"longitude\":113.38221444444444,\"latitude\":23.16570722222222},{\"longitude\":113.38222694444444,\"latitude\":23.16582888888889},{\"longitude\":113.38224305555555,\"latitude\":23.165955277777776},{\"longitude\":113.38225972222222,\"latitude\":23.166086944444444},{\"longitude\":113.38227777777777,\"latitude\":23.166217222222222},{\"longitude\":113.38229972222223,\"latitude\":23.16634138888889},{\"longitude\":113.38232055555555,\"latitude\":23.16646},{\"longitude\":113.3823388888889,\"latitude\":23.166566111111113},{\"longitude\":113.38235416666667,\"latitude\":23.166664166666667},{\"longitude\":113.38237055555555,\"latitude\":23.16676027777778},{\"longitude\":113.38238833333334,\"latitude\":23.166858333333334},{\"longitude\":113.3824063888889,\"latitude\":23.166956388888888},{\"longitude\":113.38242277777778,\"latitude\":23.167048333333334},{\"longitude\":113.38244777777778,\"latitude\":23.167212222222222},{\"longitude\":113.38245666666667,\"latitude\":23.167271666666668},{\"longitude\":113.38246388888889,\"latitude\":23.167316111111113},{\"longitude\":113.3824688888889,\"latitude\":23.167345},{\"longitude\":113.38247166666666,\"latitude\":23.167361111111113},{\"longitude\":113.38247111111112,\"latitude\":23.167357222222222},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247222222222,\"latitude\":23.167365277777776},{\"longitude\":113.38247138888889,\"latitude\":23.16737388888889},{\"longitude\":113.38247472222223,\"latitude\":23.167390833333332},{\"longitude\":113.38248027777777,\"latitude\":23.16741777777778},{\"longitude\":113.3824825,\"latitude\":23.1674275},{\"longitude\":113.38249194444444,\"latitude\":23.167470277777777},{\"longitude\":113.38250055555555,\"latitude\":23.167516666666668},{\"longitude\":113.38250833333333,\"latitude\":23.167565},{\"longitude\":113.38251833333334,\"latitude\":23.167625277777777},{\"longitude\":113.38253,\"latitude\":23.167698333333334},{\"longitude\":113.38253861111112,\"latitude\":23.167759722222222},{\"longitude\":113.38254805555556,\"latitude\":23.167817222222222},{\"longitude\":113.382555,\"latitude\":23.167863055555557},{\"longitude\":113.38255972222223,\"latitude\":23.16790027777778},{\"longitude\":113.38256027777778,\"latitude\":23.167930555555557},{\"longitude\":113.38255388888889,\"latitude\":23.16795611111111},{\"longitude\":113.38253944444445,\"latitude\":23.167976666666668},{\"longitude\":113.38251666666666,\"latitude\":23.167993055555556},{\"longitude\":113.38249027777778,\"latitude\":23.167998333333333},{\"longitude\":113.38246027777778,\"latitude\":23.16799027777778},{\"longitude\":113.3824325,\"latitude\":23.16797083333333},{\"longitude\":113.38240861111112,\"latitude\":23.167933055555554},{\"longitude\":113.38239305555555,\"latitude\":23.167873055555557},{\"longitude\":113.38236694444444,\"latitude\":23.1677125},{\"longitude\":113.38235027777777,\"latitude\":23.16760777777778},{\"longitude\":113.38233,\"latitude\":23.167494166666668},{\"longitude\":113.3823125,\"latitude\":23.167392777777778},{\"longitude\":113.38229722222222,\"latitude\":23.167290555555557},{\"longitude\":113.38227805555556,\"latitude\":23.16718722222222},{\"longitude\":113.38226083333333,\"latitude\":23.167082222222223},{\"longitude\":113.38224305555555,\"latitude\":23.166976944444446},{\"longitude\":113.38222416666666,\"latitude\":23.166870833333334},{\"longitude\":113.38220361111111,\"latitude\":23.166763333333332},{\"longitude\":113.3821588888889,\"latitude\":23.166531666666668},{\"longitude\":113.38213555555555,\"latitude\":23.166409166666668},{\"longitude\":113.38211611111112,\"latitude\":23.166297222222223},{\"longitude\":113.38209777777777,\"latitude\":23.1661875},{\"longitude\":113.38207972222222,\"latitude\":23.16608388888889},{\"longitude\":113.38206583333333,\"latitude\":23.165976944444445},{\"longitude\":113.38206111111111,\"latitude\":23.16586277777778},{\"longitude\":113.38206277777778,\"latitude\":23.16574388888889},{\"longitude\":113.38206638888889,\"latitude\":23.1656325},{\"longitude\":113.38206944444444,\"latitude\":23.165520833333332},{\"longitude\":113.38207472222223,\"latitude\":23.16540388888889},{\"longitude\":113.38207972222222,\"latitude\":23.165290833333334},{\"longitude\":113.38208888888889,\"latitude\":23.165177222222223},{\"longitude\":113.38209638888888,\"latitude\":23.165054722222223},{\"longitude\":113.38210833333333,\"latitude\":23.16492638888889},{\"longitude\":113.38212666666666,\"latitude\":23.164821944444444},{\"longitude\":113.38214111111111,\"latitude\":23.1647375},{\"longitude\":113.38215416666667,\"latitude\":23.164661388888888},{\"longitude\":113.38216166666666,\"latitude\":23.164581666666667},{\"longitude\":113.38216833333334,\"latitude\":23.164502777777777},{\"longitude\":113.38217333333333,\"latitude\":23.164419722222224},{\"longitude\":113.38217916666666,\"latitude\":23.164336944444443},{\"longitude\":113.38218833333333,\"latitude\":23.16425277777778},{\"longitude\":113.3821936111111,\"latitude\":23.164175555555556},{\"longitude\":113.38220055555556,\"latitude\":23.164102777777778},{\"longitude\":113.38220972222223,\"latitude\":23.164033888888888},{\"longitude\":113.38221777777778,\"latitude\":23.163958611111113},{\"longitude\":113.38222472222222,\"latitude\":23.16387361111111},{\"longitude\":113.38223194444444,\"latitude\":23.163799722222222},{\"longitude\":113.38223472222222,\"latitude\":23.163735833333334},{\"longitude\":113.38223638888888,\"latitude\":23.163655},{\"longitude\":113.38223777777777,\"latitude\":23.16354972222222},{\"longitude\":113.38223388888889,\"latitude\":23.16342},{\"longitude\":113.38222611111111,\"latitude\":23.16326888888889},{\"longitude\":113.38221888888889,\"latitude\":23.163118055555554},{\"longitude\":113.3822125,\"latitude\":23.16297388888889},{\"longitude\":113.38220527777777,\"latitude\":23.16284027777778},{\"longitude\":113.38219972222223,\"latitude\":23.162711388888887},{\"longitude\":113.3821975,\"latitude\":23.162591111111112},{\"longitude\":113.3821936111111,\"latitude\":23.162375277777777},{\"longitude\":113.38219222222222,\"latitude\":23.16226861111111},{\"longitude\":113.38218916666666,\"latitude\":23.162164722222222},{\"longitude\":113.38218833333333,\"latitude\":23.16205888888889},{\"longitude\":113.38218888888889,\"latitude\":23.161955},{\"longitude\":113.38218972222222,\"latitude\":23.161859166666666},{\"longitude\":113.38218777777777,\"latitude\":23.16175861111111},{\"longitude\":113.38218444444445,\"latitude\":23.161656666666666},{\"longitude\":113.38218222222223,\"latitude\":23.16154722222222},{\"longitude\":113.38217916666666,\"latitude\":23.161444444444445},{\"longitude\":113.38217666666667,\"latitude\":23.161346666666667},{\"longitude\":113.38217666666667,\"latitude\":23.161235833333333},{\"longitude\":113.38218333333333,\"latitude\":23.161114166666668},{\"longitude\":113.38219472222222,\"latitude\":23.160984444444445},{\"longitude\":113.38220111111112,\"latitude\":23.160849166666665},{\"longitude\":113.38219694444444,\"latitude\":23.16070722222222},{\"longitude\":113.38218305555556,\"latitude\":23.160548333333335},{\"longitude\":113.38216361111111,\"latitude\":23.160365555555554},{\"longitude\":113.38215194444444,\"latitude\":23.160205},{\"longitude\":113.38214805555556,\"latitude\":23.160061388888888},{\"longitude\":113.38214583333334,\"latitude\":23.159926111111112},{\"longitude\":113.3821436111111,\"latitude\":23.159803611111112},{\"longitude\":113.38214166666667,\"latitude\":23.159691666666667},{\"longitude\":113.38213833333333,\"latitude\":23.159584166666665},{\"longitude\":113.38213583333334,\"latitude\":23.159475},{\"longitude\":113.38213361111112,\"latitude\":23.15935916666667},{\"longitude\":113.38213222222222,\"latitude\":23.1592425},{\"longitude\":113.3821313888889,\"latitude\":23.159129166666666},{\"longitude\":113.38213111111111,\"latitude\":23.15902611111111},{\"longitude\":113.38213055555556,\"latitude\":23.15893611111111},{\"longitude\":113.38212833333333,\"latitude\":23.158851666666667},{\"longitude\":113.38212694444445,\"latitude\":23.1587625},{\"longitude\":113.38212638888889,\"latitude\":23.158665833333334},{\"longitude\":113.38212777777778,\"latitude\":23.158563055555554},{\"longitude\":113.38213083333333,\"latitude\":23.158455},{\"longitude\":113.38213416666666,\"latitude\":23.15834277777778},{\"longitude\":113.3821363888889,\"latitude\":23.158227222222223},{\"longitude\":113.38213833333333,\"latitude\":23.15810861111111},{\"longitude\":113.38213972222222,\"latitude\":23.157986666666666},{\"longitude\":113.38214222222223,\"latitude\":23.15787277777778},{\"longitude\":113.38214722222222,\"latitude\":23.15776222222222},{\"longitude\":113.38215277777778,\"latitude\":23.15765},{\"longitude\":113.38215777777778,\"latitude\":23.157534444444444},{\"longitude\":113.38216333333334,\"latitude\":23.157415277777776},{\"longitude\":113.38216527777777,\"latitude\":23.15737777777778},{\"longitude\":113.38217611111111,\"latitude\":23.157179166666666},{\"longitude\":113.38218083333334,\"latitude\":23.15705888888889},{\"longitude\":113.38218583333334,\"latitude\":23.156935833333332},{\"longitude\":113.38218777777777,\"latitude\":23.156806944444444},{\"longitude\":113.38218277777777,\"latitude\":23.15665277777778},{\"longitude\":113.38217666666667,\"latitude\":23.15653361111111},{\"longitude\":113.38216638888889,\"latitude\":23.15640361111111},{\"longitude\":113.38215638888889,\"latitude\":23.156303333333334},{\"longitude\":113.38214027777778,\"latitude\":23.156186666666667},{\"longitude\":113.3821211111111,\"latitude\":23.15606861111111},{\"longitude\":113.38209861111112,\"latitude\":23.15594388888889},{\"longitude\":113.38206944444444,\"latitude\":23.155814166666666},{\"longitude\":113.38203777777778,\"latitude\":23.155677222222224},{\"longitude\":113.38199666666667,\"latitude\":23.155538611111112},{\"longitude\":113.38194888888889,\"latitude\":23.15539972222222},{\"longitude\":113.38190277777778,\"latitude\":23.155271111111112},{\"longitude\":113.38185583333333,\"latitude\":23.155156944444446},{\"longitude\":113.38181083333333,\"latitude\":23.15505277777778},{\"longitude\":113.38176444444444,\"latitude\":23.154958611111113},{\"longitude\":113.38171305555555,\"latitude\":23.15486388888889},{\"longitude\":113.38165111111111,\"latitude\":23.1547625},{\"longitude\":113.38157861111111,\"latitude\":23.154652777777777},{\"longitude\":113.38150166666667,\"latitude\":23.154539166666666},{\"longitude\":113.38142166666667,\"latitude\":23.15442138888889},{\"longitude\":113.3813386111111,\"latitude\":23.154301944444445},{\"longitude\":113.38125666666667,\"latitude\":23.154182777777777},{\"longitude\":113.38117305555555,\"latitude\":23.154061666666667},{\"longitude\":113.38108722222222,\"latitude\":23.153935277777776},{\"longitude\":113.38099916666667,\"latitude\":23.153803888888888},{\"longitude\":113.38085611111111,\"latitude\":23.153588055555556},{\"longitude\":113.38078777777778,\"latitude\":23.15348611111111},{\"longitude\":113.38073083333333,\"latitude\":23.153403333333333},{\"longitude\":113.38069222222222,\"latitude\":23.153345277777778},{\"longitude\":113.38066472222222,\"latitude\":23.153303055555554},{\"longitude\":113.38064805555555,\"latitude\":23.15326388888889},{\"longitude\":113.38063916666667,\"latitude\":23.153229166666666},{\"longitude\":113.38064,\"latitude\":23.153198888888888},{\"longitude\":113.38064944444444,\"latitude\":23.1531675},{\"longitude\":113.38066472222222,\"latitude\":23.153143888888888},{\"longitude\":113.38066444444445,\"latitude\":23.153155277777778},{\"longitude\":113.38075472222222,\"latitude\":23.153171944444445},{\"longitude\":113.38081916666667,\"latitude\":23.153200277777778},{\"longitude\":113.38087222222222,\"latitude\":23.153256666666667},{\"longitude\":113.38092277777778,\"latitude\":23.15333777777778},{\"longitude\":113.38098333333333,\"latitude\":23.153430833333335},{\"longitude\":113.38105555555556,\"latitude\":23.153545},{\"longitude\":113.38111833333333,\"latitude\":23.153645},{\"longitude\":113.38117805555555,\"latitude\":23.153739722222223},{\"longitude\":113.38123138888889,\"latitude\":23.153820555555555},{\"longitude\":113.38127972222222,\"latitude\":23.153894444444443},{\"longitude\":113.38132138888889,\"latitude\":23.153958333333332},{\"longitude\":113.38136166666666,\"latitude\":23.154015277777777},{\"longitude\":113.38139916666667,\"latitude\":23.154065833333334},{\"longitude\":113.38144111111112,\"latitude\":23.154117777777778},{\"longitude\":113.38148666666666,\"latitude\":23.154172777777777},{\"longitude\":113.38154,\"latitude\":23.154239166666667},{\"longitude\":113.38159388888889,\"latitude\":23.154316666666666},{\"longitude\":113.38165777777778,\"latitude\":23.154418333333332},{\"longitude\":113.38171722222222,\"latitude\":23.154519166666667},{\"longitude\":113.38177888888889,\"latitude\":23.154627777777776},{\"longitude\":113.38184027777778,\"latitude\":23.154741944444446},{\"longitude\":113.38190416666667,\"latitude\":23.154869444444444},{\"longitude\":113.38196,\"latitude\":23.1549925},{\"longitude\":113.38200722222223,\"latitude\":23.155104166666668},{\"longitude\":113.38205111111111,\"latitude\":23.155215277777778},{\"longitude\":113.3820913888889,\"latitude\":23.155324722222222},{\"longitude\":113.38213222222222,\"latitude\":23.155440833333333},{\"longitude\":113.38216916666667,\"latitude\":23.155555833333334},{\"longitude\":113.38220333333334,\"latitude\":23.15567972222222},{\"longitude\":113.38222583333334,\"latitude\":23.155775},{\"longitude\":113.382245,\"latitude\":23.155865555555554},{\"longitude\":113.38226055555556,\"latitude\":23.155940833333332},{\"longitude\":113.38227388888889,\"latitude\":23.156005},{\"longitude\":113.38228472222222,\"latitude\":23.156060833333335},{\"longitude\":113.38229333333334,\"latitude\":23.156105833333335},{\"longitude\":113.38230083333333,\"latitude\":23.156141666666667},{\"longitude\":113.38230972222222,\"latitude\":23.156171666666665},{\"longitude\":113.38232027777778,\"latitude\":23.15619611111111},{\"longitude\":113.38233472222223,\"latitude\":23.156214722222224},{\"longitude\":113.38235944444445,\"latitude\":23.156232777777777},{\"longitude\":113.38237,\"latitude\":23.15623861111111},{\"longitude\":113.382435,\"latitude\":23.156243055555557},{\"longitude\":113.38248166666666,\"latitude\":23.156228055555555},{\"longitude\":113.38255277777778,\"latitude\":23.156190833333334},{\"longitude\":113.38262444444445,\"latitude\":23.156143055555557},{\"longitude\":113.38270583333333,\"latitude\":23.15608888888889},{\"longitude\":113.38279833333333,\"latitude\":23.15603},{\"longitude\":113.38282583333333,\"latitude\":23.15601277777778},{\"longitude\":113.38295916666667,\"latitude\":23.155929722222222},{\"longitude\":113.38298444444445,\"latitude\":23.15591361111111},{\"longitude\":113.383055,\"latitude\":23.15586972222222},{\"longitude\":113.38313,\"latitude\":23.155824166666665},{\"longitude\":113.383195,\"latitude\":23.155784444444443},{\"longitude\":113.38324972222222,\"latitude\":23.155750833333332},{\"longitude\":113.38332916666667,\"latitude\":23.155701666666666},{\"longitude\":113.38335944444445,\"latitude\":23.155684722222222},{\"longitude\":113.38338666666667,\"latitude\":23.155670277777777},{\"longitude\":113.3834125,\"latitude\":23.155655833333334},{\"longitude\":113.38344222222223,\"latitude\":23.15563611111111},{\"longitude\":113.38347694444444,\"latitude\":23.155607222222223},{\"longitude\":113.38351305555555,\"latitude\":23.15556527777778},{\"longitude\":113.38354361111111,\"latitude\":23.15551},{\"longitude\":113.38356888888889,\"latitude\":23.15544166666667},{\"longitude\":113.38359027777778,\"latitude\":23.155362222222223},{\"longitude\":113.38361027777778,\"latitude\":23.155272222222223},{\"longitude\":113.3836738888889,\"latitude\":23.155085},{\"longitude\":113.38371388888889,\"latitude\":23.154994444444444},{\"longitude\":113.3837638888889,\"latitude\":23.1549075},{\"longitude\":113.38382027777777,\"latitude\":23.154823888888888},{\"longitude\":113.38387277777778,\"latitude\":23.154746111111113},{\"longitude\":113.383915,\"latitude\":23.154678611111112},{\"longitude\":113.38395166666666,\"latitude\":23.15461833333333},{\"longitude\":113.38398638888889,\"latitude\":23.15457111111111},{\"longitude\":113.38401972222222,\"latitude\":23.154532222222223},{\"longitude\":113.38406083333334,\"latitude\":23.154493333333335},{\"longitude\":113.38410972222222,\"latitude\":23.15444861111111},{\"longitude\":113.38417,\"latitude\":23.15439},{\"longitude\":113.38423833333333,\"latitude\":23.15432},{\"longitude\":113.38432055555556,\"latitude\":23.154236666666666},{\"longitude\":113.38441666666667,\"latitude\":23.154146666666666},{\"longitude\":113.38452333333333,\"latitude\":23.15404611111111},{\"longitude\":113.38463888888889,\"latitude\":23.153940555555554},{\"longitude\":113.38474777777778,\"latitude\":23.15384},{\"longitude\":113.38484138888889,\"latitude\":23.15375472222222},{\"longitude\":113.3849275,\"latitude\":23.15368},{\"longitude\":113.38501055555555,\"latitude\":23.153611944444446},{\"longitude\":113.38509111111111,\"latitude\":23.153549722222223},{\"longitude\":113.3851763888889,\"latitude\":23.153491111111112},{\"longitude\":113.38526666666667,\"latitude\":23.153431944444446},{\"longitude\":113.38536027777778,\"latitude\":23.15337472222222},{\"longitude\":113.38544611111111,\"latitude\":23.153324444444443},{\"longitude\":113.38553222222222,\"latitude\":23.153279166666668},{\"longitude\":113.38562,\"latitude\":23.15323666666667},{\"longitude\":113.385705,\"latitude\":23.153197777777777},{\"longitude\":113.38578166666667,\"latitude\":23.153165555555557},{\"longitude\":113.38585472222222,\"latitude\":23.153138333333334},{\"longitude\":113.38591194444444,\"latitude\":23.1531175},{\"longitude\":113.38596055555556,\"latitude\":23.153102222222223},{\"longitude\":113.38599972222222,\"latitude\":23.15309111111111},{\"longitude\":113.38603111111111,\"latitude\":23.1530825},{\"longitude\":113.38605833333334,\"latitude\":23.153075},{\"longitude\":113.38608,\"latitude\":23.153068333333334},{\"longitude\":113.38609055555555,\"latitude\":23.153064722222222},{\"longitude\":113.38609055555555,\"latitude\":23.153064722222222}]"; |
| | | String json = "[{\n" + |
| | | "\t\"latitude\": 23.155130575839845,\n" + |
| | | "\t\"longitude\": 113.3843844686235\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155210151679693,\n" + |
| | | "\t\"longitude\": 113.38426593724698\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155289727519538,\n" + |
| | | "\t\"longitude\": 113.38414740587048\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15529,\n" + |
| | | "\t\"longitude\": 113.384147\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155362958389055,\n" + |
| | | "\t\"longitude\": 113.38402358903004\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155435916778114,\n" + |
| | | "\t\"longitude\": 113.38390017806007\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15550887516717,\n" + |
| | | "\t\"longitude\": 113.3837767670901\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155581833556226,\n" + |
| | | "\t\"longitude\": 113.38365335612013\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155585,\n" + |
| | | "\t\"longitude\": 113.383648\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155542,\n" + |
| | | "\t\"longitude\": 113.383621\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155312,\n" + |
| | | "\t\"longitude\": 113.383648\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155180919552134,\n" + |
| | | "\t\"longitude\": 113.3836848841087\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.155081,\n" + |
| | | "\t\"longitude\": 113.383713\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15495796304221,\n" + |
| | | "\t\"longitude\": 113.38377424506344\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.154856,\n" + |
| | | "\t\"longitude\": 113.383825\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.154741004509642,\n" + |
| | | "\t\"longitude\": 113.38390239240225\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.154626009019285,\n" + |
| | | "\t\"longitude\": 113.38397978480451\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.154593,\n" + |
| | | "\t\"longitude\": 113.384002\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.154488868635756,\n" + |
| | | "\t\"longitude\": 113.3840956684042\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15438473727151,\n" + |
| | | "\t\"longitude\": 113.3841893368084\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153869,\n" + |
| | | "\t\"longitude\": 113.384732\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153783434325412,\n" + |
| | | "\t\"longitude\": 113.38484554532484\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153697868650823,\n" + |
| | | "\t\"longitude\": 113.38495909064967\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153612302976235,\n" + |
| | | "\t\"longitude\": 113.3850726359745\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153606,\n" + |
| | | "\t\"longitude\": 113.385081\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15352802191651,\n" + |
| | | "\t\"longitude\": 113.38520076538181\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153450043833022,\n" + |
| | | "\t\"longitude\": 113.38532053076364\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153397,\n" + |
| | | "\t\"longitude\": 113.385402\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15332878835048,\n" + |
| | | "\t\"longitude\": 113.38552854437049\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15326057670096,\n" + |
| | | "\t\"longitude\": 113.38565508874098\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153252,\n" + |
| | | "\t\"longitude\": 113.385671\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.153190501345524,\n" + |
| | | "\t\"longitude\": 113.3858015058656\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15312900269105,\n" + |
| | | "\t\"longitude\": 113.38593201173121\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15308,\n" + |
| | | "\t\"longitude\": 113.386036\n" + |
| | | "}, {\n" + |
| | | "\t\"latitude\": 23.15306,\n" + |
| | | "\t\"longitude\": 113.386128\n" + |
| | | "}]"; |
| | | List<LonLatDto> polyline = JSON.parseArray(json, LonLatDto.class); |
| | | String xcgj = "[{\"longitude\":113.38368194444445,\"latitude\":23.15508361111111}]"; |
| | | List<LonLatDto> lonLatDtos = JSON.parseArray(xcgj, LonLatDto.class); |
| | | for (LonLatDto lonLatDto : lonLatDtos) { |
| | | Map<String, List<LonLatDto>> remainingNavigation = getRemainingNavigation(polyline, lonLatDto.getLongitude(), lonLatDto.getLatitude()); |
| | |
| | | polyline = unserved; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | // JSONArray objects = JSON.parseArray("[{\"latitude\":23.154856,\"longitude\":113.383825},{\"latitude\":23.154741004509642,\"longitude\":113.38390239240225},{\"latitude\":23.154626009019285,\"longitude\":113.38397978480451},{\"latitude\":23.154593,\"longitude\":113.384002},{\"latitude\":23.154488868635756,\"longitude\":113.3840956684042},{\"latitude\":23.15438473727151,\"longitude\":113.3841893368084},{\"latitude\":23.153869,\"longitude\":113.384732},{\"latitude\":23.153783434325412,\"longitude\":113.38484554532484},{\"latitude\":23.153697868650823,\"longitude\":113.38495909064967},{\"latitude\":23.153612302976235,\"longitude\":113.3850726359745},{\"latitude\":23.153606,\"longitude\":113.385081},{\"latitude\":23.15352802191651,\"longitude\":113.38520076538181},{\"latitude\":23.153450043833022,\"longitude\":113.38532053076364},{\"latitude\":23.153397,\"longitude\":113.385402},{\"latitude\":23.15332878835048,\"longitude\":113.38552854437049},{\"latitude\":23.15326057670096,\"longitude\":113.38565508874098},{\"latitude\":23.153252,\"longitude\":113.385671},{\"latitude\":23.153190501345524,\"longitude\":113.3858015058656},{\"latitude\":23.15312900269105,\"longitude\":113.38593201173121},{\"latitude\":23.15308,\"longitude\":113.386036},{\"latitude\":23.15306,\"longitude\":113.386128}]"); |
| | | // String str = "["; |
| | | // for (int i = 0; i < objects.size(); i++) { |
| | | // JSONObject jsonObject = objects.getJSONObject(i); |
| | | // str += "[" + jsonObject.getDouble("longitude") + "," + jsonObject.getDouble("latitude") + "],"; |
| | | // } |
| | | // System.err.println(str + "]"); |
| | | } |
| | | |
| | | } |
| New file |
| | |
| | | package com.xiaopeng.trafficControl; |
| | | |
| | | import com.xiaopeng.common.security.annotation.EnableCustomConfig; |
| | | import com.xiaopeng.common.security.annotation.EnableRyFeignClients; |
| | | import com.xiaopeng.common.swagger.annotation.EnableCustomSwagger2; |
| | | import org.springframework.boot.SpringApplication; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.boot.web.servlet.ServletComponentScan; |
| | | import org.springframework.scheduling.annotation.EnableScheduling; |
| | | import org.springframework.transaction.annotation.EnableTransactionManagement; |
| | | |
| | | /** |
| | | * 合规监管 |
| | | */ |
| | | @EnableCustomConfig |
| | | @EnableCustomSwagger2 |
| | | @EnableRyFeignClients |
| | | @SpringBootApplication |
| | | @EnableScheduling//开启定时任务 |
| | | @ServletComponentScan |
| | | @EnableTransactionManagement//开启事务 |
| | | public class TrafficControlApplication { |
| | | public static void main(String[] args) { |
| | | SpringApplication.run(TrafficControlApplication.class, args); |
| | | System.out.println("(♥◠‿◠)ノ゙ 合规监管模块启动成功 ლ(´ڡ`ლ)゙ \n"); |
| | | } |
| | | } |
| | |
| | | */ |
| | | VehicleTemperatureDto queryTemperatureByOrderId(Long orderId, String uid); |
| | | |
| | | |
| | | /** |
| | | * 查询车辆温度 |
| | | * |
| | | * @param orderId 订单ID |
| | | * @return 车辆温度 |
| | | */ |
| | | Boolean queryTrunkOpenStatusByOrderId(Long orderId, String uid); |
| | | |
| | | /** |
| | | * 车辆分页列表 |
| | | * |
| | |
| | | @Value("${vehicle.control.distance-threshold:100}") |
| | | private int distanceThreshold; |
| | | |
| | | @Value("${vehicle.control.report.enable:true}") |
| | | private boolean reportEnable; |
| | | |
| | | @Override |
| | | public List<XpVehicle> listByIds(List<Long> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | |
| | | if (gearLevel == null || gearLevel != 4) { |
| | | throw new ServiceException("车辆非P档,无法操作后备箱", I18nKeyConstant.VEHICLE_NOT_P_GEAR); |
| | | } |
| | | //查询后备箱开关状态 |
| | | VehicleTemperatureDto vehicleTemperatureDto = vehicleControlUtil.queryTrunkDoorStateSync(xpOrder.getAppUserId(), xpVehicle.getVehicleVin()); |
| | | VehicleStateVo trunkAjarCloseSt = vehicleTemperatureDto.getStateMap().get("trunkAjarCloseSt"); |
| | | //查询后备箱开关状态(打开状态=true,关闭状态=false) |
| | | Boolean hasKey = vehicleControlUtil.queryTrunkDoorStateSync(xpOrder.getAppUserId(), xpVehicle.getVehicleVin(), reportEnable); |
| | | //打开状态 |
| | | if(null != trunkAjarCloseSt && trunkAjarCloseSt.getValue().equals("1")){ |
| | | if(hasKey){ |
| | | xpOrder.setOpenTrunk(2); |
| | | vehiclesCommandVo.setCommandCode(VehiclesCommandEnum.DOOR_TRUNK_CLOSE.getCommand()); |
| | | }else{ |
| | |
| | | // "msg": "", |
| | | // "desc": "成功" |
| | | //} |
| | | String result = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo, xpOrder.getAppUserId()); |
| | | log.info("车辆控制结果:{}", result); |
| | | if (!result.contains("msgId")) { |
| | | String msgId = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo, xpOrder.getAppUserId()); |
| | | log.info("车辆控制结果:{}", msgId); |
| | | if (StringUtils.isEmpty(msgId)) { |
| | | return 0; |
| | | }else { |
| | | xpOrderClient.updateOrder(xpOrder); |
| | |
| | | vehiclesCommandParamVo.setDegree(dto.getTargetTemperature()); |
| | | vehiclesCommandVo.setParam(vehiclesCommandParamVo); |
| | | try { |
| | | String result = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo, xpOrder.getAppUserId()); |
| | | log.info("车辆温度设置结果:{}", result); |
| | | if (!result.contains("msgId")) { |
| | | String msgId = vehicleControlUtil.vehiclesCommand(vehiclesCommandVo, xpOrder.getAppUserId()); |
| | | log.info("车辆温度设置结果:{}", msgId); |
| | | if (StringUtils.isEmpty(msgId)) { |
| | | return 0; |
| | | }else { |
| | | return 1; |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public Boolean queryTrunkOpenStatusByOrderId(Long orderId, String uid) { |
| | | XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData(); |
| | | if (Objects.isNull(xpOrder)) { |
| | | throw new ServiceException("未查询到有效订单信息", I18nKeyConstant.ORDER_NOT_EXISTS); |
| | | } |
| | | XpVehicle xpVehicle = this.getById(xpOrder.getVehicleId()); |
| | | if (Objects.isNull(xpVehicle) || Objects.isNull(xpVehicle.getVehicleVin())) { |
| | | throw new ServiceException("未查询到有效车辆信息", I18nKeyConstant.VEHICLE_NOT_EXISTS); |
| | | } |
| | | try { |
| | | return vehicleControlUtil.queryTrunkDoorStateSync(Long.parseLong(uid), xpVehicle.getVehicleVin(), reportEnable); |
| | | } catch (Exception e) { |
| | | log.error("查询车门状态失败", e); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public PageInfo<XpVehicleVO> getVehiclePageList(VehicleSelectPageQuery query) { |
| | | Page<XpVehicleVO> page = new Page<>(query.getPageNum(), query.getPageSize()); |
| | |
| | | public Boolean getVehicleTrunkOpenStatus(String uid, Long id) { |
| | | XpVehicle xpVehicle = this.getById(id); |
| | | try { |
| | | VehicleTemperatureDto vehicleTemperatureDto = vehicleControlUtil.queryTrunkDoorStateSync(Long.parseLong(uid), xpVehicle.getVehicleVin()); |
| | | log.info("查询车辆后备箱状态成功: {}", vehicleTemperatureDto); |
| | | VehicleStateVo trunkAjarCloseSt = vehicleTemperatureDto.getStateMap().get("trunkAjarCloseSt"); |
| | | if(null == trunkAjarCloseSt){ |
| | | return false; |
| | | } |
| | | return trunkAjarCloseSt.getValue().equals("5"); |
| | | return vehicleControlUtil.queryTrunkDoorStateSync(Long.parseLong(uid), xpVehicle.getVehicleVin(), reportEnable); |
| | | } catch (Exception e) { |
| | | log.error("查询车辆后备箱失败", e); |
| | | return false; |
| | |
| | | package com.xiaopeng.vehicleConvoy.util; |
| | | |
| | | |
| | | import cn.hutool.core.io.FileUtil; |
| | | import cn.hutool.crypto.digest.MD5; |
| | | import cn.hutool.http.HttpRequest; |
| | | import cn.hutool.http.HttpResponse; |
| | | import cn.hutool.http.HttpUtil; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.io.File; |
| | | import java.io.ByteArrayInputStream; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.security.MessageDigest; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.http.HttpResponse; |
| | | import org.apache.http.client.ClientProtocolException; |
| | | import org.apache.http.client.config.RequestConfig; |
| | | import org.apache.http.client.methods.HttpPost; |
| | | import org.apache.http.entity.ContentType; |
| | | import org.apache.http.entity.mime.MultipartEntityBuilder; |
| | | import org.apache.http.impl.client.CloseableHttpClient; |
| | | import org.apache.http.impl.client.HttpClientBuilder; |
| | | import org.apache.http.util.EntityUtils; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | |
| | | /** |
| | |
| | | |
| | | private final String companyId = "4401XPQCB67N";//公司标识 |
| | | |
| | | private final String platform = "XPQC"; |
| | | private final String platform = "XPQCB67N"; |
| | | |
| | | private final String key = "gEhROt7lg4DEBanR"; |
| | | |
| | |
| | | * @return |
| | | */ |
| | | public String getToken(){ |
| | | //通过上传文件的方式获取token |
| | | String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); |
| | | String fileName = platform + "_TOKEN_ACCESS_REQ_" + format + ".json"; |
| | | File file = FileUtil.file(filePath + fileName); |
| | | if(!file.exists()){ |
| | | file.getParentFile().mkdirs(); |
| | | try { |
| | | file.createNewFile(); |
| | | } catch (IOException e) { |
| | | throw new RuntimeException(e); |
| | | try { |
| | | String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); |
| | | String filename = platform + "_TOKEN_ACCESS_REQ_" + format + ".json"; |
| | | HttpPost post = new HttpPost(url); |
| | | JSONObject body = new JSONObject(); |
| | | body.put("platform", platform); |
| | | body.put("key", key); |
| | | InputStream in = new ByteArrayInputStream(body.toJSONString().getBytes("UTF-8")); |
| | | String md5 = hash(in); |
| | | in.reset(); |
| | | MultipartEntityBuilder builder = MultipartEntityBuilder.create(); |
| | | post.addHeader("binfile-md5", md5); |
| | | post.addHeader("binfile-auth", platform); |
| | | post.addHeader("binfile-gzip", "false"); |
| | | post.addHeader("binfile-reqlen", String.valueOf(in.available())); |
| | | builder.addBinaryBody("binFile", in, ContentType.DEFAULT_BINARY, filename);// 文件 |
| | | builder.addTextBody("filename", filename, ContentType.create(ContentType.DEFAULT_TEXT.getMimeType(), "UTF-8")); |
| | | post.setEntity(builder.build()); |
| | | |
| | | int connTimeout = 10000; |
| | | int soTimeout = -1; |
| | | |
| | | HttpClientBuilder clientBuilder = HttpClientBuilder.create(); |
| | | RequestConfig.Builder configBuilder = RequestConfig.custom(); |
| | | if (connTimeout > 0) configBuilder.build(); |
| | | if (soTimeout > 0) configBuilder.setSocketTimeout(soTimeout); |
| | | clientBuilder.setDefaultRequestConfig(configBuilder.build()); |
| | | if (!false) clientBuilder.disableContentCompression(); |
| | | CloseableHttpClient client = clientBuilder.build(); |
| | | HttpResponse response = client.execute(post); |
| | | |
| | | log.info("response.toString() = \n"+response.toString()); |
| | | log.info("response.getStatusLine().getStatusCode() = \n"+response.getStatusLine().getStatusCode()); |
| | | InputStream ins = response.getEntity().getContent(); |
| | | byte[] s = new byte[1024]; |
| | | while(ins.read(s,0,1024) != -1){ |
| | | String str = new String(s,"UTF-8"); |
| | | System.out.println(str); |
| | | } |
| | | log.info("内容:"+ EntityUtils.toString(response.getEntity())); |
| | | return EntityUtils.toString(response.getEntity()); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | JSONObject body = new JSONObject(); |
| | | JSONArray items = new JSONArray(); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | jsonObject.put("platform", platform); |
| | | jsonObject.put("key", key); |
| | | items.add(jsonObject); |
| | | body.put("items", items); |
| | | file = FileUtil.writeUtf8String(body.toJSONString(), file); |
| | | String md5 = MD5.create().digestHex(file); |
| | | HttpRequest post = HttpUtil.createPost(url); |
| | | post.header("binfile-md5", md5); |
| | | // post.header("binfile-auth", "5cd4be8cf03842a6b4c3246011e3482e"); |
| | | post.header("binfile-gzip", "false"); |
| | | post.header("binfile-reqlen", file.length() + ""); |
| | | post.header("Transfer-Encoding", "chunked"); |
| | | post.contentType("multipart/form-data;boundary=inputstream"); |
| | | post.header("Connection", "Keep-Alive"); |
| | | post.form("binFile", file); |
| | | post.form("filename", fileName); |
| | | log.info("获取token请求url {}", url); |
| | | log.info("获取token请求header {}", JSON.toJSONString(post.headers())); |
| | | log.info("获取token请求参数 {}", FileUtil.readUtf8String(file)); |
| | | log.info("获取token请求body {}", JSON.toJSONString(post.form())); |
| | | HttpResponse execute = post.execute(); |
| | | if(!execute.isOk()){ |
| | | log.info("获取token失败:{} {}", execute.getStatus(), execute.body()); |
| | | return execute.body(); |
| | | } |
| | | InputStream inputStream = execute.bodyStream(); |
| | | //读取inputStream流转成file文件 |
| | | File resultFile = FileUtil.file(filePath + "token_response_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")) + ".json"); |
| | | resultFile.getParentFile().mkdirs(); |
| | | FileUtil.writeFromStream(inputStream, resultFile); |
| | | String responseContent = FileUtil.readUtf8String(resultFile); |
| | | log.info("获取token成功 {}", responseContent); |
| | | return responseContent; |
| | | return null; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | private static char[] commonDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; |
| | | |
| | | public static void main(String[] args) throws ClientProtocolException, IOException |
| | | { |
| | | |
| | | } |
| | | |
| | | public static String hash(InputStream in) |
| | | { |
| | | try |
| | | { |
| | | byte[] buffer = new byte[1024]; |
| | | MessageDigest md5 = MessageDigest.getInstance("MD5"); |
| | | int numRead = 0; |
| | | while ((numRead = in.read(buffer)) > 0) |
| | | { |
| | | md5.update(buffer, 0, numRead); |
| | | } |
| | | in.close(); |
| | | return toHexString(md5.digest()); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return ""; |
| | | } |
| | | } |
| | | |
| | | private static String toHexString(byte[] b) |
| | | { |
| | | StringBuilder sb = new StringBuilder(b.length * 2); |
| | | for (int i = 0; i < b.length; i++) |
| | | { |
| | | sb.append(commonDigit[(b[i] & 0xf0) >>> 4]); |
| | | sb.append(commonDigit[b[i] & 0x0f]); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | } |
| | |
| | | import com.xiaopeng.api.dto.vehicleConvoy.ImOpenQueryStateDto; |
| | | import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleControlClient; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.VehicleStateVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandVo; |
| | | import com.xiaopeng.vehicleConvoy.service.AsyncVehicleStateService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | String nonce = System.currentTimeMillis() + ""; |
| | | Set<String> stateList = new HashSet<>(); |
| | | stateList.add("hvacInnerTemp"); |
| | | stateList.add("trunkAjarCloseSt"); |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("nonce", nonce); |
| | | map.put("openId", OPEN_ID_ROBOT_TAXI); |
| | |
| | | * |
| | | * @param uid 用户ID |
| | | * @param vin 车辆VIN码 |
| | | * @return 车辆状态信息,包含后备箱状态 |
| | | * @return 查询后备箱开关状态(打开状态=true,关闭状态=false) |
| | | * @throws RuntimeException 查询失败或1秒超时 |
| | | */ |
| | | public VehicleTemperatureDto queryTrunkDoorStateSync(Long uid, String vin) { |
| | | public Boolean queryTrunkDoorStateSync(Long uid, String vin, boolean reportEnable) { |
| | | log.info("开始同步查询车辆后备箱状态: uid={}, vin={} (1秒超时)", uid, vin); |
| | | |
| | | if (!reportEnable) { |
| | | VehicleTemperatureDto vehicleTemperatureDto = queryVehicleTemperature(String.valueOf(uid), vin); |
| | | VehicleStateVo vehicleStateVo = vehicleTemperatureDto.getStateMap().get("trunkAjarCloseSt"); |
| | | return null != vehicleStateVo && vehicleStateVo.getValue().equals("1"); |
| | | } |
| | | try { |
| | | // 使用异步服务查询状态,内部有1秒超时处理 |
| | | CompletableFuture<VehicleTemperatureDto> future = asyncVehicleStateService |
| | |
| | | } |
| | | |
| | | log.info("同步查询车辆后备箱状态成功: uid={}, vin={}", uid, vin); |
| | | return result; |
| | | VehicleStateVo vehicleStateVo = result.getStateMap().get("trunkAjarCloseSt"); |
| | | log.info("同步查询车辆后备箱状态成功: uid={}, vin={}, vehicleStateVo={}", uid, vin, JSON.toJSONString(vehicleStateVo)); |
| | | return null != vehicleStateVo && vehicleStateVo.getValue().equals("5"); |
| | | |
| | | } catch (java.util.concurrent.ExecutionException e) { |
| | | Throwable cause = e.getCause(); |