--- name: 重构元数据数据库结构 overview: 按 新数据库结构.md 重写 fms-api/config/migrations/000_reset_metadata.sql,使表结构完全符合目标 schema;b_user 表保持不变,迁移脚本末尾仅种子 m_system 与 m_metadata。 todos: - id: rewrite-b-module-field content: 重写 b_module_field:b_type/b_default_value/b_options 列与约束,删冗余列 status: pending - id: add-b-module-field-group content: 新增 b_module_field_group 表(含自引用树),取代 b_module_field_edit_group status: pending - id: refactor-b-module-field-list content: 重构 b_module_field_list:引用分组表,移除 b_parent_id/b_kind/display/canedit status: pending dependencies: - add-b-module-field-group - id: refactor-b-module-field-edit content: 重构 b_module_field_edit:引用分组表,精简编辑器列,统一 b_xh status: pending dependencies: - add-b-module-field-group - id: update-seed-data content: 收敛种子数据仅保留 m_system 与 m_metadata status: pending dependencies: - rewrite-b-module-field - refactor-b-module-field-list - refactor-b-module-field-edit --- ## 用户需求 根据 `新数据库结构.md` 重构元数据数据库结构,使表结构完全符合目标 schema;`b_user` 表保持不变;迁移脚本末尾的种子数据仅保留"系统管理"目录与"模块管理"模块,移除多语言管理与用户授权相关全部数据。 ## 产品概述 本次为纯数据库结构重构,不涉及前后端功能页面。成果为重写 `fms-api/config/migrations/000_reset_metadata.sql` 迁移脚本,使其中所有元数据表(除 b_user 外)与目标设计文档逐一对应,并收敛种子数据。 ## 核心改动 - `b_module_field`:重命名列并采用新控件类型集合,删除冗余列。 - `b_module_field_list`:移除自包含树(b_parent_id/b_kind/b_display_type/b_canedit),改为引用统一分组表 `b_module_field_group`。 - 新增 `b_module_field_group`:统一承载列表多级表头与编辑分组的布局分组树(取代旧的 `b_module_field_edit_group`)。 - `b_module_field_edit`:剔除编辑器细节列,改为引用分组表的 `b_group_id`,统一显示顺序列为 `b_xh`。 - `b_module_field_query`、`b_module_power`、`b_user_module`、`b_user_power`、`b_i18n` 已符合目标,无需改动。 - 种子数据仅保留 `m_system` 目录与 `m_metadata` 模块及其操作权限、管理员授权;删除 `m_i18n`、`m_authorization` 全部相关行。 ## 技术栈 - 目标数据库:SQL Server(Druid 连接池,按机构独立库)。 - 变更载体:单文件 SQL 迁移脚本 `fms-api/config/migrations/000_reset_metadata.sql`,属于"RESET"脚本(执行前删除除 b_user 外的全部用户表、保留视图,再重建并插入种子)。 - 不涉及后端 Java / 前端 Vue 代码:已 grep 确认旧列名仅在迁移脚本内出现,通用接口为表/列透传,模块管理前端当前为空占位页。 ## 实施方法 完全重写 `000_reset_metadata.sql` 的建表与种子部分,使每个元数据表逐字段对齐 `新数据库结构.md`。脚本开头的"删除旧表 + 保留视图 + 重置管理员会话上下文"逻辑保持不变(它依赖 b_user,符合"b_user 不改"约束)。 ### 关键修改点(按目标文档) **1. b_module_field(混合旧列拆分)** - `b_field_type varchar(30) NOT NULL` → 重命名为 `b_type`,CHECK 改为 `('input','textarea','number','money','date','datetime','switch','select')`。 - `b_value nvarchar(500) NULL` → 重命名为 `b_default_value nvarchar(500) NULL`。 - `b_dict_code varchar(100) NULL` → 重命名为 `b_options nvarchar(max) NULL`,新增 `CHECK (b_options IS NULL OR ISJSON(b_options) = 1)`。 - 删除 `b_remark`、`b_inputdatetime` 两列。 - 保留 `b_id/b_module_id/b_field/b_name/b_i18n/b_canuse` 及外键、唯一索引 `(b_module_id, b_field)`、索引 `(b_module_id, b_canuse, b_id)`。 **2. b_module_field_group(新增,取代 b_module_field_edit_group)** - 列:`b_id bigint NOT NULL`、`b_module_id bigint NOT NULL`、`b_parent_id bigint NULL`、`b_title nvarchar(100) NOT NULL`、`b_i18n varchar(150) NULL`、`b_xh int NOT NULL DEFAULT 0`、`b_canuse int NOT NULL DEFAULT 1`。 - 外键:`FK..._module` → b_module(b_id);`FK..._parent` → 自引用 b_module_field_group(b_id)。 - 约束:`CK..._canuse CHECK (b_canuse IN (0,1))`;索引 `IX (b_module_id, b_canuse, b_xh, b_id)`。 - 注意:旧的 `b_code` 列不再需要(被 b_id 稳定关联键取代),不保留。 **3. b_module_field_list(引用统一分组表)** - 删除 `b_parent_id`、`b_kind`、`b_display_type`、`b_canedit` 及其自引用 FK `FK_b_module_field_list_parent`、shape CHECK `CK_b_module_field_list_kind` / `CK_b_module_field_list_shape` / `CK_b_module_field_list_canedit` / `CK_b_module_field_list_width`(宽度校验可保留为简单 `>0`)。 - 新增 `b_group_id bigint NULL`,`FK_b_module_field_list_group` → b_module_field_group(b_id)(同模块分组;为空时为顶层列)。 - 保留 `b_id/b_module_id/b_field_id/b_title/b_i18n/b_visible/b_xh/b_width/b_sortable` 及 CHECK `b_visible/b_sortable IN (0,1)`。 - 唯一索引 `UX (b_module_id, b_field_id)`;索引 `IX (b_module_id, b_group_id, b_xh, b_id)`。 **4. b_module_field_edit(通用编辑配置)** - 删除 `b_editor`、`b_edit_format`、`b_editor_options`、`b_placeholder`、`b_canform`、`b_edit_group`、`b_edit_span` 七列。 - `b_edit_xh` → 重命名为 `b_xh`(DEFAULT 0)。 - 新增 `b_group_id bigint NULL`,`FK_b_module_field_edit_group` → b_module_field_group(b_id)。 - 保留 `b_id/b_module_id/b_field_id/b_required/b_readonly/b_disabled` 及对应 CHECK;唯一 `(b_module_id, b_field_id)`;索引 `(b_module_id, b_xh, b_id)`。 **5. 无需改动(已符合目标)** - `b_module`(含模块类型校验、目录/页面/数据三类约束)、`b_module_field_query`、`b_module_power`、`b_user_module`、`b_user_power`、`b_i18n` 结构、约束、索引保持不变。 ### 建表顺序(满足外键依赖) `b_module` → `b_module_field_group` → `b_module_field` → `b_module_field_list` / `b_module_field_edit` / `b_module_field_query` → `b_module_power` → `b_user_module` / `b_user_power` → `b_i18n` → 种子插入。 说明:`b_module_field_group` 必须在 `b_module_field` 之前建(list/edit 的 group_id 引用它);`b_module_field_list` 与 `b_module_field_edit` 的 `b_field_id` 依赖 `b_module_field`。 ### 种子数据(按"只保留元数据") - 保留模块:`m_system`(directory,b_canmenu=1)、`m_metadata`(page,/system/metadata,b_canmenu=1)。 - 保留操作权限(b_module_power):`m_metadata` 的 create/update/delete/sync 四条。 - 保留授权(b_user_module / b_user_power):管理员对 `m_metadata` 的模块权限及上述四条操作权限。 - 移除:`m_i18n`、`m_authorization` 模块及其全部 `b_module_power`、`b_user_module`、`b_user_power` 行。 - 固定雪花种子 ID(9 开头)相应精简为 system/metadata 两套,避免与已删除模块 ID 冲突。 ## 实施注意 - 脚本头部 DROP 逻辑保留:仅删用户表(排除 b_user)、保留视图,重置 admin 会话上下文(依赖 b_user,符合约束)。 - 保持 `SET XACT_ABORT ON` 与事务包裹,确保失败时回滚。 - 不引入任何前端/后端代码改动;现有通用接口对列名透传,无需适配。 - 按开发规范,不主动执行脚本或构建;交付时说明未执行,建议用户在选定的组织库(g3hd)手动执行验证。 ## 目录结构 本次仅修改一个文件: ``` fms-api/config/migrations/ └── 000_reset_metadata.sql # [MODIFY] 重写建表与种子部分,对齐 新数据库结构.md: # - b_module_field 列重命名/精简 # - 新增 b_module_field_group 取代 b_module_field_edit_group # - b_module_field_list 改引用分组表、移除自包含树 # - b_module_field_edit 精简并引用分组表 # - 种子仅保留 m_system + m_metadata # 头部 DROP 与 admin 上下文逻辑保持不变 ```