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()); + } } + }