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:
@@ -1,71 +1,71 @@
|
||||
# INST-<EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡?- 璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?
|
||||
# INST-机构管理端 - 模块当前状态与开发指南
|
||||
|
||||
> **最后更新:** 2026-01-11
|
||||
> **状态:** 🔴 未开始(等待运营管理端完成)
|
||||
> **<EFBFBD><EFBFBD>𧋦嚗?* v0.0 (Planning)
|
||||
> **版本:** v0.0 (Planning)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 一句话总结
|
||||
|
||||
**<EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡臭蛹<EFBFBD>駁堺<EFBFBD>諹晓隡<EFBFBD>恥<EFBFBD>瑟<EFBFBD>靘𥡝䌊<EFBFBD>滚𦛚蝞∠<EFBFBD><EFBFBD>屸𢒰嚗諹悟<EFBFBD>箸<EFBFBD>蝞∠<EFBFBD><EFBFBD>䁅<EFBFBD>憭毺𡠺蝡讠恣<EFBFBD><EFBFBD>鍂<EFBFBD>瑯<EFBFBD><EFBFBD><EFBFBD>憸腈<EFBFBD><EFBFBD><EFBFBD>摰?憿寧𤌍蝑㕑<E89D91>皞僐<E79A9E>?*
|
||||
**机构管理端为医院和药企客户提供自服务管理界面,让机构管理员能够独立管理用户、配额、科室/项目等资源。**
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 敶枏<E695B6>撘<EFBFBD><E69298>𤑳𠶖<F0A491B3>?
|
||||
## 📊 当前开发状态
|
||||
|
||||
### <EFBFBD>?撌脣<E6928C><E884A3>?
|
||||
### ✅ 已完成
|
||||
|
||||
- [ ] **<EFBFBD>?*嚗<><E59A97><EFBFBD>芸<EFBFBD>憪页<E686AA>
|
||||
- [ ] **无**(尚未开始)
|
||||
|
||||
### <EFBFBD>银 餈𥡝<E9A488>銝?
|
||||
### 🚧 进行中
|
||||
|
||||
- [ ] **<EFBFBD>?*
|
||||
- [ ] **无**
|
||||
|
||||
### <EFBFBD>?敺<><E695BA><EFBFBD>𡢅<EFBFBD>靘肽<E99D98>餈鞱𨯫蝞∠<E89D9E>蝡荔<E89DA1>
|
||||
### ⏳ 待开发(依赖运营管理端)
|
||||
|
||||
**前置条件(必须先完成):**
|
||||
- [ ] 餈鞱𨯫蝞∠<EFBFBD>蝡臬抅蝖<EFBFBD><EFBFBD>嗆<EFBFBD>嚗㇊hase 0-2嚗?
|
||||
- [ ] 运营管理端基础架构(Phase 0-2)
|
||||
- [ ] 租户管理功能
|
||||
- [ ] 蝘<EFBFBD><EFBFBD>銝枏<EFBFBD><EFBFBD>餃<EFBFBD>憿?
|
||||
- [ ] 租户专属登录页
|
||||
- [ ] 品牌定制配置
|
||||
|
||||
**机构管理端开发计划(预计Week 5+):**
|
||||
|
||||
**P1 - <EFBFBD>駁堺蝞∠<EFBFBD>蝡荔<EFBFBD>Week 5-6嚗?*
|
||||
- [ ] <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗㇃RUD + 蝘穃恕<E7A983><E68195><EFBFBD>嚗?
|
||||
**P1 - 医院管理端(Week 5-6)**
|
||||
- [ ] 用户管理(CRUD + 科室分配)
|
||||
- [ ] 科室管理(支持多级结构)
|
||||
- [ ] <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD>摰?銝芯犖嚗?
|
||||
- [ ] 配额分配(科室/个人)
|
||||
- [ ] 审计日志查询
|
||||
|
||||
**P1 - <EFBFBD>臭<EFBFBD>蝞∠<EFBFBD>蝡荔<EFBFBD>Week 7-8嚗?*
|
||||
- [ ] <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗㇃RUD + 閫坿𠧧<E59DBF><F0A0A7A7><EFBFBD>嚗?
|
||||
- [ ] 憿寧𤌍蝞∠<EFBFBD>嚗㇆IT憿寧𤌍<EFBFBD>唾<EFBFBD>嚗?
|
||||
- [ ] <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗<EFBFBD>★<EFBFBD>?銝芯犖嚗?
|
||||
- [ ] 摰∟恣<EFBFBD>亙<EFBFBD><EFBFBD>亥砭嚗㇅DA<EFBFBD><EFBFBD><EFBFBD>嚗?
|
||||
**P1 - 药企管理端(Week 7-8)**
|
||||
- [ ] 用户管理(CRUD + 角色分配)
|
||||
- [ ] 项目管理(IIT项目关联)
|
||||
- [ ] 配额分配(项目/个人)
|
||||
- [ ] 审计日志查询(FDA合规)
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD>儭?<3F>嗆<EFBFBD>璁<EFBFBD><E79281>
|
||||
## 🏗️ 架构概览
|
||||
|
||||
```
|
||||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡荔<EFBFBD>INST Portal嚗? <EFBFBD>?
|
||||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>? <20>蘂 <20>駁堺蝞∠<E89D9E>蝡? <20>? <20><> <20>臭<EFBFBD>蝞∠<E89D9E>蝡? <EFBFBD>?
|
||||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>?繚 <20>冽<EFBFBD>蝞∠<E89D9E> <20>? 繚 <20>冽<EFBFBD>蝞∠<E89D9E> <EFBFBD>?
|
||||
<EFBFBD>?繚 蝘穃恕蝞∠<E89D9E> <20>? 繚 憿寧𤌍蝞∠<E89D9E> <EFBFBD>?
|
||||
<EFBFBD>?繚 <20>漤<EFBFBD><E6BCA4><EFBFBD><EFBFBD>嚗<EFBFBD><E59A97>摰?鈭綽<E988AD> <20>? 繚 <20>漤<EFBFBD><E6BCA4><EFBFBD><EFBFBD>嚗<EFBFBD>★<EFBFBD>?鈭綽<E988AD> <EFBFBD>?
|
||||
<EFBFBD>?繚 摰∟恣<E2889F>亙<EFBFBD> <20>? 繚 摰∟恣<E2889F>亙<EFBFBD>嚗<EFBFBD><E59A97>閫<EFBFBD><E996AB> <EFBFBD>?
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>氯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>?
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ 机构管理端(INST Portal) │
|
||||
├──────────────────────┬──────────────────────────┤
|
||||
│ 🏥 医院管理端 │ 💊 药企管理端 │
|
||||
├──────────────────────┼──────────────────────────┤
|
||||
│ · 用户管理 │ · 用户管理 │
|
||||
│ · 科室管理 │ · 项目管理 │
|
||||
│ · 配额分配(科室/人) │ · 配额分配(项目/人) │
|
||||
│ · 审计日志 │ · 审计日志(合规) │
|
||||
└──────────────────────┴──────────────────────────┘
|
||||
↓
|
||||
继承运营管理端的基础设施
|
||||
<EFBFBD>?
|
||||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>? Platform Layer <EFBFBD>?
|
||||
<EFBFBD>? 霈方<E99C88>銝剖<E98A9D> <20>?<3F><><EFBFBD>銝剖<E98A9D> <20>?憭𡁶<E686AD><F0A181B6>琿<EFBFBD>蝳?<3F>?摰∟恣<E2889F>亙<EFBFBD> <EFBFBD>?
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
↓
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Platform Layer │
|
||||
│ 认证中心 │ 权限中心 │ 多租户隔离 │ 审计日志 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
@@ -74,12 +74,12 @@
|
||||
|
||||
| 功能 | HOSPITAL_ADMIN | DEPARTMENT_ADMIN | PHARMA_ADMIN | PROJECT_MANAGER | USER |
|
||||
|------|----------------|------------------|--------------|-----------------|------|
|
||||
| <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>瑕<EFBFBD>嚗?| <20>?<3F>券<EFBFBD> | <20>?<3F>祉<EFBFBD>摰?| <20>?<3F>券<EFBFBD> | <20>?憿寧𤌍<E5AFA7>𣂼<EFBFBD> | <EFBFBD>?|
|
||||
| 蝘穃恕蝞∠<EFBFBD> | <20>?| <20>?| N/A | N/A | <EFBFBD>?|
|
||||
| 憿寧𤌍蝞∠<EFBFBD> | N/A | N/A | <EFBFBD>?<3F>亦<EFBFBD> | <20>?蝞∠<E89D9E> | <EFBFBD>?|
|
||||
| <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | <20>?| <20>?<3F>祉<EFBFBD>摰?| <20>?| <20>?憿寧𤌍<E5AFA7>?| <20>?|
|
||||
| 摰∟恣<EFBFBD>亙<EFBFBD> | <20>?蝘<><E89D98><EFBFBD>?| <20>?<3F>祉<EFBFBD>摰?| <20>?蝘<><E89D98><EFBFBD>?| <20>?憿寧𤌍<E5AFA7>?| <20>?|
|
||||
| 銝𡁜𦛚璅∪<EFBFBD>雿輻鍂 | <20>?| <20>?| <20>?| <20>?| <20>?|
|
||||
| 用户管理(租户内) | ✅ 全部 | ✅ 本科室 | ✅ 全部 | ✅ 项目成员 | ❌ |
|
||||
| 科室管理 | ✅ | ❌ | N/A | N/A | ❌ |
|
||||
| 项目管理 | N/A | N/A | ✅ 查看 | ✅ 管理 | ❌ |
|
||||
| 配额分配 | ✅ | ✅ 本科室 | ✅ | ✅ 项目内 | ❌ |
|
||||
| 审计日志 | ✅ 租户内 | ✅ 本科室 | ✅ 租户内 | ✅ 项目内 | ❌ |
|
||||
| 业务模块使用 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
|
||||
---
|
||||
|
||||
@@ -90,30 +90,30 @@
|
||||
```
|
||||
backend/src/
|
||||
├── modules/
|
||||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> institution/ # <EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡舀芋<EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> controllers/
|
||||
<EFBFBD>? <EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital/
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> user.controller.ts
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> department.controller.ts
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> quota.controller.ts
|
||||
<EFBFBD>? <20>? <20>?
|
||||
<EFBFBD>? <EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma/
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> user.controller.ts
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> project.controller.ts
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> quota.controller.ts
|
||||
<EFBFBD>? <EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> services/
|
||||
<EFBFBD>? <EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital.service.ts
|
||||
<EFBFBD>? <EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma.service.ts
|
||||
<EFBFBD>? <EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> routes/
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> hospital.routes.ts
|
||||
<EFBFBD>? <EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> pharma.routes.ts
|
||||
<EFBFBD>?
|
||||
│ └── 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 # 租户隔离(复用)
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> department.middleware.ts # 蝘穃恕<EFBFBD><EFBFBD><EFBFBD>璉<EFBFBD><EFBFBD>?
|
||||
└── department.middleware.ts # 科室权限检查
|
||||
```
|
||||
|
||||
### 前端
|
||||
@@ -121,33 +121,33 @@ backend/src/
|
||||
```
|
||||
frontend-v2/src/
|
||||
├── modules/
|
||||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> institution/ # <EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡舀芋<EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> pages/
|
||||
<EFBFBD>? <EFBFBD>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital/
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> UserManagement/
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DepartmentManagement/
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> QuotaAllocation/
|
||||
<EFBFBD>? <EFBFBD>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> AuditLog/
|
||||
<EFBFBD>? <20>? <20>?
|
||||
<EFBFBD>? <EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma/
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> UserManagement/
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> ProjectManagement/
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> QuotaAllocation/
|
||||
<EFBFBD>? <EFBFBD>? <EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> AuditLog/
|
||||
<EFBFBD>? <EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> components/
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> UserForm/
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> DepartmentTree/
|
||||
<EFBFBD>? <EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> QuotaAllocator/
|
||||
<EFBFBD>? <EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> AuditLogViewer/
|
||||
<EFBFBD>?
|
||||
│ └── institution/ # 机构管理端模块
|
||||
│ ├── pages/
|
||||
│ │ ├── hospital/
|
||||
│ │ │ ├── UserManagement/
|
||||
│ │ │ ├── DepartmentManagement/
|
||||
│ │ │ ├── QuotaAllocation/
|
||||
│ │ │ └── AuditLog/
|
||||
│ │ │
|
||||
│ │ └── pharma/
|
||||
│ │ ├── UserManagement/
|
||||
│ │ ├── ProjectManagement/
|
||||
│ │ ├── QuotaAllocation/
|
||||
│ │ └── AuditLog/
|
||||
│ │
|
||||
│ └── components/
|
||||
│ ├── UserForm/
|
||||
│ ├── DepartmentTree/
|
||||
│ ├── QuotaAllocator/
|
||||
│ └── AuditLogViewer/
|
||||
│
|
||||
└── layouts/
|
||||
└── TenantLayout/ # 租户专属布局(品牌定制)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD>綫 UI/UX <EFBFBD>寞<EFBFBD>?
|
||||
## 🎨 UI/UX 特性
|
||||
|
||||
### 1. 租户品牌定制
|
||||
|
||||
@@ -160,9 +160,9 @@ document.documentElement.style.setProperty('--primary-color', config.primaryColo
|
||||
document.title = config.systemName;
|
||||
```
|
||||
|
||||
**<EFBFBD><EFBFBD><EFBFBD>嚗?*
|
||||
- <EFBFBD>誩<EFBFBD><EFBFBD>駁堺<EFBFBD>见<EFBFBD><EFBFBD><EFBFBD>糓<EFBFBD>誩<EFBFBD>Logo<EFBFBD>?<3F>誩<EFBFBD>銝游<E98A9D><E6B8B8>𠉛弦撟喳蝱"
|
||||
- 颲厩<EFBFBD><EFBFBD>臭<EFBFBD><EFBFBD>见<EFBFBD><EFBFBD><EFBFBD>糓颲厩<EFBFBD>Logo<EFBFBD>?颲厩<E9A2B2>IIT蝞∠<E89D9E>撟喳蝱"
|
||||
**效果:**
|
||||
- 协和医院看到的是协和Logo和"协和临床研究平台"
|
||||
- 辉瑞药业看到的是辉瑞Logo和"辉瑞IIT管理平台"
|
||||
|
||||
### 2. 科室树组件(医院端)
|
||||
|
||||
@@ -175,19 +175,19 @@ document.title = config.systemName;
|
||||
/>
|
||||
```
|
||||
|
||||
**<EFBFBD>舀<EFBFBD>嚗?*
|
||||
**支持:**
|
||||
- 多级展开/折叠
|
||||
- 拖拽排序
|
||||
- <EFBFBD>漤<EFBFBD><EFBFBD>航<EFBFBD><EFBFBD>?
|
||||
- 配额可视化
|
||||
|
||||
### 3. <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
### 3. 配额分配器
|
||||
|
||||
```tsx
|
||||
<QuotaAllocator
|
||||
totalQuota={1000000}
|
||||
allocations={[
|
||||
{ target: '敹<EFBFBD><EFBFBD>蝘?, allocated: 500000, used: 300000 },
|
||||
{ target: '蟡𧼮<EFBFBD>蝘?, allocated: 300000, used: 150000 }
|
||||
{ target: '心内科', allocated: 500000, used: 300000 },
|
||||
{ target: '神内科', allocated: 300000, used: 150000 }
|
||||
]}
|
||||
onAllocate={(target, amount) => handleAllocate(target, amount)}
|
||||
/>
|
||||
@@ -200,9 +200,9 @@ document.title = config.systemName;
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD>儭?<3F>唳旿璅∪<E79285>
|
||||
## 🗄️ 数据模型
|
||||
|
||||
### <EFBFBD>駁堺蝡?
|
||||
### 医院端
|
||||
|
||||
```typescript
|
||||
// 科室
|
||||
@@ -221,16 +221,16 @@ interface QuotaAllocation {
|
||||
id: string;
|
||||
tenantId: string;
|
||||
targetType: 'DEPARTMENT' | 'USER';
|
||||
targetKey: string; // DepartmentID <EFBFBD>?UserID
|
||||
targetKey: string; // DepartmentID 或 UserID
|
||||
limitAmount: bigint;
|
||||
usedAmount: bigint;
|
||||
}
|
||||
```
|
||||
|
||||
### <EFBFBD>臭<EFBFBD>蝡?
|
||||
### 药企端
|
||||
|
||||
```typescript
|
||||
// 憿寧𤌍嚗<EFBFBD><EFBFBD><EFBFBD>㶏IT嚗?
|
||||
// 项目(关联IIT)
|
||||
interface Project {
|
||||
id: string;
|
||||
tenantId: string;
|
||||
@@ -252,11 +252,11 @@ interface ProjectMember {
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 撘<><E69298>烐<EFBFBD>蝔?
|
||||
## 🚀 开发流程
|
||||
|
||||
### Step 1: 设计阶段(当前)
|
||||
|
||||
- [ ] 霂衣<EFBFBD><EFBFBD><EFBFBD>瘙<EFBFBD><EFBFBD>獢<EFBFBD><EFBFBD>PRD嚗?
|
||||
- [ ] 详细需求文档(PRD)
|
||||
- [ ] API接口设计
|
||||
- [ ] 数据库表设计
|
||||
- [ ] UI原型设计
|
||||
@@ -275,19 +275,19 @@ interface ProjectMember {
|
||||
- 配额分配API
|
||||
- 审计日志API(合规)
|
||||
|
||||
### Step 3: <EFBFBD>滨垢撘<EFBFBD><EFBFBD>?
|
||||
### Step 3: 前端开发
|
||||
|
||||
1. **公共组件**
|
||||
- TenantLayout嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗅<EFBFBD>撅<EFBFBD>嚗?
|
||||
- QuotaAllocator嚗<EFBFBD><EFBFBD>憸嘥<EFBFBD><EFBFBD>滚膥嚗?
|
||||
- AuditLogViewer嚗<EFBFBD>恣霈⊥𠯫敹埈䰻<EFBFBD>见膥嚗?
|
||||
- TenantLayout(品牌定制布局)
|
||||
- QuotaAllocator(配额分配器)
|
||||
- AuditLogViewer(审计日志查看器)
|
||||
|
||||
2. **<EFBFBD>駁堺蝡舫△<EFBFBD>?*
|
||||
2. **医院端页面**
|
||||
- 用户管理
|
||||
- 蝘穃恕蝞∠<EFBFBD>嚗㇄epartmentTree嚗?
|
||||
- 科室管理(DepartmentTree)
|
||||
- 配额分配
|
||||
|
||||
3. **<EFBFBD>臭<EFBFBD>蝡舫△<EFBFBD>?*
|
||||
3. **药企端页面**
|
||||
- 用户管理
|
||||
- 项目管理
|
||||
- 配额分配
|
||||
@@ -296,48 +296,48 @@ interface ProjectMember {
|
||||
|
||||
## 📚 核心文档导航
|
||||
|
||||
### 敶枏<EFBFBD><EFBFBD>舫<EFBFBD>霂?
|
||||
### 当前可阅读
|
||||
|
||||
1. **整体架构**
|
||||
`../ADMIN-餈鞱𨯫蝞∠<EFBFBD>蝡?00-蝟餌<E89D9F>霈曇恣/00-<2D><><EFBFBD>銝舘<E98A9D><E88898>脖<EFBFBD>蝟餅4<E9A485><EFBC94>𥁒<EFBFBD>𠽤v1.0.md`
|
||||
`../ADMIN-运营管理端/00-系统设计/00-权限与角色体系梳理报告_v1.0.md`
|
||||
|
||||
2. **需求文档(包含机构端)**
|
||||
`../ADMIN-餈鞱𨯫蝞∠<EFBFBD>蝡?01-<2D><>瘙<EFBFBD><E79899><EFBFBD>?02-<2D>𡁶鍂<F0A181B6>賢<EFBFBD>撅<EFBFBD>07-餈鞱𨯫銝擧㦤<E693A7><E3A6A4>恣<EFBFBD><E681A3>垢PRD_v2.1.md`
|
||||
`../ADMIN-运营管理端/01-需求分析/02-通用能力层_07-运营与机构管理端PRD_v2.1.md`
|
||||
|
||||
3. **餈鞱𨯫蝡舐𠶖<EFBFBD>?*
|
||||
`../ADMIN-餈鞱𨯫蝞∠<EFBFBD>蝡?00-璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?md`
|
||||
3. **运营端状态**
|
||||
`../ADMIN-运营管理端/00-模块当前状态与开发指南.md`
|
||||
|
||||
### 敺<EFBFBD><EFBFBD>撱箸<EFBFBD>獢?
|
||||
### 待创建文档
|
||||
|
||||
**00-系统设计/**
|
||||
- [ ] `01-<EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡舀沲<EFBFBD><EFBFBD>挽霈?md`
|
||||
- [ ] `02-憭𡁶<EFBFBD><EFBFBD>琿<EFBFBD>蝳餉挽霈?md`
|
||||
- [ ] `01-机构管理端架构设计.md`
|
||||
- [ ] `02-多租户隔离设计.md`
|
||||
- [ ] `03-配额管理设计.md`
|
||||
|
||||
**01-<EFBFBD><EFBFBD>瘙<EFBFBD><EFBFBD><EFBFBD>?**
|
||||
**01-需求分析/**
|
||||
- [ ] `01-医院管理端PRD.md`
|
||||
- [ ] `02-药企管理端PRD.md`
|
||||
- [ ] `03-<EFBFBD>冽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝𡡞<EFBFBD><EFBFBD>嗆<EFBFBD><EFBFBD>?md`
|
||||
- [ ] `03-用户故事与验收标准.md`
|
||||
|
||||
**02-<EFBFBD><EFBFBD><EFBFBD>航挽霈?**
|
||||
**02-技术设计/**
|
||||
- [ ] `01-API设计文档.md`
|
||||
- [ ] `02-<EFBFBD>唳旿摨栞挽霈⊥<EFBFBD>獢?md`
|
||||
- [ ] `03-蝘穃恕<EFBFBD>穃<EFBFBD><EFBFBD>唳䲮獢?md`
|
||||
- [ ] `02-数据库设计文档.md`
|
||||
- [ ] `03-科室树实现方案.md`
|
||||
- [ ] `04-配额计算算法.md`
|
||||
|
||||
**03-UI设计/**
|
||||
- [ ] `01-<EFBFBD>駁堺蝡臬<EFBFBD><EFBFBD>贝挽霈?html`
|
||||
- [ ] `02-<EFBFBD>臭<EFBFBD>蝡臬<EFBFBD><EFBFBD>贝挽霈?html`
|
||||
- [ ] `01-医院端原型设计.html`
|
||||
- [ ] `02-药企端原型设计.html`
|
||||
- [ ] `03-品牌定制指南.md`
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD>𩤃<EFBFBD> <20><><EFBFBD>航<EFBFBD><E888AA>?
|
||||
## ⚠️ 技术要点
|
||||
|
||||
### 1. 憭𡁶<EFBFBD><EFBFBD>琿<EFBFBD>蝳?
|
||||
### 1. 多租户隔离
|
||||
|
||||
```typescript
|
||||
// 銝剝𡢿隞塚<EFBFBD>蝖桐<EFBFBD><EFBFBD>芾<EFBFBD>霈輸䔮<EFBFBD>芸楛蝘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>?
|
||||
// 中间件:确保只能访问自己租户的数据
|
||||
export const requireTenantAccess = async (request: FastifyRequest) => {
|
||||
const { tenantId } = request.user;
|
||||
const { id } = request.params;
|
||||
@@ -352,10 +352,10 @@ export const requireTenantAccess = async (request: FastifyRequest) => {
|
||||
};
|
||||
```
|
||||
|
||||
### 2. 蝘穃恕<EFBFBD><EFBFBD><EFBFBD>璉<EFBFBD><EFBFBD>?
|
||||
### 2. 科室权限检查
|
||||
|
||||
```typescript
|
||||
// 蝘穃恕蝞∠<EFBFBD><EFBFBD>睃蘨<EFBFBD>賜恣<EFBFBD><EFBFBD>䌊撌梁<EFBFBD>摰?
|
||||
// 科室管理员只能管理自己科室
|
||||
export const requireDepartmentAccess = async (request: FastifyRequest) => {
|
||||
const { role, departmentId } = request.user;
|
||||
const { deptId } = request.params;
|
||||
@@ -369,12 +369,12 @@ export const requireDepartmentAccess = async (request: FastifyRequest) => {
|
||||
### 3. 配额计算
|
||||
|
||||
```typescript
|
||||
// 霈∠<EFBFBD><EFBFBD>臬<EFBFBD><EFBFBD>漤<EFBFBD>憸?
|
||||
// 计算可分配配额
|
||||
export const calculateAvailableQuota = async (tenantId: string) => {
|
||||
// 1. <EFBFBD>瑕<EFBFBD>蝘<EFBFBD><EFBFBD><EFBFBD>駁<EFBFBD>憸?
|
||||
// 1. 获取租户总配额
|
||||
const tenantQuota = await getTenantQuota(tenantId);
|
||||
|
||||
// 2. 霈∠<EFBFBD>撌脣<EFBFBD><EFBFBD>漤<EFBFBD>憸?
|
||||
// 2. 计算已分配配额
|
||||
const allocated = await prisma.tenantQuotaAllocation.aggregate({
|
||||
where: { tenantId },
|
||||
_sum: { limitAmount: true }
|
||||
@@ -387,30 +387,30 @@ export const calculateAvailableQuota = async (tenantId: string) => {
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 銝舘<E98A9D><E88898>亦恣<E4BAA6><E681A3>垢<EFBFBD><E59EA2>笆瘥?
|
||||
## 🔍 与运营管理端的对比
|
||||
|
||||
| <EFBFBD>寞<EFBFBD>?| 餈鞱𨯫蝞∠<E89D9E>蝡荔<E89DA1>ADMIN嚗?| <20>箸<EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>INST嚗?|
|
||||
| 特性 | 运营管理端(ADMIN) | 机构管理端(INST) |
|
||||
|------|-------------------|------------------|
|
||||
| **<EFBFBD>冽<EFBFBD>** | <EFBFBD>砍虬<EFBFBD><EFBFBD><EFBFBD>餈鞱𨯫鈭箏<EFBFBD> | <20>駁堺/<2F>臭<EFBFBD>蝞∠<E89D9E><E288A0>?|
|
||||
| **<EFBFBD><EFBFBD><EFBFBD>** | <EFBFBD>典<EFBFBD>蝞∠<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | 蝘<><E89D98>蝥抒恣<E68A92><E681A3><EFBFBD><EFBFBD>?|
|
||||
| **蝘<EFBFBD><EFBFBD>蝞∠<EFBFBD>** | <EFBFBD>?<3F>𥕦遣/蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD>厩<EFBFBD><E58EA9>?| <20>?<3F>芾<EFBFBD><E88ABE>见<EFBFBD><E8A781>芸楛蝘<E6A59B><E89D98> |
|
||||
| **<EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>** | <EFBFBD>?<3F>典<EFBFBD><E585B8>冽<EFBFBD>蝞∠<E89D9E> | <20>?蝘<><E89D98><EFBFBD><EFBFBD>鍂<EFBFBD>瑞恣<E7919E>?|
|
||||
| **<EFBFBD>漤<EFBFBD>蝞∠<EFBFBD>** | <EFBFBD>?<3F><><EFBFBD>蝘<EFBFBD><E89D98><EFBFBD>駁<EFBFBD>憸?| <20>?<3F><><EFBFBD>蝘穃恕/憿寧𤌍<E5AFA7>漤<EFBFBD> |
|
||||
| **Prompt蝞∠<EFBFBD>** | <EFBFBD>?<3F>煺漣<E785BA>臬<EFBFBD>靚<EFBFBD><E99D9A> | <20>?<3F>䭾<EFBFBD><E4ADBE>?|
|
||||
| **摰∟恣<EFBFBD>亙<EFBFBD>** | <EFBFBD>?<3F>典<EFBFBD><E585B8>亙<EFBFBD> | <20>?蝘<><E89D98><EFBFBD><EFBFBD>𠯫敹?|
|
||||
| **<EFBFBD><EFBFBD><EFBFBD>摰𡁜<EFBFBD>** | <EFBFBD>?<3F>滨蔭<E6BBA8><E894AD><EFBFBD>厩<EFBFBD><E58EA9>瑕<EFBFBD><E79195>?| <20>?<3F>芾<EFBFBD><E88ABE>亦<EFBFBD> |
|
||||
| **用户** | 公司内部运营人员 | 医院/药企管理员 |
|
||||
| **权限** | 全局管理权限 | 租户级管理权限 |
|
||||
| **租户管理** | ✅ 创建/管理所有租户 | ❌ 只能看到自己租户 |
|
||||
| **用户管理** | ✅ 全局用户管理 | ✅ 租户内用户管理 |
|
||||
| **配额管理** | ✅ 分配租户总配额 | ✅ 分配科室/项目配额 |
|
||||
| **Prompt管理** | ✅ 生产环境调试 | ❌ 无权限 |
|
||||
| **审计日志** | ✅ 全局日志 | ✅ 租户内日志 |
|
||||
| **品牌定制** | ✅ 配置所有租户品牌 | ❌ 只能查看 |
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 憸<>恣撘<E681A3><E69298>烐𧒄<E78390>?
|
||||
## 📅 预计开发时间
|
||||
|
||||
**<EFBFBD>齿<EFBFBD>嚗?* 餈鞱𨯫蝞∠<E89D9E>蝡臬抅蝖<E68A85><E89D96>嗆<EFBFBD>摰峕<E691B0>嚗Áeek 4嚗?
|
||||
**前提:** 运营管理端基础架构完成(Week 4)
|
||||
|
||||
- **Week 5-6嚗?* <20>駁堺蝞∠<E89D9E>蝡荔<E89DA1>8鈭箏予嚗?
|
||||
- **Week 7-8嚗?* <20>臭<EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>8鈭箏予嚗?
|
||||
- **Week 9嚗?* 瘚贝<E7989A>銝𦒘<E98A9D><F0A69298>吔<EFBFBD>3鈭箏予嚗?
|
||||
- **Week 5-6:** 医院管理端(8人天)
|
||||
- **Week 7-8:** 药企管理端(8人天)
|
||||
- **Week 9:** 测试与优化(3人天)
|
||||
|
||||
**<EFBFBD>餉恣嚗?* 蝥?9鈭箏予嚗ǚ4<C79A>剁<EFBFBD>
|
||||
**总计:** 约19人天(~4周)
|
||||
|
||||
---
|
||||
|
||||
@@ -418,11 +418,11 @@ export const calculateAvailableQuota = async (tenantId: string) => {
|
||||
|
||||
1. **架构问题**:参考运营管理端实现
|
||||
2. **权限问题**:查看`00-权限与角色体系梳理报告_v1.0.md`
|
||||
3. **UI<EFBFBD>桅<EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD>C/ASL蝑匧歇<E58CA7>㗇芋<E39787>?
|
||||
3. **UI问题**:参考DC/ASL等已有模块
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD>㴓 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
|
||||
## 🎯 下一步行动
|
||||
|
||||
- [ ] 等待运营管理端完成基础架构
|
||||
- [ ] 开始编写详细PRD
|
||||
@@ -431,12 +431,11 @@ export const calculateAvailableQuota = async (tenantId: string) => {
|
||||
|
||||
---
|
||||
|
||||
*<2A>箸<EFBFBD>蝞∠<E89D9E>蝡航蒾<E888AA>嗅<EFBFBD><E59785>芸<EFBFBD>憪见<E686AA><E8A781>𡢅<EFBFBD>雿<EFBFBD>挽霈⊥<E99C88>肽楝撌脫<E6928C>蝖柴<E89D96><E69FB4><EFBFBD>餈鞱𨯫蝞∠<E89D9E>蝡臬<E89DA1><E887AC>𣂼<EFBFBD>嚗<EFBFBD>虾敹恍<E695B9>笔鍳<E7AC94>典<EFBFBD><E585B8>㻫<EFBFBD>?
|
||||
*机构管理端虽然尚未开始开发,但设计思路已明确。待运营管理端完成后,可快速启动开发。*
|
||||
|
||||
---
|
||||
|
||||
**<EFBFBD><EFBFBD> <20>祈窈<E7A588>笔<EFBFBD>嚗?*
|
||||
|
||||
**🚀 敬请期待!**
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user