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
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,41 +1,47 @@
# **REDCap 原生录入ä¸?AI Workbench æ“<C3A6>作边界åˆåˆ**
# **REDCap 原生录入与 AI Workbench 操作边界划分**
éˆå¯¹æ¨çš„关键问题:“CRC 到底在哪里录入数æ<C2B0>®ï¼Ÿâ€<C3A2>,æˆä»¬é‡‡å<E280A1>\*\*“å<C593>Œè½¨å¹¶è¡Œï¼Œåœºæ™¯åŒºåˆ†â€<C3A2>\*\*的原则ã€?
## **1\. 核心ç­ç•¥ï¼šå°Šé‡<C3A9>“数æ<C2B0>®çœŸç<C5B8>†æº<C3A6>â€?*
针对您的关键问题“CRC 到底在哪里录入数据?”,我们采取\*\*“双轨并行,场景区分”\*\*的原则。
## **1\. 核心策略:尊重“数据真理源”**
* **原则**:为了确保 GxP 合规性和维护用户的既有习惯,**REDCap 始终是主要的数据录入入口**。
* **逻辑**:我们不应该重新发明一个录入界面,而是要在录入时通过 AI 进行“实时监护”。
* **原则**:为了确ä¿?GxP å<>ˆè§„性åŒç»´æŠ¤ç”¨æˆ·çš„æ—¢æœ‰ä¹ æƒ¯ï¼Œ**REDCap å§ç»ˆæ˜¯ä¸»è¦<C3A8>的数æ<C2B0>®å½•入入å<C2A5>£**ã€?
* **逻辑**:æˆä»¬ä¸<C3A4>应该é‡<C3A9>æ°å<C2B0>明一个录入界é<C592>¢ï¼Œè€Œæ˜¯è¦<C3A8>在录入时通过 AI è¿è¡Œâ€œå®žæ—¶ç护â€<C3A2>ã€?
## **2\. 详细场景划分**
| 场景 | æ“<C3A6>作ä½<C3A4>ç½® | AI 的角è‰?| ç<>†ç”± |
| 场景 | 操作位置 | AI 的角色 | 理由 |
| :---- | :---- | :---- | :---- |
| **常规数æ<EFBFBD>®å½•å…¥** | **REDCap 界é<EFBFBD>¢** | **实时监护** | ä¿<C3A4>æŒ<C3A6> CRC 习惯,é™<C3A9>低è¿<C3A8>ç§»æˆ<C3A6>本ã€AI 通过 Webhook 实时质控ã€?|
| **大批é‡<EFBFBD>æ•°æ<EFBFBD>®å¯¼å…?* | **AI Workbench** | **智能æ<EFBFBD>¬è¿<EFBFBD>** | 外部 Excel æˆå¤šå¼ åŒéªŒå<EFBFBD>•ã€AI 清洗å<E28094>Žï¼ŒCRC 确认一次,一键注入ã€?|
| **å¾åƒ<EFBFBD>/PDF æ<><C3A6>å<EFBFBD>录入** | **AI Workbench** | **OCR æ<EFBFBD><EFBFBD>å<EFBFBD>** | REDCap 原生ä¸<EFBFBD>支æŒ<EFBFBD>å¤<EFBFBD>æ<EFBFBD>çš„ OCR è§£æž<C3A6>ã€åœ¨ Workbench 完æˆ<C3A6>æ<EFBFBD><C3A6>å<EFBFBD>比对最顺æ‰ã€?|
| **质疑(Query)处ç<EFBFBD>** | **AI Workbench** | **冲çª<EFBFBD>展示** | åœ?Workbench å<EFBFBD>¯ä»¥å<EFBFBD>Œå±<EFBFBD>çœâ€œè¯<EFBFBD>æ<EFBFBD>®åŽŸæ‡â€<EFBFBD>åŒâ€œå»ºè®®å€¼â€<EFBFBD>,体验远好äº?REDCapã€?|
| **项ç®åˆ<EFBFBD>å§åŒé…<EFBFBD>ç½?* | **AI Workbench** | **架构定义** | å¤<C3A5>æ<EFBFBD>çš?RAG 知识库上传ã€<C3A3>映射表é…<C3A9>置,属äº?AI å¹³å<C2B3>°çš„特有逻è¾ã€?|
| **常规数据录入** | **REDCap 界面** | **实时监护** | 保持 CRC 习惯降低迁移成本。AI 通过 Webhook 实时质控。 |
| **大批量数据导入** | **AI Workbench** | **智能搬运** | 外部 Excel 或多张化验单。AI 清洗后CRC 确认一次,一键注入。 |
| **图像/PDF 提取录入** | **AI Workbench** | **OCR 提取** | REDCap 原生不支持复杂的 OCR 解析。在 Workbench 完成提取比对最顺手。 |
| **质疑(Query)处理** | **AI Workbench** | **冲突展示** | Workbench 可以同屏看“证据原文”和“建议值”,体验远好于 REDCap|
| **项目初始化配置** | **AI Workbench** | **架构定义** | 复杂的 RAG 知识库上传、映射表配置,属于 AI 平台的特有逻辑。 |
## **3\. 典型流程对比**
### **æµ<EFBFBD>ç¨ A:常规录å…?(CRC åœ?REDCap æ“<EFBFBD>作)**
### **流程 A常规录入 (CRC REDCap 操作)**
1. CRC 登录 REDCap,打开æ£è€…表å<EFBFBD>•ã€?
2. 输入血红è白值:8.0(å<EFBFBD>•ä½<EFBFBD>录错)ã€?
3. ç¹å‡»ä¿<EFBFBD>å­˜ \-\> REDCap 写入 MySQL \-\> 触å<EFBFBD> Webhookã€?
4. æˆä»¬çš„å<EFBFBD>Žç«¯æ„ŸçŸ¥å<EFBFBD>Žï¼ŒQC Agent å<>现逻è¾é”™è¯¯ã€?
5. **å<EFBFBD><EFBFBD>馈**ï¼?
* **低延时æ<EFBFBD><EFBFBD>é†?*:通过 EM æ<>ä»¶åœ?REDCap 页é<C2B5>¢ä¸Šæ¹æ˜¾ç¤ºï¼šâ€œAI æ<><C3A6>示:该值å<C2BC><C3A5>离历å<E280A0>²å<C2B2>‡å€¼ï¼Œè¯·ç¡®è®¤å<C2A4>•ä½<C3A4>â€<C3A2>ã€?
* **异步质疑**:在我们çš?Workbench 生æˆ<C3A6>一æ<E282AC>?Pending Actionã€?
### **æµ<C3A6>ç¨ B:AI 增强录入 (CRC åœ?Workbench æ“<C3A6>作)**
1. CRC 登录 REDCap,打开患者表单。
2. 输入血红蛋白值8.0(单位录错)。
3. 点击保存 \-\> REDCap 写入 MySQL \-\> 触发 Webhook
4. 我们的后端感知后QC Agent 发现逻辑错误。
5. **反馈**
* **低延时提醒**:通过 EM 插件在 REDCap 页面上方显示“AI 提示:该值偏离历史均值,请确认单位”。
* **异步质疑**:在我们的 Workbench 生成一条 Pending Action
### **流程 BAI 增强录入 (CRC 在 Workbench 操作)**
1. CRC 收到一张化验单照片。
2. CRC 登录我们的 Workbench上传照片。
3. AI 提取出 10 个指标。
4. **预览比对**:界面左侧是照片,右侧是提取的表格,高亮显示不确定的值。
5. **一键注入**CRC 确认无误,点击“同步”。系统自动调用 REDCap API 将这 10 个值一次性填满 REDCap 表单。
1. CRC 收到一张åŒéªŒå<C592>•照片ã€?
2. CRC 登录我们�Workbench,上传照片�
3. AI æ<><C3A6>å<EFBFBD>å‡?10 个指标ã€?
4. **预览比对**:界é<C592>¢å·¦ä¾§æ˜¯ç…§ç‰‡ï¼Œå<C592>³ä¾§æ˜¯æ<C2AF><C3A6>å<EFBFBD>的表格,高亮显示ä¸<C3A4>确定的值ã€?
5. **一键注å…?*:CRC 确认无误,ç¹å‡»â€œå<C593>Œæ­¥â€<C3A2>ã€ç³»ç»Ÿè‡ªåŠ¨è°ƒç”?REDCap API 将这 10 个值一次性填æ»?REDCap 表å<C2A8>•ã€?
## **4\. 结论与思路总结**
* **REDCap 登录**:用于\*\*“æ‰åЍã€<C3A3>å°é‡<C3A9>ã€<C3A3>常规â€<C3A2>\*\*的临床记录ã€?
* **AI Workbench 登录**:用于\*\*“大批é‡<C3A9>ã€<C3A3>æ‡æ¡£æ<C2A3><C3A6>å<EFBFBD>ã€<C3A3>质控确认ã€<C3A3>æ¹æ¡ˆè§£æž<C3A6>â€<C3A2>\*\*的高级任务ã€?
è¿™ç§<EFBFBD>设计的优势在于:**ä¸<C3A4>强制改å<C2B9>˜ç”¨æˆ·ä¹ æƒ¯ï¼Œä½†ç”¨ AI 让任务å<C2A1>˜å¾—æ´è½»æ<C2BB>¾ã€?* æˆä»¬ä¸<C3A4>需è¦<C3A8>å<EFBFBD>šä¸€ä¸ªå®Œæ•´çš„ EDC,æˆä»¬è¦<C3A8>å<EFBFBD>šçš„æ˜?EDC 的“智能加速器â€<C3A2>ã€?
**æ¨è®¤å<C2A4>¯è¿™ä¸ªâ€œå<C593>Œè½¨åˆ¶â€<C3A2>å<EFBFBD>—ï¼?* 特别是关于“大批é‡<C3A9>åŒæ‡æ¡£æ<C2A3><C3A6>å<EFBFBD>æ‰<C3A6>åŽ?Workbenchâ€<C3A2>的设定ã€
* **REDCap 登录**:用于\*\*“手动、少量、常规”\*\*的临床记录。
* **AI Workbench 登录**:用于\*\*“大批量、文档提取、质控确认、方案解析”\*\*的高级任务。
这种设计的优势在于:**不强制改变用户习惯,但用 AI 让任务变得更轻松。** 我们不需要做一个完整的 EDC我们要做的是 EDC 的“智能加速器”。
**您认可这个“双轨制”吗?** 特别是关于“大批量和文档提取才去 Workbench”的设定。