Files
AIclinicalresearch/docs/03-业务模块/INST-机构管理端/00-模块当前状态与开发指南.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

445 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# INST-机构管理端 - 模块当前状态与开发指南
> **最后更新:** 2026-01-11
> **状态:** 🔴 未开始(等待运营管理端完成)
> **版本:** v0.0 (Planning)
---
## 🎯 一句话总结
**机构管理端为医院和药企客户提供自服务管理界面,让机构管理员能够独立管理用户、配额、科室/项目等资源。**
---
## 📊 当前开发状态
### ✅ 已完成
- [ ] **无**(尚未开始)
### 🚧 进行中
- [ ] **无**
### ⏳ 待开发(依赖运营管理端)
**前置条件(必须先完成):**
- [ ] 运营管理端基础架构Phase 0-2
- [ ] 租户管理功能
- [ ] 租户专属登录页
- [ ] 品牌定制配置
**机构管理端开发计划预计Week 5+**
**P1 - 医院管理端Week 5-6**
- [ ] 用户管理CRUD + 科室分配)
- [ ] 科室管理(支持多级结构)
- [ ] 配额分配(科室/个人)
- [ ] 审计日志查询
**P1 - 药企管理端Week 7-8**
- [ ] 用户管理CRUD + 角色分配)
- [ ] 项目管理IIT项目关联
- [ ] 配额分配(项目/个人)
- [ ] 审计日志查询FDA合规
---
## 🏗️ 架构概览
```
┌─────────────────────────────────────────────────┐
│ 机构管理端INST Portal
├──────────────────────┬──────────────────────────┤
│ 🏥 医院管理端 │ 💊 药企管理端 │
├──────────────────────┼──────────────────────────┤
│ · 用户管理 │ · 用户管理 │
│ · 科室管理 │ · 项目管理 │
│ · 配额分配(科室/人) │ · 配额分配(项目/人) │
│ · 审计日志 │ · 审计日志(合规) │
└──────────────────────┴──────────────────────────┘
继承运营管理端的基础设施
┌─────────────────────────────────────────────────┐
│ Platform Layer │
│ 认证中心 │ 权限中心 │ 多租户隔离 │ 审计日志 │
└─────────────────────────────────────────────────┘
```
---
## 🔐 权限矩阵
| 功能 | HOSPITAL_ADMIN | DEPARTMENT_ADMIN | PHARMA_ADMIN | PROJECT_MANAGER | USER |
|------|----------------|------------------|--------------|-----------------|------|
| 用户管理(租户内) | ✅ 全部 | ✅ 本科室 | ✅ 全部 | ✅ 项目成员 | ❌ |
| 科室管理 | ✅ | ❌ | N/A | N/A | ❌ |
| 项目管理 | N/A | N/A | ✅ 查看 | ✅ 管理 | ❌ |
| 配额分配 | ✅ | ✅ 本科室 | ✅ | ✅ 项目内 | ❌ |
| 审计日志 | ✅ 租户内 | ✅ 本科室 | ✅ 租户内 | ✅ 项目内 | ❌ |
| 业务模块使用 | ✅ | ✅ | ✅ | ✅ | ✅ |
---
## 📁 代码结构(规划)
### 后端
```
backend/src/
├── modules/
│ └── institution/ # 机构管理端模块
│ ├── controllers/
│ │ ├── hospital/
│ │ │ ├── user.controller.ts
│ │ │ ├── department.controller.ts
│ │ │ └── quota.controller.ts
│ │ │
│ │ └── pharma/
│ │ ├── user.controller.ts
│ │ ├── project.controller.ts
│ │ └── quota.controller.ts
│ │
│ ├── services/
│ │ ├── hospital.service.ts
│ │ └── pharma.service.ts
│ │
│ └── routes/
│ ├── hospital.routes.ts
│ └── pharma.routes.ts
└── common/
└── middleware/
├── tenant.middleware.ts # 租户隔离(复用)
└── department.middleware.ts # 科室权限检查
```
### 前端
```
frontend-v2/src/
├── modules/
│ └── institution/ # 机构管理端模块
│ ├── pages/
│ │ ├── hospital/
│ │ │ ├── UserManagement/
│ │ │ ├── DepartmentManagement/
│ │ │ ├── QuotaAllocation/
│ │ │ └── AuditLog/
│ │ │
│ │ └── pharma/
│ │ ├── UserManagement/
│ │ ├── ProjectManagement/
│ │ ├── QuotaAllocation/
│ │ └── AuditLog/
│ │
│ └── components/
│ ├── UserForm/
│ ├── DepartmentTree/
│ ├── QuotaAllocator/
│ └── AuditLogViewer/
└── layouts/
└── TenantLayout/ # 租户专属布局(品牌定制)
```
---
## 🎨 UI/UX 特性
### 1. 租户品牌定制
```typescript
// 从API获取租户配置
const tenantConfig = await api.get('/api/public/tenant-config/:tenantCode');
// 应用品牌样式
document.documentElement.style.setProperty('--primary-color', config.primaryColor);
document.title = config.systemName;
```
**效果:**
- 协和医院看到的是协和Logo和"协和临床研究平台"
- 辉瑞药业看到的是辉瑞Logo和"辉瑞IIT管理平台"
### 2. 科室树组件(医院端)
```tsx
<DepartmentTree
departments={departments}
onSelect={(dept) => loadDeptUsers(dept)}
showQuota={true} // 显示科室配额
allowEdit={hasPermission('dept:edit')}
/>
```
**支持:**
- 多级展开/折叠
- 拖拽排序
- 配额可视化
### 3. 配额分配器
```tsx
<QuotaAllocator
totalQuota={1000000}
allocations={[
{ target: '心内科', allocated: 500000, used: 300000 },
{ target: '神内科', allocated: 300000, used: 150000 }
]}
onAllocate={(target, amount) => handleAllocate(target, amount)}
/>
```
**特性:**
- 可视化进度条
- 实时计算剩余配额
- 超额预警
---
## 🗄️ 数据模型
### 医院端
```typescript
// 科室
interface Department {
id: string;
tenantId: string;
name: string;
parentId?: string; // 支持多级
description?: string;
members: User[];
quota?: QuotaAllocation;
}
// 配额分配
interface QuotaAllocation {
id: string;
tenantId: string;
targetType: 'DEPARTMENT' | 'USER';
targetKey: string; // DepartmentID 或 UserID
limitAmount: bigint;
usedAmount: bigint;
}
```
### 药企端
```typescript
// 项目关联IIT
interface Project {
id: string;
tenantId: string;
iitProjectId?: string; // 关联IIT项目
name: string;
description?: string;
members: User[];
quota?: QuotaAllocation;
}
// 项目成员
interface ProjectMember {
id: string;
projectId: string;
userId: string;
role: 'PROJECT_MANAGER' | 'DATA_ANALYST' | 'MEMBER';
}
```
---
## 🚀 开发流程
### Step 1: 设计阶段(当前)
- [ ] 详细需求文档PRD
- [ ] API接口设计
- [ ] 数据库表设计
- [ ] UI原型设计
### Step 2: 后端开发(依赖运营端完成)
1. **医院端API**
- 用户管理API
- 科室管理API
- 配额分配API
- 审计日志API
2. **药企端API**
- 用户管理API
- 项目管理API
- 配额分配API
- 审计日志API合规
### Step 3: 前端开发
1. **公共组件**
- TenantLayout品牌定制布局
- QuotaAllocator配额分配器
- AuditLogViewer审计日志查看器
2. **医院端页面**
- 用户管理
- 科室管理DepartmentTree
- 配额分配
3. **药企端页面**
- 用户管理
- 项目管理
- 配额分配
---
## 📚 核心文档导航
### 当前可阅读
1. **整体架构**
`../ADMIN-运营管理端/00-系统设计/00-权限与角色体系梳理报告_v1.0.md`
2. **需求文档(包含机构端)**
`../ADMIN-运营管理端/01-需求分析/02-通用能力层_07-运营与机构管理端PRD_v2.1.md`
3. **运营端状态**
`../ADMIN-运营管理端/00-模块当前状态与开发指南.md`
### 待创建文档
**00-系统设计/**
- [ ] `01-机构管理端架构设计.md`
- [ ] `02-多租户隔离设计.md`
- [ ] `03-配额管理设计.md`
**01-需求分析/**
- [ ] `01-医院管理端PRD.md`
- [ ] `02-药企管理端PRD.md`
- [ ] `03-用户故事与验收标准.md`
**02-技术设计/**
- [ ] `01-API设计文档.md`
- [ ] `02-数据库设计文档.md`
- [ ] `03-科室树实现方案.md`
- [ ] `04-配额计算算法.md`
**03-UI设计/**
- [ ] `01-医院端原型设计.html`
- [ ] `02-药企端原型设计.html`
- [ ] `03-品牌定制指南.md`
---
## ⚠️ 技术要点
### 1. 多租户隔离
```typescript
// 中间件:确保只能访问自己租户的数据
export const requireTenantAccess = async (request: FastifyRequest) => {
const { tenantId } = request.user;
const { id } = request.params;
const resource = await prisma.resource.findUnique({
where: { id }
});
if (resource.tenantId !== tenantId) {
throw new ForbiddenError('无权访问其他租户资源');
}
};
```
### 2. 科室权限检查
```typescript
// 科室管理员只能管理自己科室
export const requireDepartmentAccess = async (request: FastifyRequest) => {
const { role, departmentId } = request.user;
const { deptId } = request.params;
if (role === 'DEPARTMENT_ADMIN' && departmentId !== deptId) {
throw new ForbiddenError('无权访问其他科室');
}
};
```
### 3. 配额计算
```typescript
// 计算可分配配额
export const calculateAvailableQuota = async (tenantId: string) => {
// 1. 获取租户总配额
const tenantQuota = await getTenantQuota(tenantId);
// 2. 计算已分配配额
const allocated = await prisma.tenantQuotaAllocation.aggregate({
where: { tenantId },
_sum: { limitAmount: true }
});
// 3. 返回可用配额
return tenantQuota.totalAmount - (allocated._sum.limitAmount || 0);
};
```
---
## 🔍 与运营管理端的对比
| 特性 | 运营管理端ADMIN | 机构管理端INST |
|------|-------------------|------------------|
| **用户** | 公司内部运营人员 | 医院/药企管理员 |
| **权限** | 全局管理权限 | 租户级管理权限 |
| **租户管理** | ✅ 创建/管理所有租户 | ❌ 只能看到自己租户 |
| **用户管理** | ✅ 全局用户管理 | ✅ 租户内用户管理 |
| **配额管理** | ✅ 分配租户总配额 | ✅ 分配科室/项目配额 |
| **Prompt管理** | ✅ 生产环境调试 | ❌ 无权限 |
| **审计日志** | ✅ 全局日志 | ✅ 租户内日志 |
| **品牌定制** | ✅ 配置所有租户品牌 | ❌ 只能查看 |
---
## 📅 预计开发时间
**前提:** 运营管理端基础架构完成Week 4
- **Week 5-6** 医院管理端8人天
- **Week 7-8** 药企管理端8人天
- **Week 9** 测试与优化3人天
**总计:** 约19人天~4周
---
## 📞 需要帮助?
1. **架构问题**:参考运营管理端实现
2. **权限问题**:查看`00-权限与角色体系梳理报告_v1.0.md`
3. **UI问题**参考DC/ASL等已有模块
---
## 🎯 下一步行动
- [ ] 等待运营管理端完成基础架构
- [ ] 开始编写详细PRD
- [ ] 设计UI原型
- [ ] 设计API接口
---
*机构管理端虽然尚未开始开发,但设计思路已明确。待运营管理端完成后,可快速启动开发。*
---
**🚀 敬请期待!**