Commit 501cfe5afa7fc951e8d92dcdb80bfc8a5406543a

Authored by YunaiV
1 parent 0f7e715b

feat:【INFRA 基础设施】代码生成时,支持配置 VO/DO 模式

yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenVOTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.infra.enums.codegen;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 代码生成的 VO 类型枚举
  8 + *
  9 + * 目前的作用:Controller 新增、修改、响应时,使用 VO 还是 DO
  10 + * 注意:不包括 Controller 的分页参数!
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@AllArgsConstructor
  15 +@Getter
  16 +public enum CodegenVOTypeEnum {
  17 +
  18 + VO(10, "VO"),
  19 + DO(20, "DO");
  20 +
  21 + /**
  22 + * 场景
  23 + */
  24 + private final Integer type;
  25 + /**
  26 + * 场景名
  27 + */
  28 + private final String name;
  29 +
  30 +}
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/codegen/config/CodegenProperties.java
1 1 package cn.iocoder.yudao.module.infra.framework.codegen.config;
2 2  
3 3 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
  4 +import cn.iocoder.yudao.module.infra.enums.codegen.CodegenVOTypeEnum;
4 5 import lombok.Data;
5 6 import org.springframework.boot.context.properties.ConfigurationProperties;
6 7 import org.springframework.validation.annotation.Validated;
... ... @@ -35,6 +36,14 @@ public class CodegenProperties {
35 36 private Integer frontType;
36 37  
37 38 /**
  39 + * 代码生成的 VO 类型
  40 + *
  41 + * 枚举 {@link CodegenVOTypeEnum#getType()}
  42 + */
  43 + @NotNull(message = "代码生成的 VO 类型不能为空")
  44 + private Integer voType;
  45 +
  46 + /**
38 47 * 是否生成单元测试
39 48 */
40 49 @NotNull(message = "是否生成单元测试不能为空")
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -31,6 +31,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
31 31 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
32 32 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
33 33 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
  34 +import cn.iocoder.yudao.module.infra.enums.codegen.CodegenVOTypeEnum;
34 35 import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties;
35 36 import com.google.common.annotations.VisibleForTesting;
36 37 import com.google.common.collect.ImmutableTable;
... ... @@ -234,6 +235,7 @@ public class CodegenEngine {
234 235 globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage()
235 236 + '.' + "framework"); // 用于后续获取测试类的 package 地址
236 237 globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax");
  238 + globalBindingMap.put("voType", codegenProperties.getVoType());
237 239 // 全局 Java Bean
238 240 globalBindingMap.put("CommonResultClassName", CommonResult.class.getName());
239 241 globalBindingMap.put("PageResultClassName", PageResult.class.getName());
... ... @@ -383,11 +385,13 @@ public class CodegenEngine {
383 385  
384 386 // className 相关
385 387 // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀
  388 + String className = table.getClassName();
386 389 String simpleClassName = equalsAnyIgnoreCase(table.getClassName(), table.getModuleName()) ? table.getClassName()
387 390 : removePrefix(table.getClassName(), upperFirst(table.getModuleName()));
  391 + String classNameVar = lowerFirst(simpleClassName);
388 392 bindingMap.put("simpleClassName", simpleClassName);
389 393 bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type
390   - bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量
  394 + bindingMap.put("classNameVar", classNameVar); // 将 DictType 转换成 dictType,用于变量
391 395 // 将 DictType 转换成 dict-type
392 396 String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-');
393 397 bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase);
... ... @@ -441,6 +445,22 @@ public class CodegenEngine {
441 445 bindingMap.put("subClassNameVars", subClassNameVars);
442 446 bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases);
443 447 }
  448 +
  449 + // 多个 vm 公用的 VO 变量
  450 + if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) {
  451 + String prefixClass = CodegenSceneEnum.valueOf(table.getScene()).getPrefixClass();
  452 + bindingMap.put("saveReqVOClass", prefixClass + className + "SaveReqVO");
  453 + bindingMap.put("updateReqVOClass", prefixClass + className + "SaveReqVO");
  454 + bindingMap.put("respVOClass", prefixClass + className + "RespVO");
  455 + bindingMap.put("saveReqVOVar", "createReqVO");
  456 + bindingMap.put("updateReqVOVar", "updateReqVO");
  457 + } else if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.DO.getType())) {
  458 + bindingMap.put("saveReqVOClass", className + "DO");
  459 + bindingMap.put("updateReqVOClass", className + "DO");
  460 + bindingMap.put("respVOClass", className + "DO");
  461 + bindingMap.put("saveReqVOVar", classNameVar);
  462 + bindingMap.put("updateReqVOVar", classNameVar);
  463 + }
444 464 return bindingMap;
445 465 }
446 466  
... ... @@ -461,6 +481,11 @@ public class CodegenEngine {
461 481 templates.remove(javaTemplatePath("test/serviceTest"));
462 482 templates.remove("codegen/sql/h2.vm");
463 483 }
  484 + // 如果禁用 VO 类型,则移除对应的模版
  485 + if (ObjectUtil.notEqual(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) {
  486 + templates.remove(javaTemplatePath("controller/vo/respVO"));
  487 + templates.remove(javaTemplatePath("controller/vo/saveReqVO"));
  488 + }
464 489 return templates;
465 490 }
466 491  
... ...
yudao-module-infra/src/main/resources/codegen/java/controller/controller.vm
... ... @@ -49,8 +49,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
49 49 #if ($sceneEnum.scene == 1)
50 50 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
51 51 #end
52   - public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) {
53   - return success(${classNameVar}Service.create${simpleClassName}(createReqVO));
  52 + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${saveReqVOClass} ${saveReqVOVar}) {
  53 + return success(${classNameVar}Service.create${simpleClassName}(${saveReqVOVar}));
54 54 }
55 55  
56 56 @PutMapping("/update")
... ... @@ -58,8 +58,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
58 58 #if ($sceneEnum.scene == 1)
59 59 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")
60 60 #end
61   - public CommonResult<Boolean> update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) {
62   - ${classNameVar}Service.update${simpleClassName}(updateReqVO);
  61 + public CommonResult<Boolean> update${simpleClassName}(@Valid @RequestBody ${updateReqVOClass} ${updateReqVOVar}) {
  62 + ${classNameVar}Service.update${simpleClassName}(${updateReqVOVar});
63 63 return success(true);
64 64 }
65 65  
... ... @@ -80,9 +80,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
80 80 #if ($sceneEnum.scene == 1)
81 81 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
82 82 #end
83   - public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) {
  83 + public CommonResult<${respVOClass}> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) {
84 84 ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id);
85   - return success(BeanUtils.toBean(${classNameVar}, ${sceneEnum.prefixClass}${table.className}RespVO.class));
  85 +#if ($voType == 10)
  86 + return success(BeanUtils.toBean(${classNameVar}, ${respVOClass}.class));
  87 +#else
  88 + return success(${classNameVar});
  89 +#end
86 90 }
87 91  
88 92 #if ( $table.templateType != 2 )
... ... @@ -91,9 +95,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
91 95 #if ($sceneEnum.scene == 1)
92 96 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
93 97 #end
94   - public CommonResult<PageResult<${sceneEnum.prefixClass}${table.className}RespVO>> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
  98 + public CommonResult<PageResult<${respVOClass}>> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
95 99 PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO);
96   - return success(BeanUtils.toBean(pageResult, ${sceneEnum.prefixClass}${table.className}RespVO.class));
  100 +#if ($voType == 10)
  101 + return success(BeanUtils.toBean(pageResult, ${respVOClass}.class));
  102 +#else
  103 + return success(pageResult);
  104 +#end
97 105 }
98 106  
99 107 ## 特殊:树表专属逻辑(树不需要分页接口)
... ... @@ -103,9 +111,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
103 111 #if ($sceneEnum.scene == 1)
104 112 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
105 113 #end
106   - public CommonResult<List<${sceneEnum.prefixClass}${table.className}RespVO>> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) {
  114 + public CommonResult<List<${respVOClass}>> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) {
107 115 List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO);
108   - return success(BeanUtils.toBean(list, ${sceneEnum.prefixClass}${table.className}RespVO.class));
  116 +#if ($voType == 10)
  117 + return success(BeanUtils.toBean(list, ${respVOClass}.class));
  118 +#else
  119 + return success(list);
  120 +#end
109 121 }
110 122  
111 123 #end
... ... @@ -121,8 +133,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
121 133 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
122 134 List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO).getList();
123 135 // 导出 Excel
124   - ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}RespVO.class,
125   - BeanUtils.toBean(list, ${sceneEnum.prefixClass}${table.className}RespVO.class));
  136 + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${respVOClass}.class,
  137 + BeanUtils.toBean(list, ${respVOClass}.class));
126 138 }
127 139 ## 特殊:树表专属逻辑(树不需要分页接口)
128 140 #else
... ...
yudao-module-infra/src/main/resources/codegen/java/dal/do.vm
... ... @@ -12,6 +12,18 @@ import java.time.LocalDateTime;
12 12 #end
13 13 import com.baomidou.mybatisplus.annotation.*;
14 14 import ${BaseDOClassName};
  15 +## 处理 Excel 导出 + Schema 注解(仅 DO 模式)
  16 +#if ($voType == 20)
  17 +import io.swagger.v3.oas.annotations.media.Schema;
  18 +import com.alibaba.excel.annotation.*;
  19 +#foreach ($column in $columns)
  20 + #if ("$!column.dictType" != "")## 有设置数据字典
  21 + import ${DictFormatClassName};
  22 + import ${DictConvertClassName};
  23 + #break
  24 + #end
  25 +#end
  26 +#end
15 27  
16 28 /**
17 29 * ${table.classComment} DO
... ... @@ -26,6 +38,11 @@ import ${BaseDOClassName};
26 38 @Builder
27 39 @NoArgsConstructor
28 40 @AllArgsConstructor
  41 +## 处理 Excel 导出 + Schema 注解(仅 DO 模式)
  42 +#if ($voType == 20)
  43 +@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO")
  44 +@ExcelIgnoreUnannotated
  45 +#end
29 46 public class ${table.className}DO extends BaseDO {
30 47  
31 48 ## 特殊:树表专属逻辑
... ... @@ -45,6 +62,18 @@ public class ${table.className}DO extends BaseDO {
45 62 #if (${column.primaryKey})##处理主键
46 63 @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end
47 64 #end
  65 +#if ($voType == 20)
  66 +## 1. 处理 Swagger 注解
  67 + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end)
  68 +## 2. 处理 Excel 导出
  69 +#if ("$!column.dictType" != "")##处理枚举值
  70 + @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class)
  71 + @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
  72 +#else
  73 + @ExcelProperty("${column.columnComment}")
  74 +#end
  75 +#end
  76 +## 3. 处理字段定义
48 77 private ${column.javaType} ${column.javaField};
49 78 #end
50 79 #end
... ...
yudao-module-infra/src/main/resources/codegen/java/dal/do_sub.vm
... ... @@ -14,6 +14,17 @@ import java.time.LocalDateTime;
14 14 #end
15 15 import com.baomidou.mybatisplus.annotation.*;
16 16 import ${BaseDOClassName};
  17 +## 处理 Schema 注解(仅 DO 模式)
  18 +#if ($voType == 20)
  19 +import io.swagger.v3.oas.annotations.media.Schema;
  20 +#foreach ($column in $columns)
  21 + #if ("$!column.dictType" != "")## 有设置数据字典
  22 + import ${DictFormatClassName};
  23 + import ${DictConvertClassName};
  24 + #break
  25 + #end
  26 +#end
  27 +#end
17 28  
18 29 /**
19 30 * ${subTable.classComment} DO
... ... @@ -28,6 +39,10 @@ import ${BaseDOClassName};
28 39 @Builder
29 40 @NoArgsConstructor
30 41 @AllArgsConstructor
  42 +## 处理 Schema 注解(仅 DO 模式)
  43 +#if ($voType == 20)
  44 +@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO")
  45 +#end
31 46 public class ${subTable.className}DO extends BaseDO {
32 47  
33 48 #foreach ($column in $subColumns)
... ... @@ -42,6 +57,11 @@ public class ${subTable.className}DO extends BaseDO {
42 57 #if (${column.primaryKey})##处理主键
43 58 @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end
44 59 #end
  60 +#if ($voType == 20)
  61 +## 1. 处理 Swagger 注解
  62 + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end)
  63 +#end
  64 +## 2. 处理字段定义
45 65 private ${column.javaType} ${column.javaField};
46 66 #end
47 67 #end
... ...
yudao-module-infra/src/main/resources/codegen/java/service/service.vm
... ... @@ -21,17 +21,17 @@ public interface ${table.className}Service {
21 21 /**
22 22 * 创建${table.classComment}
23 23 *
24   - * @param createReqVO 创建信息
  24 + * @param ${saveReqVOVar} 创建信息
25 25 * @return 编号
26 26 */
27   - ${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO);
  27 + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${saveReqVOClass} ${saveReqVOVar});
28 28  
29 29 /**
30 30 * 更新${table.classComment}
31 31 *
32   - * @param updateReqVO 更新信息
  32 + * @param ${updateReqVOVar} 更新信息
33 33 */
34   - void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO);
  34 + void update${simpleClassName}(@Valid ${updateReqVOClass} ${updateReqVOVar});
35 35  
36 36 /**
37 37 * 删除${table.classComment}
... ...
yudao-module-infra/src/main/resources/codegen/java/service/serviceImpl.vm
... ... @@ -49,19 +49,21 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
49 49 #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
50 50 @Transactional(rollbackFor = Exception.class)
51 51 #end
52   - public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) {
  52 + public ${primaryColumn.javaType} create${simpleClassName}(${saveReqVOClass} ${saveReqVOVar}) {
53 53 ## 特殊:树表专属逻辑
54 54 #if ( $table.templateType == 2 )
55 55 #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
56 56 #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
57 57 // 校验${treeParentColumn.columnComment}的有效性
58   - validateParent${simpleClassName}(null, createReqVO.get${TreeParentJavaField}());
  58 + validateParent${simpleClassName}(null, ${createReqVOVar}.get${TreeParentJavaField}());
59 59 // 校验${treeNameColumn.columnComment}的唯一性
60   - validate${simpleClassName}${TreeNameJavaField}Unique(null, createReqVO.get${TreeParentJavaField}(), createReqVO.get${TreeNameJavaField}());
  60 + validate${simpleClassName}${TreeNameJavaField}Unique(null, ${createReqVOVar}.get${TreeParentJavaField}(), ${createReqVOVar}.get${TreeNameJavaField}());
61 61  
62 62 #end
63 63 // 插入
  64 +#if ($voType == 10)
64 65 ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class);
  66 +#end
65 67 ${classNameVar}Mapper.insert(${classNameVar});
66 68 ## 特殊:主子表专属逻辑(非 ERP 模式)
67 69 #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
... ... @@ -73,9 +75,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
73 75 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
74 76 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
75 77 #if ( $subTable.subJoinMany)
76   - create${subSimpleClassName}List(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}s());
  78 + create${subSimpleClassName}List(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}s());
77 79 #else
78   - create${subSimpleClassName}(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}());
  80 + create${subSimpleClassName}(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}());
79 81 #end
80 82 #end
81 83 #end
... ... @@ -88,22 +90,26 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
88 90 #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
89 91 @Transactional(rollbackFor = Exception.class)
90 92 #end
91   - public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) {
  93 + public void update${simpleClassName}(${updateReqVOClass} ${updateReqVOVar}) {
92 94 // 校验存在
93   - validate${simpleClassName}Exists(updateReqVO.getId());
  95 + validate${simpleClassName}Exists(${updateReqVOVar}.getId());
94 96 ## 特殊:树表专属逻辑
95 97 #if ( $table.templateType == 2 )
96 98 #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
97 99 #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
98 100 // 校验${treeParentColumn.columnComment}的有效性
99   - validateParent${simpleClassName}(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}());
  101 + validateParent${simpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}());
100 102 // 校验${treeNameColumn.columnComment}的唯一性
101   - validate${simpleClassName}${TreeNameJavaField}Unique(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}(), updateReqVO.get${TreeNameJavaField}());
  103 + validate${simpleClassName}${TreeNameJavaField}Unique(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}(), ${updateReqVOVar}.get${TreeNameJavaField}());
102 104  
103 105 #end
104 106 // 更新
  107 +#if ($voType == 10)
105 108 ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class);
106 109 ${classNameVar}Mapper.updateById(updateObj);
  110 +#else
  111 + ${classNameVar}Mapper.updateById(${updateReqVOVar});
  112 +#end
107 113 ## 特殊:主子表专属逻辑(非 ERP 模式)
108 114 #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11)
109 115  
... ... @@ -114,9 +120,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
114 120 #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
115 121 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
116 122 #if ( $subTable.subJoinMany)
117   - update${subSimpleClassName}List(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}s());
  123 + update${subSimpleClassName}List(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}s());
118 124 #else
119   - update${subSimpleClassName}(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}());
  125 + update${subSimpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}());
120 126 #end
121 127 #end
122 128 #end
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -269,6 +269,7 @@ yudao:
269 269 base-package: ${yudao.info.base-package}
270 270 db-schemas: ${spring.datasource.dynamic.datasource.master.name}
271 271 front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
  272 + vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类
272 273 unit-test-enable: false # 是否生成单元测试
273 274 tenant: # 多租户相关配置项
274 275 enable: true
... ...