Commit 7c09a1fc86dbb50b453dafb2e7c8d2e41cd4c9cc

Authored by zhijiantianya@gmail.com
1 parent 2f6456e2

代码生成器:主子表,支持普通、内嵌、ERP 三种模式

yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/demo02/InfraDemoStudentController.java
1 1 package cn.iocoder.yudao.module.infra.controller.admin.demo02;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  3 +import org.springframework.web.bind.annotation.*;
  4 +import javax.annotation.Resource;
  5 +import org.springframework.validation.annotation.Validated;
  6 +import org.springframework.security.access.prepost.PreAuthorize;
  7 +import io.swagger.v3.oas.annotations.tags.Tag;
  8 +import io.swagger.v3.oas.annotations.Parameter;
  9 +import io.swagger.v3.oas.annotations.Operation;
  10 +
  11 +import javax.validation.constraints.*;
  12 +import javax.validation.*;
  13 +import javax.servlet.http.*;
  14 +import java.util.*;
  15 +import java.io.IOException;
  16 +
4 17 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  18 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  19 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  20 +
5 21 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  22 +
6 23 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  24 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
  25 +
7 26 import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.*;
8   -import cn.iocoder.yudao.module.infra.convert.demo02.InfraDemoStudentConvert;
9 27 import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentDO;
  28 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentContactDO;
  29 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentAddressDO;
  30 +import cn.iocoder.yudao.module.infra.convert.demo02.InfraDemoStudentConvert;
10 31 import cn.iocoder.yudao.module.infra.service.demo02.InfraDemoStudentService;
11   -import io.swagger.v3.oas.annotations.Operation;
12   -import io.swagger.v3.oas.annotations.Parameter;
13   -import io.swagger.v3.oas.annotations.tags.Tag;
14   -import org.springframework.security.access.prepost.PreAuthorize;
15   -import org.springframework.validation.annotation.Validated;
16   -import org.springframework.web.bind.annotation.*;
17   -
18   -import javax.annotation.Resource;
19   -import javax.servlet.http.HttpServletResponse;
20   -import javax.validation.Valid;
21   -import java.io.IOException;
22   -import java.util.Collection;
23   -import java.util.List;
24   -
25   -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26   -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
27 32  
28 33 @Tag(name = "管理后台 - 学生")
29 34 @RestController
... ... @@ -87,4 +92,24 @@ public class InfraDemoStudentController {
87 92 ExcelUtils.write(response, "学生.xls", "数据", InfraDemoStudentExcelVO.class, datas);
88 93 }
89 94  
  95 + // ==================== 子表(学生联系人) ====================
  96 +
  97 + @GetMapping("/demo-student/list-by-student-id")
  98 + @Operation(summary = "获得学生联系人列表")
  99 + @Parameter(name = "studentId", description = "学生编号")
  100 + @PreAuthorize("@ss.hasPermission('infra:demo-student:query')")
  101 + public CommonResult<List<InfraDemoStudentContactDO>> getDemoStudentContactListByStudentId(@RequestParam("studentId") Long studentId) {
  102 + return success(demoStudentService.getDemoStudentContactListByStudentId(studentId));
  103 + }
  104 +
  105 + // ==================== 子表(学生地址) ====================
  106 +
  107 + @GetMapping("/demo-student/get-by-student-id")
  108 + @Operation(summary = "获得学生地址")
  109 + @Parameter(name = "studentId", description = "学生编号")
  110 + @PreAuthorize("@ss.hasPermission('infra:demo-student:query')")
  111 + public CommonResult<InfraDemoStudentAddressDO> getDemoStudentAddressByStudentId(@RequestParam("studentId") Long studentId) {
  112 + return success(demoStudentService.getDemoStudentAddressByStudentId(studentId));
  113 + }
  114 +
90 115 }
91 116 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/demo02/InfraDemoStudentContactMapper.java
1 1 package cn.iocoder.yudao.module.infra.dal.mysql.demo02;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 5 import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentContactDO;
5 6 import org.apache.ibatis.annotations.Mapper;
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenTemplateTypeEnum.java
... ... @@ -14,8 +14,11 @@ public enum CodegenTemplateTypeEnum {
14 14  
15 15 ONE(1), // 单表(增删改查)
16 16 TREE(2), // 树表(增删改查)
17   - MASTER(10), // 主子表 - 主表
18   - SUB(11), // 主子表 - 子表
  17 +
  18 + MASTER_NORMAL(10), // 主子表 - 主表 - 普通模式
  19 + MASTER_ERP(11), // 主子表 - 主表 - ERP 模式
  20 + MASTER_INNER(12), // 主子表 - 主表 - 内嵌模式
  21 + SUB(15), // 主子表 - 子表
19 22 ;
20 23  
21 24 /**
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -193,6 +193,44 @@ public class CodegenEngine {
193 193 */
194 194 public Map<String, String> execute(CodegenTableDO table, List<CodegenColumnDO> columns,
195 195 List<CodegenTableDO> subTables, List<List<CodegenColumnDO>> subColumnsList) {
  196 + // 1.1 初始化 bindMap 上下文
  197 + Map<String, Object> bindingMap = initBindingMap(table, columns, subTables, subColumnsList);
  198 + // 1.2 获得模版
  199 + Map<String, String> templates = getTemplates(table.getFrontType());
  200 +
  201 + // 2. 执行生成
  202 + Map<String, String> result = Maps.newLinkedHashMapWithExpectedSize(templates.size()); // 有序
  203 + templates.forEach((vmPath, filePath) -> {
  204 + // 2.1 特殊:主子表专属逻辑
  205 + if (isSubTemplate(vmPath)) {
  206 + if (CollUtil.isEmpty(subTables)) {
  207 + return;
  208 + }
  209 + for (int i = 0; i < subTables.size(); i++) {
  210 + bindingMap.put("subIndex", i);
  211 + generateCode(result, vmPath, filePath, bindingMap);
  212 + }
  213 + bindingMap.remove("subIndex");
  214 + return;
  215 + }
  216 +
  217 + // 2.2 默认生成
  218 + generateCode(result, vmPath, filePath, bindingMap);
  219 + });
  220 + return result;
  221 + }
  222 +
  223 + private void generateCode(Map<String, String> result, String vmPath,
  224 + String filePath, Map<String, Object> bindingMap) {
  225 + filePath = formatFilePath(filePath, bindingMap);
  226 + String content = templateEngine.getTemplate(vmPath).render(bindingMap);
  227 + // 去除字段后面多余的 , 逗号
  228 + content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }");
  229 + result.put(filePath, content);
  230 + }
  231 +
  232 + private Map<String, Object> initBindingMap(CodegenTableDO table, List<CodegenColumnDO> columns,
  233 + List<CodegenTableDO> subTables, List<List<CodegenColumnDO>> subColumnsList) {
196 234 // 创建 bindingMap
197 235 Map<String, Object> bindingMap = new HashMap<>(globalBindingMap);
198 236 bindingMap.put("table", table);
... ... @@ -217,60 +255,40 @@ public class CodegenEngine {
217 255 // 创建 bindingMap
218 256 bindingMap.put("subTables", subTables);
219 257 bindingMap.put("subColumnsList", subColumnsList);
  258 + List<CodegenColumnDO> subPrimaryColumns = new ArrayList<>();
220 259 List<CodegenColumnDO> subJoinColumns = new ArrayList<>();
  260 + List<String> subJoinColumnStrikeCases = new ArrayList<>();
221 261 List<String> subSimpleClassNames = new ArrayList<>();
222 262 List<String> subClassNameVars = new ArrayList<>();
  263 + List<String> subSimpleClassNameStrikeCases = new ArrayList<>();
223 264 for (int i = 0; i < subTables.size(); i++) {
224 265 CodegenTableDO subTable = subTables.get(i);
225 266 List<CodegenColumnDO> subColumns = subColumnsList.get(i);
226   - subJoinColumns.add(CollectionUtils.findFirst(subColumns, // 关联的字段
227   - column -> Objects.equals(column.getId(), subTable.getSubJoinColumnId())));
  267 + subPrimaryColumns.add(CollectionUtils.findFirst(subColumns, CodegenColumnDO::getPrimaryKey)); //
  268 + CodegenColumnDO subColumn = CollectionUtils.findFirst(subColumns, // 关联的字段
  269 + column -> Objects.equals(column.getId(), subTable.getSubJoinColumnId()));
  270 + subJoinColumns.add(subColumn);
  271 + subJoinColumnStrikeCases.add(toSymbolCase(subColumn.getJavaField(), '-')); // 将 DictType 转换成 dict-type
228 272 // className 相关
229 273 String subSimpleClassName = removePrefix(subTable.getClassName(), upperFirst(subTable.getModuleName()));
230 274 subSimpleClassNames.add(subSimpleClassName);
231 275 subClassNameVars.add(lowerFirst(subSimpleClassName)); // 将 DictType 转换成 dictType,用于变量
  276 + subSimpleClassNameStrikeCases.add(toSymbolCase(simpleClassName, '-')); // 将 DictType 转换成 dict-type
232 277 }
  278 + bindingMap.put("subPrimaryColumns", subPrimaryColumns);
233 279 bindingMap.put("subJoinColumns", subJoinColumns);
  280 + bindingMap.put("subJoinColumn_strikeCases", subJoinColumnStrikeCases);
234 281 bindingMap.put("subSimpleClassNames", subSimpleClassNames);
235 282 bindingMap.put("subClassNameVars", subClassNameVars);
  283 + bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases);
236 284 }
237   -
238   - // 执行生成
239   - Map<String, String> templates = getTemplates(table.getTemplateType(), table.getFrontType());
240   - Map<String, String> result = Maps.newLinkedHashMapWithExpectedSize(templates.size()); // 有序
241   - templates.forEach((vmPath, filePath) -> {
242   - // 特殊:主子表专属逻辑
243   - if (isSubTemplate(vmPath)) {
244   - for (int i = 0; i < subTables.size(); i++) {
245   - bindingMap.put("subIndex", i);
246   - // TODO 芋艿:这块需要优化下逻辑
247   - String newFilePath = formatFilePath(filePath, bindingMap);
248   - String content = templateEngine.getTemplate(vmPath).render(bindingMap);
249   - // 去除字段后面多余的 , 逗号
250   - content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }");
251   - result.put(newFilePath, content);
252   - bindingMap.remove("subIndex");
253   - }
254   - } else {
255   - filePath = formatFilePath(filePath, bindingMap);
256   - String content = templateEngine.getTemplate(vmPath).render(bindingMap);
257   - // 去除字段后面多余的 , 逗号
258   - content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }");
259   - result.put(filePath, content);
260   - }
261   - });
262   - return result;
  285 + return bindingMap;
263 286 }
264 287  
265   - private Map<String, String> getTemplates(Integer templateType, Integer frontType) {
  288 + private Map<String, String> getTemplates(Integer frontType) {
266 289 Map<String, String> templates = new LinkedHashMap<>();
267 290 templates.putAll(SERVER_TEMPLATES);
268 291 templates.putAll(FRONT_TEMPLATES.row(frontType));
269   - // 特殊:主子表专属逻辑
270   - if (ObjUtil.notEqual(templateType, CodegenTemplateTypeEnum.MASTER.getType())) {
271   - templates.remove(javaTemplatePath("dal/do_sub"));
272   - templates.remove(javaTemplatePath("dal/mapper_sub"));
273   - }
274 292 return templates;
275 293 }
276 294  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/demo02/InfraDemoStudentService.java
1 1 package cn.iocoder.yudao.module.infra.service.demo02;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.InfraDemoStudentCreateReqVO;
5   -import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.InfraDemoStudentExportReqVO;
6   -import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.InfraDemoStudentPageReqVO;
7   -import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.InfraDemoStudentUpdateReqVO;
  3 +import java.util.*;
  4 +import javax.validation.*;
  5 +import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.*;
8 6 import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentDO;
9   -
10   -import javax.validation.Valid;
11   -import java.util.Collection;
12   -import java.util.List;
  7 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentContactDO;
  8 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentAddressDO;
  9 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 10  
14 11 /**
15 12 * 学生 Service 接口
... ... @@ -65,4 +62,25 @@ public interface InfraDemoStudentService {
65 62 List<InfraDemoStudentDO> getDemoStudentList(InfraDemoStudentExportReqVO exportReqVO);
66 63  
67 64  
  65 + // ==================== 子表(学生联系人) ====================
  66 +
  67 + /**
  68 + * 获得学生联系人列表
  69 + *
  70 + * @param studentId 学生编号
  71 + * @return 学生联系人列表
  72 + */
  73 + List<InfraDemoStudentContactDO> getDemoStudentContactListByStudentId(Long studentId);
  74 +
  75 +
  76 + // ==================== 子表(学生地址) ====================
  77 +
  78 + /**
  79 + * 获得学生地址
  80 + *
  81 + * @param studentId 学生编号
  82 + * @return 学生地址
  83 + */
  84 + InfraDemoStudentAddressDO getDemoStudentAddressByStudentId(Long studentId);
  85 +
68 86 }
69 87 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/demo02/InfraDemoStudentServiceImpl.java
... ... @@ -8,6 +8,8 @@ import org.springframework.transaction.annotation.Transactional;
8 8 import java.util.*;
9 9 import cn.iocoder.yudao.module.infra.controller.admin.demo02.vo.*;
10 10 import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentDO;
  11 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentContactDO;
  12 +import cn.iocoder.yudao.module.infra.dal.dataobject.demo02.InfraDemoStudentAddressDO;
11 13 import cn.iocoder.yudao.framework.common.pojo.PageResult;
12 14  
13 15 import cn.iocoder.yudao.module.infra.convert.demo02.InfraDemoStudentConvert;
... ... @@ -43,12 +45,10 @@ public class InfraDemoStudentServiceImpl implements InfraDemoStudentService {
43 45 // 插入
44 46 InfraDemoStudentDO demoStudent = InfraDemoStudentConvert.INSTANCE.convert(createReqVO);
45 47 demoStudentMapper.insert(demoStudent);
46   - // 插入子表(学生联系人)
47   - createReqVO.getDemoStudentContacts().forEach(o -> o.setStudentId(demoStudent.getId()));
48   - demoStudentContactMapper.insertBatch(createReqVO.getDemoStudentContacts());
49   - // 插入子表(学生地址)
50   - createReqVO.getDemoStudentAddress().setStudentId(demoStudent.getId());
51   - demoStudentAddressMapper.insert(createReqVO.getDemoStudentAddress());
  48 +
  49 + // 插入子表($subTable.classComment)
  50 + createDemoStudentContactList(demoStudent.getId(), createReqVO.getDemoStudentContacts());
  51 + createDemoStudentAddress(demoStudent.getId(), createReqVO.getDemoStudentAddress());
52 52 // 返回
53 53 return demoStudent.getId();
54 54 }
... ... @@ -61,13 +61,10 @@ public class InfraDemoStudentServiceImpl implements InfraDemoStudentService {
61 61 // 更新
62 62 InfraDemoStudentDO updateObj = InfraDemoStudentConvert.INSTANCE.convert(updateReqVO);
63 63 demoStudentMapper.updateById(updateObj);
64   - // 更新子表(学生联系人)
65   - demoStudentContactMapper.deleteByStudentId(updateReqVO.getId());
66   - updateReqVO.getDemoStudentContacts().forEach(o -> o.setStudentId(updateReqVO.getId()));
67   - demoStudentContactMapper.insertBatch(updateReqVO.getDemoStudentContacts());
68   - // 更新子表(学生地址)
69   - updateReqVO.getDemoStudentAddress().setStudentId(updateReqVO.getId());
70   - demoStudentAddressMapper.updateById(updateReqVO.getDemoStudentAddress());
  64 +
  65 + // 更新子表
  66 + updateDemoStudentContactList(updateReqVO.getId(), updateReqVO.getDemoStudentContacts());
  67 + updateDemoStudentAddress(updateReqVO.getId(), updateReqVO.getDemoStudentAddress());
71 68 }
72 69  
73 70 @Override
... ... @@ -77,10 +74,10 @@ public class InfraDemoStudentServiceImpl implements InfraDemoStudentService {
77 74 validateDemoStudentExists(id);
78 75 // 删除
79 76 demoStudentMapper.deleteById(id);
80   - // 删除子表(学生联系人)
81   - demoStudentContactMapper.deleteByStudentId(id);
82   - // 删除子表(学生地址)
83   - demoStudentAddressMapper.deleteByStudentId(id);
  77 +
  78 + // 删除子表
  79 + deleteDemoStudentContactByStudentId(id);
  80 + deleteDemoStudentAddressByStudentId(id);
84 81 }
85 82  
86 83 private void validateDemoStudentExists(Long id) {
... ... @@ -104,4 +101,46 @@ public class InfraDemoStudentServiceImpl implements InfraDemoStudentService {
104 101 return demoStudentMapper.selectList(exportReqVO);
105 102 }
106 103  
  104 + // ==================== 子表(学生联系人) ====================
  105 +
  106 + @Override
  107 + public List<InfraDemoStudentContactDO> getDemoStudentContactListByStudentId(Long studentId) {
  108 + return demoStudentContactMapper.selectListByStudentId(studentId);
  109 + }
  110 +
  111 + private void createDemoStudentContactList(Long studentId, List<InfraDemoStudentContactDO> list) {
  112 + list.forEach(o -> o.setStudentId(studentId));
  113 + demoStudentContactMapper.insertBatch(list);
  114 + }
  115 +
  116 + private void updateDemoStudentContactList(Long studentId, List<InfraDemoStudentContactDO> list) {
  117 + deleteDemoStudentContactByStudentId(studentId);
  118 + createDemoStudentContactList(studentId, list);
  119 + }
  120 +
  121 + private void deleteDemoStudentContactByStudentId(Long studentId) {
  122 + demoStudentContactMapper.deleteByStudentId(studentId);
  123 + }
  124 +
  125 + // ==================== 子表(学生地址) ====================
  126 +
  127 + @Override
  128 + public InfraDemoStudentAddressDO getDemoStudentAddressByStudentId(Long studentId) {
  129 + return demoStudentAddressMapper.selectByStudentId(studentId);
  130 + }
  131 +
  132 + private void createDemoStudentAddress(Long studentId, InfraDemoStudentAddressDO demoStudentAddress) {
  133 + demoStudentAddress.setStudentId(studentId);
  134 + demoStudentAddressMapper.insert(demoStudentAddress);
  135 + }
  136 +
  137 + private void updateDemoStudentAddress(Long studentId, InfraDemoStudentAddressDO demoStudentAddress) {
  138 + demoStudentAddress.setStudentId(studentId);
  139 + demoStudentAddressMapper.updateById(demoStudentAddress);
  140 + }
  141 +
  142 + private void deleteDemoStudentAddressByStudentId(Long studentId) {
  143 + demoStudentAddressMapper.deleteByStudentId(studentId);
  144 + }
  145 +
107 146 }
108 147 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm
... ... @@ -26,6 +26,10 @@ import static ${OperateTypeEnumClassName}.*;
26 26  
27 27 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
28 28 import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
  29 +## 特殊:主子表专属逻辑
  30 +#foreach ($subTable in $subTables)
  31 +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
  32 +#end
29 33 import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert;
30 34 import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service;
31 35  
... ... @@ -41,16 +45,18 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
41 45  
42 46 @PostMapping("/create")
43 47 @Operation(summary = "创建${table.classComment}")
44   -#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")#end
45   -
  48 +#if ($sceneEnum.scene == 1)
  49 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
  50 +#end
46 51 public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) {
47 52 return success(${classNameVar}Service.create${simpleClassName}(createReqVO));
48 53 }
49 54  
50 55 @PutMapping("/update")
51 56 @Operation(summary = "更新${table.classComment}")
52   -#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")#end
53   -
  57 +#if ($sceneEnum.scene == 1)
  58 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")
  59 +#end
54 60 public CommonResult<Boolean> update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) {
55 61 ${classNameVar}Service.update${simpleClassName}(updateReqVO);
56 62 return success(true);
... ... @@ -59,8 +65,9 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
59 65 @DeleteMapping("/delete")
60 66 @Operation(summary = "删除${table.classComment}")
61 67 @Parameter(name = "id", description = "编号", required = true)
62   -#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")#end
63   -
  68 +#if ($sceneEnum.scene == 1)
  69 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
  70 +#end
64 71 public CommonResult<Boolean> delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) {
65 72 ${classNameVar}Service.delete${simpleClassName}(id);
66 73 return success(true);
... ... @@ -69,8 +76,9 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
69 76 @GetMapping("/get")
70 77 @Operation(summary = "获得${table.classComment}")
71 78 @Parameter(name = "id", description = "编号", required = true, example = "1024")
72   -#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end
73   -
  79 +#if ($sceneEnum.scene == 1)
  80 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
  81 +#end
74 82 public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) {
75 83 ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id);
76 84 return success(${table.className}Convert.INSTANCE.convert(${classNameVar}));
... ... @@ -78,8 +86,9 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
78 86  
79 87 @GetMapping("/page")
80 88 @Operation(summary = "获得${table.classComment}分页")
81   -#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end
82   -
  89 +#if ($sceneEnum.scene == 1)
  90 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
  91 +#end
83 92 public CommonResult<PageResult<${sceneEnum.prefixClass}${table.className}RespVO>> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageVO) {
84 93 PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageVO);
85 94 return success(${table.className}Convert.INSTANCE.convertPage(pageResult));
... ... @@ -87,8 +96,9 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
87 96  
88 97 @GetMapping("/export-excel")
89 98 @Operation(summary = "导出${table.classComment} Excel")
90   -#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")#end
91   -
  99 +#if ($sceneEnum.scene == 1)
  100 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")
  101 +#end
92 102 @OperateLog(type = EXPORT)
93 103 public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO,
94 104 HttpServletResponse response) throws IOException {
... ... @@ -98,4 +108,89 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
98 108 ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}ExcelVO.class, datas);
99 109 }
100 110  
  111 +## 特殊:主子表专属逻辑
  112 +#foreach ($subTable in $subTables)
  113 +#set ($index = $foreach.count - 1)
  114 +#set ($subSimpleClassName = $subSimpleClassNames.get($index))
  115 +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
  116 +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  117 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  118 +#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
  119 +#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
  120 +#set ($subClassNameVar = $subClassNameVars.get($index))
  121 + // ==================== 子表($subTable.classComment) ====================
  122 +
  123 +## 情况一:MASTER_ERP 时,需要分查询页子表
  124 +#if ( $table.templateType == 11 )
  125 + @GetMapping("/${subSimpleClassName_strikeCase}/page")
  126 + @Operation(summary = "获得${subTable.classComment}分页")
  127 + @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}")
  128 +#if ($sceneEnum.scene == 1)
  129 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
  130 +#end
  131 + public CommonResult<PageResult<${subTable.className}DO>> get${subSimpleClassName}Page(PageParam pageReqVO,
  132 + @RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  133 + return success(${classNameVar}Service.get${subSimpleClassName}Page(pageReqVO, ${subJoinColumn.javaField}));
  134 + }
  135 +
  136 +## 情况二:非 MASTER_ERP 时,需要列表查询子表
  137 +#else
  138 + #if ( $subTable.subJoinMany )
  139 + @GetMapping("/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}")
  140 + @Operation(summary = "获得${subTable.classComment}列表")
  141 + @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}")
  142 +#if ($sceneEnum.scene == 1)
  143 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
  144 +#end
  145 + public CommonResult<List<${subTable.className}DO>> get${subSimpleClassName}ListBy${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  146 + return success(${classNameVar}Service.get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}));
  147 + }
  148 +
  149 + #else
  150 + @GetMapping("/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}")
  151 + @Operation(summary = "获得${subTable.classComment}")
  152 + @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}")
  153 +#if ($sceneEnum.scene == 1)
  154 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
  155 +#end
  156 + public CommonResult<${subTable.className}DO> get${subSimpleClassName}By${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  157 + return success(${classNameVar}Service.get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}));
  158 + }
  159 +
  160 + #end
  161 +#end
  162 +## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作
  163 +#if ( $table.templateType == 11 )
  164 + @PostMapping("/${subSimpleClassName_strikeCase}/create")
  165 + @Operation(summary = "创建${subTable.classComment}")
  166 +#if ($sceneEnum.scene == 1)
  167 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
  168 +#end
  169 + public CommonResult<${subPrimaryColumn.javaType}> create${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) {
  170 + return success(${classNameVar}Service.create${subSimpleClassName}(${subClassNameVar}));
  171 + }
  172 +
  173 + @PutMapping("/${subSimpleClassName_strikeCase}/update")
  174 + @Operation(summary = "更新${subTable.classComment}")
  175 +#if ($sceneEnum.scene == 1)
  176 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")
  177 +#end
  178 + public CommonResult<Booealn> update${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) {
  179 + ${classNameVar}Service.update${subSimpleClassName}(${subClassNameVar});
  180 + return success(true);
  181 + }
  182 +
  183 + @DeleteMapping("/${subSimpleClassName_strikeCase}/delete")
  184 + @Parameter(name = "id", description = "编号", required = true)
  185 + @Operation(summary = "删除${subTable.classComment}")
  186 +#if ($sceneEnum.scene == 1)
  187 + @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
  188 +#end
  189 + public CommonResult<Booealn> delete${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) {
  190 + ${classNameVar}Service.delete${subSimpleClassName}(${subClassNameVar});
  191 + return success(true);
  192 + }
  193 +
  194 +#end
  195 +#end
101 196 }
102 197 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/dal/mapper_sub.vm
... ... @@ -6,6 +6,9 @@ package ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.busine
6 6  
7 7 import java.util.*;
8 8  
  9 +import ${PageResultClassName};
  10 +import ${PageParamClassName};
  11 +import ${QueryWrapperClassName};
9 12 import ${BaseMapperClassName};
10 13 import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
11 14 import org.apache.ibatis.annotations.Mapper;
... ... @@ -18,21 +21,29 @@ import org.apache.ibatis.annotations.Mapper;
18 21 @Mapper
19 22 public interface ${subTable.className}Mapper extends BaseMapperX<${subTable.className}DO> {
20 23  
21   -#if ( $subTable.subJoinMany)
  24 +## 情况一:MASTER_ERP 时,需要分查询页子表
  25 +#if ( $table.templateType == 11 )
  26 + default PageResult<${subTable.className}DO> selectPage(PageParam reqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  27 + return selectPage(reqVO, new LambdaQueryWrapperX<${subTable.className}DO>()
  28 + .eq(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField})
  29 + .orderByDesc(${subTable.className}DO::getId));## 大多数情况下,id 倒序
  30 +
  31 + }
  32 +
  33 +## 情况二:非 MASTER_ERP 时,需要列表查询子表
  34 +#else
  35 + #if ( $subTable.subJoinMany)
22 36 default List<${subTable.className}DO> selectListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
23 37 return selectList(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
24 38 }
25 39  
26   -#else
  40 + #else
27 41 default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
28 42 return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
29 43 }
30 44  
31   -#end
32   - default List<${subTable.className}DO> selectListBy${SubJoinColumnName}(List<${subJoinColumn.javaType}> ${subJoinColumn.javaField}s) {
33   - return selectList(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}s);
34   - }
35   -
  45 + #end
  46 + #end
36 47 default int deleteBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
37 48 return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
38 49 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/service.vm
... ... @@ -4,6 +4,10 @@ import java.util.*;
4 4 import javax.validation.*;
5 5 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
6 6 import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
  7 +## 特殊:主子表专属逻辑
  8 +#foreach ($subTable in $subTables)
  9 +import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
  10 +#end
7 11 import ${PageResultClassName};
8 12  
9 13 /**
... ... @@ -63,8 +67,26 @@ public interface ${table.className}Service {
63 67 #foreach ($subTable in $subTables)
64 68 #set ($index = $foreach.count - 1)
65 69 #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  70 +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
66 71 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
67 72 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  73 +#set ($subClassNameVar = $subClassNameVars.get($index))
  74 +
  75 + // ==================== 子表($subTable.classComment) ====================
  76 +
  77 +## 情况一:MASTER_ERP 时,需要分查询页子表
  78 +#if ( $table.templateType == 11 )
  79 + /**
  80 + * 获得${subTable.classComment}分页
  81 + *
  82 + * @param pageReqVO 分页查询
  83 + * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment}
  84 + * @return ${subTable.classComment}分页
  85 + */
  86 + PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField})
  87 +
  88 +## 情况二:非 MASTER_ERP 时,需要列表查询子表
  89 +#else
68 90 #if ( $subTable.subJoinMany )
69 91 /**
70 92 * 获得${subTable.classComment}列表
... ... @@ -85,4 +107,30 @@ public interface ${table.className}Service {
85 107  
86 108 #end
87 109 #end
  110 +## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作
  111 +#if ( $table.templateType == 11 )
  112 + /**
  113 + * 创建${subTable.classComment}
  114 + *
  115 + * @param ${subClassNameVar} 创建信息
  116 + * @return 编号
  117 + */
  118 + ${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar});
  119 +
  120 + /**
  121 + * 更新${subTable.classComment}
  122 + *
  123 + * @param ${subClassNameVar} 更新信息
  124 + */
  125 + void update${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar});
  126 +
  127 + /**
  128 + * 删除${subTable.classComment}
  129 + *
  130 + * @param id 编号
  131 + */
  132 + void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id);
  133 +
  134 +#end
  135 +#end
88 136 }
89 137 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm
... ... @@ -9,7 +9,7 @@ import java.util.*;
9 9 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
10 10 import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
11 11 ## 特殊:主子表专属逻辑
12   -#if( $subTable )
  12 +#foreach ($subTable in $subTables)
13 13 import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
14 14 #end
15 15 import ${PageResultClassName};
... ... @@ -56,19 +56,21 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
56 56 ${table.className}DO ${classNameVar} = ${table.className}Convert.INSTANCE.convert(createReqVO);
57 57 ${classNameVar}Mapper.insert(${classNameVar});
58 58 ## 特殊:主子表专属逻辑
  59 +#if ( $subTables.size() > 0)
  60 +
  61 + // 插入子表($subTable.classComment)
59 62 #foreach ($subTable in $subTables)
60 63 #set ($index = $foreach.count - 1)
  64 +#set ($subSimpleClassName = $subSimpleClassNames.get($index))
61 65 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
62 66 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
63   - // 插入子表($subTable.classComment)
64 67 #if ( $subTable.subJoinMany)
65   - createReqVO.get${subSimpleClassNames.get($index)}s().forEach(o -> o.set$SubJoinColumnName(${classNameVar}.getId()));
66   - ${subClassNameVars.get($index)}Mapper.insertBatch(createReqVO.get${subSimpleClassNames.get($index)}s());
  68 + create${subSimpleClassName}List(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}s());
67 69 #else
68   - createReqVO.get${subSimpleClassNames.get($index)}().set$SubJoinColumnName(${classNameVar}.getId());
69   - ${subClassNameVars.get($index)}Mapper.insert(createReqVO.get${subSimpleClassNames.get($index)}());
  70 + create${subSimpleClassName}(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}());
70 71 #end
71 72 #end
  73 +#end
72 74 // 返回
73 75 return ${classNameVar}.getId();
74 76 }
... ... @@ -85,20 +87,21 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
85 87 ${table.className}DO updateObj = ${table.className}Convert.INSTANCE.convert(updateReqVO);
86 88 ${classNameVar}Mapper.updateById(updateObj);
87 89 ## 特殊:主子表专属逻辑
  90 +#if ( $subTables.size() > 0)
  91 +
  92 + // 更新子表
88 93 #foreach ($subTable in $subTables)
89 94 #set ($index = $foreach.count - 1)
  95 +#set ($subSimpleClassName = $subSimpleClassNames.get($index))
90 96 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
91 97 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
92   - // 更新子表($subTable.classComment)
93 98 #if ( $subTable.subJoinMany)
94   - ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(updateReqVO.getId());
95   - updateReqVO.get${subSimpleClassNames.get($index)}s().forEach(o -> o.set$SubJoinColumnName(updateReqVO.getId()));
96   - ${subClassNameVars.get($index)}Mapper.insertBatch(updateReqVO.get${subSimpleClassNames.get($index)}s());
  99 + update${subSimpleClassName}List(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}s());
97 100 #else
98   - updateReqVO.get${subSimpleClassNames.get($index)}().set$SubJoinColumnName(updateReqVO.getId());
99   - ${subClassNameVars.get($index)}Mapper.updateById(updateReqVO.get${subSimpleClassNames.get($index)}());
  101 + update${subSimpleClassName}(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}());
100 102 #end
101 103 #end
  104 +#end
102 105 }
103 106  
104 107 @Override
... ... @@ -112,12 +115,16 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
112 115 // 删除
113 116 ${classNameVar}Mapper.deleteById(id);
114 117 ## 特殊:主子表专属逻辑
  118 +#if ( $subTables.size() > 0)
  119 +
  120 + // 删除子表
115 121 #foreach ($subTable in $subTables)
116 122 #set ($index = $foreach.count - 1)
  123 +#set ($subSimpleClassName = $subSimpleClassNames.get($index))
117 124 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
118 125 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
119   - // 删除子表($subTable.classComment)
120   - ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(id);
  126 + delete${subSimpleClassName}By${SubJoinColumnName}(id);
  127 +#end
121 128 #end
122 129 }
123 130  
... ... @@ -142,4 +149,86 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
142 149 return ${classNameVar}Mapper.selectList(exportReqVO);
143 150 }
144 151  
  152 +## 特殊:主子表专属逻辑
  153 +#foreach ($subTable in $subTables)
  154 +#set ($index = $foreach.count - 1)
  155 +#set ($subSimpleClassName = $subSimpleClassNames.get($index))
  156 +#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
  157 +#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  158 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  159 +#set ($subClassNameVar = $subClassNameVars.get($index))
  160 + // ==================== 子表($subTable.classComment) ====================
  161 +
  162 +## 情况一:MASTER_ERP 时,需要分查询页子表
  163 +#if ( $table.templateType == 11 )
  164 + @Override
  165 + public PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  166 + return ${subClassNameVars.get($index)}Mapper.selectPage(pageReqVO, ${subJoinColumn.javaField});
  167 + }
  168 +
  169 +## 情况二:非 MASTER_ERP 时,需要列表查询子表
  170 +#else
  171 + #if ( $subTable.subJoinMany )
  172 + @Override
  173 + public List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  174 + return ${subClassNameVars.get($index)}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField});
  175 + }
  176 +
  177 + #else
  178 + @Override
  179 + public ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
  180 + return ${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subJoinColumn.javaField});
  181 + }
  182 +
  183 + #end
  184 +#end
  185 +## 情况一:MASTER_ERP 时,支持单个的新增、修改、删除操作
  186 +#if ( $table.templateType == 11 )
  187 + @Override
  188 + public ${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}) {
  189 + ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar});
  190 + return ${subClassNameVar}.getId();
  191 + }
  192 +
  193 + @Override
  194 + public void update${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}) {
  195 + ${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar});
  196 + }
  197 +
  198 + @Override
  199 + public void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id) {
  200 + ${subClassNameVars.get($index)}Mapper.deleteById(id);
  201 + }
  202 +
  203 +## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作
  204 +#else
  205 + #if ( $subTable.subJoinMany)
  206 + private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
  207 + list.forEach(o -> o.set$SubJoinColumnName(${subJoinColumn.javaField}));
  208 + ${subClassNameVars.get($index)}Mapper.insertBatch(list);
  209 + }
  210 +
  211 + private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
  212 + delete${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField});
  213 + create${subSimpleClassName}List(${subJoinColumn.javaField}, list);
  214 + }
  215 +
  216 + #else
  217 + private void create${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) {
  218 + ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField});
  219 + ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar});
  220 + }
  221 +
  222 + private void update${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) {
  223 + ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField});
  224 + ${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar});
  225 + }
  226 +
  227 + #end
  228 + private void delete${subSimpleClassName}By${SubJoinColumnName}(${primaryColumn.javaType} ${subJoinColumn.javaField}) {
  229 + ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField});
  230 + }
  231 +
  232 +#end
  233 +#end
145 234 }
146 235 \ No newline at end of file
... ...
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngineTest.java
... ... @@ -173,7 +173,8 @@ public class CodegenEngineTest extends BaseMockitoUnitTest {
173 173 .setTableName("infra_demo_student").setTableComment("学生表")
174 174 .setModuleName("infra").setBusinessName("demo02").setClassName("InfraDemoStudent")
175 175 .setClassComment("学生").setAuthor("芋道源码")
176   - .setTemplateType(CodegenTemplateTypeEnum.MASTER.getType())
  176 + .setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType())
  177 +// .setTemplateType(CodegenTemplateTypeEnum.MASTER_ERP.getType())
177 178 .setFrontType(CodegenFrontTypeEnum.VUE3.getType());
178 179 CodegenColumnDO idColumn = new CodegenColumnDO().setColumnName("id").setDataType(JdbcType.BIGINT.name())
179 180 .setColumnComment("编号").setNullable(false).setPrimaryKey(true).setAutoIncrement(true)
... ...