From 37de2f4b0f732ca5c19582d4a340ad7c987925b5 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期三, 05 十一月 2025 22:40:47 +0800
Subject: [PATCH] feat: 部门管理多个车辆

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java |  314 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 309 insertions(+), 5 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 f966940..ac0efe6 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
@@ -3,9 +3,14 @@
 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;
@@ -24,6 +29,7 @@
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.http.HttpUtils;
 
 /**
  * 杞﹁締GPS鍧愭爣Controller
@@ -51,6 +57,12 @@
 
     @Autowired
     private ICmsGpsCollectService cmsGpsCollectService;
+    
+    @Autowired
+    private TencentMapConfig tencentMapConfig;
+    
+    @Autowired
+    private BaiduMapConfig baiduMapConfig;
 
    /**
      * 鏌ヨ杞﹁締GPS鍧愭爣鍒楄〃
@@ -139,6 +151,8 @@
             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());
@@ -225,17 +239,20 @@
             // 閫氳繃杞︾墝鍙疯幏鍙栬澶嘔D
             VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(vehicleNo);
             if (vehicleInfo == null) {
-                throw new Error("鏈壘鍒拌杞﹁締瀵瑰簲鐨凣PS璁惧");
+
+                // throw new Error("鏈壘鍒拌杞﹁締瀵瑰簲鐨凣PS璁惧");
+                return getDataTable(new ArrayList<>());
             }
 
             // 澶勭悊寮�濮嬫椂闂�
-                beginTime = beginTime.replace("T", " ").replace(" ","%20");
+                beginTime = beginTime.replace("T", " ");
                 if (beginTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
                     beginTime += ":00";
                 }
                 
                 // 澶勭悊缁撴潫鏃堕棿
-                endTime = endTime.replace("T", " ").replace(" ","%20");
+//                endTime = endTime.replace("T", " ").replace(" ","%20");
+            endTime = endTime.replace("T", " ");
                 if (endTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
                     endTime += ":59";
                 }
@@ -310,10 +327,12 @@
                 request.setEndtime(endTime);
                 request.setTimezone(8); // 涓浗鏃跺尯
 
+                logger.info("鏌ヨ杞﹁締杞ㄨ抗锛氳溅杈嗗彿锛歿}, 璁惧ID锛歿}, 寮�濮嬫椂闂达細{}, 缁撴潫鏃堕棿锛歿}", vehicleNo, vehicleInfo.getDeviceId(), beginTime, endTime);
                 // 鏌ヨ杞ㄨ抗
                 GpsTrackQueryResponse response = gpsCollectService.queryTracks(request);
                 if (response.getStatus() != 0) {
-                    throw new Error("鏌ヨ杞ㄨ抗澶辫触锛�" + response.getCause());
+                    logger.error("鏌ヨ杞ㄨ抗澶辫触锛岀姸鎬佺爜锛歿}, 閿欒淇℃伅锛歿}", response.getStatus(), response.getCause());
+                    throw new Error("鏌ヨ杞ㄨ抗澶辫触锛�" + (response.getCause() != null ? response.getCause() : "鏈煡閿欒"));
                 }
 
                 // 杞崲GPS51杞ㄨ抗鐐逛负缁熶竴鏍煎紡
@@ -362,4 +381,289 @@
             throw new Error("鏌ヨ杞﹁締杞ㄨ抗澶辫触锛�" + e.getMessage());
         }
     }
-} 
\ No newline at end of file
+    
+    /**
+     * 鑵捐鍦板浘鍦板潃鎼滅储鎺ュ彛浠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);
+            
+            // 瑙f瀽璧风偣鍧愭爣
+            com.alibaba.fastjson2.JSONObject geocodingJson1 = com.alibaba.fastjson2.JSONObject.parseObject(geocodingResponse1);
+            if (geocodingJson1.getInteger("status") != 0) {
+                logger.error("璧风偣鍦扮悊缂栫爜澶辫触: {}", geocodingResponse1);
+                return AjaxResult.error("璧风偣鍦板潃瑙f瀽澶辫触");
+            }
+            com.alibaba.fastjson2.JSONObject location1 = geocodingJson1.getJSONObject("result").getJSONObject("location");
+            double fromLat = location1.getDouble("lat");
+            double fromLng = location1.getDouble("lng");
+            logger.info("璧风偣鍧愭爣: lat={}, lng={}", fromLat, fromLng);
+            
+            // 绗簩姝ワ細缁堢偣鍦板潃杞潗鏍�
+            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瀽缁堢偣鍧愭爣
+            com.alibaba.fastjson2.JSONObject geocodingJson2 = com.alibaba.fastjson2.JSONObject.parseObject(geocodingResponse2);
+            if (geocodingJson2.getInteger("status") != 0) {
+                logger.error("缁堢偣鍦扮悊缂栫爜澶辫触: {}", geocodingResponse2);
+                return AjaxResult.error("缁堢偣鍦板潃瑙f瀽澶辫触");
+            }
+            com.alibaba.fastjson2.JSONObject location2 = geocodingJson2.getJSONObject("result").getJSONObject("location");
+            double toLat = location2.getDouble("lat");
+            double toLng = location2.getDouble("lng");
+            logger.info("缁堢偣鍧愭爣: lat={}, lng={}", toLat, toLng);
+            
+            // 绗笁姝ワ細璋冪敤璺嚎瑙勫垝鎺ュ彛璁$畻璺濈
+            String routeUrl = "https://api.map.baidu.com/directionlite/v1/driving";
+            String origin = fromLat + "," + fromLng;
+            String destination = toLat + "," + toLng;
+            String routeParams = "origin=" + origin +
+                                "&destination=" + destination +
+                                "&ak=" + baiduMapConfig.getAk();
+            
+            logger.info("璺嚎瑙勫垝璇锋眰: origin={}, destination={}", origin, destination);
+            String routeResponse = HttpUtils.sendGet(routeUrl, routeParams);
+            logger.info("璺嚎瑙勫垝鍝嶅簲: {}", routeResponse);
+            
+            // 瑙f瀽璺濈缁撴灉
+            com.alibaba.fastjson2.JSONObject routeJson = com.alibaba.fastjson2.JSONObject.parseObject(routeResponse);
+            if (routeJson.getInteger("status") != 0) {
+                logger.error("璺嚎瑙勫垝澶辫触: {}", routeResponse);
+                return AjaxResult.error("璺嚎瑙勫垝澶辫触");
+            }
+            
+            // 鎻愬彇璺濈淇℃伅锛堝崟浣嶏細绫筹級
+            com.alibaba.fastjson2.JSONObject result = routeJson.getJSONObject("result");
+            com.alibaba.fastjson2.JSONArray routes = result.getJSONArray("routes");
+            if (routes == null || routes.isEmpty()) {
+                logger.error("鏈壘鍒拌矾绾夸俊鎭�");
+                return AjaxResult.error("鏈壘鍒拌矾绾夸俊鎭�");
+            }
+            
+            com.alibaba.fastjson2.JSONObject route = routes.getJSONObject(0);
+            int distance = route.getInteger("distance"); // 璺濈锛屽崟浣嶏細绫�
+            int duration = route.getInteger("duration"); // 鏃堕暱锛屽崟浣嶏細绉�
+            
+            logger.info("璁$畻鎴愬姛: 璺濈={}绫�, 鏃堕暱={}绉�", distance, duration);
+            
+            // 鏋勫缓杩斿洖缁撴灉
+            Map<String, Object> resultMap = new HashMap<>();
+            resultMap.put("distance", distance); // 璺濈锛堢背锛�
+            resultMap.put("duration", duration); // 鏃堕暱锛堢锛�
+            resultMap.put("distanceKm", String.format("%.1f", distance / 1000.0)); // 璺濈锛堝叕閲岋級
+            resultMap.put("durationMin", duration / 60); // 鏃堕暱锛堝垎閽燂級
+            
+            // 璧风偣鍧愭爣
+            Map<String, Object> fromLocation = new HashMap<>();
+            fromLocation.put("lat", fromLat);
+            fromLocation.put("lng", fromLng);
+            resultMap.put("fromLocation", fromLocation);
+            
+            // 缁堢偣鍧愭爣
+            Map<String, Object> toLocation = new HashMap<>();
+            toLocation.put("lat", toLat);
+            toLocation.put("lng", toLng);
+            resultMap.put("toLocation", toLocation);
+            
+            return AjaxResult.success("璁$畻鎴愬姛", resultMap);
+        } catch (Exception e) {
+            logger.error("璁$畻鍦板潃璺濈澶辫触", e);
+            return AjaxResult.error("璁$畻璺濈澶辫触锛�" + e.getMessage());
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1