From a5b842f1f6ab32f1af39f4bcb7e45217e94db761 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 25 十月 2025 18:14:44 +0800
Subject: [PATCH] fix:完成任务状态,任务同步,高度同步等工作

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java |  513 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 502 insertions(+), 11 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
index bc6b087..5ae3359 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
@@ -1,7 +1,16 @@
 package com.ruoyi.web.controller.system;
 
-import java.util.List;
+import java.util.*;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.service.*;
+import com.ruoyi.common.config.TencentMapConfig;
+import com.ruoyi.common.config.BaiduMapConfig;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -18,10 +27,9 @@
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.system.domain.VehicleGps;
-import com.ruoyi.system.service.IVehicleGpsService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.http.HttpUtils;
 
 /**
  * 杞﹁締GPS鍧愭爣Controller
@@ -31,14 +39,45 @@
 public class VehicleGpsController extends BaseController {
     @Autowired
     private IVehicleGpsService vehicleGpsService;
+
+    @Autowired
+    private ITbVehicleOrderService tbVehicleOrderService;
+
+    @Autowired
+    private IDispatchOrdService dispatchOrdService;
+
+    @Autowired
+    private ITbOrdersService tbOrdersService;
+
+    @Autowired
+    private IGpsCollectService gpsCollectService;
+
+    @Autowired
+    private IVehicleInfoService vehicleInfoService;
+
+    @Autowired
+    private ICmsGpsCollectService cmsGpsCollectService;
+    
+    @Autowired
+    private TencentMapConfig tencentMapConfig;
+    
+    @Autowired
+    private BaiduMapConfig baiduMapConfig;
+
    /**
      * 鏌ヨ杞﹁締GPS鍧愭爣鍒楄〃
      */  
     @PreAuthorize("@ss.hasPermi('system:gps:list')")
     @GetMapping("/list")
     public TableDataInfo list(VehicleGps vehicleGps) {
+
         startPage();
-        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+//        String vehicleNo=vehicleGps.getVehicleNo();
+//        String beginTime=vehicleGps.getBeginTime();
+//        String endTime=vehicleGps.getEndTime();
+//        return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//
+//        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
         vehicleGps.setOrderByColumn("collect_time");
         vehicleGps.setIsAsc("desc");
         List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
@@ -47,12 +86,83 @@
     @Anonymous(needSign=true)   
     @GetMapping("/anonymousList")
     public TableDataInfo anonymousList(VehicleGps vehicleGps) {
-        startPage();
-        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
-        vehicleGps.setOrderByColumn("collect_time");
-        vehicleGps.setIsAsc("desc");
-        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
-        return getDataTable(list);
+
+        if(vehicleGps.getOrderId()==null)
+        {
+            return getDataTable(new ArrayList<>());
+        }
+
+        //鏌ヨ璁㈠崟
+        TbVehicleOrder tbVehicleOrder = tbVehicleOrderService.selectTbVehicleOrderById(vehicleGps.getOrderId());
+        if(tbVehicleOrder==null)
+        {
+            return getDataTable(new ArrayList<>());
+        }
+
+        if(!Objects.equals(tbVehicleOrder.getStatus(), "0"))
+        {
+            //闈�0琛ㄧず璁㈠崟瀹屾垚浜嗐��
+            try {
+                TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
+                if (tbOrders == null) {
+                    return getDataTable(new ArrayList<>());
+                }
+
+
+                DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
+                if (dispatchOrd == null) {
+                    return getDataTable(new ArrayList<>());
+                }
+
+                String vehicleNo = tbVehicleOrder.getVehicle();
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
+                String endTime=  sdf.format(dispatchOrd.getDispatchOrdUpdateTime());
+                //濡傛灉璁㈠崟娌″畬鎴愶紝 endTime涓哄綋鍓嶆椂闂达紱濡備綍璁㈠崟宸茬粡瀹屾垚浜嗭紝鐢ㄨ鍗曠殑缁撴潫鏃堕棿銆�
+
+                return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//                Map<String, Object> params = new HashMap<>();
+//                params.put("beginTime", dispatchOrd.getDispatchOrdStartDate());
+//                params.put("endTime", dispatchOrd.getDispatchOrdUpdateTime());
+//
+//                vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
+//                startPage();
+//                // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+//                vehicleGps.setOrderByColumn("collect_time");
+//                vehicleGps.setIsAsc("desc");
+//                List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
+//                return getDataTable(list);
+            }
+            catch (Exception ex)
+            {
+                logger.error("宸插畬鎴愮殑璁㈠崟鏌ヨ鍦板浘寮傚父锛歿}",ex.getMessage());
+                return getDataTable(new ArrayList<>());
+            }
+        }else{
+            TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
+            if (tbOrders == null) {
+                return getDataTable(new ArrayList<>());
+            }
+            DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
+            if (dispatchOrd == null) {
+                return getDataTable(new ArrayList<>());
+            }
+            String vehicleNo = tbVehicleOrder.getVehicle();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
+            String endTime=  sdf.format(new Date());
+
+            logger.info("鏌ヨ杞﹁締杞ㄨ抗锛氳溅杈嗗彿锛歿}, 寮�濮嬫椂闂达細{}, 缁撴潫鏃堕棿锛歿}", vehicleNo, beginTime, endTime);
+            return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//
+//        vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
+//        startPage();
+//        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+//        vehicleGps.setOrderByColumn("collect_time");
+//        vehicleGps.setIsAsc("desc");
+//        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
+//        return getDataTable(list);
+        }
     }
 
     /**
@@ -108,4 +218,385 @@
     public AjaxResult remove(@PathVariable Long[] gpsIds) {
         return toAjax(vehicleGpsService.deleteVehicleGpsByIds(gpsIds));
     }
-} 
\ No newline at end of file
+
+    /**
+     * 鏌ヨ杞﹁締鍘嗗彶杞ㄨ抗
+     */
+    @PreAuthorize("@ss.hasPermi('system:gps:query')")
+    @GetMapping("/tracks")
+    public TableDataInfo getTracks(String vehicleNo, String beginTime, String endTime) {
+        return getAnonymousTracks(vehicleNo, beginTime, endTime);
+    }
+
+   
+    /**
+     * 鍖垮悕鏌ヨ杞﹁締鍘嗗彶杞ㄨ抗
+     */
+    @Anonymous()
+    @GetMapping("/anonymousTracks")
+    public TableDataInfo getAnonymousTracks(String vehicleNo, String beginTime, String endTime) {
+        try {
+            // 閫氳繃杞︾墝鍙疯幏鍙栬澶嘔D
+            VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(vehicleNo);
+            if (vehicleInfo == null) {
+
+                // throw new Error("鏈壘鍒拌杞﹁締瀵瑰簲鐨凣PS璁惧");
+                return getDataTable(new ArrayList<>());
+            }
+
+            // 澶勭悊寮�濮嬫椂闂�
+                beginTime = beginTime.replace("T", " ");
+                if (beginTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
+                    beginTime += ":00";
+                }
+                
+                // 澶勭悊缁撴潫鏃堕棿
+//                endTime = endTime.replace("T", " ").replace(" ","%20");
+            endTime = endTime.replace("T", " ");
+                if (endTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
+                    endTime += ":59";
+                }
+
+            List<GpsTrackPoint> trackPoints = new ArrayList<>();
+
+            //濡傛灉骞冲彴鏄痗ms锛屽垯璋冪敤cms鐨勬帴鍙�
+            if(vehicleInfo.getPlatformCode().equals("CMS"))
+            {
+                
+                CmsTrackDetailResponse response = cmsGpsCollectService.queryTrackDetail(
+                    vehicleInfo.getDeviceId(),  // 璁惧鍙�
+                    beginTime,                  // 寮�濮嬫椂闂�
+                    endTime,                    // 缁撴潫鏃堕棿
+                    null,                       // 璺濈锛堝彲閫夛級
+                    null,                       // 鍋滆溅鏃堕暱锛堝彲閫夛級
+                    1,                          // 瑙f瀽鍦扮悊浣嶇疆
+                    null,                       // 褰撳墠椤电爜锛堝彲閫夛級
+                    null,                       // 姣忛〉璁板綍鏁帮紙鍙�夛級
+                    2                           // 鍦板浘绫诲瀷锛�2锛氱櫨搴﹀湴鍥撅級
+                );
+
+                if (response.getResult() != 0) {
+                    throw new Error("鏌ヨCMS杞ㄨ抗澶辫触");
+                }
+
+                // 杞崲CMS杞ㄨ抗鐐逛负缁熶竴鏍煎紡
+                if (response.getTracks() != null) {
+                    for (CmsTrackDetailResponse.CmsTrackPoint point : response.getTracks()) {
+                        GpsTrackPoint trackPoint = new GpsTrackPoint();
+                        trackPoint.setVehicleNo(point.getVid());
+                        trackPoint.setDeviceId(point.getId());
+                        
+                        //缁忓害绾害涓虹┖鏃讹紝璺宠繃
+                        if(point.getMlng()==null || point.getMlat()==null)
+                        {
+                            continue;
+                        }
+
+                        // 缁忓害锛屼娇鐢ㄤ笁鍏冭繍绠楃
+                        trackPoint.setLongitude(point.getMlng() != null ? Double.parseDouble(point.getMlng()) : 0.0);
+                        
+                        // 绾害锛屼娇鐢ㄤ笁鍏冭繍绠楃
+                        trackPoint.setLatitude(point.getMlat() != null ? Double.parseDouble(point.getMlat()) : 0.0);
+                        
+                        // 閫熷害锛岀洿鎺ヤ娇鐢╥nt杞琩ouble
+                        trackPoint.setSpeed(point.getSp() > 0 ? (double)point.getSp() : 0.0);
+                        
+                        // 鏂瑰悜锛屼娇鐢ㄤ笁鍏冭繍绠楃澶勭悊
+                        trackPoint.setCourse(point.getFt() > 0 ? point.getFt() : 0);
+                        
+                        // ACC鐘舵�侊紝浣跨敤涓夊厓杩愮畻绗﹀鐞�
+                        trackPoint.setAccStatus(point.getAc() > 0 ? point.getAc() : 0);
+                        
+                        // 鍦ㄧ嚎鐘舵�侊紝浣跨敤涓夊厓杩愮畻绗﹀鐞�
+                        trackPoint.setOnlineStatus(point.getNet() > 0 ? point.getNet() : 0);
+                        trackPoint.setAddress(point.getPs());
+                        
+                        // 涓婃姤鏃堕棿锛岀洿鎺ヤ娇鐢ㄥ瓧绗︿覆
+                        trackPoint.setReportTime(point.getGt() != null ? point.getGt() : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+                        
+                        trackPoints.add(trackPoint);
+                    }
+                }
+            }
+            else {
+                
+                // 鏋勫缓鏌ヨ璇锋眰
+                GpsTrackQueryRequest request = new GpsTrackQueryRequest();
+                request.setDeviceid(vehicleInfo.getDeviceId());
+                request.setBegintime(beginTime);
+                request.setEndtime(endTime);
+                request.setTimezone(8); // 涓浗鏃跺尯
+
+                logger.info("鏌ヨ杞﹁締杞ㄨ抗锛氳溅杈嗗彿锛歿}, 璁惧ID锛歿}, 寮�濮嬫椂闂达細{}, 缁撴潫鏃堕棿锛歿}", vehicleNo, vehicleInfo.getDeviceId(), beginTime, endTime);
+                // 鏌ヨ杞ㄨ抗
+                GpsTrackQueryResponse response = gpsCollectService.queryTracks(request);
+                if (response.getStatus() != 0) {
+                    logger.error("鏌ヨ杞ㄨ抗澶辫触锛岀姸鎬佺爜锛歿}, 閿欒淇℃伅锛歿}", response.getStatus(), response.getCause());
+                    throw new Error("鏌ヨ杞ㄨ抗澶辫触锛�" + (response.getCause() != null ? response.getCause() : "鏈煡閿欒"));
+                }
+
+                // 杞崲GPS51杞ㄨ抗鐐逛负缁熶竴鏍煎紡
+                if (response.getRecords() != null) {
+                    for (GpsTrackPoint point : response.getRecords()) {
+                        GpsTrackPoint trackPoint = new GpsTrackPoint();
+                        trackPoint.setVehicleNo(vehicleNo);
+                        trackPoint.setDeviceId(vehicleInfo.getDeviceId());
+                        trackPoint.setLongitude(point.getLongitude());    // 缁忓害
+                        trackPoint.setLatitude(point.getLatitude());    // 绾害
+                        trackPoint.setSpeed(point.getSpeed());      // 閫熷害
+                        trackPoint.setCourse(point.getCourse());    // 鏂瑰悜
+                        trackPoint.setReportTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(point.getUpdatetime()))); // 涓婃姤鏃堕棿
+                        trackPoints.add(trackPoint);
+                    }
+                }
+            }
+            //杞崲鎴怢ist<VehicleGps> 
+            List<VehicleGps> vehicleGpsList = new ArrayList<>();
+            for(GpsTrackPoint trackPoint : trackPoints)
+            {
+                VehicleGps vehicleGps = new VehicleGps();
+                vehicleGps.setVehicleNo(trackPoint.getVehicleNo());
+                vehicleGps.setDeviceId(trackPoint.getDeviceId());
+                vehicleGps.setLongitude(trackPoint.getLongitude());
+                vehicleGps.setLatitude(trackPoint.getLatitude());
+                vehicleGps.setSpeed(trackPoint.getSpeed());
+                //鏂瑰悜
+                vehicleGps.setDirection(Double.valueOf(trackPoint.getCourse()));
+                //鍦板潃
+                vehicleGps.setAddress(trackPoint.getAddress());
+                vehicleGps.setCollectTime(trackPoint.getReportTime());
+                //GPS骞冲彴澶勭悊鏃堕棿
+                vehicleGps.setPlatformProcessTime(trackPoint.getReportTime());
+                vehicleGps.setDeviceReportTime(trackPoint.getReportTime());
+                vehicleGpsList.add(vehicleGps);
+            }
+            //鏃堕棿鍊掑簭鎺掑簭
+            vehicleGpsList.sort(Comparator.comparing(VehicleGps::getDeviceReportTime).reversed());
+            
+            //杩斿洖杞﹁締Gps鍒楄〃
+            return getDataTable(vehicleGpsList);
+            // return success(vehicleGpsList);
+        } catch (Exception e) {
+            logger.error("鏌ヨ杞﹁締杞ㄨ抗寮傚父", e);
+            throw new Error("鏌ヨ杞﹁締杞ㄨ抗澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鑵捐鍦板浘鍦板潃鎼滅储鎺ュ彛浠g悊
+     */
+    @Anonymous()
+    @GetMapping("/address/search")
+    public AjaxResult searchAddress(String keyword, String region) {
+        try {
+            // 鏋勫缓鑵捐鍦板浘鎼滅储API URL
+            String url = "https://apis.map.qq.com/ws/place/v1/search";
+            String params = "keyword=" + URLEncoder.encode(keyword, StandardCharsets.UTF_8.toString()) + 
+                           "&boundary=region(" + (region != null ? region : "骞垮窞") + ")" + 
+                           "&key=" + tencentMapConfig.getKey();
+            
+            // 鍙戦�丠TTP璇锋眰
+            String response = HttpUtils.sendGet(url, params);
+            
+            // 杩斿洖缁撴灉
+            return AjaxResult.success("鏌ヨ鎴愬姛", response);
+        } catch (Exception e) {
+            logger.error("鍦板潃鎼滅储澶辫触", e);
+            return AjaxResult.error("鍦板潃鎼滅储澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鑵捐鍦板浘閫嗗湴鍧�瑙f瀽鎺ュ彛浠g悊
+     */
+    @Anonymous()
+    @GetMapping("/address/geocoder")
+    public AjaxResult reverseGeocoder(Double lat, Double lng) {
+        try {
+            // 妫�鏌ュ弬鏁�
+            logger.info("閫嗗湴鍧�瑙f瀽璇锋眰鍙傛暟: lat={}, lng={}", lat, lng);
+            
+            if (lat == null || lng == null) {
+                logger.warn("鍙傛暟涓嶅畬鏁达紝缂哄皯缁忕含搴﹀潗鏍�: lat={}, lng={}", lat, lng);
+                return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯缁忕含搴﹀潗鏍�");
+            }
+            
+            // 妫�鏌ュ弬鏁版湁鏁堟��
+            if (Double.isNaN(lat) || Double.isNaN(lng) || 
+                Double.isInfinite(lat) || Double.isInfinite(lng)) {
+                logger.warn("鍙傛暟鏃犳晥锛岀粡绾害鍧愭爣鍖呭惈闈炴硶鍊�: lat={}, lng={}", lat, lng);
+                return AjaxResult.error("鍙傛暟鏃犳晥锛岀粡绾害鍧愭爣鏍煎紡閿欒");
+            }
+            
+            // 鏋勫缓鑵捐鍦板浘閫嗗湴鍧�瑙f瀽API URL
+            String url = "https://apis.map.qq.com/ws/geocoder/v1/";
+            String params = "location=" + lat + "," + lng + 
+                           "&key=" + tencentMapConfig.getKey() + 
+                           "&get_poi=1";
+            
+            // 鍙戦�丠TTP璇锋眰
+            String response = HttpUtils.sendGet(url, params);
+            
+            // 杩斿洖缁撴灉
+            return AjaxResult.success("鏌ヨ鎴愬姛", response);
+        } catch (Exception e) {
+            logger.error("閫嗗湴鍧�瑙f瀽澶辫触: lat={}, lng={}", lat, lng, e);
+            return AjaxResult.error("閫嗗湴鍧�瑙f瀽澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鑵捐鍦板浘璺嚎瑙勫垝鎺ュ彛浠g悊锛堣绠椾袱鐐归棿璺濈锛�
+     */
+    @Anonymous()
+    @GetMapping("/route/distance")
+    public AjaxResult calculateDistance(Double fromLat, Double fromLng, Double toLat, Double toLng) {
+        try {
+            // 妫�鏌ュ弬鏁�
+            if (fromLat == null || fromLng == null || toLat == null || toLng == null) {
+                return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰潗鏍�");
+            }
+            
+            // 鏋勫缓鑵捐鍦板浘璺嚎瑙勫垝API URL
+            String url = "https://apis.map.qq.com/ws/distance/v1/";
+            String params = "mode=driving" +
+                           "&from=" + fromLat + "," + fromLng +
+                           "&to=" + toLat + "," + toLng +
+                           "&key=" + tencentMapConfig.getKey();
+            
+            // 鍙戦�丠TTP璇锋眰
+            String response = HttpUtils.sendGet(url, params);
+            
+            // 杩斿洖缁撴灉
+            return AjaxResult.success("璁$畻鎴愬姛", response);
+        } catch (Exception e) {
+            logger.error("璺濈璁$畻澶辫触", e);
+            return AjaxResult.error("璺濈璁$畻澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鐧惧害鍦板浘鍦扮悊缂栫爜鎺ュ彛浠g悊锛堝湴鍧�杞潗鏍囷級
+     */
+    @Anonymous()
+    @GetMapping("/baidu/geocoding")
+    public AjaxResult baiduGeocoding(String address, String city) {
+        try {
+            // 妫�鏌ュ弬鏁�
+            if (address == null || address.trim().isEmpty()) {
+                return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯鍦板潃淇℃伅");
+            }
+            
+            // 鏋勫缓鐧惧害鍦板浘鍦扮悊缂栫爜API URL
+            String url = "https://api.map.baidu.com/geocoding/v3/";
+            String params = "address=" + URLEncoder.encode(address, StandardCharsets.UTF_8.toString()) +
+                           (city != null && !city.trim().isEmpty() ? 
+                            "&city=" + URLEncoder.encode(city, StandardCharsets.UTF_8.toString()) : "") +
+                           "&output=json" +
+                           "&ak=" + baiduMapConfig.getAk();
+            
+            logger.info("鐧惧害鍦板浘鍦扮悊缂栫爜璇锋眰: address={}, city={}", address, city);
+            
+            // 鍙戦�丠TTP璇锋眰
+            String response = HttpUtils.sendGet(url, params);
+            
+            // 杩斿洖缁撴灉
+            return AjaxResult.success("鏌ヨ鎴愬姛", response);
+        } catch (Exception e) {
+            logger.error("鐧惧害鍦板浘鍦扮悊缂栫爜澶辫触", e);
+            return AjaxResult.error("鍦扮悊缂栫爜澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鐧惧害鍦板浘璺嚎瑙勫垝鎺ュ彛浠g悊锛堣绠椾袱涓潗鏍囦箣闂寸殑椹捐溅璺濈锛�
+     */
+    @Anonymous()
+    @GetMapping("/baidu/route/driving")
+    public AjaxResult baiduRouteDriving(String origin, String destination) {
+        try {
+            // 妫�鏌ュ弬鏁�
+            if (origin == null || origin.trim().isEmpty() || 
+                destination == null || destination.trim().isEmpty()) {
+                return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰潗鏍�");
+            }
+            
+            // 楠岃瘉鍧愭爣鏍煎紡锛堢含搴�,缁忓害锛�
+            String[] originParts = origin.split(",");
+            String[] destParts = destination.split(",");
+            if (originParts.length != 2 || destParts.length != 2) {
+                return AjaxResult.error("鍧愭爣鏍煎紡閿欒锛屽簲涓猴細绾害,缁忓害");
+            }
+            
+            // 鏋勫缓鐧惧害鍦板浘璺嚎瑙勫垝API URL
+            String url = "https://api.map.baidu.com/directionlite/v1/driving";
+            String params = "origin=" + origin +
+                           "&destination=" + destination +
+                           "&ak=" + baiduMapConfig.getAk();
+            
+            logger.info("鐧惧害鍦板浘璺嚎瑙勫垝璇锋眰: origin={}, destination={}", origin, destination);
+            
+            // 鍙戦�丠TTP璇锋眰
+            String response = HttpUtils.sendGet(url, params);
+            
+            // 杩斿洖缁撴灉
+            return AjaxResult.success("璁$畻鎴愬姛", response);
+        } catch (Exception e) {
+            logger.error("鐧惧害鍦板浘璺嚎瑙勫垝澶辫触", e);
+            return AjaxResult.error("璺嚎瑙勫垝澶辫触锛�" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 鐧惧害鍦板浘璁$畻涓や釜鍦板潃涔嬮棿鐨勮窛绂伙紙缁勫悎鎺ュ彛锛氬湴鍧�杞潗鏍� + 璺嚎瑙勫垝锛�
+     */
+    @Anonymous()
+    @GetMapping("/baidu/distance/byAddress")
+    public AjaxResult baiduDistanceByAddress(String fromAddress, String fromCity, 
+                                             String toAddress, String toCity) {
+        try {
+            // 妫�鏌ュ弬鏁�
+            if (fromAddress == null || fromAddress.trim().isEmpty() || 
+                toAddress == null || toAddress.trim().isEmpty()) {
+                return AjaxResult.error("鍙傛暟涓嶅畬鏁达紝缂哄皯璧风偣鎴栫粓鐐瑰湴鍧�");
+            }
+            
+            logger.info("寮�濮嬭绠楀湴鍧�璺濈: fromAddress={}, fromCity={}, toAddress={}, toCity={}", 
+                       fromAddress, fromCity, toAddress, toCity);
+            
+            // 绗竴姝ワ細璧风偣鍦板潃杞潗鏍�
+            String geocodingUrl1 = "https://api.map.baidu.com/geocoding/v3/";
+            String geocodingParams1 = "address=" + URLEncoder.encode(fromAddress, StandardCharsets.UTF_8.toString()) +
+                                     (fromCity != null && !fromCity.trim().isEmpty() ? 
+                                      "&city=" + URLEncoder.encode(fromCity, StandardCharsets.UTF_8.toString()) : "") +
+                                     "&output=json" +
+                                     "&ak=" + baiduMapConfig.getAk();
+            
+            String geocodingResponse1 = HttpUtils.sendGet(geocodingUrl1, geocodingParams1);
+            logger.info("璧风偣鍦扮悊缂栫爜鍝嶅簲: {}", geocodingResponse1);
+            
+            // 绗簩姝ワ細缁堢偣鍦板潃杞潗鏍�
+            String geocodingUrl2 = "https://api.map.baidu.com/geocoding/v3/";
+            String geocodingParams2 = "address=" + URLEncoder.encode(toAddress, StandardCharsets.UTF_8.toString()) +
+                                     (toCity != null && !toCity.trim().isEmpty() ? 
+                                      "&city=" + URLEncoder.encode(toCity, StandardCharsets.UTF_8.toString()) : "") +
+                                     "&output=json" +
+                                     "&ak=" + baiduMapConfig.getAk();
+            
+            String geocodingResponse2 = HttpUtils.sendGet(geocodingUrl2, geocodingParams2);
+            logger.info("缁堢偣鍦扮悊缂栫爜鍝嶅簲: {}", geocodingResponse2);
+            
+            // 瑙f瀽鍧愭爣锛堣繖閲岀畝鍖栧鐞嗭紝瀹為檯搴旇瑙f瀽JSON锛�
+            // 娉ㄦ剰锛氶渶瑕佷粠鍝嶅簲涓彁鍙栧潗鏍囷紝杩欓噷杩斿洖涓棿缁撴灉渚涘墠绔鐞�
+            Map<String, Object> result = new HashMap<>();
+            result.put("fromGeocoding", geocodingResponse1);
+            result.put("toGeocoding", geocodingResponse2);
+            result.put("message", "璇疯В鏋愬潗鏍囧悗璋冪敤 /baidu/route/driving 鎺ュ彛璁$畻璺濈");
+            
+            return AjaxResult.success("鍦扮悊缂栫爜鎴愬姛", result);
+        } catch (Exception e) {
+            logger.error("璁$畻鍦板潃璺濈澶辫触", e);
+            return AjaxResult.error("璁$畻璺濈澶辫触锛�" + e.getMessage());
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1