| | |
| | | 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; |
| | |
| | | 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); |
| | | } |
| | | |
| | | }); |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | |
| | | //对车牌处理的通用方法 |
| | | private String getPlateNo(String plateNo){ |
| | | |
| | | if (StringUtils.isNotEmpty(plateNo)) { |
| | | // 从车辆名称中提取车牌号(假设格式为"★车牌号(地区)") |
| | | if(plateNo.contains("(")) { |
| | |
| | | plateNo = plateNo.replace("★", "").replace("☆", "").split("(")[0]; |
| | | } |
| | | } |
| | | return plateNo; |
| | | //xxx粤VSX120 |
| | | plateNo = plateNo.replaceAll("[^a-zA-Z0-9]", ""); |
| | | return PlateNumberExtractor.extractPlateNumber(plateNo); |
| | | } |
| | | |
| | | /** |