模板组复制功能

This commit is contained in:
b2baccline
2020-06-30 16:34:15 +08:00
parent 4e05c2c1dd
commit 7d8aae8621
9 changed files with 220 additions and 73 deletions

View File

@@ -64,11 +64,28 @@ public class TemplateGroupController {
// @CreateOperationLogging(msg = "新增模板组" )
@PostMapping
// @PreAuthorize("@per.hasPermission('codegen:templategroup:add')" )
public R save(@RequestBody TemplateGroup templateGroup) {
public R<?> save(@RequestBody TemplateGroup templateGroup) {
return templateGroupService.save(templateGroup) ? R.ok()
: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "新增模板组失败");
}
/**
* 复制模板组
* @param resourceId 原模板组id
* @param templateGroup 新模板组实体
* @return R
*/
@PostMapping("/{resourceId}")
@ApiOperation(value = "复制模板组", notes = "复制模板组")
public R<?> copy(@PathVariable Integer resourceId,
@RequestBody TemplateGroup templateGroup) {
return templateGroupService.copy(resourceId, templateGroup) ? R.ok()
: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "复制模板组失败");
}
/**
* 修改模板组
* @param templateGroup 模板组

View File

@@ -30,6 +30,12 @@ public class TemplateInfo extends Model<TemplateInfo> {
@ApiModelProperty(value = "目录项ID")
private Integer directoryEntryId;
/**
* 模板组Id
*/
@ApiModelProperty(value = "模板组Id")
private Integer groupId;
/**
* 模板名称
*/

View File

@@ -1,6 +1,7 @@
package com.hccake.ballcat.codegen.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hccake.ballcat.codegen.model.bo.TemplateFile;
import com.hccake.ballcat.codegen.model.dto.TemplateDirectoryCreateDTO;
import com.hccake.ballcat.codegen.model.entity.TemplateDirectoryEntry;
import com.hccake.ballcat.codegen.model.vo.TemplateDirectoryEntryVO;
@@ -68,4 +69,17 @@ public interface TemplateDirectoryEntryService extends IService<TemplateDirector
*/
boolean removeEntry(Integer entryId, Integer mode);
/**
* 获取模板文件
* @param groupId 模板组Id
* @return List 模板文件
*/
List<TemplateFile> findTemplateFiles(Integer groupId);
/**
* 复制模板目录项文件
* @param resourceId 原模板组
* @param groupId 模板模板组
*/
void copy(Integer resourceId, Integer groupId);
}

View File

@@ -38,4 +38,13 @@ public interface TemplateGroupService extends IService<TemplateGroup> {
* @return List<SelectData<?>>
*/
List<SelectData<?>> getSelectData();
/**
* 复制模板组
*
* @param resourceId
* @param templateGroup 模板组
* @return boolean 复制成功: true
*/
boolean copy(Integer resourceId, TemplateGroup templateGroup);
}

View File

@@ -31,4 +31,10 @@ public interface TemplatePropertyService extends IService<TemplateProperty> {
*/
List<TemplatePropertyVO> list(Integer templateGroupId);
/**
* 复制模板属性配置
* @param resourceId 原模板组ID
* @param groupId 模板模板组ID
*/
void copy(Integer resourceId, Integer groupId);
}

View File

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.hccake.ballcat.codegen.constant.DirectoryEntryRemoveModeEnum;
import com.hccake.ballcat.codegen.constant.DirectoryEntryTypeEnum;
import com.hccake.ballcat.codegen.mapper.TemplateDirectoryEntryMapper;
import com.hccake.ballcat.codegen.model.bo.TemplateFile;
import com.hccake.ballcat.codegen.model.converter.TemplateModelConverter;
import com.hccake.ballcat.codegen.model.dto.TemplateDirectoryCreateDTO;
import com.hccake.ballcat.codegen.model.dto.TemplateInfoDTO;
@@ -26,7 +27,8 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -187,6 +189,117 @@ public class TemplateDirectoryEntryServiceImpl extends ServiceImpl<TemplateDirec
return SqlHelper.retBool(baseMapper.deleteById(entryId));
}
/**
* 复制模板目录项文件
*
* @param resourceId 原模板组
* @param groupId 模板模板组
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void copy(Integer resourceId, Integer groupId) {
// 1. ===============获取模板目录项==================
List<TemplateDirectoryEntry> list = baseMapper
.selectList(Wrappers.<TemplateDirectoryEntry>lambdaQuery().eq(TemplateDirectoryEntry::getGroupId, resourceId));
// 2. ============== 复制模板文件 ===================
Set<Integer> oldParentIdSet = new HashSet<>();
List<Integer> originEntryIds = new ArrayList<>();
for (TemplateDirectoryEntry entry : list) {
originEntryIds.add(entry.getId());
oldParentIdSet.add(entry.getParentId());
entry.setGroupId(groupId);
entry.setId(null);
entry.setCreateTime(null);
entry.setUpdateTime(null);
}
this.saveBatch(list);
// 3. =============== 获取新老ID的映射表key: oldId, value: newId ==========
Map<Integer, Integer> idMap = new HashMap<>();
for (int i = 0; i < originEntryIds.size(); i++) {
idMap.put(originEntryIds.get(i), list.get(i).getId());
}
// 4. =============== 更新复制出来的模板文件的父级ID ===============
// 父节点为根节点的不需要修改
oldParentIdSet.remove(GlobalConstants.TREE_ROOT_ID);
for (Integer oldParentId : oldParentIdSet) {
baseMapper.update(null, Wrappers.<TemplateDirectoryEntry>lambdaUpdate()
.set(TemplateDirectoryEntry::getParentId, idMap.get(oldParentId))
.eq(TemplateDirectoryEntry::getParentId, oldParentId)
.eq(TemplateDirectoryEntry::getGroupId, groupId));
}
// 5. ================保存模板文件详情信息===================
List<TemplateInfo> templateInfoList = templateInfoService.list(Wrappers.<TemplateInfo>lambdaQuery()
.eq(TemplateInfo::getGroupId, resourceId));
for (TemplateInfo templateInfo : templateInfoList) {
Integer oldId = templateInfo.getDirectoryEntryId();
Integer newId = idMap.get(oldId);
templateInfo.setDirectoryEntryId(newId);
templateInfo.setCreateTime(null);
templateInfo.setUpdateTime(null);
}
templateInfoService.saveBatch(templateInfoList);
}
/**
* 获取模板文件
* @param groupId 模板组Id
* @return List 模板文件
*/
@Override
public List<TemplateFile> findTemplateFiles(Integer groupId) {
// 获取模板目录项
List<TemplateDirectoryEntry> list = baseMapper.selectList(
Wrappers.<TemplateDirectoryEntry>lambdaQuery().eq(TemplateDirectoryEntry::getGroupId, groupId));
// 转树形目录结构
List<TemplateDirectory> treeList = TreeUtil.buildTree(list, GlobalConstants.TREE_ROOT_ID,
TemplateModelConverter.INSTANCE::entryPoToTree);
// 填充模板文件
List<TemplateFile> templateFiles = new ArrayList<>();
for (TemplateDirectory tree : treeList) {
fillTemplateFiles(tree, templateFiles, "");
}
return templateFiles;
}
/**
* 填充模板文件信息
* @param current 当前目录项
* @param list 模板文件列表
* @param path 当前目录路径
*/
@SuppressWarnings("unchecked")
private void fillTemplateFiles(TemplateDirectory current, List<TemplateFile> list, String path) {
// 文件夹类型则递归子节点
if (DirectoryEntryTypeEnum.FOLDER.getType().equals(current.getType())) {
List<TemplateDirectory> children = (List<TemplateDirectory>) current.getChildren();
// 递归调用子节点,查找叶子节点
if (CollectionUtil.isNotEmpty(children)) {
for (TemplateDirectory child : children) {
fillTemplateFiles(child, list, path + current.getFileName() + File.separator);
}
}
}
// 目录项类型为文件则记录(文件必然是叶子节点)
if (DirectoryEntryTypeEnum.FILE.getType().equals(current.getType())) {
// 查找对应的模板文件详情信息
TemplateInfo templateInfo = templateInfoService.getById(current.getId());
TemplateFile templateFile = new TemplateFile().setFileName(current.getFileName()).setFilePath(path)
.setContent(templateInfo.getContent()).setEngineType(templateInfo.getEngineType());
list.add(templateFile);
}
}
/**
* 新建一个目录项
* @param entryDTO 目录项新建传输对象

View File

@@ -1,32 +1,25 @@
package com.hccake.ballcat.codegen.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hccake.ballcat.codegen.constant.DirectoryEntryTypeEnum;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.hccake.ballcat.codegen.mapper.TemplateGroupMapper;
import com.hccake.ballcat.codegen.model.bo.TemplateFile;
import com.hccake.ballcat.codegen.model.converter.TemplateModelConverter;
import com.hccake.ballcat.codegen.model.entity.TemplateDirectoryEntry;
import com.hccake.ballcat.codegen.model.entity.TemplateGroup;
import com.hccake.ballcat.codegen.model.entity.TemplateInfo;
import com.hccake.ballcat.codegen.model.qo.TemplateGroupQO;
import com.hccake.ballcat.codegen.model.vo.TemplateDirectory;
import com.hccake.ballcat.codegen.model.vo.TemplateGroupVO;
import com.hccake.ballcat.codegen.service.TemplateDirectoryEntryService;
import com.hccake.ballcat.codegen.service.TemplateGroupService;
import com.hccake.ballcat.codegen.service.TemplateInfoService;
import com.hccake.ballcat.common.core.constant.GlobalConstants;
import com.hccake.ballcat.common.core.util.TreeUtil;
import com.hccake.ballcat.codegen.service.TemplatePropertyService;
import com.hccake.ballcat.common.core.vo.SelectData;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
@@ -39,12 +32,9 @@ import java.util.List;
@RequiredArgsConstructor
public class TemplateGroupServiceImpl extends ServiceImpl<TemplateGroupMapper, TemplateGroup>
implements TemplateGroupService {
private final static String TABLE_ALIAS_PREFIX = "tg.";
private final TemplateDirectoryEntryService templateDirectoryEntryService;
private final TemplateInfoService templateInfoService;
private final TemplatePropertyService templatePropertyService;
/**
* 根据QueryObject查询分页数据
@@ -66,20 +56,7 @@ public class TemplateGroupServiceImpl extends ServiceImpl<TemplateGroupMapper, T
*/
@Override
public List<TemplateFile> findTemplateFiles(Integer groupId) {
// 获取模板目录项
List<TemplateDirectoryEntry> list = templateDirectoryEntryService
.list(Wrappers.<TemplateDirectoryEntry>lambdaQuery().eq(TemplateDirectoryEntry::getGroupId, groupId));
// 转树形目录结构
List<TemplateDirectory> treeList = TreeUtil.buildTree(list, GlobalConstants.TREE_ROOT_ID,
TemplateModelConverter.INSTANCE::entryPoToTree);
// 填充模板文件
List<TemplateFile> templateFiles = new ArrayList<>();
for (TemplateDirectory tree : treeList) {
fillTemplateFiles(tree, templateFiles, "");
}
return templateFiles;
return templateDirectoryEntryService.findTemplateFiles(groupId);
}
/**
@@ -92,33 +69,27 @@ public class TemplateGroupServiceImpl extends ServiceImpl<TemplateGroupMapper, T
}
/**
* 填充模板文件信息
* @param current 当前目录项
* @param list 模板文件列表
* @param path 当前目录路径
* 复制模板组
*
*
* @param resourceId 原资源组id
* @param templateGroup 模板组
* @return boolean 复制成功: true
*/
@SuppressWarnings("unchecked")
private void fillTemplateFiles(TemplateDirectory current, List<TemplateFile> list, String path) {
@Override
@Transactional(rollbackFor = Exception.class)
public boolean copy(Integer resourceId, TemplateGroup templateGroup) {
// 清空id
templateGroup.setId(null);
int insertFlag = baseMapper.insert(templateGroup);
Assert.isTrue(SqlHelper.retBool(insertFlag), "复制模板组时,保存模板组失败:[{}]", templateGroup);
// 获取落库成功后的自增ID
Integer groupId = templateGroup.getId();
// 复制模板目录文件
templateDirectoryEntryService.copy(resourceId, groupId);
// 复制模板属性配置
templatePropertyService.copy(resourceId, groupId);
// 文件夹类型则递归子节点
if (DirectoryEntryTypeEnum.FOLDER.getType().equals(current.getType())) {
List<TemplateDirectory> children = (List<TemplateDirectory>) current.getChildren();
// 递归调用子节点,查找叶子节点
if (CollectionUtil.isNotEmpty(children)) {
for (TemplateDirectory child : children) {
fillTemplateFiles(child, list, path + current.getFileName() + File.separator);
}
}
}
// 目录项类型为文件则记录(文件必然是叶子节点)
if (DirectoryEntryTypeEnum.FILE.getType().equals(current.getType())) {
// 查找对应的模板文件详情信息
TemplateInfo templateInfo = templateInfoService.getById(current.getId());
TemplateFile templateFile = new TemplateFile().setFileName(current.getFileName()).setFilePath(path)
.setContent(templateInfo.getContent()).setEngineType(templateInfo.getEngineType());
list.add(templateFile);
}
return true;
}
}

View File

@@ -1,15 +1,16 @@
package com.hccake.ballcat.codegen.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hccake.ballcat.codegen.mapper.TemplatePropertyMapper;
import com.hccake.ballcat.codegen.model.converter.TemplatePropertyConverter;
import com.hccake.ballcat.codegen.model.entity.TemplateProperty;
import com.hccake.ballcat.codegen.model.vo.TemplatePropertyVO;
import com.hccake.ballcat.codegen.model.qo.TemplatePropertyQO;
import com.hccake.ballcat.codegen.mapper.TemplatePropertyMapper;
import com.hccake.ballcat.codegen.model.vo.TemplatePropertyVO;
import com.hccake.ballcat.codegen.service.TemplatePropertyService;
import org.springframework.stereotype.Service;
@@ -54,4 +55,26 @@ public class TemplatePropertyServiceImpl extends ServiceImpl<TemplatePropertyMap
return templateProperties.stream().map(TemplatePropertyConverter.INSTANCE::poToVo).collect(Collectors.toList());
}
/**
* 复制模板属性配置
* @param resourceId 原模板组ID
* @param groupId 模板模板组ID
*/
@Override
public void copy(Integer resourceId, Integer groupId) {
List<TemplateProperty> templateProperties = baseMapper
.selectList(Wrappers.<TemplateProperty>lambdaQuery().eq(TemplateProperty::getGroupId, resourceId));
if (CollectionUtil.isNotEmpty(templateProperties)) {
List<TemplateProperty> list = templateProperties.stream().peek(x -> {
x.setId(null);
x.setCreateTime(null);
x.setUpdateTime(null);
x.setGroupId(groupId);
}).collect(Collectors.toList());
this.saveBatch(list);
}
}
}

View File

@@ -2,22 +2,10 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hccake.ballcat.codegen.mapper.TemplateInfoMapper">
<resultMap id="templateMap" type="com.hccake.ballcat.codegen.model.entity.TemplateInfo">
<id property="directoryEntryId" column="directory_entry_id"/>
<result property="groupId" column="group_id"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<result property="engineType" column="engine_type"/>
<result property="remarks" column="remarks"/>
<result property="deleted" column="deleted"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<sql id="Base_Column_List">
directory_entry_id, title, content, engine_type, remarks, deleted, create_time, update_time </sql>
directory_entry_id, group_id, title, content, engine_type, remarks, deleted, create_time, update_time </sql>
<sql id="Base_Alias_Column_List">
t.directory_entry_id, t.title, t.content, t.engine_type, t.remarks, t.deleted, t.create_time, t.update_time </sql>
t.directory_entry_id, t.group_id, t.title, t.content, t.engine_type, t.remarks, t.deleted, t.create_time, t.update_time </sql>
</mapper>