puzhibing
2026-04-17 1632956ff51882192bb01dbfc5a3761482ff4603
合并线上代码
4个文件已添加
18个文件已修改
1285 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/MiniprogramConfigurer.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ReassignOrderDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/PushOrderRouteDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/ReassignOrderClientFallbackFactory.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/XpLogMessage.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java 542 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/TaskUtil.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/PushMessageTypeEnum.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/config/MiniprogramConfigurer.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/LogController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/BannerTaskUtil.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/TrafficControlApplication.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/VehicleControlUtil.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/MiniprogramConfigurer.java
@@ -1,33 +1,33 @@
//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());
        }
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/ReassignOrderDTO.java
@@ -21,7 +21,4 @@
    @ApiModelProperty(value = "订单号")
    private String orderNo;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/pushMessage/PushOrderRouteDTO.java
@@ -36,4 +36,7 @@
    @ApiModelProperty(value = "方向角 0-359")
    private Integer direction;
    @ApiModelProperty(value = "消息类型")
    private String messageType;
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/order/ReassignOrderClientFallbackFactory.java
@@ -23,5 +23,4 @@
        };
    }
}
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/operation/XpLogMessage.java
New file
@@ -0,0 +1,37 @@
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;
}
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -106,8 +106,7 @@
            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();
@@ -518,6 +517,7 @@
                    dto.setDuration(10.0);
                    dto.setDistance(2.0);
                    dto.setDirection(60);
                    dto.setMessageType(PushMessageTypeEnum.ORDER_ROUTE.getDesc());
                    xpPushMessageClient.pushOrderRoute(dto);
                }
@@ -699,6 +699,7 @@
                    dto.setDuration(20.0);
                    dto.setDistance(10.0);
                    dto.setDirection(60);
                    dto.setMessageType(PushMessageTypeEnum.ORDER_ROUTE.getDesc());
                    xpPushMessageClient.pushOrderRoute(dto);
                    //存储历史轨迹
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -49,6 +49,9 @@
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;
@@ -60,9 +63,11 @@
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;
/**
@@ -129,6 +134,9 @@
    @Resource
    private XpTestOrderClient testOrderClient;
    @Resource
    private RedissonClient redissonClient;
    private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer()
            .printingEnumsAsInts()
@@ -348,109 +356,118 @@
        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();
        }
    }
@@ -631,94 +648,31 @@
        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);
@@ -729,90 +683,168 @@
                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();
        }
    }
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/TaskUtil.java
New file
@@ -0,0 +1,28 @@
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);
    }
}
xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/enums/PushMessageTypeEnum.java
@@ -15,7 +15,8 @@
    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;
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.api.dto.map.HistoryPointDto;
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
@@ -30,6 +31,7 @@
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -66,7 +68,7 @@
        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对象)
@@ -79,25 +81,31 @@
                    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("没有找到路线");
@@ -124,27 +132,34 @@
        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("没有找到路线");
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
@@ -47,7 +47,7 @@
     * @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();
@@ -57,11 +57,7 @@
        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);
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/config/MiniprogramConfigurer.java
@@ -33,7 +33,9 @@
                            "/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());
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/LogController.java
New file
@@ -0,0 +1,53 @@
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);
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/OssController.java
@@ -24,13 +24,13 @@
 */
@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 {
@@ -60,7 +60,38 @@
    @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 {
@@ -73,5 +104,20 @@
        }
    }
    @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());
        }
    }
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/task/BannerTaskUtil.java
@@ -1,14 +1,22 @@
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 无关风月
@@ -20,6 +28,9 @@
    @Autowired
    private XpBannerService bannerService;
    @Resource
    private MongoTemplate mongoTemplate;
    /**
@@ -48,4 +59,14 @@
    }
    /**
     * 删除移动端日志
     */
    @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);
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/controller/PushOrderRouteController.java
@@ -14,7 +14,6 @@
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;
@@ -25,7 +24,6 @@
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;
@@ -54,11 +52,14 @@
        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();
@@ -66,7 +67,7 @@
            // 获取路线规划
            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();
@@ -125,7 +126,7 @@
                // 封装轨迹信息
                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()+"");
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/utils/MapMatchingUtil.java
@@ -1,6 +1,8 @@
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;
@@ -85,14 +87,6 @@
            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){
@@ -109,10 +103,11 @@
                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;
@@ -233,13 +228,114 @@
    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());
@@ -249,6 +345,17 @@
            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 + "]");
    }
}
xp-robotaxi-traffic-control-boot/src/main/java/com/xiaopeng/trafficControl/TrafficControlApplication.java
New file
@@ -0,0 +1,27 @@
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");
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
@@ -175,6 +175,15 @@
     */
    VehicleTemperatureDto queryTemperatureByOrderId(Long orderId, String uid);
    /**
     * 查询车辆温度
     *
     * @param orderId 订单ID
     * @return 车辆温度
     */
    Boolean queryTrunkOpenStatusByOrderId(Long orderId, String uid);
    /**
     * 车辆分页列表
     *
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -128,6 +128,9 @@
    @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)) {
@@ -330,11 +333,10 @@
            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{
@@ -352,9 +354,9 @@
            //    "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);
@@ -394,9 +396,9 @@
        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;
@@ -1072,6 +1074,25 @@
        }
    }
    @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());
@@ -1087,13 +1108,7 @@
    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;
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/MinistryOfTransport.java
@@ -1,22 +1,25 @@
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;
/**
@@ -40,7 +43,7 @@
    private final String companyId = "4401XPQCB67N";//公司标识
    private final String platform = "XPQC";
    private final String platform = "XPQCB67N";
    private final String key = "gEhROt7lg4DEBanR";
@@ -54,56 +57,92 @@
     * @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();
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/util/VehicleControlUtil.java
@@ -7,6 +7,7 @@
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;
@@ -52,6 +53,7 @@
        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);
@@ -80,12 +82,16 @@
     *
     * @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
@@ -99,7 +105,9 @@
            }
            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();