From 70f6ade5db4d32921cd923a1765c8c02f152e085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=A4=E5=85=A8=E6=98=86?= Date: Mon, 1 Sep 2025 09:39:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AD=98=E5=82=A8=E6=B1=A0=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/StoragePoolServiceImpl.java | 79 ++++++++++++++++--- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/nex-be/src/main/java/com/unisinsight/project/service/impl/StoragePoolServiceImpl.java b/nex-be/src/main/java/com/unisinsight/project/service/impl/StoragePoolServiceImpl.java index f19dfc9..f293fe2 100644 --- a/nex-be/src/main/java/com/unisinsight/project/service/impl/StoragePoolServiceImpl.java +++ b/nex-be/src/main/java/com/unisinsight/project/service/impl/StoragePoolServiceImpl.java @@ -12,6 +12,7 @@ import com.unisinsight.project.exception.BusinessException; import com.unisinsight.project.feign.ExternalApiClient; import com.unisinsight.project.mapper.StoragePoolMapper; import com.unisinsight.project.service.StoragePoolService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,10 +22,14 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 存储池服务实现类 */ +@Slf4j @Service public class StoragePoolServiceImpl extends ServiceImpl implements StoragePoolService { @@ -181,6 +186,7 @@ public class StoragePoolServiceImpl extends ServiceImpl response; try { @@ -192,22 +198,69 @@ public class StoragePoolServiceImpl extends ServiceImpl vmStoragePoolList = response.getData().getItems(); - if (CollectionUtils.isEmpty(vmStoragePoolList)) { - return; - } - List networkManageList = new ArrayList<>(); - for (VmStoragePool vmStoragePool : vmStoragePoolList) { + List remoteStoragePools = response.getData().getItems(); + + // 获取本地所有存储池数据 + List localStoragePools = this.list(); + + // 创建映射便于查找 + Map remoteMap = remoteStoragePools.stream() + .collect(Collectors.toMap(VmStoragePool::getName, Function.identity())); + + Map localMap = localStoragePools.stream() + .collect(Collectors.toMap(StoragePool::getPoolName, Function.identity())); + + // 分类处理数据 + List toAdd = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + + // 处理远程数据:识别新增和修改项 + for (VmStoragePool remotePool : remoteStoragePools) { + StoragePool localPool = localMap.get(remotePool.getName()); StoragePool storagePool = new StoragePool(); - BeanUtils.copyProperties(vmStoragePool, storagePool); - storagePool.setPoolName(vmStoragePool.getName()); - storagePool.setStatus("active".equals(vmStoragePool.getState()) ? 1 : 2); - networkManageList.add(storagePool); + BeanUtils.copyProperties(remotePool, storagePool); + storagePool.setPoolName(remotePool.getName()); + storagePool.setStatus("active".equals(remotePool.getState()) ? 1 : 2); + + if (localPool == null) { + // 新增项 + storagePool.setCreateTime(new Date()); + storagePool.setUpdateTime(new Date()); + toAdd.add(storagePool); + } else { + // 修改项 + storagePool.setId(localPool.getId()); + storagePool.setCreateTime(localPool.getCreateTime()); + storagePool.setUpdateTime(new Date()); + toUpdate.add(storagePool); + } } - // 清空数据并重新插入 - this.remove(new QueryWrapper<>()); - this.saveOrUpdateBatch(networkManageList); + // 识别删除项 + List toRemoveNames = new ArrayList<>(); + for (StoragePool localPool : localStoragePools) { + if (!remoteMap.containsKey(localPool.getPoolName())) { + toRemoveNames.add(localPool.getPoolName()); + } + } + // 执行批量操作 + if (!toAdd.isEmpty()) { + this.saveBatch(toAdd); + log.info("新增 {} 条存储池数据", toAdd.size()); + } + + if (!toUpdate.isEmpty()) { + this.updateBatchById(toUpdate); + log.info("更新 {} 条存储池数据", toUpdate.size()); + } + + if (!toRemoveNames.isEmpty()) { + QueryWrapper deleteWrapper = new QueryWrapper<>(); + deleteWrapper.in("pool_name", toRemoveNames); + this.remove(deleteWrapper); + log.info("删除 {} 条存储池数据", toRemoveNames.size()); + } } + }