From 34044707d97b6396325c7fc4cac8d889fae96f85 Mon Sep 17 00:00:00 2001
From: wanglizhong <wlz>
Date: 星期六, 10 五月 2025 21:34:53 +0800
Subject: [PATCH] fix:修复map加载显示问题

---
 ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml                  |   22 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGps.java                  |   22 +
 ruoyi-admin/src/main/resources/application-test.yml                                 |   12 
 ruoyi-ui/src/views/system/gps/mapNeed.vue                                           |  386 +++++++++++---------
 ruoyi-admin/src/main/resources/application-prod.yml                                 |  163 +++++++++
 ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql                             |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java |    9 
 ruoyi-ui/src/views/system/gps/map.vue                                               |  217 ++++++++---
 ruoyi-admin/src/main/resources/application.yml                                      |    8 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/GpsSyncTask.java                   |   88 ----
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleSyncTask.java               |   96 +++++
 ruoyi-admin/src/main/resources/application-dev.yml                                  |   22 +
 12 files changed, 721 insertions(+), 331 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 998237f..bc6b087 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
@@ -38,6 +38,9 @@
     @GetMapping("/list")
     public TableDataInfo list(VehicleGps vehicleGps) {
         startPage();
+        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+        vehicleGps.setOrderByColumn("collect_time");
+        vehicleGps.setIsAsc("desc");
         List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
         return getDataTable(list);
     }
@@ -45,6 +48,9 @@
     @GetMapping("/anonymousList")
     public TableDataInfo anonymousList(VehicleGps vehicleGps) {
         startPage();
+        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+        vehicleGps.setOrderByColumn("collect_time");
+        vehicleGps.setIsAsc("desc");
         List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
         return getDataTable(list);
     }
@@ -56,6 +62,9 @@
     @Log(title = "杞﹁締GPS鍧愭爣", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
     public AjaxResult export(VehicleGps vehicleGps) {
+        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+        vehicleGps.setOrderByColumn("collect_time");
+        vehicleGps.setIsAsc("desc");
         List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
         ExcelUtil<VehicleGps> util = new ExcelUtil<VehicleGps>(VehicleGps.class);
         return util.exportExcel(list, "杞﹁締GPS鍧愭爣鏁版嵁");
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-dev.yml
similarity index 81%
copy from ruoyi-admin/src/main/resources/application-druid.yml
copy to ruoyi-admin/src/main/resources/application-dev.yml
index ac810e6..5659fd8 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -66,4 +66,24 @@
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
\ No newline at end of file
+                        multi-statement-allow: true
+    # 瀹氭椂浠诲姟閰嶇疆
+    quartz:
+      # 鏄惁鍚敤瀹氭椂浠诲姟
+      enabled: false
+      # 瀹氭椂浠诲姟绾跨▼姹犻厤缃�
+      properties:
+        org:
+          quartz:
+            threadPool:
+              threadCount: 5
+              threadPriority: 5
+              threadsInheritContextClassLoaderOfInitializingThread: true
+            jobStore:
+              class: org.quartz.simpl.RAMJobStore
+            scheduler:
+              instanceName: clusteredScheduler
+              instanceId: AUTO
+# 姘戣埅鎺ュ彛鍦板潃
+min:
+  apiUrl: http://120.25.98.119:8084/v1/   #娴嬭瘯鐜锛歭ocalhost:8011
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..0bd32ca
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -0,0 +1,163 @@
+# 鐢熶骇鐜閰嶇疆
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛
+  port: 8080
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿鍊�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�25
+      min-spare: 30
+
+# Spring閰嶇疆
+spring:
+  # 鏁版嵁婧愰厤缃�
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: password
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url: 
+        username: 
+        password: 
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        # 寮�鍚痵tat鎷︽埅
+        enabled: true
+      statViewServlet:
+        # 寮�鍚痙ruid鐩戞帶
+        enabled: true
+        # 璁块棶璺緞涓�/druid/*
+        url-pattern: /druid/*
+        # 鏄惁鍏佽娓呯┖缁熻鏁版嵁
+        reset-enable: false
+        # 璁剧疆璁块棶鐨勭敤鎴峰悕
+        login-username: admin
+        # 璁剧疆璁块棶鐨勫瘑鐮�
+        login-password: 123456
+      filter:
+        stat:
+          # 寮�鍚參sql璁板綍
+          slow-sql-enabled: true
+          # 鎱ql鏃堕棿
+          log-slow-sql: true
+          # 鍚堝苟sql
+          merge-sql: true
+        wall:
+          config:
+            # 涓嶅厑璁稿垹闄よ〃
+            drop-table-allow: false
+            # 涓嶅厑璁稿垹闄ゆ暟鎹�
+            delete-allow: false
+            # 涓嶅厑璁稿垹闄ゆ暟鎹簱
+            delete-allow: false
+            # 涓嶅厑璁稿垹闄ゆ暟鎹簱
+            drop-table-allow: false
+  # 鏂囦欢涓婁紶 閰嶇疆
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 10MB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 20MB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+
+# 瀹氭椂浠诲姟閰嶇疆
+quartz:
+  # 鏄惁鍚敤瀹氭椂浠诲姟
+  enabled: true
+  # 瀹氭椂浠诲姟绾跨▼姹犻厤缃�
+  properties:
+    org:
+      quartz:
+        threadPool:
+          threadCount: 5
+          threadPriority: 5
+          threadsInheritContextClassLoaderOfInitializingThread: true
+        jobStore:
+          class: org.quartz.simpl.RAMJobStore
+        scheduler:
+          instanceName: clusteredScheduler
+          instanceId: AUTO
+
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�
+  typeAliasesPackage: com.ruoyi.**.domain
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  pagehelper:
+    # 鍒嗛〉鍙傛暟鍚堢悊鍖�
+    reasonable: true
+    # 鏀寔閫氳繃Mapper鎺ュ彛鍙傛暟鏉ヤ紶閫掑垎椤靛弬鏁�
+    supportMethodsArguments: true
+    # 鍒嗛〉鎻掍欢浼氳嚜鍔ㄦ娴嬪綋鍓嶇殑鏁版嵁搴撻摼鎺�
+    helperDialect: mysql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: false
+  # 璇锋眰鍓嶇紑
+  pathMapping: /
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: info
+    org.springframework: warn
+
+# 绗笁鏂规帴鍙i厤缃�
+min:
+  apiUrl: http://localhost:8080 
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-test.yml
similarity index 85%
rename from ruoyi-admin/src/main/resources/application-druid.yml
rename to ruoyi-admin/src/main/resources/application-test.yml
index ac810e6..4484557 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-test.yml
@@ -6,13 +6,13 @@
         druid:
             # 涓诲簱鏁版嵁婧�
             master:
-                url: jdbc:mysql://120.25.98.119:3307/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://localhost:3307/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
                 password: abcd1234
             # 浠庡簱鏁版嵁婧�
             # SQL Server鏁版嵁婧�
             sqlserver:
-                url: jdbc:sqlserver://120.25.98.119:1432;databaseName=came
+                url: jdbc:sqlserver://127.0.0.1:1432;databaseName=came
                 username: camesa
                 password: camesa
                 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
@@ -66,4 +66,10 @@
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
\ No newline at end of file
+                        multi-statement-allow: true
+    # 瀹氭椂浠诲姟閰嶇疆
+    quartz:
+      enabled: false
+# 姘戣埅鎺ュ彛鍦板潃
+min:
+  apiUrl: http://120.25.98.119:8084/v1/   #娴嬭瘯鐜锛歭ocalhost:8011
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index ee28eba..04eb1ad 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -3,9 +3,11 @@
   # 鍚嶇О
   name: RuoYi
   # 鐗堟湰
-  version: 3.8.9
+  version: ${revision}
   # 鐗堟潈骞翠唤
   copyrightYear: 2025
+  # 瀹炰緥婕旂ず寮�鍏�
+  demoEnabled: true
   # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
   profile: D:/ruoyi/uploadPath
   # 鑾峰彇ip鍦板潃寮�鍏�
@@ -53,7 +55,8 @@
     # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
     basename: i18n/messages
   profiles:
-    active: druid
+    # 鐜 dev|test|prod
+    active: dev
   # 鏂囦欢涓婁紶
   servlet:
     multipart:
@@ -88,6 +91,7 @@
         max-active: 8
         # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
         max-wait: -1ms
+  
 
 # token閰嶇疆
 token:
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/GpsSyncTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/GpsSyncTask.java
index 70b8789..692c14f 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/GpsSyncTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/GpsSyncTask.java
@@ -4,15 +4,11 @@
 import java.util.Date;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import com.ruoyi.system.domain.GpsDevice;
-import com.ruoyi.system.domain.GpsDeviceListResponse;
-import com.ruoyi.system.domain.GpsGroup;
 import com.ruoyi.system.domain.GpsLastPosition;
 import com.ruoyi.system.domain.GpsLastPositionRequest;
 import com.ruoyi.system.domain.GpsLastPositionResponse;
@@ -40,21 +36,16 @@
     private IVehicleGpsService vehicleGpsService;
 
     /**
-     * 鍚屾璁惧鍒楄〃鍜孏PS浣嶇疆
+     * 鍚屾GPS浣嶇疆
      */
     public void syncGpsData() {
         try {
             log.info("寮�濮嬪悓姝PS鏁版嵁...");
 
-            // 1. 鑾峰彇璁惧鍒楄〃锛岃繖浼氳嚜鍔ㄦ洿鏂拌溅杈嗕俊鎭腑鐨勮澶嘔D
-            GpsDeviceListResponse response = gpsCollectService.getDeviceList();
-            // 鏇存柊杞﹁締璁惧ID
-            updateVehicleDeviceIds(response);
-
-            // 2. 鑾峰彇鎵�鏈夎溅杈嗕俊鎭�
+            // 1. 鑾峰彇鎵�鏈夎溅杈嗕俊鎭�
             List<VehicleInfo> vehicleList = vehicleInfoService.selectVehicleInfoList(new VehicleInfo());
 
-            //鍦ㄨ繖閲岃幏寰楁墍鏈夎溅杈嗙殑GPS鏈�鍚庝綅缃�
+            // 2. 鑾峰彇鎵�鏈夎溅杈嗙殑GPS鏈�鍚庝綅缃�
             GpsLastPositionResponse gpsLastPositionResponse = gpsCollectService.getLastPosition(new GpsLastPositionRequest());
 
             // 3. 閬嶅巻杞﹁締鍒楄〃锛岃幏鍙栨瘡涓溅杈嗙殑GPS浣嶇疆
@@ -62,11 +53,11 @@
                 if (vehicle.getDeviceId() != null && !vehicle.getDeviceId().isEmpty()) {
                     try {
                         // 鑾峰彇杞﹁締鐨勬渶鍚庝綅缃�
-                        gpsLastPositionResponse.getRecords().stream().filter(e->e.getDeviceid().equals(vehicle.getDeviceId())).forEach(record -> {
+                        gpsLastPositionResponse.getRecords().stream()
+                            .filter(e -> e.getDeviceid().equals(vehicle.getDeviceId()))
+                            .forEach(record -> {
                                 updateVehicleGpsPositions(vehicle, record);
-
-                        });
-
+                            });
                     } catch (Exception e) {
                         log.error("鑾峰彇杞﹁締[{}]GPS浣嶇疆澶辫触: {}", vehicle.getVehicleNo(), e.getMessage());
                     }
@@ -77,57 +68,6 @@
         } catch (Exception e) {
             log.error("GPS鏁版嵁鍚屾澶辫触: {}", e.getMessage());
         }
-    }
-
-    /**
-     * 鏇存柊杞﹁締璁惧ID
-     */
-    private void updateVehicleDeviceIds(GpsDeviceListResponse response) {
-        if (response.getStatus() != 0 || response.getGroups() == null) {
-            return;
-        }
-
-        for (GpsGroup group : response.getGroups()) {
-            for (GpsDevice device : group.getDevices()) {
-                String deviceName = device.getDevicename();
-                String remark = device.getRemark();
-                String deviceId = device.getDeviceid();
-
-                if (StringUtils.isNotEmpty(deviceName) || StringUtils.isNotEmpty(remark)) {
-                    String plateNumber = extractPlateNumber(deviceName, remark);
-                    if (StringUtils.isNotEmpty(plateNumber)) {
-                        VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(plateNumber);
-                        if (vehicleInfo != null) {
-                            vehicleInfo.setDeviceId(deviceId);
-                            //鑾峰緱鏁版嵁瀛楀吀涓殑骞冲彴缂栫爜
-
-                            vehicleInfo.setPlatformCode("GPS51");
-                            vehicleInfoService.updateVehicleInfo(vehicleInfo);
-                        } else {
-                            VehicleInfo newVehicle = new VehicleInfo();
-                            newVehicle.setVehicleNo(plateNumber);
-                            newVehicle.setDeviceId(deviceId);
-                            newVehicle.setStatus("0");
-                            newVehicle.setPlatformCode("GPS51");
-                            vehicleInfoService.insertVehicleInfo(newVehicle);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * 浠庤澶囧悕绉板拰澶囨敞涓彁鍙栬溅鐗屽彿
-     */
-    private String extractPlateNumber(String deviceName, String remark) {
-        if (StringUtils.isNotEmpty(deviceName)) {
-            return deviceName;
-        }
-        if (StringUtils.isNotEmpty(remark)) {
-            return remark;
-        }
-        return null;
     }
 
     /**
@@ -144,19 +84,15 @@
             gps.setSpeed(position.getSpeed());
             gps.setDirection(Double.valueOf(position.getCourse()));
             
-            //devicetime 杩欎釜鏄竴涓猯inux鏃堕棿鎴筹紝瑕佽浆鎹㈡垚鍖椾含鏃堕棿锛屽啀杞垚yyyy-MM-dd HH:mm:ss鏍煎紡
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
-            //getArrivedtime 杩欎釜鏄竴涓猯inux鏃堕棿鎴筹紝瑕佽浆鎹㈡垚鍖椾含鏃堕棿锛屽啀杞垚yyyy-MM-dd HH:mm:ss鏍煎紡
+            // 澶勭悊鍒拌揪鏃堕棿
             long arrivedTime = position.getArrivedtime();
             Date arrivedDate;
-            // 妫�鏌ユ椂闂存埑鏄惁鏈夋晥锛堝ぇ浜�0锛�
             if (arrivedTime > 0) {
                 arrivedDate = new Date(arrivedTime);
-                // 鍑忓幓8灏忔椂
                 arrivedDate.setTime(arrivedDate.getTime() - 8 * 60 * 60 * 1000);
             } else {
-                // 鏃堕棿鎴虫棤鏁堬紝浣跨敤褰撳墠鏃堕棿
                 arrivedDate = new Date();
             }
             gps.setPlatformProcessTime(sdf.format(arrivedDate));
@@ -164,21 +100,16 @@
             // 璁惧涓婃姤鏃堕棿
             long deviceTime = position.getDevicetime();
             Date date;
-            // 妫�鏌ユ椂闂存埑鏄惁鏈夋晥锛堝ぇ浜�0锛�
             if (deviceTime > 0) {
                 date = new Date(deviceTime);
-                // 鍑忓幓8灏忔椂
                 date.setTime(date.getTime() - 8 * 60 * 60 * 1000);
             } else {
-                // 鏃堕棿鎴虫棤鏁堬紝浣跨敤褰撳墠鏃堕棿
                 date = arrivedDate;
             }
             gps.setDeviceReportTime(sdf.format(date));
-
-
             
             // 閲囬泦鏃堕棿锛堜娇鐢ㄨ澶囦笂鎶ユ椂闂达級
-            gps.setCollectTime(sdf.format(new Date( )));
+            gps.setCollectTime(sdf.format(new Date()));
 
             // 淇濆瓨GPS浣嶇疆淇℃伅
             vehicleGpsService.insertVehicleGps(gps);
@@ -190,5 +121,4 @@
             log.error("鏇存柊杞﹁締[{}]GPS浣嶇疆澶辫触: {}", vehicle.getVehicleNo(), e.getMessage());
         }
     }
-
 }
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleSyncTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleSyncTask.java
new file mode 100644
index 0000000..e969f5f
--- /dev/null
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleSyncTask.java
@@ -0,0 +1,96 @@
+package com.ruoyi.quartz.task;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.ruoyi.system.domain.GpsDevice;
+import com.ruoyi.system.domain.GpsDeviceListResponse;
+import com.ruoyi.system.domain.GpsGroup;
+import com.ruoyi.system.domain.VehicleInfo;
+import com.ruoyi.system.service.IGpsCollectService;
+import com.ruoyi.system.service.IVehicleInfoService;
+
+/**
+ * 杞﹁締鍚屾瀹氭椂浠诲姟
+ */
+@Component("vehicleSyncTask")
+public class VehicleSyncTask {
+
+    private static final Logger log = LoggerFactory.getLogger(VehicleSyncTask.class);
+
+    @Autowired
+    private IGpsCollectService gpsCollectService;
+
+    @Autowired
+    private IVehicleInfoService vehicleInfoService;
+
+    /**
+     * 鍚屾杞﹁締淇℃伅
+     */
+    public void syncVehicleInfo() {
+        try {
+            log.info("寮�濮嬪悓姝ヨ溅杈嗕俊鎭�...");
+
+            // 鑾峰彇璁惧鍒楄〃锛岃繖浼氳嚜鍔ㄦ洿鏂拌溅杈嗕俊鎭腑鐨勮澶嘔D
+            GpsDeviceListResponse response = gpsCollectService.getDeviceList();
+            // 鏇存柊杞﹁締璁惧ID
+            updateVehicleDeviceIds(response);
+
+            log.info("杞﹁締淇℃伅鍚屾瀹屾垚");
+        } catch (Exception e) {
+            log.error("杞﹁締淇℃伅鍚屾澶辫触: {}", e.getMessage());
+        }
+    }
+
+    /**
+     * 鏇存柊杞﹁締璁惧ID
+     */
+    private void updateVehicleDeviceIds(GpsDeviceListResponse response) {
+        if (response.getStatus() != 0 || response.getGroups() == null) {
+            return;
+        }
+
+        for (GpsGroup group : response.getGroups()) {
+            for (GpsDevice device : group.getDevices()) {
+                String deviceName = device.getDevicename();
+                String remark = device.getRemark();
+                String deviceId = device.getDeviceid();
+
+                if (StringUtils.isNotEmpty(deviceName) || StringUtils.isNotEmpty(remark)) {
+                    String plateNumber = extractPlateNumber(deviceName, remark);
+                    if (StringUtils.isNotEmpty(plateNumber)) {
+                        VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(plateNumber);
+                        if (vehicleInfo != null) {
+                            vehicleInfo.setDeviceId(deviceId);
+                            vehicleInfo.setPlatformCode("GPS51");
+                            vehicleInfoService.updateVehicleInfo(vehicleInfo);
+                        } else {
+                            VehicleInfo newVehicle = new VehicleInfo();
+                            newVehicle.setVehicleNo(plateNumber);
+                            newVehicle.setDeviceId(deviceId);
+                            newVehicle.setStatus("0");
+                            newVehicle.setPlatformCode("GPS51");
+                            vehicleInfoService.insertVehicleInfo(newVehicle);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 浠庤澶囧悕绉板拰澶囨敞涓彁鍙栬溅鐗屽彿
+     */
+    private String extractPlateNumber(String deviceName, String remark) {
+        if (StringUtils.isNotEmpty(deviceName)) {
+            return deviceName;
+        }
+        if (StringUtils.isNotEmpty(remark)) {
+            return remark;
+        }
+        return null;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql b/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql
new file mode 100644
index 0000000..7d2de38
--- /dev/null
+++ b/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql
@@ -0,0 +1,7 @@
+-- 杞﹁締鍚屾瀹氭椂浠诲姟
+INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark) 
+VALUES ('杞﹁締鍚屾浠诲姟', 'DEFAULT', 'vehicleSyncTask.syncVehicleInfo()', '0 0 */1 * * ?', '3', '1', '1', 'admin', sysdate(), 'admin', sysdate(), '姣忓皬鏃跺悓姝ヤ竴娆¤溅杈嗕俊鎭�');
+
+-- GPS鍚屾瀹氭椂浠诲姟
+INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark) 
+VALUES ('GPS鍚屾浠诲姟', 'DEFAULT', 'gpsSyncTask.syncGpsData()', '0 */5 * * * ?', '3', '1', '1', 'admin', sysdate(), 'admin', sysdate(), '姣�5鍒嗛挓鍚屾涓�娆PS浣嶇疆淇℃伅'); 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGps.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGps.java
index 3d7f7fd..b9d84ff 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGps.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGps.java
@@ -64,6 +64,12 @@
     /** 缁撴潫鏃堕棿 */
     private String endTime;
 
+    /** 鎺掑簭鍒� */
+    private String orderByColumn;
+
+    /** 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc */
+    private String isAsc;
+
     public void setGpsId(Long gpsId) {
         this.gpsId = gpsId;
     }
@@ -176,6 +182,22 @@
         this.endTime = endTime;
     }
 
+    public String getOrderByColumn() {
+        return orderByColumn;
+    }
+
+    public void setOrderByColumn(String orderByColumn) {
+        this.orderByColumn = orderByColumn;
+    }
+
+    public String getIsAsc() {
+        return isAsc;
+    }
+
+    public void setIsAsc(String isAsc) {
+        this.isAsc = isAsc;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
diff --git a/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml
index a1c00c3..98a65fe 100644
--- a/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml
@@ -30,16 +30,20 @@
     <select id="selectVehicleGpsList" parameterType="VehicleGps" resultMap="VehicleGpsResult">
         <include refid="selectVehicleGpsVo"/>
         <where>  
-            <if test="vehicleId != null "> and g.vehicle_id = #{vehicleId}</if>
-            <if test="vehicleNo != null and vehicleNo != ''"> and v.vehicle_no like concat('%', #{vehicleNo}, '%')</if>
-            <if test="longitude != null "> and g.longitude = #{longitude}</if>
-            <if test="latitude != null "> and g.latitude = #{latitude}</if>
-            <if test="altitude != null "> and g.altitude = #{altitude}</if>
-            <if test="speed != null "> and g.speed = #{speed}</if>
-            <if test="direction != null "> and g.direction = #{direction}</if>
-            <if test="beginTime != null and beginTime != ''"> and g.collect_time &gt;= #{beginTime}</if>
-            <if test="endTime != null and endTime != ''"> and g.collect_time &lt;= #{endTime}</if>
+            <if test="vehicleNo != null  and vehicleNo != ''"> and vehicle_no = #{vehicleNo}</if>
+            <if test="longitude != null "> and longitude = #{longitude}</if>
+            <if test="latitude != null "> and latitude = #{latitude}</if>
+            <if test="speed != null "> and speed = #{speed}</if>
+            <if test="direction != null "> and direction = #{direction}</if>
+            <if test="collectTime != null "> and collect_time = #{collectTime}</if>
+            <if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+                AND date_format(collect_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
+            </if>
+            <if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+                AND date_format(collect_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
+            </if>
         </where>
+        order by collect_time desc
     </select>
     
     <select id="selectVehicleGpsById" parameterType="Long" resultMap="VehicleGpsResult">
diff --git a/ruoyi-ui/src/views/system/gps/map.vue b/ruoyi-ui/src/views/system/gps/map.vue
index bd09c70..27705dd 100644
--- a/ruoyi-ui/src/views/system/gps/map.vue
+++ b/ruoyi-ui/src/views/system/gps/map.vue
@@ -26,6 +26,8 @@
           range-separator="-"
           start-placeholder="寮�濮嬫棩鏈�"
           end-placeholder="缁撴潫鏃ユ湡"
+          :default-time="['00:00:00', '23:59:59']"
+          @change="handleDateRangeChange"
         ></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -56,7 +58,9 @@
           >
             <el-table-column label="鏃堕棿" align="center" prop="collectTime" />
             <el-table-column label="閫熷害(km/h)" align="center" prop="speed" />
-            
+            <el-table-column label="缁忓害" align="center" prop="longitude" />
+            <el-table-column label="绾害" align="center" prop="latitude" />
+            <el-table-column label="鏂瑰悜(掳)" align="center" prop="direction" />
           </el-table>
         </el-card>
       </el-col>
@@ -127,11 +131,27 @@
       // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
-        pageSize: 10,
+        pageSize: 1000,
         deviceId: null,
         appId: null,
         sign: null,
-        timestamp: null
+        timestamp: null,
+        vehicleNo: null,
+        beginTime: null,
+        endTime: null
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        vehicleNo: null
+      },
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        vehicleNo: [
+          { required: true, message: "杞︾墝鍙蜂笉鑳戒负绌�", trigger: "blur" }
+        ],
+        dateRange: [
+          { required: true, message: "璇烽�夋嫨鏃堕棿鑼冨洿", trigger: "change" }
+        ]
       },
       // 鍦板浘瀵硅薄
       map: null,
@@ -158,7 +178,25 @@
     const query = this.$route.query;
     if (query.vehicleNo) {
       this.queryParams.vehicleNo = query.vehicleNo;
+    } else {
+      this.$message.error('缂哄皯杞︾墝鍙峰弬鏁�');
+      return;
     }
+
+    // 妫�鏌ユ椂闂村弬鏁�
+    if (query.beginTime && query.endTime) {
+      // 鏍煎紡鍖栨椂闂�
+      this.dateRange = [
+        this.formatDateTime(query.beginTime),
+        this.formatDateTime(query.endTime)
+      ];
+      this.queryParams.beginTime = this.dateRange[0];
+      this.queryParams.endTime = this.dateRange[1];
+    } else {
+      this.$message.error('缂哄皯鏃堕棿鑼冨洿鍙傛暟');
+      return;
+    }
+
     // 璁剧疆璁よ瘉鍙傛暟
     if (query.appId) {
       this.queryParams.appId = query.appId;
@@ -170,26 +208,14 @@
       this.queryParams.timestamp = query.timestamp;
     }
     
-    // 璁剧疆榛樿鏃堕棿鑼冨洿
-    const today = new Date();
-    const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);
-    const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59);
-    this.dateRange = [this.parseTime(startTime), this.parseTime(endTime)];
-    
-    // 濡傛灉URL涓湁鏃堕棿鍙傛暟锛屽垯浣跨敤URL涓殑鏃堕棿
-    if (query.beginTime && query.endTime) {
-      this.dateRange = [query.beginTime, query.endTime];
-    }
-    
     this.getList();
   },
   mounted() {
     // 鍔ㄦ�佸姞杞界櫨搴﹀湴鍥続PI
-    this.loadBMapScript().then(() => {
-      this.initMap();
-      window.initMapFlag=true;
-      if(window.loadGpsList){
-        this.drawTrack()
+    this.initMap().then(() => {
+      window.initMapFlag = true;
+      if (window.loadGpsList) {
+        this.drawTrack();
       }
     });
   },
@@ -201,31 +227,21 @@
           resolve(window.BMap);
           return;
         }
+        
+        window.initBMap = () => {
+          console.log("鐧惧害鍦板浘API鍔犺浇鎴愬姛");
+          resolve(window.BMap);
+        };
+
         const script = document.createElement("script");
         script.type = "text/javascript";
         script.src =
           "https://api.map.baidu.com/api?v=3.0&ak=n5z5pKfAnaP3fYMR4RJOAQsR1wQ2avAn&callback=initBMap";
-        script.onerror = reject;
-        document.head.appendChild(script);
-        window.initBMap = () => {
-          // 鍔犺浇鍧愭爣杞崲搴�
-          const convertorScript = document.createElement("script");
-          convertorScript.type = "text/javascript";
-          convertorScript.src =
-            "https://api.map.baidu.com/getscript?v=3.0&ak=n5z5pKfAnaP3fYMR4RJOAQsR1wQ2avAn&services=&t=20230101100000";
-          convertorScript.onload = () => {
-            // 鍔犺浇鍧愭爣杞崲宸ュ叿
-            const toolsScript = document.createElement("script");
-            toolsScript.type = "text/javascript";
-            toolsScript.src =
-              "https://api.map.baidu.com/library/Convertor/1.4/src/Convertor_min.js";
-            toolsScript.onload = () => {
-              resolve(window.BMap);
-            };
-            document.head.appendChild(toolsScript);
-          };
-          document.head.appendChild(convertorScript);
+        script.onerror = (error) => {
+          console.error("鐧惧害鍦板浘API鍔犺浇澶辫触", error);
+          reject(error);
         };
+        document.head.appendChild(script);
       });
     },
     /** 鏍煎紡鍖栨椂闂� */
@@ -238,6 +254,15 @@
       const seconds = String(time.getSeconds()).padStart(2, '0');
       return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
     },
+    /** 澶勭悊鏃堕棿鏍煎紡 */
+    formatDateTime(dateTimeStr) {
+      if (!dateTimeStr) return '';
+      // 濡傛灉鏃堕棿瀛楃涓蹭笉鍖呭惈绉掞紝娣诲姞绉�
+      if (dateTimeStr.length === 16) { // yyyy-MM-dd HH:mm
+        return dateTimeStr + ':00';
+      }
+      return dateTimeStr;
+    },
     /** 鏌ヨGPS鍒楄〃 */
     getList() {
       this.loading = true;      
@@ -246,13 +271,17 @@
         ...this.queryParams
       };
 
-      // 濡傛灉娌℃湁閫夋嫨鏃堕棿鑼冨洿锛屽垯榛樿浣跨敤褰撳ぉ
+      // 濡傛灉娌℃湁閫夋嫨鏃堕棿鑼冨洿锛屽垯浣跨敤URL涓殑鏃堕棿
       if (!this.dateRange || this.dateRange.length === 0) {
-        const today = new Date();
-        const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);
-        const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59);
-        params.beginTime = this.parseTime(startTime);
-        params.endTime = this.parseTime(endTime);
+        const query = this.$route.query;
+        if (query.beginTime && query.endTime) {
+          params.beginTime = query.beginTime;
+          params.endTime = query.endTime;
+        } else {
+          this.$message.error('璇烽�夋嫨鏃堕棿鑼冨洿');
+          this.loading = false;
+          return;
+        }
       } else {
         params.beginTime = this.dateRange[0];
         params.endTime = this.dateRange[1];
@@ -268,21 +297,45 @@
         }
       });
     },
-    async translatePoints(points) {
-      // 灏哤GS84鍧愭爣杞崲涓虹櫨搴﹀潗鏍�
-      var translatePoints = [];
-      return new Promise((resolve, reject) => {
+    /** 鍧愭爣杞崲鏂规硶 */
+    translatePoint(point) {
+      return new Promise((resolve) => {
+        // 浣跨敤鐧惧害鍦板浘API鍐呯疆鐨勫潗鏍囪浆鎹�
         const convertor = new BMap.Convertor();
-        convertor.translate(points, 1, 5, (data) => {
+        const pointArr = [];
+        pointArr.push(point);
+        convertor.translate(pointArr, 1, 5, (data) => {
           if (data.status === 0) {
-            translatePoints = data.points;
-            resolve(translatePoints);
+            resolve(data.points[0]);
+          } else {
+            // 濡傛灉杞崲澶辫触锛岃繑鍥炲師濮嬪潗鏍�
+            resolve(point);
           }
         });
       });
     },
+    /** 鎵归噺鍧愭爣杞崲 */
+    async translatePoints(points) {
+      const translatePoints = [];
+      for (const point of points) {
+        const translatedPoint = await this.translatePoint(point);
+        translatePoints.push(translatedPoint);
+      }
+      return translatePoints;
+    },
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery() {
+      if (!this.queryParams.vehicleNo) {
+        this.$message.error('璇疯緭鍏ヨ溅鐗屽彿');
+        return;
+      }
+      if (!this.dateRange || this.dateRange.length !== 2) {
+        this.$message.error('璇烽�夋嫨鏃堕棿鑼冨洿');
+        return;
+      }
+      // 鏇存柊鏌ヨ鍙傛暟
+      this.queryParams.beginTime = this.dateRange[0];
+      this.queryParams.endTime = this.dateRange[1];
       this.getList();
     },
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
@@ -293,17 +346,28 @@
       const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59);
       this.dateRange = [this.parseTime(startTime), this.parseTime(endTime)];
       this.resetForm("queryForm");
+      // 淇濈暀杞︾墝鍙�
+      this.queryParams.vehicleNo = this.$route.query.vehicleNo;
+      // 鏇存柊鏌ヨ鍙傛暟
+      this.queryParams.beginTime = this.dateRange[0];
+      this.queryParams.endTime = this.dateRange[1];
       this.handleQuery();
     },
     /** 鍒濆鍖栧湴鍥� */
-    initMap() {
-      // 鍒涘缓鍦板浘瀹炰緥
-      this.map = new BMap.Map("mapContainer");
-      // 璁剧疆鍦板浘涓績鐐瑰拰缂╂斁绾у埆
-      this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
-      // 鍚敤婊氳疆鏀惧ぇ缂╁皬
-      this.map.enableScrollWheelZoom();
-      console.log("initMap 鍒濆鍖栧湴鍥�")
+    async initMap() {
+      try {
+        await this.loadBMapScript();
+        // 鍒涘缓鍦板浘瀹炰緥
+        this.map = new BMap.Map("mapContainer");
+        // 璁剧疆鍦板浘涓績鐐瑰拰缂╂斁绾у埆
+        this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
+        // 鍚敤婊氳疆鏀惧ぇ缂╁皬
+        this.map.enableScrollWheelZoom();
+        console.log("鍦板浘鍒濆鍖栨垚鍔�");
+      } catch (error) {
+        console.error("鍦板浘鍒濆鍖栧け璐�", error);
+        this.$message.error("鍦板浘鍔犺浇澶辫触锛岃鍒锋柊椤甸潰閲嶈瘯");
+      }
     },
      /** 璁$畻涓ょ偣涔嬮棿鐨勮窛绂伙紙绫筹級 */
      getDistance(point1, point2) {
@@ -346,7 +410,7 @@
       );
       const currentSegment = this.gpsList.slice(startIndex, endIndex);
 
-      //鍏堣幏寰楁墍鏈夊潗鏍囨暟缁�
+      // 鑾峰彇鎵�鏈夊潗鏍囨暟缁�
       const originPoints = currentSegment.map(
         (item) => new BMap.Point(item.longitude, item.latitude)
       );
@@ -354,10 +418,11 @@
       this.gpsList.sort((a, b) => {
         return new Date(b.collectTime) - new Date(a.collectTime);
       }).forEach(item => {
-       item.speed=item.speed/1000;
+        item.speed = item.speed/1000;
       });
-      //鎵归噺杞崲鍧愭爣
-      var translatePoints = await this.translatePoints(originPoints);
+
+      // 鎵归噺杞崲鍧愭爣
+      const translatePoints = await this.translatePoints(originPoints);
 
       // 鍒涘缓杞ㄨ抗鐐规暟缁�
       const points = translatePoints;
@@ -601,6 +666,30 @@
       }
       this.isPlaying = false;
     },
+    /** 澶勭悊鏃堕棿鑼冨洿鍙樺寲 */
+    handleDateRangeChange(val) {
+      if (val && val.length === 2) {
+        // 鏍煎紡鍖栨椂闂�
+        this.dateRange = [
+          this.formatDateTime(val[0]),
+          this.formatDateTime(val[1])
+        ];
+        
+        // 妫�鏌ョ粨鏉熸椂闂存槸鍚﹀寘鍚叿浣撴椂闂�
+        const endDate = new Date(this.dateRange[1]);
+        const hasSpecificTime = endDate.getHours() !== 0 || endDate.getMinutes() !== 0;
+        
+        if (!hasSpecificTime) {
+          // 濡傛灉娌℃湁鍏蜂綋鏃堕棿锛岃缃负23:59:59
+          endDate.setHours(23, 59, 59);
+          this.dateRange[1] = this.parseTime(endDate);
+        }
+        
+        // 鏇存柊鏌ヨ鍙傛暟
+        this.queryParams.beginTime = this.dateRange[0];
+        this.queryParams.endTime = this.dateRange[1];
+      }
+    },
   },
   beforeDestroy() {
     this.stopPlayback();
diff --git a/ruoyi-ui/src/views/system/gps/mapNeed.vue b/ruoyi-ui/src/views/system/gps/mapNeed.vue
index 48adcc7..048ebd6 100644
--- a/ruoyi-ui/src/views/system/gps/mapNeed.vue
+++ b/ruoyi-ui/src/views/system/gps/mapNeed.vue
@@ -127,7 +127,7 @@
       // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
-        pageSize: 10,
+        pageSize: 1000,
         deviceId: null,
         appId: null,
         sign: null,
@@ -175,12 +175,16 @@
   },
   mounted() {
     // 鍔ㄦ�佸姞杞界櫨搴﹀湴鍥続PI
-    this.loadBMapScript().then(() => {
-      this.initMap();
-      window.initMapFlag=true;
-      if(window.loadGpsList){
-        this.drawTrack()
+    this.initMap().then((success) => {
+      if (success) {
+        window.initMapFlag = true;
+        if (window.loadGpsList) {
+          this.drawTrack();
+        }
       }
+    }).catch(error => {
+      console.error("鍦板浘鍒濆鍖栧け璐�", error);
+      this.$message.error("鍦板浘鍔犺浇澶辫触锛岃鍒锋柊椤甸潰閲嶈瘯");
     });
   },
   methods: {
@@ -191,31 +195,28 @@
           resolve(window.BMap);
           return;
         }
+        
+        window.initBMap = () => {
+          console.log("鐧惧害鍦板浘API鍔犺浇鎴愬姛");
+          // 纭繚BMap瀵硅薄瀹屽叏鍔犺浇
+          setTimeout(() => {
+            if (window.BMap && window.BMap.Map) {
+              resolve(window.BMap);
+            } else {
+              reject(new Error("鐧惧害鍦板浘API鍔犺浇涓嶅畬鏁�"));
+            }
+          }, 100);
+        };
+
         const script = document.createElement("script");
         script.type = "text/javascript";
         script.src =
           "https://api.map.baidu.com/api?v=3.0&ak=n5z5pKfAnaP3fYMR4RJOAQsR1wQ2avAn&callback=initBMap";
-        script.onerror = reject;
-        document.head.appendChild(script);
-        window.initBMap = () => {
-          // 鍔犺浇鍧愭爣杞崲搴�
-          const convertorScript = document.createElement("script");
-          convertorScript.type = "text/javascript";
-          convertorScript.src =
-            "https://api.map.baidu.com/getscript?v=3.0&ak=n5z5pKfAnaP3fYMR4RJOAQsR1wQ2avAn&services=&t=20230101100000";
-          convertorScript.onload = () => {
-            // 鍔犺浇鍧愭爣杞崲宸ュ叿
-            const toolsScript = document.createElement("script");
-            toolsScript.type = "text/javascript";
-            toolsScript.src =
-              "https://api.map.baidu.com/library/Convertor/1.4/src/Convertor_min.js";
-            toolsScript.onload = () => {
-              resolve(window.BMap);
-            };
-            document.head.appendChild(toolsScript);
-          };
-          document.head.appendChild(convertorScript);
+        script.onerror = (error) => {
+          console.error("鐧惧害鍦板浘API鍔犺浇澶辫触", error);
+          reject(error);
         };
+        document.head.appendChild(script);
       });
     },
     /** 鏌ヨGPS鍒楄〃 */
@@ -258,18 +259,55 @@
       const seconds = String(time.getSeconds()).padStart(2, '0');
       return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
     },
-    async translatePoints(points) {
-      // 灏哤GS84鍧愭爣杞崲涓虹櫨搴﹀潗鏍�
-      var translatePoints = [];
-      return new Promise((resolve, reject) => {
+    /** 鍒濆鍖栧湴鍥� */
+    async initMap() {
+      try {
+        await this.loadBMapScript();
+        // 纭繚DOM鍏冪礌宸茬粡鍑嗗濂�
+        await this.$nextTick();
+        // 纭繚BMap瀵硅薄瀛樺湪
+        if (!window.BMap || !window.BMap.Map) {
+          throw new Error("鐧惧害鍦板浘API鏈纭姞杞�");
+        }
+        // 鍒涘缓鍦板浘瀹炰緥
+        this.map = new BMap.Map("mapContainer");
+        // 璁剧疆鍦板浘涓績鐐瑰拰缂╂斁绾у埆
+        this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
+        // 鍚敤婊氳疆鏀惧ぇ缂╁皬
+        this.map.enableScrollWheelZoom();
+        console.log("鍦板浘鍒濆鍖栨垚鍔�");
+        return true;
+      } catch (error) {
+        console.error("鍦板浘鍒濆鍖栧け璐�", error);
+        this.$message.error("鍦板浘鍔犺浇澶辫触锛岃鍒锋柊椤甸潰閲嶈瘯");
+        return false;
+      }
+    },
+    /** 鍧愭爣杞崲鏂规硶 */
+    translatePoint(point) {
+      return new Promise((resolve) => {
+        // 浣跨敤鐧惧害鍦板浘API鍐呯疆鐨勫潗鏍囪浆鎹�
         const convertor = new BMap.Convertor();
-        convertor.translate(points, 1, 5, (data) => {
+        const pointArr = [];
+        pointArr.push(point);
+        convertor.translate(pointArr, 1, 5, (data) => {
           if (data.status === 0) {
-            translatePoints = data.points;
-            resolve(translatePoints);
+            resolve(data.points[0]);
+          } else {
+            // 濡傛灉杞崲澶辫触锛岃繑鍥炲師濮嬪潗鏍�
+            resolve(point);
           }
         });
       });
+    },
+    /** 鎵归噺鍧愭爣杞崲 */
+    async translatePoints(points) {
+      const translatePoints = [];
+      for (const point of points) {
+        const translatedPoint = await this.translatePoint(point);
+        translatePoints.push(translatedPoint);
+      }
+      return translatePoints;
     },
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery() {
@@ -285,90 +323,117 @@
       this.resetForm("queryForm");
       this.handleQuery();
     },
-    /** 鍒濆鍖栧湴鍥� */
-    initMap() {
-      // 鍒涘缓鍦板浘瀹炰緥
-      this.map = new BMap.Map("mapContainer");
-      // 璁剧疆鍦板浘涓績鐐瑰拰缂╂斁绾у埆
-      this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
-      // 鍚敤婊氳疆鏀惧ぇ缂╁皬
-      this.map.enableScrollWheelZoom();
-      console.log("initMap 鍒濆鍖栧湴鍥�")
+    /** 璁$畻涓ょ偣涔嬮棿鐨勮窛绂伙紙绫筹級 */
+    getDistance(point1, point2) {
+      return this.map.getDistance(point1, point2);
     },
-     /** 璁$畻涓ょ偣涔嬮棿鐨勮窛绂伙紙绫筹級 */
-     getDistance(point1, point2) {
-        return this.map.getDistance(point1, point2);
-      },
-      /** 璁$畻涓ょ偣涔嬮棿鐨勮搴� */
-      getAngle(point1, point2) {
-        const dx = point2.lng - point1.lng;
-        const dy = point2.lat - point1.lat;
-        return Math.atan2(dy, dx) * 180 / Math.PI;
-      },
-
-   
-
+    /** 璁$畻涓ょ偣涔嬮棿鐨勮搴� */
+    getAngle(point1, point2) {
+      const dx = point2.lng - point1.lng;
+      const dy = point2.lat - point1.lat;
+      return Math.atan2(dy, dx) * 180 / Math.PI;
+    },
     /** 缁樺埗杞ㄨ抗 */
     async drawTrack() {
-      // 娓呴櫎涔嬪墠鐨勮建杩�
-      if (this.polyline) {
-        this.map.removeOverlay(this.polyline);
-      }
-      this.markers.forEach((marker) => {
-        this.map.removeOverlay(marker);
-      });
-      this.markers = [];
-
-      if (this.gpsList.length === 0) {
+      // 纭繚鍦板浘瀹炰緥瀛樺湪
+      if (!this.map) {
+        console.error("鍦板浘瀹炰緥鏈垵濮嬪寲");
         return;
       }
 
-      // 鎸夋椂闂存帓搴�
-      this.gpsList.sort((a, b) => {
-        return new Date(a.collectTime) - new Date(b.collectTime);
-      });
+      try {
+        // 娓呴櫎涔嬪墠鐨勮建杩�
+        if (this.polyline) {
+          this.map.removeOverlay(this.polyline);
+        }
+        this.markers.forEach((marker) => {
+          this.map.removeOverlay(marker);
+        });
+        this.markers = [];
 
-      // 璁$畻褰撳墠娈佃惤鐨勮捣濮嬪拰缁撴潫绱㈠紩
-      const startIndex = this.segmentIndex * this.segmentSize;
-      const endIndex = Math.min(
-        startIndex + this.segmentSize,
-        this.gpsList.length
-      );
-      const currentSegment = this.gpsList.slice(startIndex, endIndex);
+        if (this.gpsList.length === 0) {
+          return;
+        }
 
-      //鍏堣幏寰楁墍鏈夊潗鏍囨暟缁�
-      const originPoints = currentSegment.map(
-        (item) => new BMap.Point(item.longitude, item.latitude)
-      );
-    
-      this.gpsList.sort((a, b) => {
-        return new Date(b.collectTime) - new Date(a.collectTime);
-      }).forEach(item => {
-       item.speed=item.speed/1000;
-      });
-      //鎵归噺杞崲鍧愭爣
-      var translatePoints = await this.translatePoints(originPoints);
+        // 鎸夋椂闂存帓搴�
+        this.gpsList.sort((a, b) => {
+          return new Date(a.collectTime) - new Date(b.collectTime);
+        });
 
-      // 鍒涘缓杞ㄨ抗鐐规暟缁�
-      const points = translatePoints;
-      translatePoints.forEach((item, index) => {
-        const bdPoint = item;
+        // 璁$畻褰撳墠娈佃惤鐨勮捣濮嬪拰缁撴潫绱㈠紩
+        const startIndex = this.segmentIndex * this.segmentSize;
+        const endIndex = Math.min(
+          startIndex + this.segmentSize,
+          this.gpsList.length
+        );
+        const currentSegment = this.gpsList.slice(startIndex, endIndex);
 
-        // 鍒ゆ柇璧风偣鍜岀粓鐐规槸鍚︾浉鍚�
-        const isStartPoint = index === 0;
-        const isEndPoint = index === translatePoints.length - 1;
-        const isStartEndSame = isStartPoint && isEndPoint && 
-          translatePoints[0].lng === translatePoints[translatePoints.length - 1].lng && 
-          translatePoints[0].lat === translatePoints[translatePoints.length - 1].lat;
+        // 鑾峰彇鎵�鏈夊潗鏍囨暟缁�
+        const originPoints = currentSegment.map(
+          (item) => new BMap.Point(item.longitude, item.latitude)
+        );
+      
+        this.gpsList.sort((a, b) => {
+          return new Date(b.collectTime) - new Date(a.collectTime);
+        }).forEach(item => {
+          item.speed = item.speed/1000;
+        });
 
-        // 鍙湪璧风偣鍜岀粓鐐瑰垱寤烘爣璁帮紝涓旇捣鐐瑰拰缁堢偣涓嶅悓鏃舵墠鏄剧ず璧风偣鏍囪
-        if ((isStartPoint && !isStartEndSame) || isEndPoint) {
-          let marker;
-          let direction=currentSegment[index].direction;
-          if (isStartPoint && !isStartEndSame) {
-            // 璧风偣鏄剧ず"璧�"瀛�
-            const label = new BMap.Label("璧�", {
-              offset: new BMap.Size(0, 0),
+        // 鎵归噺杞崲鍧愭爣
+        const translatePoints = await this.translatePoints(originPoints);
+
+        // 鍒涘缓杞ㄨ抗鐐规暟缁�
+        const points = translatePoints;
+        for (let index = 0; index < translatePoints.length; index++) {
+          const bdPoint = translatePoints[index];
+
+          // 鍒ゆ柇璧风偣鍜岀粓鐐规槸鍚︾浉鍚�
+          const isStartPoint = index === 0;
+          const isEndPoint = index === translatePoints.length - 1;
+          const isStartEndSame = isStartPoint && isEndPoint && 
+            translatePoints[0].lng === translatePoints[translatePoints.length - 1].lng && 
+            translatePoints[0].lat === translatePoints[translatePoints.length - 1].lat;
+
+          // 鍙湪璧风偣鍜岀粓鐐瑰垱寤烘爣璁帮紝涓旇捣鐐瑰拰缁堢偣涓嶅悓鏃舵墠鏄剧ず璧风偣鏍囪
+          if ((isStartPoint && !isStartEndSame) || isEndPoint) {
+            let marker;
+            let direction = currentSegment[index].direction;
+            if (isStartPoint && !isStartEndSame) {
+              // 璧风偣鏄剧ず"璧�"瀛�
+              const label = new BMap.Label("璧�", {
+                offset: new BMap.Size(0, 0),
+                position: bdPoint,
+              });
+              label.setStyle({
+                color: "white",
+                fontSize: "12px",
+                backgroundColor: "#3388ff",
+                border: "none",
+                padding: "2px 6px",
+                borderRadius: "3px",
+              });
+
+              marker = new BMap.Marker(bdPoint, {rotation: direction});
+              marker.setLabel(label);
+            } else {
+              // 缁堢偣鏄剧ず杞﹁締鍥炬爣
+              const myIcon = new BMap.Icon(
+                "/car_blue.png",
+                new BMap.Size(20, 20),
+                {
+                  imageSize: new BMap.Size(20, 20),
+                  anchor: new BMap.Size(10, 10),
+                }
+              );
+              marker = new BMap.Marker(bdPoint, {
+                icon: myIcon,
+                rotation: direction,
+              });
+            }
+
+            // 鍦ㄨ溅鍥炬爣涓婃樉绀鸿溅鐗�
+            const label = new BMap.Label(currentSegment[index].vehicleNo, {
+              offset: new BMap.Size(0, -25),
               position: bdPoint,
             });
             label.setStyle({
@@ -379,81 +444,56 @@
               padding: "2px 6px",
               borderRadius: "3px",
             });
-
-            marker = new BMap.Marker(bdPoint,{rotation:direction});
             marker.setLabel(label);
-          } else {
-            // 缁堢偣鏄剧ず杞﹁締鍥炬爣
-            const myIcon = new BMap.Icon(
-              "/car_blue.png",
-              new BMap.Size(20, 20),
-              {
-                imageSize: new BMap.Size(20, 20),
-                anchor: new BMap.Size(10, 10),
+
+            // 鑾峰彇鍦板潃淇℃伅
+            const geoc = new BMap.Geocoder();
+            geoc.getLocation(bdPoint, (rs) => {
+              if (rs && rs.addressComponents) {
+                const addComp = rs.addressComponents;
+                const address =
+                  addComp.province +
+                  addComp.city +
+                  addComp.district +
+                  addComp.street +
+                  addComp.streetNumber;
+
+                // 娣诲姞鐐瑰嚮浜嬩欢鐩戝惉鍣�
+                marker.addEventListener("click", () => {
+                  // 鍒涘缓淇℃伅绐楀彛
+                  const infoWindow = new BMap.InfoWindow(
+                    `杞︾墝鍙凤細${currentSegment[index].vehicleNo}<br/>鏃堕棿锛�${currentSegment[index].collectTime}<br/>閫熷害锛�${
+                      currentSegment[index].speed
+                    }km/h<br/>鏂瑰悜锛�${currentSegment[index].direction}掳<br/>鍦板潃锛�${address}`
+                  );
+                  this.map.openInfoWindow(infoWindow, bdPoint);
+                });
               }
-            );
-            marker = new BMap.Marker(bdPoint, {
-              icon: myIcon,
-              rotation: direction,
             });
+
+            this.map.addOverlay(marker);
+            this.markers.push(marker);
           }
-          //鍦ㄨ溅鍥炬爣涓婃樉绀鸿溅鐗�
-          const label = new BMap.Label(currentSegment[index].vehicleNo, {
-            offset: new BMap.Size(0, -25), // 鍚戜笂鍋忕Щ25鍍忕礌
-            position: bdPoint,
-          });
-          label.setStyle({
-            color: "white",
-            fontSize: "12px",
-            backgroundColor: "#3388ff",
-            border: "none",
-            padding: "2px 6px",
-            borderRadius: "3px",
-          });
-          marker.setLabel(label);
 
-          // 鑾峰彇鍦板潃淇℃伅
-          const geoc = new BMap.Geocoder();
-          geoc.getLocation(bdPoint, (rs) => {
-            const addComp = rs.addressComponents;
-            const address =
-              addComp.province +
-              addComp.city +
-              addComp.district +
-              addComp.street +
-              addComp.streetNumber;
-
-            // 娣诲姞鐐瑰嚮浜嬩欢鐩戝惉鍣�
-            marker.addEventListener("click", () => {
-              // 鍒涘缓淇℃伅绐楀彛
-              const infoWindow = new BMap.InfoWindow(
-                `杞︾墝鍙凤細${currentSegment[index].vehicleNo}<br/>鏃堕棿锛�${currentSegment[index].collectTime}<br/>閫熷害锛�${
-                  currentSegment[index].speed
-                }km/h<br/>鏂瑰悜锛�${currentSegment[index].direction}掳<br/>鍦板潃锛�${address}`
-              );
-              this.map.openInfoWindow(infoWindow, bdPoint);
+          // 濡傛灉鏄渶鍚庝竴涓偣锛岀粯鍒惰建杩圭嚎
+          if (index === currentSegment.length - 1) {
+            // 鍒涘缓杞ㄨ抗绾�
+            this.polyline = new BMap.Polyline(points, {
+              strokeColor: "#3388ff",
+              strokeWeight: 5,
+              strokeOpacity: 0.8,
+              strokeStyle: "solid",
             });
-          });
+            this.map.addOverlay(this.polyline);
 
-          this.map.addOverlay(marker);
-          this.markers.push(marker);
+            // 璋冩暣鍦板浘瑙嗛噹浠ユ樉绀哄畬鏁磋建杩�
+            this.map.setViewport(points);
+          }
         }
-
-        // 濡傛灉鏄渶鍚庝竴涓偣锛岀粯鍒惰建杩圭嚎
-        if (index === currentSegment.length - 1) {
-          // 鍒涘缓杞ㄨ抗绾�
-          this.polyline = new BMap.Polyline(points, {
-            strokeColor: "#3388ff",
-            strokeWeight: 5,
-            strokeOpacity: 0.8,
-            strokeStyle: "solid",
-          });
-          this.map.addOverlay(this.polyline);
-
-          // 璋冩暣鍦板浘瑙嗛噹浠ユ樉绀哄畬鏁磋建杩�
-          this.map.setViewport(points);
-        }
-      });
+      } catch (error) {
+        console.error("缁樺埗杞ㄨ抗澶辫触", error);
+        this.$message.error("缁樺埗杞ㄨ抗澶辫触锛岃鍒锋柊椤甸潰閲嶈瘯");
+      }
     },
     /** 鐐瑰嚮琛ㄦ牸琛� */
     handleRowClick(row) {

--
Gitblit v1.9.1