fix: 代码生成器 系统模板

This commit is contained in:
cuijiawang 2025-09-29 16:55:30 +08:00
parent 5e47425ab5
commit 2d75478bb7

View File

@ -3,7 +3,6 @@ package com.agileboot.codegen.service.impl;
import com.agileboot.codegen.dto.TemplateRepositoryDTO;
import com.agileboot.codegen.entity.UserTemplate;
import com.agileboot.codegen.entity.UserTemplateRepository;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.agileboot.codegen.mapper.UserTemplateMapper;
import com.agileboot.codegen.mapper.UserTemplateRepositoryMapper;
import com.agileboot.codegen.service.IGeneratorService;
@ -16,17 +15,12 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
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.*;
import java.util.stream.Collectors;
/**
* 模板仓库 Service实现类
*
*
* @author system
* @date 2025-09-26
*/
@ -43,51 +37,51 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
public JSONArray getUserTemplateConfig(Long userId) {
// 获取用户启用的模板仓库配置公开模板
List<UserTemplateRepository> repositories = repositoryMapper.selectEnabledByUserId(userId);
// 按分组组织模板
Map<String, List<JSONObject>> groupedTemplates = new HashMap<>();
for (UserTemplateRepository repo : repositories) {
String group = repo.getTemplateGroup();
JSONObject template = new JSONObject();
template.put("id", repo.getTemplateId());
template.put("name", repo.getTemplateName());
template.put("description", repo.getTemplateName());
template.put("source", repo.getTemplateSource()); // 添加来源标识
groupedTemplates.computeIfAbsent(group, k -> new ArrayList<>()).add(template);
}
// 添加用户自己的启用模板包括私有模板
List<UserTemplate> userEnabledTemplates = userTemplateMapper.selectList(
new LambdaQueryWrapper<UserTemplate>()
.eq(UserTemplate::getUserId, userId)
.eq(UserTemplate::getIsEnabled, 1)
.eq(UserTemplate::getStatus, 1) // 只包含发布状态的模板
new LambdaQueryWrapper<UserTemplate>()
.eq(UserTemplate::getUserId, userId)
.eq(UserTemplate::getIsEnabled, 1)
.eq(UserTemplate::getStatus, 1) // 只包含发布状态的模板
);
for (UserTemplate userTemplate : userEnabledTemplates) {
// 如果是公开模板且已经在仓库配置中跳过避免重复
if (userTemplate.getIsPublic() == 1) {
boolean alreadyInRepo = repositories.stream()
.anyMatch(repo -> "user".equals(repo.getTemplateSource()) &&
userTemplate.getId().toString().equals(repo.getTemplateId()));
.anyMatch(repo -> "user".equals(repo.getTemplateSource()) &&
userTemplate.getId().toString().equals(repo.getTemplateId()));
if (alreadyInRepo) {
continue;
}
}
String group = userTemplate.getTemplateGroup();
JSONObject template = new JSONObject();
template.put("id", userTemplate.getId().toString());
template.put("name", userTemplate.getTemplateName());
template.put("description", userTemplate.getTemplateName());
template.put("source", "user");
groupedTemplates.computeIfAbsent(group, k -> new ArrayList<>()).add(template);
}
// 如果用户没有配置任何模板先初始化用户仓库然后重新获取
if (groupedTemplates.isEmpty()) {
log.info("用户 {} 没有模板配置,自动初始化用户仓库", userId);
@ -97,13 +91,13 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
repositories = repositoryMapper.selectEnabledByUserId(userId);
for (UserTemplateRepository repo : repositories) {
String group = repo.getTemplateGroup();
JSONObject template = new JSONObject();
template.put("id", repo.getTemplateId());
template.put("name", repo.getTemplateName());
template.put("description", repo.getTemplateName());
template.put("source", repo.getTemplateSource());
groupedTemplates.computeIfAbsent(group, k -> new ArrayList<>()).add(template);
}
} else {
@ -111,7 +105,7 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
return JSONArray.parseArray(generatorService.getTemplateConfig());
}
}
// 转换为JSONArray格式
JSONArray result = new JSONArray();
for (Map.Entry<String, List<JSONObject>> entry : groupedTemplates.entrySet()) {
@ -120,7 +114,7 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
group.put("templates", entry.getValue());
result.add(group);
}
return result;
}
@ -132,23 +126,23 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
@Override
public List<TemplateRepositoryDTO> getAvailableTemplates(Long 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
));
.collect(Collectors.toMap(
repo -> repo.getTemplateSource() + ":" + repo.getTemplateId(),
repo -> repo
));
// 1. 添加系统模板
try {
JSONArray systemTemplates = JSONArray.parseArray(generatorService.getTemplateConfig());
@ -156,7 +150,7 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
JSONObject group = (JSONObject) groupObj;
String groupName = group.getString("group");
JSONArray templates = group.getJSONArray("templates");
for (Object templateObj : templates) {
JSONObject template = (JSONObject) templateObj;
TemplateRepositoryDTO dto = new TemplateRepositoryDTO();
@ -165,19 +159,19 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
dto.setTemplateName(template.getString("name"));
dto.setTemplateGroup(groupName);
dto.setDescription(template.getString("description")); // 系统模板描述
// 从内存中获取显示状态避免数据库查询
String key = "system:" + template.getString("id");
UserTemplateRepository userRepo = repoMap.get(key);
dto.setIsEnabled(userRepo != null ? userRepo.getIsEnabled() : 1); // 默认显示
dto.setIsEnabled(userRepo != null ? userRepo.getIsEnabled() : 0); // 默认显示
result.add(dto);
}
}
} catch (Exception e) {
log.error("解析系统模板配置失败", e);
}
// 2. 添加公开的用户模板
List<UserTemplate> publicTemplates = userTemplateMapper.selectPublicTemplates(null);
for (UserTemplate template : publicTemplates) {
@ -187,27 +181,27 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
dto.setTemplateName(template.getTemplateName());
dto.setTemplateGroup(template.getTemplateGroup());
dto.setDescription(template.getDescription()); // 用户模板描述
// 从内存中获取显示状态避免数据库查询
String key = "user:" + template.getId().toString();
UserTemplateRepository userRepo = repoMap.get(key);
dto.setIsEnabled(userRepo != null ? userRepo.getIsEnabled() : 1); // 默认显示
dto.setIsEnabled(userRepo != null ? userRepo.getIsEnabled() : 0); // 默认显示
result.add(dto);
}
return result;
}
@Override
@Transactional
public boolean addTemplateToRepository(Long userId, String templateSource, String templateId,
String templateName, String templateGroup) {
public boolean addTemplateToRepository(Long userId, String templateSource, String templateId,
String templateName, String templateGroup) {
// 检查是否已存在
if (repositoryMapper.checkTemplateExists(userId, templateSource, templateId) > 0) {
return false;
}
UserTemplateRepository repository = new UserTemplateRepository();
repository.setUserId(userId);
repository.setTemplateSource(templateSource);
@ -216,7 +210,7 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
repository.setTemplateGroup(templateGroup);
repository.setIsEnabled(1);
repository.setSortOrder(repositoryMapper.getMaxSortOrder(userId) + 1);
return repositoryMapper.insert(repository) > 0;
}
@ -233,11 +227,11 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
if (repositoryMapper.checkTemplateExists(userId, templateSource, templateId) == 0) {
// 记录不存在需要先创建
log.info("模板记录不存在,先创建记录: userId={}, templateSource={}, templateId={}", userId, templateSource, templateId);
// 获取模板信息
String templateName = "";
String templateGroup = "";
if ("system".equals(templateSource)) {
// 系统模板从配置中获取信息
try {
@ -246,7 +240,7 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
JSONObject group = (JSONObject) groupObj;
String groupName = group.getString("group");
JSONArray templates = group.getJSONArray("templates");
for (Object templateObj : templates) {
JSONObject template = (JSONObject) templateObj;
if (templateId.equals(template.getString("id"))) {
@ -274,12 +268,12 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
return false;
}
}
if (templateName.isEmpty()) {
log.error("无法获取模板信息: templateSource={}, templateId={}", templateSource, templateId);
return false;
}
// 创建记录
UserTemplateRepository repository = new UserTemplateRepository();
repository.setUserId(userId);
@ -289,7 +283,7 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
repository.setTemplateGroup(templateGroup);
repository.setIsEnabled(isEnabled);
repository.setSortOrder(repositoryMapper.getMaxSortOrder(userId) + 1);
return repositoryMapper.insert(repository) > 0;
} else {
// 记录存在直接更新状态
@ -319,25 +313,25 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
// 先获取用户已有的仓库配置
List<UserTemplateRepository> existingRepos = repositoryMapper.selectAllByUserId(userId);
Set<String> existingKeys = existingRepos.stream()
.map(repo -> repo.getTemplateSource() + ":" + repo.getTemplateId())
.collect(Collectors.toSet());
.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());
for (Object groupObj : systemTemplates) {
JSONObject group = (JSONObject) groupObj;
String groupName = group.getString("group");
JSONArray templates = group.getJSONArray("templates");
for (Object templateObj : templates) {
JSONObject template = (JSONObject) templateObj;
String templateId = template.getString("id");
String key = "system:" + templateId;
// 从内存中检查是否已存在避免数据库查询
if (!existingKeys.contains(key)) {
UserTemplateRepository repository = new UserTemplateRepository();
@ -346,24 +340,24 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
repository.setTemplateId(templateId);
repository.setTemplateName(template.getString("name"));
repository.setTemplateGroup(groupName);
repository.setIsEnabled(1); // 系统模板默认启用
repository.setIsEnabled(0); // 系统模板默认启用
repository.setSortOrder(sortOrder++);
toInsert.add(repository);
}
}
}
// 批量插入减少数据库交互
for (UserTemplateRepository repo : toInsert) {
repositoryMapper.insert(repo);
}
// 2. 将公开的用户模板添加到用户仓库如果不存在
List<UserTemplate> publicTemplates = userTemplateMapper.selectPublicTemplates(null);
for (UserTemplate template : publicTemplates) {
String templateId = template.getId().toString();
// 检查是否已存在
if (repositoryMapper.checkTemplateExists(userId, "user", templateId) == 0) {
UserTemplateRepository repository = new UserTemplateRepository();
@ -374,11 +368,11 @@ public class TemplateRepositoryServiceImpl implements ITemplateRepositoryService
repository.setTemplateGroup(template.getTemplateGroup());
repository.setIsEnabled(1); // 公开模板默认启用
repository.setSortOrder(sortOrder++);
repositoryMapper.insert(repository);
}
}
return true;
} catch (Exception e) {
log.error("初始化用户模板仓库失败", e);