From 3d7fd649fd4b8c80a8cca9c1fcd7907ee05aca6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=B0=8F=E7=8E=8B=E5=AD=90?= Date: Fri, 12 Apr 2024 21:33:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Ruoyi-Flex-Guide.docx | Bin 4160463 -> 4160533 bytes .../src/main/resources/logback-plus.xml | 4 +- .../ruoyi/generator/util/VelocityUtils.java | 5 + .../main/resources/vm/java/controller.java.vm | 25 ++++ .../main/resources/vm/java/listener.java.vm | 126 ++++++++++++++++++ .../main/resources/vm/java/service.java.vm | 8 ++ .../resources/vm/java/serviceImpl.java.vm | 95 +++++++++++++ .../main/resources/vm/java/vo-import.java.vm | 70 ++++++++++ .../vm/vue/element.ts.index-tree.vue.vm | 113 ++++++++++++++-- .../resources/vm/vue/element.ts.index.vue.vm | 91 ++++++++++++- 10 files changed, 522 insertions(+), 15 deletions(-) create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/listener.java.vm create mode 100644 ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo-import.java.vm diff --git a/doc/Ruoyi-Flex-Guide.docx b/doc/Ruoyi-Flex-Guide.docx index 068631ec6309c1346a6cdccfe8150d36df131382..928fc453569e22570a6af731a79e313d0dfd9232 100644 GIT binary patch delta 31706 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≺=0|qb)Goednx|Xw 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 diff --git a/ruoyi-extra/ruoyi-easyretry-server/src/main/resources/logback-plus.xml b/ruoyi-extra/ruoyi-easyretry-server/src/main/resources/logback-plus.xml index cdd5451..bcd3abc 100644 --- a/ruoyi-extra/ruoyi-easyretry-server/src/main/resources/logback-plus.xml +++ b/ruoyi-extra/ruoyi-easyretry-server/src/main/resources/logback-plus.xml @@ -36,7 +36,7 @@ ${log.path}/info.log - ${log.base}/info.%d{yyyy-MM-dd}.log + ${log.path}/info.%d{yyyy-MM-dd}.log 60 @@ -52,7 +52,7 @@ ${log.path}/error.log - ${log.base}/error.%d{yyyy-MM-dd}.log + ${log.path}/error.%d{yyyy-MM-dd}.log 60 diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 90b085b..a3a6cd7 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -136,11 +136,13 @@ public class VelocityUtils { List templates = new ArrayList<>(); templates.add("vm/java/domain.java.vm"); templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/vo-import.java.vm"); templates.add("vm/java/bo.java.vm"); templates.add("vm/java/mapper.java.vm"); templates.add("vm/java/service.java.vm"); templates.add("vm/java/serviceImpl.java.vm"); templates.add("vm/java/controller.java.vm"); + templates.add("vm/java/listener.java.vm"); templates.add("vm/xml/mapper.xml.vm"); if (DataBaseHelper.isPostgreSql()) { templates.add("vm/sql/postgresql/sql.vm"); @@ -225,6 +227,7 @@ public class VelocityUtils { case "vm/java/sub-domain.java.vm" -> fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); case "vm/java/vo.java.vm" -> fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + case "vm/java/vo-import.java.vm" -> fileName = StringUtils.format("{}/domain/vo/{}ImportVo.java", javaPath, className); case "vm/java/bo.java.vm" -> fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); case "vm/java/mapper.java.vm" -> fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); @@ -236,6 +239,8 @@ public class VelocityUtils { fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); case "vm/java/controller.java.vm" -> fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + case "vm/java/listener.java.vm" -> + fileName = StringUtils.format("{}/listener/{}ImportListener.java", javaPath, className); case "vm/xml/mapper.xml.vm" -> fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); case "vm/xml/sub-mapper.xml.vm" -> fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, genTable.getSubTable().getClassName()); diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 5f7a568..7db75d6 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -1,5 +1,6 @@ package ${packageName}.controller; +import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; @@ -7,6 +8,7 @@ import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; +import com.ruoyi.common.excel.core.ExcelResult; import com.ruoyi.common.core.core.domain.R; import com.ruoyi.common.excel.utils.ExcelUtil; import com.ruoyi.common.log.annotation.Log; @@ -15,8 +17,11 @@ import com.ruoyi.common.web.annotation.RepeatSubmit; import com.ruoyi.common.web.core.BaseController; import jakarta.annotation.Resource; import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.vo.${ClassName}ImportVo; import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.listener.${ClassName}ImportListener; import ${packageName}.service.I${ClassName}Service; +import org.springframework.web.multipart.MultipartFile; #if($table.crud || $table.sub) import com.ruoyi.common.orm.core.page.TableDataInfo; @@ -68,6 +73,26 @@ public class ${ClassName}Controller extends BaseController ExcelUtil.exportExcel(list, "${functionName}", ${ClassName}Vo.class, response); } + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "${functionName}", businessType = BusinessType.IMPORT) + @SaCheckPermission("${permissionPrefix}:import") + @PostMapping("/importData") + public R importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult<${ClassName}ImportVo> result = ExcelUtil.importExcel(file.getInputStream(), ${ClassName}ImportVo.class, new ${ClassName}ImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + @SaCheckPermission("${permissionPrefix}:import") + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "${functionName}", ${ClassName}ImportVo.class, response); + } + /** * 获取${functionName}详细信息 */ diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/listener.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/listener.java.vm new file mode 100644 index 0000000..0c16aa9 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/listener.java.vm @@ -0,0 +1,126 @@ +package ${packageName}.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.utils.SpringUtils; +import com.ruoyi.common.core.utils.ValidatorUtils; +import com.ruoyi.common.excel.core.ExcelListener; +import com.ruoyi.common.excel.core.ExcelResult; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.domain.vo.*; +import ${packageName}.service.*; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * ${functionName}自定义导入 + * + * @author ${author} + */ +@Slf4j +public class ${ClassName}ImportListener extends AnalysisEventListener<${ClassName}ImportVo> implements ExcelListener<${ClassName}ImportVo> { + private final I${ClassName}Service ${className}Service; + + private final Boolean isUpdateSupport; + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public ${ClassName}ImportListener(Boolean isUpdateSupport) { + this.${className}Service = SpringUtils.getBean(I${ClassName}Service.class); + this.isUpdateSupport = isUpdateSupport; + } + + @Override + public void invoke(${ClassName}ImportVo ${className}Vo, AnalysisContext context) { + try { + + ${ClassName}Bo ${className}Bo = BeanUtil.toBean(${className}Vo, ${ClassName}Bo.class); + + //TODO:根据某个字段,查询数据库表中是否存在记录,不存在就新增,存在就更新 + ${ClassName}Vo ${className}Vo1 = null; + + #if($table.tree) + ${className}Vo1 = ${className}Service.selectById(${className}Vo.get${pkColumn.capJavaField}()); + #else + //${className}Vo1 = ${className}Service.selectBySomefield(${className}Vo.getSomefield()); + #end + if (ObjectUtil.isNull(${className}Vo1)) { + //不存在就新增 + ${className}Bo.setVersion(0); + ValidatorUtils.validate(${className}Bo); + #if($table.tree) + boolean inserted = ${className}Service.insertWithPk(${className}Bo);//树表需要前台传来主键值 + #else + boolean inserted = ${className}Service.insert(${className}Bo); + #end + + if (inserted) { + successNum++; + successMsg.append("
").append(successNum).append("、${functionName} 记录导入成功"); + return; + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、${functionName} 记录导入失败"); + return; + } + } else if (isUpdateSupport) { + //存在就更新 + ${className}Bo.set${pkColumn.capJavaField}(${className}Vo1.get${pkColumn.capJavaField}());//主键 + ${className}Bo.setVersion(${className}Vo1.getVersion()); + boolean updated = ${className}Service.update(${className}Bo); + if (updated) { + successNum++; + successMsg.append("
").append(successNum).append("、${functionName} 记录更新成功"); + return; + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、${functionName} 记录更新失败"); + return; + } + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、${functionName} 记录导入失败:"; + failureMsg.append(msg).append(e.getMessage()); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult<${ClassName}ImportVo> getExcelResult() { + return new ExcelResult<>() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List<${ClassName}ImportVo> getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm index 72ba8eb..8023bb5 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -51,6 +51,14 @@ public interface I${ClassName}Service extends IBaseService<${ClassName}> */ boolean insert(${ClassName}Bo ${className}Bo); + /** + * 新增${functionName},前台提供主键值,一般用于导入的场合 + * + * @param ${className}Bo ${functionName}Bo + * @return 结果:true 操作成功,false 操作失败 + */ + boolean insertWithPk(${ClassName}Bo ${className}Bo); + /** * 修改${functionName} * diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index 5be2a76..5dd1937 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -5,7 +5,9 @@ import java.util.List; import java.util.Map; import cn.hutool.core.util.ObjectUtil; import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryMethods; import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.update.UpdateChain; import com.ruoyi.common.core.utils.MapstructUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.orm.core.page.PageQuery; @@ -149,6 +151,21 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper, { ${ClassName} ${className} = MapstructUtils.convert(${className}Bo, ${ClassName}.class); +#if($table.tree) + //获取祖级列表字段 + Long parentId = ${className}.getParentId(); + if (parentId == 0) { + ${className}.setAncestors("0"); + } else { + ${ClassName}Vo parent${ClassName} = selectById(${className}Bo.getParentId()); + if (ObjectUtil.isNotNull(parent${ClassName})) { + ${className}.setAncestors(parent${ClassName}.getAncestors()+"," +parentId); + } else { + ${className}.setAncestors("0"); + } + } +#end + #if($table.sub) boolean inserted = this.save(${className});//使用全局配置的雪花算法主键生成器生成ID值 if (inserted && ObjectUtil.isNotNull(${className})) { @@ -160,6 +177,46 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper, #end } + /** + * 新增${functionName},前台提供主键值,一般用于导入的场合 + * + * @param ${className}Bo ${functionName}Bo + * @return 结果:true 操作成功,false 操作失败 + */ + #if($table.sub) + @Transactional + #end + @Override + public boolean insertWithPk(${ClassName}Bo ${className}Bo) + { + ${ClassName} ${className} = MapstructUtils.convert(${className}Bo, ${ClassName}.class); + + #if($table.tree) + //获取祖级列表字段 + Long parentId = ${className}.getParentId(); + if (parentId == 0) { + ${className}.setAncestors("0"); + } else { + ${ClassName}Vo parent${ClassName} = selectById(${className}Bo.getParentId()); + if (ObjectUtil.isNotNull(parent${ClassName})) { + ${className}.setAncestors(parent${ClassName}.getAncestors()+"," +parentId); + } else { + ${className}.setAncestors("0"); + } + } + #end + + #if($table.sub) + boolean inserted = ${className}Mapper.insertWithPk(${className}) > 0;//前台传来主键值 + if (inserted && ObjectUtil.isNotNull(${className})) { + return insert${subClassName}(${className}); + } + return false; + #else + return ${className}Mapper.insertWithPk(${className}) > 0;//前台传来主键值 + #end + } + /** * 修改${functionName} * @@ -174,6 +231,17 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper, { ${ClassName} ${className} = MapstructUtils.convert(${className}Bo, ${ClassName}.class); if(ObjectUtil.isNotNull(${className}) && ObjectUtil.isNotNull(${className}.get${pkColumn.capJavaField}())) { + #if($table.tree) + //更新祖级列表字段 + ${ClassName}Vo newParent${ClassName} = selectById(${className}.getParentId()); + ${ClassName}Vo old${ClassName} = selectById(${className}.get${pkColumn.capJavaField}()); + if ( ObjectUtil.isNotNull(newParent${ClassName}) && ObjectUtil.isNotNull(old${ClassName}) ) { + String newAncestors = newParent${ClassName}.getAncestors() + "," + newParent${ClassName}.get${pkColumn.capJavaField}(); + String oldAncestors = old${ClassName}.getAncestors(); + ${className}.setAncestors(newAncestors); + update${ClassName}Children(${className}.get${pkColumn.capJavaField}(), newAncestors, oldAncestors); + } + #end boolean updated = this.updateById(${className}); #if($table.sub) if (updated) { @@ -188,6 +256,33 @@ public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper, return false; } + #if($table.tree) + /** + * 修改子元素关系 + * + * @param ${pkColumn.javaField} 主键ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + @Transactional + public void update${ClassName}Children(Long ${pkColumn.javaField}, String newAncestors, String oldAncestors) { + QueryWrapper queryWrapper = QueryWrapper.create() + .from(${CapitalUnderScoreClassName}) + .where(QueryMethods.findInSet(QueryMethods.number(${pkColumn.javaField}), ${CapitalUnderScoreClassName}.ANCESTORS).gt(0)); + + List<${ClassName}Vo> children = this.listAs(queryWrapper, ${ClassName}Vo.class); + + for (${ClassName}Vo child : children) { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + + UpdateChain.of(${ClassName}.class) + .set(${ClassName}::getAncestors, child.getAncestors()) + .where(${ClassName}::get${pkColumn.capJavaField}).eq(child.get${pkColumn.capJavaField}()) + .update(); + } + } + #end + /** * 批量删除${functionName} * diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo-import.java.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo-import.java.vm new file mode 100644 index 0000000..afee2d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/vo-import.java.vm @@ -0,0 +1,70 @@ +package ${packageName}.domain.vo; + +#foreach ($import in $importList) +import ${import}; +#end +import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.excel.annotation.ExcelDictFormat; +import com.ruoyi.common.excel.convert.ExcelDictConvert; +import lombok.Data; +import java.io.Serial; +import java.io.Serializable; +import lombok.NoArgsConstructor; + +/** + * ${functionName}导入视图对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ + +@Data +@NoArgsConstructor +public class ${ClassName}ImportVo implements Serializable +{ + + @Serial + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) + #if($column.isPk=='1') + #if($table.tree) + /** $column.columnComment */ + @ExcelProperty(value = "${column.columnComment}") + private $column.javaType $column.javaField; + #end + #end +#end + + #foreach ($column in $columns) +#if($column.isPk!='1') +#if(!$table.isSuperColumn($column.javaField) || ($column.javaField.equals("parentId")) || ($column.javaField.equals("orderNum"))) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if(${column.dictType} && ${column.dictType} != '') + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "${column.dictType}") +#elseif($parentheseIndex != -1) + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") +#else + @ExcelProperty(value = "${comment}") +#end + private $column.javaType $column.javaField; + +#else + @ExcelProperty(value = "${column.columnComment}") + private $column.javaType $column.javaField; + +#end +#end +#end +#end + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index-tree.vue.vm b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index-tree.vue.vm index d460877..d2495c7 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index-tree.vue.vm +++ b/ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/element.ts.index-tree.vue.vm @@ -73,7 +73,10 @@ 新增 - 导出 + 导入 + + + 导出 展开/折叠 @@ -271,12 +274,50 @@ + + + + + + + +
将文件拖到此处,或点击上传
+ +
+ +
-