wlzboy
2025-11-29 364adbc9a93a396b74e154f910c2a0a72bfb1a0f
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/CmsVehicleSyncTask.java
@@ -67,27 +67,61 @@
            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->{
            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);
                }
                else{
                    vehicleInfo.setVehicleNo(plateNo);
                                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());
                    // 继续处理下一个车辆
                }
            }