From f1ba120c486048373505acfa74c3943c19be55ca Mon Sep 17 00:00:00 2001
From: wanglizhong <wlz>
Date: 星期三, 14 五月 2025 15:23:20 +0800
Subject: [PATCH] feat:优化查看历史轨迹

---
 ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml                     |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGps.java                     |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java    |   88 +++++
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CleanVehicleGpsTask.java              |   31 ++
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java               |   43 +-
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryRequest.java           |   40 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleGpsService.java            |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java               |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ICmsGpsCollectService.java         |   19 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CmsGpsCollectServiceImpl.java |   80 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsTrackDetailResponse.java         |   74 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsServiceImpl.java    |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryResponse.java          |   42 ++
 ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql                                |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackPoint.java                  |   45 +++
 sql/clean_gps.sql                                                                      |   27 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java    |  243 ++++++++++++++-
 ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsVehicleDeviceListResponse.java   |   64 +--
 ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java            |    8 
 19 files changed, 762 insertions(+), 87 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 e54c9f9..f966940 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleGpsController.java
@@ -1,13 +1,11 @@
 package com.ruoyi.web.controller.system;
 
 import java.util.*;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
 
-import com.ruoyi.system.domain.DispatchOrd;
-import com.ruoyi.system.domain.TbOrders;
-import com.ruoyi.system.domain.TbVehicleOrder;
-import com.ruoyi.system.service.IDispatchOrdService;
-import com.ruoyi.system.service.ITbOrdersService;
-import com.ruoyi.system.service.ITbVehicleOrderService;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.service.*;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -24,8 +22,6 @@
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.system.domain.VehicleGps;
-import com.ruoyi.system.service.IVehicleGpsService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
 
@@ -47,6 +43,15 @@
     @Autowired
     private ITbOrdersService tbOrdersService;
 
+    @Autowired
+    private IGpsCollectService gpsCollectService;
+
+    @Autowired
+    private IVehicleInfoService vehicleInfoService;
+
+    @Autowired
+    private ICmsGpsCollectService cmsGpsCollectService;
+
    /**
      * 鏌ヨ杞﹁締GPS鍧愭爣鍒楄〃
      */  
@@ -55,7 +60,12 @@
     public TableDataInfo list(VehicleGps vehicleGps) {
 
         startPage();
-        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+//        String vehicleNo=vehicleGps.getVehicleNo();
+//        String beginTime=vehicleGps.getBeginTime();
+//        String endTime=vehicleGps.getEndTime();
+//        return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//
+//        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
         vehicleGps.setOrderByColumn("collect_time");
         vehicleGps.setIsAsc("desc");
         List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
@@ -92,32 +102,53 @@
                     return getDataTable(new ArrayList<>());
                 }
 
-                Map<String, Object> params = new HashMap<>();
-                params.put("beginTime", dispatchOrd.getDispatchOrdStartDate());
-                params.put("endTime", dispatchOrd.getDispatchOrdUpdateTime());
+                String vehicleNo = tbVehicleOrder.getVehicle();
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
+                String endTime=  sdf.format(dispatchOrd.getDispatchOrdUpdateTime());
+                //濡傛灉璁㈠崟娌″畬鎴愶紝 endTime涓哄綋鍓嶆椂闂达紱濡備綍璁㈠崟宸茬粡瀹屾垚浜嗭紝鐢ㄨ鍗曠殑缁撴潫鏃堕棿銆�
 
-                vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
-                startPage();
-                // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
-                vehicleGps.setOrderByColumn("collect_time");
-                vehicleGps.setIsAsc("desc");
-                List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
-                return getDataTable(list);
+                return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//                Map<String, Object> params = new HashMap<>();
+//                params.put("beginTime", dispatchOrd.getDispatchOrdStartDate());
+//                params.put("endTime", dispatchOrd.getDispatchOrdUpdateTime());
+//
+//                vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
+//                startPage();
+//                // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+//                vehicleGps.setOrderByColumn("collect_time");
+//                vehicleGps.setIsAsc("desc");
+//                List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
+//                return getDataTable(list);
             }
             catch (Exception ex)
             {
                 logger.error("宸插畬鎴愮殑璁㈠崟鏌ヨ鍦板浘寮傚父锛歿}",ex.getMessage());
                 return getDataTable(new ArrayList<>());
             }
+        }else{
+            TbOrders tbOrders = tbOrdersService.selectTbOrdersByOrderID(vehicleGps.getOrderId());
+            if (tbOrders == null) {
+                return getDataTable(new ArrayList<>());
+            }
+            DispatchOrd dispatchOrd = dispatchOrdService.selectDispatchOrdByServiceOrdIDDt(tbOrders.getServiceOrdID());
+            if (dispatchOrd == null) {
+                return getDataTable(new ArrayList<>());
+            }
+            String vehicleNo = tbVehicleOrder.getVehicle();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String beginTime= sdf.format(dispatchOrd.getDispatchOrdStartDate());
+            String endTime=  sdf.format(new Date());
+            return this.getAnonymousTracks(vehicleNo,beginTime,endTime);
+//
+//        vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
+//        startPage();
+//        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
+//        vehicleGps.setOrderByColumn("collect_time");
+//        vehicleGps.setIsAsc("desc");
+//        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
+//        return getDataTable(list);
         }
-
-        vehicleGps.setVehicleNo(tbVehicleOrder.getVehicle());
-        startPage();
-        // 璁剧疆鎸夋椂闂村�掑簭鎺掑簭
-        vehicleGps.setOrderByColumn("collect_time");
-        vehicleGps.setIsAsc("desc");
-        List<VehicleGps> list = vehicleGpsService.selectVehicleGpsList(vehicleGps);
-        return getDataTable(list);
     }
 
     /**
@@ -173,4 +204,162 @@
     public AjaxResult remove(@PathVariable Long[] gpsIds) {
         return toAjax(vehicleGpsService.deleteVehicleGpsByIds(gpsIds));
     }
+
+    /**
+     * 鏌ヨ杞﹁締鍘嗗彶杞ㄨ抗
+     */
+    @PreAuthorize("@ss.hasPermi('system:gps:query')")
+    @GetMapping("/tracks")
+    public TableDataInfo getTracks(String vehicleNo, String beginTime, String endTime) {
+        return getAnonymousTracks(vehicleNo, beginTime, endTime);
+    }
+
+   
+    /**
+     * 鍖垮悕鏌ヨ杞﹁締鍘嗗彶杞ㄨ抗
+     */
+    @Anonymous()
+    @GetMapping("/anonymousTracks")
+    public TableDataInfo getAnonymousTracks(String vehicleNo, String beginTime, String endTime) {
+        try {
+            // 閫氳繃杞︾墝鍙疯幏鍙栬澶嘔D
+            VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(vehicleNo);
+            if (vehicleInfo == null) {
+                throw new Error("鏈壘鍒拌杞﹁締瀵瑰簲鐨凣PS璁惧");
+            }
+
+            // 澶勭悊寮�濮嬫椂闂�
+                beginTime = beginTime.replace("T", " ").replace(" ","%20");
+                if (beginTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
+                    beginTime += ":00";
+                }
+                
+                // 澶勭悊缁撴潫鏃堕棿
+                endTime = endTime.replace("T", " ").replace(" ","%20");
+                if (endTime.split(":").length == 2) { // 鍙湁灏忔椂鍜屽垎閽�
+                    endTime += ":59";
+                }
+
+            List<GpsTrackPoint> trackPoints = new ArrayList<>();
+
+            //濡傛灉骞冲彴鏄痗ms锛屽垯璋冪敤cms鐨勬帴鍙�
+            if(vehicleInfo.getPlatformCode().equals("CMS"))
+            {
+                
+                CmsTrackDetailResponse response = cmsGpsCollectService.queryTrackDetail(
+                    vehicleInfo.getDeviceId(),  // 璁惧鍙�
+                    beginTime,                  // 寮�濮嬫椂闂�
+                    endTime,                    // 缁撴潫鏃堕棿
+                    null,                       // 璺濈锛堝彲閫夛級
+                    null,                       // 鍋滆溅鏃堕暱锛堝彲閫夛級
+                    1,                          // 瑙f瀽鍦扮悊浣嶇疆
+                    null,                       // 褰撳墠椤电爜锛堝彲閫夛級
+                    null,                       // 姣忛〉璁板綍鏁帮紙鍙�夛級
+                    2                           // 鍦板浘绫诲瀷锛�2锛氱櫨搴﹀湴鍥撅級
+                );
+
+                if (response.getResult() != 0) {
+                    throw new Error("鏌ヨCMS杞ㄨ抗澶辫触");
+                }
+
+                // 杞崲CMS杞ㄨ抗鐐逛负缁熶竴鏍煎紡
+                if (response.getTracks() != null) {
+                    for (CmsTrackDetailResponse.CmsTrackPoint point : response.getTracks()) {
+                        GpsTrackPoint trackPoint = new GpsTrackPoint();
+                        trackPoint.setVehicleNo(point.getVid());
+                        trackPoint.setDeviceId(point.getId());
+                        
+                        //缁忓害绾害涓虹┖鏃讹紝璺宠繃
+                        if(point.getMlng()==null || point.getMlat()==null)
+                        {
+                            continue;
+                        }
+
+                        // 缁忓害锛屼娇鐢ㄤ笁鍏冭繍绠楃
+                        trackPoint.setLongitude(point.getMlng() != null ? Double.parseDouble(point.getMlng()) : 0.0);
+                        
+                        // 绾害锛屼娇鐢ㄤ笁鍏冭繍绠楃
+                        trackPoint.setLatitude(point.getMlat() != null ? Double.parseDouble(point.getMlat()) : 0.0);
+                        
+                        // 閫熷害锛岀洿鎺ヤ娇鐢╥nt杞琩ouble
+                        trackPoint.setSpeed(point.getSp() > 0 ? (double)point.getSp() : 0.0);
+                        
+                        // 鏂瑰悜锛屼娇鐢ㄤ笁鍏冭繍绠楃澶勭悊
+                        trackPoint.setCourse(point.getFt() > 0 ? point.getFt() : 0);
+                        
+                        // ACC鐘舵�侊紝浣跨敤涓夊厓杩愮畻绗﹀鐞�
+                        trackPoint.setAccStatus(point.getAc() > 0 ? point.getAc() : 0);
+                        
+                        // 鍦ㄧ嚎鐘舵�侊紝浣跨敤涓夊厓杩愮畻绗﹀鐞�
+                        trackPoint.setOnlineStatus(point.getNet() > 0 ? point.getNet() : 0);
+                        trackPoint.setAddress(point.getPs());
+                        
+                        // 涓婃姤鏃堕棿锛岀洿鎺ヤ娇鐢ㄥ瓧绗︿覆
+                        trackPoint.setReportTime(point.getGt() != null ? point.getGt() : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+                        
+                        trackPoints.add(trackPoint);
+                    }
+                }
+            }
+            else {
+                
+                // 鏋勫缓鏌ヨ璇锋眰
+                GpsTrackQueryRequest request = new GpsTrackQueryRequest();
+                request.setDeviceid(vehicleInfo.getDeviceId());
+                request.setBegintime(beginTime);
+                request.setEndtime(endTime);
+                request.setTimezone(8); // 涓浗鏃跺尯
+
+                // 鏌ヨ杞ㄨ抗
+                GpsTrackQueryResponse response = gpsCollectService.queryTracks(request);
+                if (response.getStatus() != 0) {
+                    throw new Error("鏌ヨ杞ㄨ抗澶辫触锛�" + response.getCause());
+                }
+
+                // 杞崲GPS51杞ㄨ抗鐐逛负缁熶竴鏍煎紡
+                if (response.getRecords() != null) {
+                    for (GpsTrackPoint point : response.getRecords()) {
+                        GpsTrackPoint trackPoint = new GpsTrackPoint();
+                        trackPoint.setVehicleNo(vehicleNo);
+                        trackPoint.setDeviceId(vehicleInfo.getDeviceId());
+                        trackPoint.setLongitude(point.getLongitude());    // 缁忓害
+                        trackPoint.setLatitude(point.getLatitude());    // 绾害
+                        trackPoint.setSpeed(point.getSpeed());      // 閫熷害
+                        trackPoint.setCourse(point.getCourse());    // 鏂瑰悜
+                        trackPoint.setReportTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(point.getUpdatetime()))); // 涓婃姤鏃堕棿
+                        trackPoints.add(trackPoint);
+                    }
+                }
+            }
+            //杞崲鎴怢ist<VehicleGps> 
+            List<VehicleGps> vehicleGpsList = new ArrayList<>();
+            for(GpsTrackPoint trackPoint : trackPoints)
+            {
+                VehicleGps vehicleGps = new VehicleGps();
+                vehicleGps.setVehicleNo(trackPoint.getVehicleNo());
+                vehicleGps.setDeviceId(trackPoint.getDeviceId());
+                vehicleGps.setLongitude(trackPoint.getLongitude());
+                vehicleGps.setLatitude(trackPoint.getLatitude());
+                vehicleGps.setSpeed(trackPoint.getSpeed());
+                //鏂瑰悜
+                vehicleGps.setDirection(Double.valueOf(trackPoint.getCourse()));
+                //鍦板潃
+                vehicleGps.setAddress(trackPoint.getAddress());
+                vehicleGps.setCollectTime(trackPoint.getReportTime());
+                //GPS骞冲彴澶勭悊鏃堕棿
+                vehicleGps.setPlatformProcessTime(trackPoint.getReportTime());
+                vehicleGps.setDeviceReportTime(trackPoint.getReportTime());
+                vehicleGpsList.add(vehicleGps);
+            }
+            //鏃堕棿鍊掑簭鎺掑簭
+            vehicleGpsList.sort(Comparator.comparing(VehicleGps::getDeviceReportTime).reversed());
+            
+            //杩斿洖杞﹁締Gps鍒楄〃
+            return getDataTable(vehicleGpsList);
+            // return success(vehicleGpsList);
+        } catch (Exception e) {
+            logger.error("鏌ヨ杞﹁締杞ㄨ抗寮傚父", e);
+            throw new Error("鏌ヨ杞﹁締杞ㄨ抗澶辫触锛�" + e.getMessage());
+        }
+    }
 } 
\ No newline at end of file
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CleanVehicleGpsTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CleanVehicleGpsTask.java
new file mode 100644
index 0000000..321d326
--- /dev/null
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CleanVehicleGpsTask.java
@@ -0,0 +1,31 @@
+package com.ruoyi.quartz.task;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.ruoyi.system.service.IVehicleGpsService;
+
+/**
+ * 娓呯悊杞﹁締GPS鍘嗗彶鏁版嵁浠诲姟
+ */
+@Component("cleanVehicleGpsTask")
+public class CleanVehicleGpsTask {
+    private static final Logger log = LoggerFactory.getLogger(CleanVehicleGpsTask.class);
+
+    @Autowired
+    private IVehicleGpsService vehicleGpsService;
+
+    /**
+     * 娓呯悊杞﹁締GPS鍘嗗彶鏁版嵁
+     */
+    public void cleanVehicleGpsData() {
+        try {
+            log.info("寮�濮嬫竻鐞嗚溅杈咷PS鍘嗗彶鏁版嵁");
+            int count = vehicleGpsService.deleteVehicleGpsBeforeDate();
+            log.info("娓呯悊杞﹁締GPS鍘嗗彶鏁版嵁瀹屾垚锛屽叡娓呯悊{}鏉¤褰�", count);
+        } catch (Exception e) {
+            log.error("娓呯悊杞﹁締GPS鍘嗗彶鏁版嵁寮傚父", e);
+        }
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java
index 6bd3d87..c5abe54 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java
@@ -6,16 +6,13 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import com.ruoyi.system.domain.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.domain.CmsVehicleDeviceResponse;
-import com.ruoyi.system.domain.CmsVehicleLocationResponse;
-import com.ruoyi.system.domain.VehicleGps;
-import com.ruoyi.system.domain.VehicleInfo;
 import com.ruoyi.system.service.ICmsGpsCollectService;
 import com.ruoyi.system.service.IVehicleGpsService;
 import com.ruoyi.system.service.IVehicleInfoService;
@@ -42,7 +39,7 @@
         log.info("寮�濮嬪悓姝MS杞﹁締淇℃伅");
         try {
             // 鑾峰彇CMS鎵�鏈夎溅杈嗕俊鎭�
-            CmsVehicleDeviceResponse response = cmsGpsCollectService.queryVehicleDevices();
+            CmsVehicleDeviceListResponse response = cmsGpsCollectService.getDeviceByVehicle(null);
             if (response.getResult() != 0) {
                 log.error("鑾峰彇CMS杞﹁締淇℃伅澶辫触");
                 return;
@@ -50,10 +47,10 @@
 
             // 鑾峰彇鎵�鏈塁MS杞﹁締鐨勮溅鐗屽彿
             List<String> cmsPlateNos = new ArrayList<>();
-            response.getVehicles().forEach(vehicle -> {
-                if (StringUtils.isNotEmpty(vehicle.getNm())) {
+            response.getDevices().forEach(vehicle -> {
+                if (StringUtils.isNotEmpty(vehicle.getVid())) {
                     // 浠庤溅杈嗗悕绉颁腑鎻愬彇杞︾墝鍙凤紙鍋囪鏍煎紡涓�"鈽呰溅鐗屽彿锛堝湴鍖猴級"锛�
-                    String plateNo =this.getPlateNo(vehicle.getNm());
+                    String plateNo =this.getPlateNo(vehicle.getVid());
                     cmsPlateNos.add(plateNo);
                 }
             });
@@ -70,17 +67,29 @@
             List<String> onlyCms=cmsPlateNos.stream().filter(e->!notCmsVehicles.contains(e)).collect((Collectors.toList()));
 
             Integer syncCarCount=0;
-            for(String e:onlyCms){
-                VehicleInfo vehicleInfo = new VehicleInfo();
-                vehicleInfo.setVehicleNo(e);
-                vehicleInfo.setPlatformCode("CMS");
-                vehicleInfo.setStatus("0");
-                //濡傛灉杞﹁締涓嶅瓨鍦紝鍒欐彃鍏�
-                if (vehicleInfoService.selectVehicleInfoList(vehicleInfo).size()==0) {
+            response.getDevices().stream().filter(e->onlyCms.contains(this.getPlateNo(e.getVid()))).forEach(vehicle->{
+                String plateNo =this.getPlateNo(vehicle.getVid());
+
+                VehicleInfo vehicleInfo= vehicleInfoService.selectVehicleInfoByPlateNumber(plateNo);
+                if (vehicleInfo==null) {
+                    vehicleInfo = new VehicleInfo();
+                    vehicleInfo.setVehicleNo(plateNo);
+                    vehicleInfo.setDeviceId(vehicle.getDid());
+                    vehicleInfo.setPlatformCode("CMS");
+                    vehicleInfo.setStatus("0");
                     vehicleInfoService.insertVehicleInfo(vehicleInfo);
-                    syncCarCount++;
                 }
-            }
+                else{
+                    vehicleInfo.setVehicleNo(plateNo);
+                    vehicleInfo.setDeviceId(vehicle.getDid());
+                    vehicleInfo.setPlatformCode("CMS");
+                    vehicleInfo.setStatus("0");
+                    vehicleInfoService.updateVehicleInfo(vehicleInfo);
+                }
+
+            });
+
+
 
 
             log.info("鎴愬姛鍚屾{}涓狢MS杞﹁締淇℃伅", syncCarCount);
diff --git a/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql b/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql
index 7d2de38..0f3f944 100644
--- a/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql
+++ b/ruoyi-quartz/src/main/resources/sql/vehicle_gps_job.sql
@@ -1,7 +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/CmsTrackDetailResponse.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsTrackDetailResponse.java
new file mode 100644
index 0000000..bf33338
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsTrackDetailResponse.java
@@ -0,0 +1,74 @@
+package com.ruoyi.system.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * CMS杞ㄨ抗鏌ヨ鍝嶅簲
+ */
+@Data
+public class CmsTrackDetailResponse implements Serializable{
+    private int result;
+    private List<CmsTrackPoint> tracks;
+    private CmsPagination pagination;
+
+
+    /**
+     * CMS杞ㄨ抗鐐�
+     */
+    @Data
+    public static class CmsTrackPoint implements Serializable{
+        private String id;        // 璁惧ID
+        private int lng;         // 缁忓害
+        private int lat;         // 绾害
+        private int ft;          // 鏂瑰悜
+        private int sp;          // 閫熷害
+        private String ol;       // 娌归噺
+        private String gt;       // GPS鏃堕棿
+        private int pt;          // 瀹氫綅绫诲瀷
+        private int dt;          // 鏁版嵁绫诲瀷
+        private int ac;          // ACC鐘舵��
+        private int fdt;         // 鐤插姵椹鹃┒
+        private int net;         // 缃戠粶绫诲瀷
+        private String gw;       // 缃戝叧
+        private String vid;      // 杞﹁締杞︾墝
+        private long s1;         // 鐘舵��1
+        private int s2;          // 鐘舵��2
+        private int s3;          // 鐘舵��3
+        private int s4;          // 鐘舵��4
+        private int t1;          // 娓╁害1
+        private int t2;          // 娓╁害2
+        private int t3;          // 娓╁害3
+        private int t4;          // 娓╁害4
+        private int hx;          // 婀垮害
+        private String mlng;     // 鍦板浘缁忓害
+        private String mlat;     // 鍦板浘绾害
+        private int pk;          // 鍋滆溅鐘舵��
+        private long lc;         // 閲岀▼
+        private int yl;          // 娌归噺
+        private String ps;       // 浣嶇疆
+
+    }
+
+    /**
+     * CMS鍒嗛〉淇℃伅
+     */
+    @Data
+    public static class CmsPagination implements Serializable {
+        private int totalPages;      // 鎬婚〉鏁�
+        private int currentPage;     // 褰撳墠椤�
+        private int pageRecords;     // 姣忛〉璁板綍鏁�
+        private int totalRecords;    // 鎬昏褰曟暟
+        private String sortParams;   // 鎺掑簭鍙傛暟
+        private boolean hasNextPage; // 鏄惁鏈変笅涓�椤�
+        private boolean hasPreviousPage; // 鏄惁鏈変笂涓�椤�
+        private int nextPage;        // 涓嬩竴椤�
+        private int previousPage;    // 涓婁竴椤�
+        private int startRecord;     // 寮�濮嬭褰�
+
+
+
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsVehicleDeviceListResponse.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsVehicleDeviceListResponse.java
index df25b7e..120754e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsVehicleDeviceListResponse.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/CmsVehicleDeviceListResponse.java
@@ -1,74 +1,60 @@
 package com.ruoyi.system.domain;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
 import java.util.List;
 
 /**
- * CMS杞﹁締璁惧鍒楄〃鏌ヨ鍝嶅簲
+ * CMS杞﹁締璁惧鍒楄〃鍝嶅簲
  */
-public class CmsVehicleDeviceListResponse implements Serializable {
-    private static final long serialVersionUID = 1L;
+public class CmsVehicleDeviceListResponse {
+    private int result;
+    private List<CmsVehicleDevice> devices;
 
-    /** 缁撴灉鐮� */
-    @JsonProperty("result")
-    private Integer result;
-
-    /** 璁惧鍒楄〃 */
-    @JsonProperty("devices")
-    private List<VehicleDevice> devices;
-
-    public Integer getResult() {
+    public int getResult() {
         return result;
     }
 
-    public void setResult(Integer result) {
+    public void setResult(int result) {
         this.result = result;
     }
 
-    public List<VehicleDevice> getDevices() {
+    public List<CmsVehicleDevice> getDevices() {
         return devices;
     }
 
-    public void setDevices(List<VehicleDevice> devices) {
+    public void setDevices(List<CmsVehicleDevice> devices) {
         this.devices = devices;
     }
 
-    public static class VehicleDevice {
-        /** 杞︾墝鍙� */
-        @JsonProperty("vid")
-        private String vehicleId;
+    /**
+     * CMS杞﹁締璁惧淇℃伅
+     */
+    public static class CmsVehicleDevice {
+        private String vid;    // 杞︾墝鍙�
+        private int type;      // 璁惧绫诲瀷锛�1锛氳棰戣澶囷紝0锛欸PS璁惧锛�
+        private String did;    // 璁惧鍙�
 
-        /** 璁惧绫诲瀷 */
-        @JsonProperty("type")
-        private Integer type;
-
-        /** 璁惧鍙� */
-        @JsonProperty("did")
-        private String deviceId;
-
-        public String getVehicleId() {
-            return vehicleId;
+        public String getVid() {
+            return vid;
         }
 
-        public void setVehicleId(String vehicleId) {
-            this.vehicleId = vehicleId;
+        public void setVid(String vid) {
+            this.vid = vid;
         }
 
-        public Integer getType() {
+        public int getType() {
             return type;
         }
 
-        public void setType(Integer type) {
+        public void setType(int type) {
             this.type = type;
         }
 
-        public String getDeviceId() {
-            return deviceId;
+        public String getDid() {
+            return did;
         }
 
-        public void setDeviceId(String deviceId) {
-            this.deviceId = deviceId;
+        public void setDid(String did) {
+            this.did = did;
         }
     }
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackPoint.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackPoint.java
new file mode 100644
index 0000000..0e19c30
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackPoint.java
@@ -0,0 +1,45 @@
+package com.ruoyi.system.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * GPS杞ㄨ抗鐐圭粺涓�鍝嶅簲鏍煎紡
+ */
+@Data
+public class GpsTrackPoint implements Serializable {
+    private String vehicleNo;      // 杞︾墝鍙�
+    private Double longitude;      // 缁忓害
+    private Double latitude;       // 绾害
+    private Double speed;          // 閫熷害
+    private Integer direction;     // 鏂瑰悜
+    private String address;        // 鍦扮悊浣嶇疆
+    private String reportTime;     // 涓婃姤鏃堕棿
+    private String deviceId;       // 璁惧ID
+    private Integer accStatus;     // ACC鐘舵��
+    private Integer onlineStatus;  // 鍦ㄧ嚎鐘舵��
+    private Integer powerStatus;   // 鐢垫簮鐘舵��
+    private Integer signalStrength;// 淇″彿寮哄害
+    private Integer trackCount;    // 杞ㄨ抗鐐规暟閲�
+    private Long starttime;        // 寮�濮嬫椂闂�
+    private Long endtime;          // 缁撴潫鏃堕棿
+    private Integer trackid;       // 杞ㄨ抗ID
+    private Long arrivedtime;      // 鍒拌揪鏃堕棿
+    private Long updatetime;       // 鏇存柊鏃堕棿
+    private Double altitude;       // 娴锋嫈
+    private Integer radius;        // 鍗婂緞
+    private Double recorderspeed;  // 璁板綍浠�熷害
+    private Integer totaldistance; // 鎬昏窛绂�
+    private Integer course;        // 鏂瑰悜
+    private Long status;           // 鐘舵��
+    private String strstatus;      // 鐘舵�佹弿杩�
+    private String strstatusen;    // 鐘舵�佽嫳鏂囨弿杩�
+    private String gotsrc;         // 鏁版嵁鏉ユ簮
+    private Integer rxlevel;       // 淇″彿寮哄害
+    private Integer gpsvalidnum;   // GPS鏈夋晥鍗槦鏁�
+
+    private Short reportmode;      // 涓婃姤妯″紡
+
+
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryRequest.java
new file mode 100644
index 0000000..0286ddf
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryRequest.java
@@ -0,0 +1,40 @@
+package com.ruoyi.system.domain;
+
+public class GpsTrackQueryRequest {
+    private String deviceid;
+    private String begintime;
+    private String endtime;
+    private Integer timezone;
+
+    public String getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(String deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public String getBegintime() {
+        return begintime;
+    }
+
+    public void setBegintime(String begintime) {
+        this.begintime = begintime;
+    }
+
+    public String getEndtime() {
+        return endtime;
+    }
+
+    public void setEndtime(String endtime) {
+        this.endtime = endtime;
+    }
+
+    public Integer getTimezone() {
+        return timezone;
+    }
+
+    public void setTimezone(Integer timezone) {
+        this.timezone = timezone;
+    }
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryResponse.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryResponse.java
new file mode 100644
index 0000000..62e2011
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GpsTrackQueryResponse.java
@@ -0,0 +1,42 @@
+package com.ruoyi.system.domain;
+
+import java.util.List;
+
+public class GpsTrackQueryResponse {
+    private int status;
+    private String cause;
+    private String deviceid;
+    private List<GpsTrackPoint> records;
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getCause() {
+        return cause;
+    }
+
+    public void setCause(String cause) {
+        this.cause = cause;
+    }
+
+    public String getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(String deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public List<GpsTrackPoint> getRecords() {
+        return records;
+    }
+
+    public void setRecords(List<GpsTrackPoint> records) {
+        this.records = records;
+    }
+} 
\ 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 a2b492b..daf5d6e 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
@@ -67,6 +67,9 @@
     /** 鎺掑簭鍒� */
     private String orderByColumn;
 
+    /** 鍦板潃 */
+    private String address;
+
     /** 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc */
     private String isAsc;
 
@@ -211,6 +214,14 @@
         return  this.orderId;
     }
 
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
@@ -227,6 +238,7 @@
                 .append("deviceReportTime", getDeviceReportTime())
                 .append("platformProcessTime", getPlatformProcessTime())
                 .append("createTime", getCreateTime())
+                .append("address", getAddress())
                 .toString();
     }
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java
index fb1310c..52f64bd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java
@@ -41,4 +41,11 @@
      * 鏍规嵁杞︾墝鍙疯幏鍙栬溅杈咺D
      */
     public Long getVehicleIdByNo(String vehicleNo);
+
+    /**
+     * 鍒犻櫎鎸囧畾鏃ユ湡涔嬪墠鐨勮溅杈咷PS鏁版嵁
+     * 
+     * @return 鍒犻櫎鐨勮褰曟暟
+     */
+    public int deleteVehicleGpsBeforeDate();
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ICmsGpsCollectService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ICmsGpsCollectService.java
index 782d0b0..131acd2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ICmsGpsCollectService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ICmsGpsCollectService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.system.domain.CmsVehicleDeviceResponse;
 import com.ruoyi.system.domain.CmsVehicleDeviceListResponse;
 import com.ruoyi.system.domain.CmsVehicleLocationResponse;
+import com.ruoyi.system.domain.CmsTrackDetailResponse;
 
 /**
  * CMS GPS閲囬泦鏈嶅姟鎺ュ彛
@@ -44,4 +45,22 @@
      * @return 杞﹁締浣嶇疆淇℃伅鍝嶅簲
      */
     CmsVehicleLocationResponse getVehicleLocation(String vehicleId, Integer toMap, Integer geoAddress, Integer currentPage, Integer pageRecords);
+
+    /**
+     * 鑾峰彇璁惧鍘嗗彶杞ㄨ抗
+     *
+     * @param devIdno 璁惧鍙�
+     * @param begintime 寮�濮嬫椂闂达紙鏍煎紡锛歽yyy-MM-dd HH:mm:ss锛�
+     * @param endtime 缁撴潫鏃堕棿锛堟牸寮忥細yyyy-MM-dd HH:mm:ss锛�
+     * @param distance 璺濈锛堝崟浣嶏細KM锛屽彲閫夛級
+     * @param parkTime 鍋滆溅鏃堕暱锛堝崟浣嶏細绉掞紝鍙�夛級
+     * @param geoaddress 鏄惁瑙f瀽鍦扮悊浣嶇疆锛�1锛氭槸锛屽彲閫夛級
+     * @param currentPage 褰撳墠鏌ヨ椤电爜锛堝彲閫夛級
+     * @param pageRecords 姣忛〉鏉℃暟锛堝彲閫夛級
+     * @param toMap 鍦板浘缁忕含搴﹁浆鎹紙1锛氳胺姝屽湴鍥撅紝2锛氱櫨搴﹀湴鍥撅紝鍙�夛級
+     * @return 鍘嗗彶杞ㄨ抗鍝嶅簲
+     */
+    CmsTrackDetailResponse queryTrackDetail(String devIdno, String begintime, String endtime,
+            Double distance, Integer parkTime, Integer geoaddress, Integer currentPage,
+            Integer pageRecords, Integer toMap);
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java
index f89c320..d0512fa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IGpsCollectService.java
@@ -32,4 +32,12 @@
      * @return 璁惧鍙凤紝濡傛灉鏈壘鍒板垯杩斿洖null
      */
     String getDeviceIdByPlateNumber(String plateNumber);
+
+    /**
+     * 鎸夋椂闂存煡璇㈠巻鍙茶建杩�
+     *
+     * @param request 鏌ヨ璇锋眰
+     * @return 杞ㄨ抗鏌ヨ鍝嶅簲
+     */
+    GpsTrackQueryResponse queryTracks(GpsTrackQueryRequest request);
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleGpsService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleGpsService.java
index 061954d..970c3ac 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleGpsService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleGpsService.java
@@ -36,4 +36,11 @@
      * 鍒犻櫎杞﹁締GPS鍧愭爣淇℃伅
      */
     public int deleteVehicleGpsById(Long gpsId);
+
+    /**
+     * 鍒犻櫎鎸囧畾鏃ユ湡涔嬪墠鐨勮溅杈咷PS鏁版嵁
+     * 
+     * @return 鍒犻櫎鐨勮褰曟暟
+     */
+    public int deleteVehicleGpsBeforeDate();
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CmsGpsCollectServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CmsGpsCollectServiceImpl.java
index 493f47d..2c6b036 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CmsGpsCollectServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CmsGpsCollectServiceImpl.java
@@ -6,6 +6,7 @@
 import com.ruoyi.system.domain.CmsVehicleDeviceResponse;
 import com.ruoyi.system.domain.CmsVehicleDeviceListResponse;
 import com.ruoyi.system.domain.CmsVehicleLocationResponse;
+import com.ruoyi.system.domain.CmsTrackDetailResponse;
 import com.ruoyi.system.domain.SysGpsConfig;
 import com.ruoyi.system.service.ICmsGpsCollectService;
 import com.ruoyi.system.service.IGpsConfigService;
@@ -15,6 +16,8 @@
 import org.springframework.stereotype.Service;
 import com.alibaba.fastjson.JSONObject;
 import java.util.Date;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 
 /**
  * CMS GPS閲囬泦鏈嶅姟瀹炵幇
@@ -115,13 +118,17 @@
             }
 
             // 鏋勫缓璇锋眰URL
-            String url = baseUrlConfig.getDomain() + "/StandardApiAction_getDeviceByVehicle.action?jsession=" + baseUrlConfig.getToken();
+            StringBuilder url = new StringBuilder();
+            url.append(baseUrlConfig.getDomain())
+               .append("/StandardApiAction_getDeviceByVehicle.action?jsession=")
+               .append(baseUrlConfig.getToken());
+
             if (vehicleId != null && !vehicleId.isEmpty()) {
-                url += "&vehiIdno=" + vehicleId;
+                url.append("&vehiIdno=").append(vehicleId);
             }
 
             // 鍙戦�佹煡璇㈣姹�
-            String response = HttpUtil.get(url,null);
+            String response = HttpUtils.sendGet(url.toString());
             
             // 瑙f瀽鍝嶅簲
             CmsVehicleDeviceListResponse deviceListResponse = JSONObject.parseObject(response, CmsVehicleDeviceListResponse.class);
@@ -196,4 +203,71 @@
             throw new RuntimeException("鑾峰彇杞﹁締浣嶇疆淇℃伅寮傚父锛�" + e.getMessage());
         }
     }
+
+    @Override
+    public CmsTrackDetailResponse queryTrackDetail(String devIdno, String begintime, String endtime,
+            Double distance, Integer parkTime, Integer geoaddress, Integer currentPage,
+            Integer pageRecords, Integer toMap) {
+        
+        try {
+            // 浠庢暟鎹簱鑾峰彇CMS閰嶇疆
+            SysGpsConfig baseUrlConfig = gpsConfigService.selectGpsConfigByKey("gpscms");
+            if (baseUrlConfig == null) {
+                throw new RuntimeException("鏈厤缃瓹MS绯荤粺鍦板潃");
+            }
+
+            // 妫�鏌oken鏄惁杩囨湡
+            if (baseUrlConfig.getTokenExpireTime() == null || 
+                baseUrlConfig.getTokenExpireTime().before(new Date())) {
+                // token杩囨湡锛岄噸鏂扮櫥褰�
+                login(baseUrlConfig.getUsername(), baseUrlConfig.getPassword());
+                baseUrlConfig = gpsConfigService.selectGpsConfigByKey("gpscms");
+            }
+
+            // 鏋勫缓璇锋眰URL
+            StringBuilder url = new StringBuilder(baseUrlConfig.getDomain())
+               .append("/StandardApiAction_queryTrackDetail.action?jsession=")
+               .append(baseUrlConfig.getToken())
+               .append("&devIdno=").append(devIdno)
+               .append("&begintime=").append(begintime)
+               .append("&endtime=").append(endtime);
+
+            // 娣诲姞鍙�夊弬鏁�
+            if (distance != null) {
+                url.append("&distance=").append(distance);
+            }
+            if (parkTime != null) {
+                url.append("&parkTime=").append(parkTime);
+            }
+            if (geoaddress != null) {
+                url.append("&geoaddress=").append(geoaddress);
+            }
+            if (currentPage != null) {
+                url.append("&currentPage=").append(currentPage);
+            }
+            if (pageRecords != null) {
+                url.append("&pageRecords=").append(pageRecords);
+            }
+            if (toMap != null) {
+                url.append("&toMap=").append(toMap);
+            }
+
+            // 鍙戦�佹煡璇㈣姹�
+            String response = HttpUtils.sendGet(url.toString());
+            
+            // 瑙f瀽鍝嶅簲
+            CmsTrackDetailResponse trackResponse = JSONObject.parseObject(response, CmsTrackDetailResponse.class);
+            
+            if (trackResponse.getResult() == 0) {
+                log.info("鑾峰彇璁惧鍘嗗彶杞ㄨ抗鎴愬姛锛岃澶囧彿锛歿}", devIdno);
+            } else {
+                log.error("鑾峰彇璁惧鍘嗗彶杞ㄨ抗澶辫触锛岃澶囧彿锛歿}", devIdno);
+            }
+            
+            return trackResponse;
+        } catch (Exception e) {
+            log.error("鑾峰彇璁惧鍘嗗彶杞ㄨ抗寮傚父锛岃澶囧彿锛歿}", devIdno, e);
+            throw new RuntimeException("鑾峰彇璁惧鍘嗗彶杞ㄨ抗寮傚父锛�" + e.getMessage());
+        }
+    }
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java
index f456c36..7c20adb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GpsCollectServiceImpl.java
@@ -510,4 +510,92 @@
 
         return null;
     }
+
+    @Override
+    public GpsTrackQueryResponse queryTracks(GpsTrackQueryRequest request) {
+        // 鑾峰彇GPS閰嶇疆淇℃伅
+        SysGpsConfig config = gpsConfigService.selectGpsConfigByKey("gps51");
+        if (config == null) {
+            GpsTrackQueryResponse response = new GpsTrackQueryResponse();
+            response.setStatus(-1);
+            response.setCause("鏈壘鍒癎PS閰嶇疆淇℃伅");
+            return response;
+        }
+
+        // 鑾峰彇鏈夋晥鐨則oken锛屽鏋滄棤鏁堝垯鑷姩鐧诲綍
+        String token = getValidTokenWithAutoLogin();
+        if (token == null) {
+            GpsTrackQueryResponse response = new GpsTrackQueryResponse();
+            response.setStatus(-1);
+            response.setCause("鑾峰彇token澶辫触");
+            return response;
+        }
+
+        // 鏋勫缓璇锋眰URL
+        String url = config.getDomain() + "/webapi?action=querytracks&token=" + token;
+        
+        // 鏋勫缓璇锋眰鍙傛暟
+        Map<String, String> params = new HashMap<>();
+        params.put("deviceid", request.getDeviceid());
+        params.put("begintime", request.getBegintime());
+        params.put("endtime", request.getEndtime());
+        if (request.getTimezone() != null) {
+            params.put("timezone", String.valueOf(request.getTimezone()));
+        }
+
+        try {
+            // 鍙戦�丠TTP璇锋眰
+            String result = HttpUtil.post(url, params);
+            JSONObject jsonResult = JSON.parseObject(result);
+
+            // 瑙f瀽鍝嶅簲
+            GpsTrackQueryResponse response = new GpsTrackQueryResponse();
+            response.setStatus(jsonResult.getInteger("status"));
+            response.setCause(jsonResult.getString("cause"));
+            response.setDeviceid(jsonResult.getString("deviceid"));
+
+            if (response.getStatus() == 0) {
+                // 瑙f瀽杞ㄨ抗璁板綍鍒楄〃
+                JSONArray recordsArray = jsonResult.getJSONArray("records");
+                List<GpsTrackPoint> records = new ArrayList<>();
+                
+                for (int i = 0; i < recordsArray.size(); i++) {
+                    JSONObject recordJson = recordsArray.getJSONObject(i);
+                    GpsTrackPoint record = new GpsTrackPoint();
+                    record.setTrackCount(recordJson.getInteger("trackCount"));
+                    record.setStarttime(recordJson.getLong("starttime"));
+                    record.setEndtime(recordJson.getLong("endtime"));
+                    record.setTrackid(recordJson.getInteger("trackid"));
+                    record.setArrivedtime(recordJson.getLong("arrivedtime"));
+                    record.setUpdatetime(recordJson.getLong("updatetime"));
+                    record.setLatitude(recordJson.getDouble("callat"));
+                    record.setLongitude(recordJson.getDouble("callon"));
+                    record.setAltitude(recordJson.getDouble("altitude"));
+                    record.setRadius(recordJson.getInteger("radius"));
+                    record.setSpeed(recordJson.getDouble("speed"));
+                    record.setRecorderspeed(recordJson.getDouble("recorderspeed"));
+                    record.setTotaldistance(recordJson.getInteger("totaldistance"));
+                    record.setCourse(recordJson.getInteger("course"));
+                    record.setStatus(recordJson.getLong("status"));
+                    record.setStrstatus(recordJson.getString("strstatus"));
+                    record.setStrstatusen(recordJson.getString("strstatusen"));
+                    record.setGotsrc(recordJson.getString("gotsrc"));
+                    record.setRxlevel(recordJson.getInteger("rxlevel"));
+                    record.setGpsvalidnum(recordJson.getInteger("gpsvalidnum"));
+                    record.setReportmode(recordJson.getShort("reportmode"));
+                    
+                    records.add(record);
+                }
+                
+                response.setRecords(records);
+            }
+
+            return response;
+        } catch (Exception e) {
+            GpsTrackQueryResponse response = new GpsTrackQueryResponse();
+            response.setStatus(-1);
+            response.setCause("鏌ヨ鍘嗗彶杞ㄨ抗澶辫触锛�" + e.getMessage());
+            return response;
+        }
+    }
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsServiceImpl.java
index 8697cbe..ad9eb5a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsServiceImpl.java
@@ -71,4 +71,12 @@
     public int deleteVehicleGpsById(Long gpsId) {
         return vehicleGpsMapper.deleteVehicleGpsById(gpsId);
     }
+
+    /**
+     * 鍒犻櫎鎸囧畾鏃ユ湡涔嬪墠鐨勮溅杈咷PS鏁版嵁
+     */
+    @Override
+    public int deleteVehicleGpsBeforeDate() {
+        return vehicleGpsMapper.deleteVehicleGpsBeforeDate();
+    }
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml
index 98a65fe..9e01aae 100644
--- a/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/VehicleGpsMapper.xml
@@ -110,4 +110,13 @@
     <select id="getVehicleIdByNo" parameterType="String" resultType="Long">
         select vehicle_id from tb_vehicle_info where vehicle_no = #{vehicleNo}
     </select>
+
+    <delete id="deleteVehicleGpsBeforeDate">
+        delete g from tb_vehicle_gps g
+        where g.collect_time &lt; (
+            select date_sub(max(collect_time), interval 2 day)
+            from tb_vehicle_gps g2
+            where g2.vehicle_id = g.vehicle_id
+        )
+    </delete>
 </mapper> 
\ No newline at end of file
diff --git a/sql/clean_gps.sql b/sql/clean_gps.sql
new file mode 100644
index 0000000..692b8e8
--- /dev/null
+++ b/sql/clean_gps.sql
@@ -0,0 +1,27 @@
+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',
+    'cleanVehicleGpsTask.cleanVehicleGpsData()',
+    '0 0 1 * * ?',
+    '1',
+    '1',
+    '0',
+    'admin',
+    sysdate(),
+    'admin',
+    sysdate(),
+    '姣忓ぉ鍑屾櫒1鐐规竻鐞嗚溅杈咷PS鍘嗗彶鏁版嵁锛屽彧淇濈暀姣忓彴杞︽渶鍚�2澶╃殑鏁版嵁'
+);
\ No newline at end of file

--
Gitblit v1.9.1