From c6e38b6c66de5f5a8df5b8b2ab03a82c3b605db8 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期三, 03 十二月 2025 00:48:44 +0800
Subject: [PATCH] feat:优化同步

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java |   89 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 70 insertions(+), 19 deletions(-)

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 e414f6a..1694256 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,14 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import com.ruoyi.common.utils.PlateNumberExtractor;
+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 +40,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 +48,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 +68,63 @@
             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) {
-                    vehicleInfoService.insertVehicleInfo(vehicleInfo);
-                    syncCarCount++;
+            for (CmsVehicleDeviceListResponse.CmsVehicleDevice vehicle : response.getDevices()) {
+                try {
+                    if (!onlyCms.contains(this.getPlateNo(vehicle.getVid()))) {
+                        continue;
+                    }
+                    
+                    String plateNo = this.getPlateNo(vehicle.getVid());
+                    
+                    // 浣跨敤閲嶈瘯鏈哄埗澶勭悊姝婚攣
+                    int maxRetries = 3;
+                    int retryCount = 0;
+                    boolean success = false;
+                    
+                    while (!success && retryCount < maxRetries) {
+                        try {
+                            // 鏌ヨ杞﹁締淇℃伅锛堜娇鐢ㄧ簿纭尮閰嶏級
+                            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++;
+                                log.info("鏂板CMS杞﹁締: {}", plateNo);
+                            } else {
+                                // 鏇存柊杞﹁締 - 浠呮洿鏂板繀瑕佸瓧娈�,閬垮厤瑙﹀彂鍏宠仈琛ㄦ搷浣�
+                                vehicleInfo.setDeviceId(vehicle.getDid());
+                                vehicleInfo.setPlatformCode("CMS");
+                                vehicleInfo.setStatus("0");
+                                vehicleInfo.setDeptIds(null); // 涓嶆洿鏂伴儴闂ㄥ叧鑱�,閬垮厤姝婚攣
+                                vehicleInfoService.updateVehicleInfo(vehicleInfo);
+                                syncCarCount++;
+                                log.debug("鏇存柊CMS杞﹁締: {}", plateNo);
+                            }
+                            success = true;
+                        } catch (org.springframework.dao.DeadlockLoserDataAccessException e) {
+                            retryCount++;
+                            if (retryCount < maxRetries) {
+                                log.warn("鍚屾杞﹁締 {} 閬囧埌姝婚攣,绗瑊}娆¢噸璇�", plateNo, retryCount);
+                                // 闅忔満绛夊緟50-200ms鍚庨噸璇�,閬垮厤澶氫釜绾跨▼鍚屾椂閲嶈瘯
+                                Thread.sleep(50 + (long)(Math.random() * 150));
+                            } else {
+                                log.error("鍚屾杞﹁締 {} 澶辫触: 姝婚攣閲嶈瘯{}娆″悗浠嶅け璐�", plateNo, maxRetries);
+                                throw e;
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("鍚屾杞﹁締 {} 澶辫触: {}", vehicle.getVid(), e.getMessage());
+                    // 缁х画澶勭悊涓嬩竴涓溅杈�
                 }
             }
+
+
 
 
             log.info("鎴愬姛鍚屾{}涓狢MS杞﹁締淇℃伅", syncCarCount);
@@ -92,6 +136,7 @@
 
     //瀵硅溅鐗屽鐞嗙殑閫氱敤鏂规硶
     private String getPlateNo(String plateNo){
+
         if (StringUtils.isNotEmpty(plateNo)) {
                 // 浠庤溅杈嗗悕绉颁腑鎻愬彇杞︾墝鍙凤紙鍋囪鏍煎紡涓�"鈽呰溅鐗屽彿锛堝湴鍖猴級"锛�
             if(plateNo.contains("(")) {
@@ -100,7 +145,9 @@
                 plateNo = plateNo.replace("鈽�", "").replace("鈽�", "").split("锛�")[0];
             }
             }
-            return plateNo;
+        //xxx绮SX120
+        plateNo = plateNo.replaceAll("[^a-zA-Z0-9]", "");
+        return PlateNumberExtractor.extractPlateNumber(plateNo);
     }
 
     /**
@@ -138,12 +185,16 @@
                         if(f==null){
                             continue;
                         }
-
+                    if(vehicle.getJd()==null||vehicle.getWd()==null){
+                        continue;
+                    }
                     // 鍒涘缓GPS璁板綍
                     VehicleGps gps = new VehicleGps();
                     gps.setVehicleId(f.getVehicleId());
                     gps.setDeviceId(null);
+
                     gps.setLongitude(vehicle.getJd()/1000000);
+
                     gps.setLatitude(vehicle.getWd()/1000000);
                     gps.setSpeed(defaultZero);
                     gps.setVehicleNo(plateNo);

--
Gitblit v1.9.1