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 >= #{beginTime}</if>
- <if test="endTime != null and endTime != ''"> and g.collect_time <= #{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') >= date_format(#{beginTime},'%y%m%d')
+ </if>
+ <if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+ AND date_format(collect_time,'%y%m%d') <= 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