Commit 501cfe5afa7fc951e8d92dcdb80bfc8a5406543a
1 parent
0f7e715b
feat:【INFRA 基础设施】代码生成时,支持配置 VO/DO 模式
Showing
9 changed files
with
160 additions
and
28 deletions
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 | ... | ... |