Commit cd341da674be599301a8fffa3cadc664505c58ad

Authored by puhui999
1 parent bc77af09

perf:【INFRA 基础设施】代码生成主子表非 erp 模式时,当子表一对多时更新改为通过 diffList 实现对应的增删改

yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
@@ -236,6 +236,7 @@ public class CodegenEngine { @@ -236,6 +236,7 @@ public class CodegenEngine {
236 + '.' + "framework"); // 用于后续获取测试类的 package 地址 236 + '.' + "framework"); // 用于后续获取测试类的 package 地址
237 globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); 237 globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax");
238 globalBindingMap.put("voType", codegenProperties.getVoType()); 238 globalBindingMap.put("voType", codegenProperties.getVoType());
  239 + globalBindingMap.put("deleteBatchEnable", codegenProperties.getDeleteBatchEnable());
239 // 全局 Java Bean 240 // 全局 Java Bean
240 globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); 241 globalBindingMap.put("CommonResultClassName", CommonResult.class.getName());
241 globalBindingMap.put("PageResultClassName", PageResult.class.getName()); 242 globalBindingMap.put("PageResultClassName", PageResult.class.getName());
@@ -257,6 +258,7 @@ public class CodegenEngine { @@ -257,6 +258,7 @@ public class CodegenEngine {
257 globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName()); 258 globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName());
258 globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); 259 globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName());
259 globalBindingMap.put("BeanUtils", BeanUtils.class.getName()); 260 globalBindingMap.put("BeanUtils", BeanUtils.class.getName());
  261 + globalBindingMap.put("CollectionUtilsClassName", CollectionUtils.class.getName());
260 } 262 }
261 263
262 /** 264 /**
@@ -382,7 +384,6 @@ public class CodegenEngine { @@ -382,7 +384,6 @@ public class CodegenEngine {
382 bindingMap.put("columns", columns); 384 bindingMap.put("columns", columns);
383 bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 385 bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段
384 bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); 386 bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene()));
385 - bindingMap.put("deleteBatchEnable", codegenProperties.getDeleteBatchEnable());  
386 // className 相关 387 // className 相关
387 // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 388 // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀
388 String className = table.getClassName(); 389 String className = table.getClassName();
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/inner/Demo03StudentInnerServiceImpl.java
1 package cn.iocoder.yudao.module.infra.service.demo.demo03.inner; 1 package cn.iocoder.yudao.module.infra.service.demo.demo03.inner;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerPageReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.inner.vo.Demo03StudentInnerPageReqVO;
@@ -19,6 +20,8 @@ import org.springframework.validation.annotation.Validated; @@ -19,6 +20,8 @@ import org.springframework.validation.annotation.Validated;
19 import java.util.List; 20 import java.util.List;
20 21
21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
22 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO03_STUDENT_NOT_EXISTS; 25 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO03_STUDENT_NOT_EXISTS;
23 26
24 /** 27 /**
@@ -127,9 +130,26 @@ public class Demo03StudentInnerServiceImpl implements Demo03StudentInnerService @@ -127,9 +130,26 @@ public class Demo03StudentInnerServiceImpl implements Demo03StudentInnerService
127 } 130 }
128 131
129 private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) { 132 private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {
130 - deleteDemo03CourseByStudentId(studentId);  
131 - list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新  
132 - createDemo03CourseList(studentId, list); 133 + list.forEach(o -> o.setStudentId(studentId));
  134 + List<Demo03CourseDO> oldList = demo03CourseInnerMapper.selectListByStudentId(studentId);
  135 + List<List<Demo03CourseDO>> diffList = diffList(oldList, list, (oldVal, newVal) -> {
  136 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  137 + if (same) {
  138 + newVal.setId(oldVal.getId()).setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  139 + }
  140 + return same;
  141 + });
  142 +
  143 + // 第二步,批量添加、修改、删除
  144 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  145 + demo03CourseInnerMapper.insertBatch(diffList.get(0));
  146 + }
  147 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  148 + demo03CourseInnerMapper.updateBatch(diffList.get(1));
  149 + }
  150 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  151 + demo03CourseInnerMapper.deleteByIds(convertList(diffList.get(2), Demo03CourseDO::getId));
  152 + }
133 } 153 }
134 154
135 private void deleteDemo03CourseByStudentId(Long studentId) { 155 private void deleteDemo03CourseByStudentId(Long studentId) {
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/demo/demo03/normal/Demo03StudentNormalServiceImpl.java
1 package cn.iocoder.yudao.module.infra.service.demo.demo03.normal; 1 package cn.iocoder.yudao.module.infra.service.demo.demo03.normal;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalPageReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.demo.demo03.normal.vo.Demo03StudentNormalPageReqVO;
@@ -19,6 +20,8 @@ import org.springframework.validation.annotation.Validated; @@ -19,6 +20,8 @@ import org.springframework.validation.annotation.Validated;
19 import java.util.List; 20 import java.util.List;
20 21
21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
22 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO03_STUDENT_NOT_EXISTS; 25 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DEMO03_STUDENT_NOT_EXISTS;
23 26
24 /** 27 /**
@@ -127,9 +130,26 @@ public class Demo03StudentNormalServiceImpl implements Demo03StudentNormalServic @@ -127,9 +130,26 @@ public class Demo03StudentNormalServiceImpl implements Demo03StudentNormalServic
127 } 130 }
128 131
129 private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) { 132 private void updateDemo03CourseList(Long studentId, List<Demo03CourseDO> list) {
130 - deleteDemo03CourseByStudentId(studentId);  
131 - list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新  
132 - createDemo03CourseList(studentId, list); 133 + list.forEach(o -> o.setStudentId(studentId));
  134 + List<Demo03CourseDO> oldList = demo03CourseNormalMapper.selectListByStudentId(studentId);
  135 + List<List<Demo03CourseDO>> diffList = diffList(oldList, list, (oldVal, newVal) -> {
  136 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  137 + if (same) {
  138 + newVal.setId(oldVal.getId()).setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  139 + }
  140 + return same;
  141 + });
  142 +
  143 + // 第二步,批量添加、修改、删除
  144 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  145 + demo03CourseNormalMapper.insertBatch(diffList.get(0));
  146 + }
  147 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  148 + demo03CourseNormalMapper.updateBatch(diffList.get(1));
  149 + }
  150 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  151 + demo03CourseNormalMapper.deleteByIds(convertList(diffList.get(2), Demo03CourseDO::getId));
  152 + }
133 } 153 }
134 154
135 private void deleteDemo03CourseByStudentId(Long studentId) { 155 private void deleteDemo03CourseByStudentId(Long studentId) {
yudao-module-infra/src/main/resources/codegen/java/service/serviceImpl.vm
@@ -25,6 +25,8 @@ import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.busines @@ -25,6 +25,8 @@ import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.busines
25 #end 25 #end
26 26
27 import static ${ServiceExceptionUtilClassName}.exception; 27 import static ${ServiceExceptionUtilClassName}.exception;
  28 +import static ${CollectionUtilsClassName}.convertList;
  29 +import static ${CollectionUtilsClassName}.diffList;
28 import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; 30 import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*;
29 31
30 /** 32 /**
@@ -56,9 +58,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -56,9 +58,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
56 #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 58 #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
57 #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 59 #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
58 // 校验${treeParentColumn.columnComment}的有效性 60 // 校验${treeParentColumn.columnComment}的有效性
59 - validateParent${simpleClassName}(null, ${createReqVOVar}.get${TreeParentJavaField}()); 61 + validateParent${simpleClassName}(null, ${saveReqVOVar}.get${TreeParentJavaField}());
60 // 校验${treeNameColumn.columnComment}的唯一性 62 // 校验${treeNameColumn.columnComment}的唯一性
61 - validate${simpleClassName}${TreeNameJavaField}Unique(null, ${createReqVOVar}.get${TreeParentJavaField}(), ${createReqVOVar}.get${TreeNameJavaField}()); 63 + validate${simpleClassName}${TreeNameJavaField}Unique(null, ${saveReqVOVar}.get${TreeParentJavaField}(), ${saveReqVOVar}.get${TreeNameJavaField}());
62 64
63 #end 65 #end
64 // 插入 66 // 插入
@@ -76,9 +78,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -76,9 +78,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
76 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 78 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
77 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 79 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
78 #if ( $subTable.subJoinMany) 80 #if ( $subTable.subJoinMany)
79 - create${subSimpleClassName}List(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}s()); 81 + create${subSimpleClassName}List(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}s());
80 #else 82 #else
81 - create${subSimpleClassName}(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}()); 83 + create${subSimpleClassName}(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}());
82 #end 84 #end
83 #end 85 #end
84 #end 86 #end
@@ -372,14 +374,31 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -372,14 +374,31 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
372 #else 374 #else
373 #if ( $subTable.subJoinMany) 375 #if ( $subTable.subJoinMany)
374 private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { 376 private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
375 - list.forEach(o -> o.set$SubJoinColumnName(${subJoinColumn.javaField})); 377 + list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}));
376 ${subClassNameVars.get($index)}Mapper.insertBatch(list); 378 ${subClassNameVars.get($index)}Mapper.insertBatch(list);
377 } 379 }
378 380
379 private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { 381 private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
380 - delete${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField});  
381 - list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新  
382 - create${subSimpleClassName}List(${subJoinColumn.javaField}, list); 382 + list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}));
  383 + List<${subTable.className}DO> oldList = ${subClassNameVar}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField});
  384 + List<List<${subTable.className}DO>> diffList = diffList(oldList, list, (oldVal, newVal) -> {
  385 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  386 + if (same) {
  387 + newVal.setId(oldVal.getId()).setUpdater(null).setUpdateTime(null); // 解决更新情况下:updateTime 不更新
  388 + }
  389 + return same;
  390 + });
  391 +
  392 + // 第二步,批量添加、修改、删除
  393 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  394 + ${subClassNameVar}Mapper.insertBatch(diffList.get(0));
  395 + }
  396 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  397 + ${subClassNameVar}Mapper.updateBatch(diffList.get(1));
  398 + }
  399 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  400 + ${subClassNameVar}Mapper.deleteByIds(convertList(diffList.get(2), ${subTable.className}DO::getId));
  401 + }
383 } 402 }
384 403
385 #else 404 #else