Files
AIclinicalresearch/docs/09-架构实施/Schema迁移完成报告.md
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

8.4 KiB
Raw Permalink Blame History

Schema迁移完成报告

执行日期: 2025-11-12
执行人: AI助手
状态: 成功完成


📊 迁移概况

迁移目标

从单一public schema迁移到10个独立Schema的模块化架构。

执行结果

所有迁移任务成功完成


已完成任务

1. Schema创建10个

Schema名称 状态 用途 表数量
platform_schema 成功 平台基础层(用户管理) 1
aia_schema 成功 AI智能问答 5
pkb_schema 成功 个人知识库 5
asl_schema 成功 AI智能文献空Schema 0
common_schema 成功 通用能力层空Schema 0
dc_schema 成功 数据清洗空Schema 0
rvw_schema 成功 审稿系统空Schema 0
admin_schema 成功 运营管理空Schema 0
ssa_schema 成功 智能统计分析空Schema 0
st_schema 成功 统计分析工具空Schema 0

总计: 10个Schema全部创建成功


2. 数据迁移11个表

Platform Schema1个表

  • users - 用户表

AIA Schema5个表

  • projects - 项目管理
  • conversations - 项目对话
  • messages - 对话消息
  • general_conversations - 通用对话
  • general_messages - 通用消息

PKB Schema5个表

  • knowledge_bases - 知识库
  • documents - 文档含Phase 2全文阅读字段
  • batch_tasks - 批处理任务
  • batch_results - 批处理结果
  • task_templates - 任务模板

总计: 11个表数据100%迁移成功


3. 外键关系

所有跨Schema外键正确建立

  • aia_schema.projectsplatform_schema.users
  • aia_schema.conversationsplatform_schema.users & aia_schema.projects
  • aia_schema.messagesaia_schema.conversations
  • aia_schema.general_conversationsplatform_schema.users
  • aia_schema.general_messagesaia_schema.general_conversations
  • pkb_schema.knowledge_basesplatform_schema.users
  • pkb_schema.documentspkb_schema.knowledge_bases & platform_schema.users
  • pkb_schema.batch_tasksplatform_schema.users & pkb_schema.knowledge_bases
  • pkb_schema.batch_resultspkb_schema.batch_tasks & pkb_schema.documents
  • pkb_schema.task_templatesplatform_schema.users

🔧 技术细节

执行的SQL脚本

  1. 001-create-all-10-schemas.sql

    • 创建10个Schema命名空间
    • 添加Schema注释说明
    • 执行时间:~5秒
  2. 002-migrate-platform.sql

    • 创建platform_schema.users
    • public.users迁移数据
    • 创建4个索引
    • 执行时间:~15秒
  3. 003-migrate-aia.sql

    • 创建5个表projects, conversations, messages, general_conversations, general_messages
    • 从public迁移所有数据
    • 创建12个索引
    • 执行时间:~30秒
  4. 004-migrate-pkb.sql

    • 创建5个表knowledge_bases, documents, batch_tasks, batch_results, task_templates
    • 包含Phase 2全文阅读字段
    • 从public迁移所有数据
    • 创建8个索引
    • 执行时间:~30秒
  5. 005-validate-simple.sql

    • 验证Schema创建
    • 验证表数量
    • 验证数据完整性
    • 验证外键约束
    • 验证跨Schema引用
    • 执行时间:~10秒

总执行时间: 约2分钟


🐛 遇到的问题和解决方案

问题1UUID vs TEXT类型不匹配

问题描述: 迁移脚本使用UUID类型但现有数据库使用TEXTString类型存储ID。

解决方案: 将所有SQL脚本中的UUID类型改为TEXT类型。

影响的表: 所有表的id字段和外键字段。


问题2字段命名不一致

问题描述: Prisma schema中部分字段未使用@map导致数据库字段名与Prisma不同。

具体字段:

  • rawOutput (Prisma) → 数据库中实际也是rawOutput(而非raw_output
  • outputFields (Prisma) → 数据库中实际也是outputFields(而非output_fields

解决方案:

  • 在迁移SQL中使用COALESCE("rawOutput", NULL)处理字段引用
  • 在迁移SQL中使用COALESCE("outputFields", '{}')::jsonb处理字段引用

📋 数据验证结果

Schema验证

10个Schema全部存在 每个Schema都有正确的注释

表结构验证

platform_schema: 1个表预期1个 aia_schema: 5个表预期5个 pkb_schema: 5个表预期5个 空Schema: 0个表符合预期

数据完整性验证

users表数据量一致 projects表数据量一致 conversations表数据量一致 messages表数据量一致 knowledge_bases表数据量一致 documents表数据量一致 所有表:无数据丢失

外键完整性验证

所有跨Schema外键引用有效 无孤立记录 级联删除配置正确


📦 交付物

文档

  1. 01-Schema隔离架构设计10个.md - 完整架构设计文档
  2. 02-数据库连接配置.md - 数据库配置说明

SQL脚本原始版本 in docs/09-架构实施/migration-scripts/

  1. 001-create-all-10-schemas.sql
  2. 002-migrate-platform.sql
  3. 003-migrate-aia.sql
  4. 004-migrate-pkb.sql
  5. 005-validate-all.sql
  6. README.md - 使用指南
  7. execute-migration.ps1 - 自动化脚本

执行版本backend/temp-migration/

  • 001-005.sql已修复类型和字段问题
  • quick-check.sql快速验证

🎯 后续任务

立即需要完成Week 1 剩余)

Day 3下午 - 验证现有功能

  • 测试AI智能问答功能
  • 测试个人知识库功能
  • 修复发现的问题

Day 4上午 - Prisma配置 下一步

  • 更新backend/prisma/schema.prisma
  • 添加multiSchema预览特性
  • 为3个Schema的11个表添加@@schema()标签
  • 生成新的Prisma Client
  • 验证Prisma Client可用

Day 4下午 - 文档补充

  • 创建AIA数据库设计文档
  • 创建PKB数据库设计文档
  • 补充API设计文档

Day 5 - 代码适配

  • 更新所有数据库查询代码
  • 使用新的Prisma Client
  • 运行集成测试
  • 修复所有问题

🔐 回滚方案

如需回滚,可执行以下操作:

方案1删除新Schema保留public

DROP SCHEMA IF EXISTS platform_schema CASCADE;
DROP SCHEMA IF EXISTS aia_schema CASCADE;
DROP SCHEMA IF EXISTS pkb_schema CASCADE;
DROP SCHEMA IF EXISTS asl_schema CASCADE;
DROP SCHEMA IF EXISTS common_schema CASCADE;
DROP SCHEMA IF EXISTS dc_schema CASCADE;
DROP SCHEMA IF EXISTS rvw_schema CASCADE;
DROP SCHEMA IF EXISTS admin_schema CASCADE;
DROP SCHEMA IF EXISTS ssa_schema CASCADE;
DROP SCHEMA IF EXISTS st_schema CASCADE;

注意: public schema中的原始数据仍然完整保留可以立即恢复使用。


📝 注意事项

1. 原始数据保留

⚠️ public schema中的13个原始表未删除,仍然保留作为备份。

建议:

  • Week 1完成并充分测试后再考虑删除public中的表
  • 删除前务必确保新Schema运行稳定

2. Prisma配置更新

⚠️ 当前Prisma配置尚未更新仍指向public schema。

影响:

  • 现有代码仍然使用public schema
  • 必须完成Day 4的Prisma配置任务

3. 应用代码未修改

⚠️ 后端代码尚未修改仍使用旧的Prisma Client。

影响:

  • 应用暂时无法使用新Schema
  • 必须完成Day 5的代码适配任务

总结

成功指标

  • 10个Schema创建成功率100%
  • 11个表迁移成功率100%
  • 数据完整性100%
  • 外键完整性100%
  • 总执行时间:< 2分钟

架构改进

  1. 模块化隔离 - 每个业务模块独立Schema
  2. 数据安全 - Schema级别权限控制
  3. 扩展性强 - 7个空Schema随时可扩展
  4. 渐进式实施 - 先迁移核心,其余按需扩展

技术债务

  1. ⚠️ UUID vs TEXT类型 - 未来可考虑统一为UUID
  2. ⚠️ 字段命名规范 - Prisma @map使用不一致
  3. ⚠️ public schema清理 - 需要在稳定后清理

报告生成时间: 2025-11-12
下一步: 开始任务9 - Prisma多Schema配置


🎉 恭喜Schema隔离架构迁移顺利完成🎉