fix: 性能优化

This commit is contained in:
cuijiawang 2025-09-28 10:41:05 +08:00
parent 852eb05cbf
commit a4d6306259

View File

@ -18,8 +18,10 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -129,11 +131,24 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
@Override
public List<TemplateRepositoryDTO> getAvailableTemplates(Long userId) {
// 确保用户仓库已初始化
initUserRepository(userId);
List<TemplateRepositoryDTO> result = new ArrayList<>();
// 一次性获取用户的所有仓库配置避免N+1查询
List<UserTemplateRepository> userRepositories = repositoryMapper.selectAllByUserId(userId);
// 如果用户没有任何仓库配置才进行初始化
if (userRepositories.isEmpty()) {
initUserRepository(userId);
// 重新获取初始化后的配置
userRepositories = repositoryMapper.selectAllByUserId(userId);
}
Map<String, UserTemplateRepository> repoMap = userRepositories.stream()
.collect(Collectors.toMap(
repo -> repo.getTemplateSource() + ":" + repo.getTemplateId(),
repo -> repo
));
// 1. 添加系统模板
try {
JSONArray systemTemplates = JSONArray.parseArray(generatorService.getTemplateConfig());
@ -151,8 +166,9 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
dto.setTemplateGroup(groupName);
dto.setDescription(template.getString("description")); // 系统模板描述
// 从用户仓库获取显示状态
UserTemplateRepository userRepo = repositoryMapper.selectByTemplate(userId, "system", template.getString("id"));
// 从内存中获取显示状态避免数据库查询
String key = "system:" + template.getString("id");
UserTemplateRepository userRepo = repoMap.get(key);
dto.setIsEnabled(userRepo != null ? userRepo.getIsEnabled() : 1); // 默认显示
result.add(dto);
@ -172,8 +188,9 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
dto.setTemplateGroup(template.getTemplateGroup());
dto.setDescription(template.getDescription()); // 用户模板描述
// 从用户仓库获取显示状态
UserTemplateRepository userRepo = repositoryMapper.selectByTemplate(userId, "user", template.getId().toString());
// 从内存中获取显示状态避免数据库查询
String key = "user:" + template.getId().toString();
UserTemplateRepository userRepo = repoMap.get(key);
dto.setIsEnabled(userRepo != null ? userRepo.getIsEnabled() : 1); // 默认显示
result.add(dto);
@ -299,7 +316,14 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
@Transactional
public boolean initUserRepository(Long userId) {
try {
// 先获取用户已有的仓库配置
List<UserTemplateRepository> existingRepos = repositoryMapper.selectAllByUserId(userId);
Set<String> existingKeys = existingRepos.stream()
.map(repo -> repo.getTemplateSource() + ":" + repo.getTemplateId())
.collect(Collectors.toSet());
int sortOrder = repositoryMapper.getMaxSortOrder(userId) + 1;
List<UserTemplateRepository> toInsert = new ArrayList<>();
// 1. 将系统默认模板添加到用户仓库如果不存在
JSONArray systemTemplates = JSONArray.parseArray(generatorService.getTemplateConfig());
@ -312,9 +336,10 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
for (Object templateObj : templates) {
JSONObject template = (JSONObject) templateObj;
String templateId = template.getString("id");
String key = "system:" + templateId;
// 检查是否已存在
if (repositoryMapper.checkTemplateExists(userId, "system", templateId) == 0) {
// 从内存中检查是否已存在避免数据库查询
if (!existingKeys.contains(key)) {
UserTemplateRepository repository = new UserTemplateRepository();
repository.setUserId(userId);
repository.setTemplateSource("system");
@ -324,11 +349,16 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
repository.setIsEnabled(1); // 系统模板默认启用
repository.setSortOrder(sortOrder++);
repositoryMapper.insert(repository);
toInsert.add(repository);
}
}
}
// 批量插入减少数据库交互
for (UserTemplateRepository repo : toInsert) {
repositoryMapper.insert(repo);
}
// 2. 将公开的用户模板添加到用户仓库如果不存在
List<UserTemplate> publicTemplates = userTemplateMapper.selectPublicTemplates(null);
for (UserTemplate template : publicTemplates) {