wlzboy
6 天以前 7de1396e315896dbc72a9d54e44f77434ea90f18
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java
@@ -6,6 +6,7 @@
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;
@@ -36,7 +37,7 @@
    private IVehicleGpsService vehicleGpsService;
    public void syncVehicleInfo() {
        log.info("开始同步CMS车辆信息");
//        log.info("开始同步CMS车辆信息");
        try {
            // 获取CMS所有车辆信息
            CmsVehicleDeviceListResponse response = cmsGpsCollectService.getDeviceByVehicle(null);
@@ -67,33 +68,67 @@
            List<String> onlyCms=cmsPlateNos.stream().filter(e->!notCmsVehicles.contains(e)).collect((Collectors.toList()));
            Integer syncCarCount=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);
            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());
                    // 继续处理下一个车辆
                }
                else{
                    vehicleInfo.setVehicleNo(plateNo);
                    vehicleInfo.setDeviceId(vehicle.getDid());
                    vehicleInfo.setPlatformCode("CMS");
                    vehicleInfo.setStatus("0");
                    vehicleInfoService.updateVehicleInfo(vehicleInfo);
                }
            });
            }
            log.info("成功同步{}个CMS车辆信息", syncCarCount);
            log.info("CMS车辆信息同步完成");
//            log.info("成功同步{}个CMS车辆信息", syncCarCount);
//            log.info("CMS车辆信息同步完成");
        } catch (Exception e) {
            log.error("同步CMS车辆信息异常", e);
        }
@@ -101,6 +136,7 @@
    //对车牌处理的通用方法
    private String getPlateNo(String plateNo){
        if (StringUtils.isNotEmpty(plateNo)) {
                // 从车辆名称中提取车牌号(假设格式为"★车牌号(地区)")
            if(plateNo.contains("(")) {
@@ -109,14 +145,16 @@
                plateNo = plateNo.replace("★", "").replace("☆", "").split("(")[0];
            }
            }
            return plateNo;
        //xxx粤VSX120
        plateNo = plateNo.replaceAll("[^a-zA-Z0-9]", "");
        return PlateNumberExtractor.extractPlateNumber(plateNo);
    }
    /**
     * 同步CMS车辆位置信息
     */
    public void syncVehicleLocation() {
        log.info("开始同步CMS车辆位置信息");
//        log.info("开始同步CMS车辆位置信息");
        try {
                //先获得本地CMS上的所有CMS车辆
                VehicleInfo query = new VehicleInfo();