Sfoglia il codice sorgente

代码生成:支持设置主子表的信息

YunaiV 1 anno fa
parent
commit
a75bb825d7

+ 2 - 0
yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/enums/ErrorCodeConstants.java

@@ -42,6 +42,8 @@ public interface ErrorCodeConstants {
     ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1_003_001_007, "同步失败,不存在改变");
     ErrorCode CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL = new ErrorCode(1_003_001_008, "数据库的表注释未填写");
     ErrorCode CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL = new ErrorCode(1_003_001_009, "数据库的表字段({})注释未填写");
+    ErrorCode CODEGEN_MASTER_TABLE_NOT_EXISTS = new ErrorCode(1_003_001_010, "主表(id={})定义不存在,请检查");
+    ErrorCode CODEGEN_SUB_COLUMN_NOT_EXISTS = new ErrorCode(1_003_001_011, "子表的字段(id={})不存在,请检查");
 
     // ========== 文件配置 1-001-006-000 ==========
     ErrorCode FILE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_006_000, "文件配置不存在");

+ 10 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java

@@ -60,10 +60,19 @@ public class CodegenController {
         return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment));
     }
 
+    @GetMapping("/table/list")
+    @Operation(summary = "获得表定义列表")
+    @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1")
+    @PreAuthorize("@ss.hasPermission('infra:codegen:query')")
+    public CommonResult<List<CodegenTableRespVO>> getCodegenTableList(@RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId) {
+        List<CodegenTableDO> list = codegenService.getCodegenTableList(dataSourceConfigId);
+        return success(CodegenConvert.INSTANCE.convertList05(list));
+    }
+
     @GetMapping("/table/page")
     @Operation(summary = "获得表定义分页")
     @PreAuthorize("@ss.hasPermission('infra:codegen:query')")
-    public CommonResult<PageResult<CodegenTableRespVO>> getCodeGenTablePage(@Valid CodegenTablePageReqVO pageReqVO) {
+    public CommonResult<PageResult<CodegenTableRespVO>> getCodegenTablePage(@Valid CodegenTablePageReqVO pageReqVO) {
         PageResult<CodegenTableDO> pageResult = codegenService.getCodegenTablePage(pageReqVO);
         return success(CodegenConvert.INSTANCE.convertPage(pageResult));
     }

+ 5 - 3
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.column.CodegenC
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTableBaseVO;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -38,17 +39,18 @@ public class CodegenUpdateReqVO {
         private Long id;
 
         @AssertTrue(message = "上级菜单不能为空,请前往 [修改生成配置 -> 生成信息] 界面,设置“上级菜单”字段")
+        @JsonIgnore
         public boolean isParentMenuIdValid() {
             // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的
             return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene())
                     || getParentMenuId() != null;
         }
 
-        // TODO 芋艿:这里有问题哈;
-        @AssertTrue(message = "关联的子表与字段不能为空")
+        @AssertTrue(message = "关联的父表信息不全")
+        @JsonIgnore
         public boolean isSubValid() {
             return ObjectUtil.notEqual(getTemplateType(), CodegenTemplateTypeEnum.SUB)
-                    || (getSubTableId() != null && getSubColumnId() != null);
+                    || (ObjectUtil.isAllNotEmpty(getMasterTableId(), getSubJoinColumnId(), getSubJoinMany()));
         }
 
     }

+ 6 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.java

@@ -58,9 +58,11 @@ public class CodegenTableBaseVO {
     @Schema(description = "父菜单编号", example = "1024")
     private Long parentMenuId;
 
-    @Schema(description = "子表的表编号", example = "2048")
-    private Long subTableId;
-    @Schema(description = "子表的关联字段编号", example = "4096")
-    private Long subColumnId;
+    @Schema(description = "主表的编号", example = "2048")
+    private Long masterTableId;
+    @Schema(description = "子表关联主表的字段编号", example = "4096")
+    private Long subJoinColumnId;
+    @Schema(description = "主表与子表是否一对多", example = "4096")
+    private Boolean subJoinMany;
 
 }

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/convert/codegen/CodegenConvert.java

@@ -56,7 +56,7 @@ public interface CodegenConvert {
 
     // ========== CodegenTableDO 相关 ==========
 
-//    List<CodegenTableRespVO> convertList02(List<CodegenTableDO> list);
+    List<CodegenTableRespVO> convertList05(List<CodegenTableDO> list);
 
     CodegenTableRespVO convert(CodegenTableDO bean);
 

+ 0 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenTableDO.java

@@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
 import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
@@ -124,14 +123,12 @@ public class CodegenTableDO extends BaseDO {
      *
      * 关联 {@link CodegenTableDO#getId()}
      */
-    @TableField(exist = false)
     private Long masterTableId;
     /**
      * 【自己】子表关联主表的字段编号
      *
      * 关联 {@link CodegenColumnDO#getId()}
      */
-    @TableField(exist = false)
     private Long subJoinColumnId;
     /**
      * 主表与子表是否一对多
@@ -139,7 +136,6 @@ public class CodegenTableDO extends BaseDO {
      * true:一对多
      * false:一对一
      */
-    @TableField(exist = false)
     private Boolean subJoinMany;
 
 }

+ 12 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenTemplateTypeEnum.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.infra.enums.codegen;
 
+import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -26,4 +27,15 @@ public enum CodegenTemplateTypeEnum {
      */
     private final Integer type;
 
+    /**
+     * 是否为主表
+     *
+     * @param type 类型
+     * @return 是否主表
+     */
+    public static boolean isMaster(Integer type) {
+        return ObjectUtils.equalsAny(type,
+                MASTER_NORMAL.type, MASTER_ERP.type, MASTER_INNER.type);
+    }
+
 }

+ 8 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java

@@ -48,6 +48,14 @@ public interface CodegenService {
      */
     void deleteCodegen(Long tableId);
 
+    /**
+     * 获得表定义列表
+     *
+     * @param dataSourceConfigId 数据源配置的编号
+     * @return 表定义列表
+     */
+    List<CodegenTableDO> getCodegenTableList(Long dataSourceConfigId);
+
     /**
      * 获得表定义分页
      *

+ 23 - 11
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java

@@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
 import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenColumnMapper;
 import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenTableMapper;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
+import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
 import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties;
 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenBuilder;
 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenEngine;
@@ -25,10 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 
@@ -129,6 +127,16 @@ public class CodegenServiceImpl implements CodegenService {
         if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) {
             throw exception(CODEGEN_TABLE_NOT_EXISTS);
         }
+        // 校验主表字段存在
+        if (Objects.equals(updateReqVO.getTable().getTemplateType(), CodegenTemplateTypeEnum.SUB.getType())) {
+            if (codegenTableMapper.selectById(updateReqVO.getTable().getMasterTableId()) == null) {
+                throw exception(CODEGEN_MASTER_TABLE_NOT_EXISTS, updateReqVO.getTable().getMasterTableId());
+            }
+            if (CollUtil.findOne(updateReqVO.getColumns(),  // 关联主表的字段不存在
+                    column -> column.getId().equals(updateReqVO.getTable().getSubJoinColumnId())) == null) {
+                throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, updateReqVO.getTable().getSubJoinColumnId());
+            }
+        }
 
         // 更新 table 表定义
         CodegenTableDO updateTableObj = CodegenConvert.INSTANCE.convert(updateReqVO.getTable());
@@ -208,6 +216,11 @@ public class CodegenServiceImpl implements CodegenService {
         codegenColumnMapper.deleteListByTableId(tableId);
     }
 
+    @Override
+    public List<CodegenTableDO> getCodegenTableList(Long dataSourceConfigId) {
+        return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId);
+    }
+
     @Override
     public PageResult<CodegenTableDO> getCodegenTablePage(CodegenTablePageReqVO pageReqVO) {
         return codegenTableMapper.selectPage(pageReqVO);
@@ -235,23 +248,22 @@ public class CodegenServiceImpl implements CodegenService {
             throw exception(CODEGEN_COLUMN_NOT_EXISTS);
         }
 
-        // 校验子表是否已经存在
-        CodegenTableDO subTable = null;
-        List<CodegenColumnDO> subColumns = null;
-        if (table.getMasterTableId() != null) {
+        // 如果是主子表,则加载对应的子表信息
+        List<CodegenTableDO> subTables = null;
+        List<List<CodegenColumnDO>> subColumnsList = null;
+        if (CodegenTemplateTypeEnum.isMaster(table.getTemplateType())) {
+            subTables = codegenTableMapper.selectListByMasterTableId(tableId);
             subTable = codegenTableMapper.selectById(table.getMasterTableId());
             subColumns = codegenColumnMapper.selectListByTableId(table.getMasterTableId());
         }
 
         // 执行生成
-//        return codegenEngine.execute(table, columns, subTable, subColumns);
-        return codegenEngine.execute(table, columns, null, null);
+        return codegenEngine.execute(table, columns, subTable, subColumns);
     }
 
     @Override
     public List<DatabaseTableRespVO> getDatabaseTableList(Long dataSourceConfigId, String name, String comment) {
         List<TableInfo> tables = databaseTableService.getTableList(dataSourceConfigId, name, comment);
-        // 移除已经生成的表
         // 移除在 Codegen 中,已经存在的
         Set<String> existsTables = CollectionUtils.convertSet(
                 codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName);