Files
AIclinicalresearch/docs/03-业务模块/INST-机构管理端/00-模块当前状态与开发指南.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

446 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-<2D><EFBFBD>蝞∠<E89D9E>蝡?- 璅<E79285>敶枏<E695B6><E69E8F><EFBFBD><E59786><EFBFBD><EFBFBD><E69298><EFBFBD><E78390>?
> **<2A><><EFBFBD>擧凒<E693A7><EFBFBD>** 2026-01-11
> **<2A><EFBFBD><E59786><EFBFBD>** <20>𣞁 <20><EFBFBD>憪页<E686AA>蝑匧<E89D91>餈鞱𨯫蝞∠<E89D9E>蝡臬<E89DA1><E887AC><EFBFBD>
> **<2A><>𧋦嚗?* v0.0 (Planning)
---
## <20>㴓 銝<><E98A9D><EFBFBD><E4BAA5><EFBFBD>
**<EFBFBD><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>?*
---
## <20><> 敶枏<E695B6><EFBFBD><E69298>𤑳𠶖<F0A491B3>?
### <20>?撌脣<E6928C><E884A3>?
- [ ] **<EFBFBD>?*嚗<><E59A97><EFBFBD><EFBFBD>憪页<E686AA>
### <20>银 餈𥡝<E9A488>銝?
- [ ] **<EFBFBD>?*
### <20>?敺<><E695BA><EFBFBD>𡢅<EFBFBD>靘肽<E99D98>餈鞱𨯫蝞∠<E89D9E>蝡荔<E89DA1>
**<EFBFBD>滨蔭<EFBFBD>∩辣嚗<EFBFBD><EFBFBD>憿餃<EFBFBD>摰峕<EFBFBD>嚗㚁<EFBFBD>**
- [ ] 餈鞱𨯫蝞∠<E89D9E>蝡臬抅蝖<E68A85><E89D96><EFBFBD>嚗㇊hase 0-2嚗?
- [ ]<><E89D98>蝞∠<E89D9E><E288A0><EFBFBD>
- [ ]<><E89D98>銝枏<E98A9D><E69E8F><EFBFBD>憿?
- [ ] <20><><EFBFBD>摰𡁜<E691B0><F0A1819C>滨蔭
**<EFBFBD><EFBFBD>蝞∠<EFBFBD>蝡臬<EFBFBD><EFBFBD>𤏸恣<EFBFBD>𡜐<EFBFBD><EFBFBD>恣Week 5+嚗㚁<E59A97>**
**P1 - <20>駁堺蝞∠<E89D9E>蝡荔<E89DA1>Week 5-6嚗?*
- [ ] <20><EFBFBD>蝞∠<E89D9E>嚗㇃RUD + 蝘穃恕<E7A983><E68195><EFBFBD>嚗?
- [ ] 蝘穃恕蝞∠<E89D9E><EFBFBD>𣈲<EFBFBD><F0A388B2><EFBFBD>蝥抒<E89DA5><E68A92><EFBFBD><EFBFBD>
- [ ] <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD><EFBFBD><E59A97>摰?銝芯犖嚗?
- [ ] 摰∟恣<E2889F><EFBFBD><E4BA99>亥砭
**P1 - <20><EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>Week 7-8嚗?*
- [ ] <20><EFBFBD>蝞∠<E89D9E>嚗㇃RUD + 閫坿𠧧<E59DBF><F0A0A7A7><EFBFBD>嚗?
- [ ] 憿寧𤌍蝞∠<E89D9E>嚗㇆IT憿寧𤌍<E5AFA7><EFBFBD>嚗?
- [ ] <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?銝芯犖嚗?
- [ ] 摰∟恣<E2889F><EFBFBD><E4BA99>亥砭嚗㇅DA<44><41><EFBFBD>嚗?
---
## <20><>儭?<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>? <20><EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>INST Portal嚗? <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>蝡? <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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> <20>?
<EFBFBD>?繚 蝘穃恕蝞∠<E89D9E> <20>? 繚 憿寧𤌍蝞∠<E89D9E> <20>?
<EFBFBD>?繚 <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD><EFBFBD><E59A97>摰?鈭綽<E988AD> <20>? 繚 <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?鈭綽<E988AD> <20>?
<EFBFBD>?繚 摰∟恣<E2889F><EFBFBD> <20>? 繚 摰∟恣<E2889F><EFBFBD><EFBFBD><E59A97><EFBFBD><E996AB> <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>?
蝏扳㗁餈鞱𨯫蝞∠<E89D9E>蝡舐<E89DA1><E88890><EFBFBD>霈暹鴌
<20>?
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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 <20>?
<EFBFBD>? 霈方<E99C88>銝剖<E98A9D> <20>?<3F><><EFBFBD>銝剖<E98A9D> <20>?憭𡁶<E686AD><F0A181B6><EFBFBD>蝳?<3F>?摰∟恣<E2889F><EFBFBD> <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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><><EFBFBD><EFBFBD>拚猐
| <20><EFBFBD> | HOSPITAL_ADMIN | DEPARTMENT_ADMIN | PHARMA_ADMIN | PROJECT_MANAGER | USER |
|------|----------------|------------------|--------------|-----------------|------|
| <20><EFBFBD>蝞∠<E89D9E><EFBFBD><E59A97><EFBFBD><EFBFBD>嚗?| <20>?<3F><EFBFBD> | <20>?<3F><EFBFBD>摰?| <20>?<3F><EFBFBD> | <20>?憿寧𤌍<E5AFA7>𣂼<EFBFBD> | <20>?|
| 蝘穃恕蝞∠<E89D9E> | <20>?| <20>?| N/A | N/A | <20>?|
| 憿寧𤌍蝞∠<E89D9E> | N/A | N/A | <20>?<3F><EFBFBD> | <20>?蝞∠<E89D9E> | <20>?|
| <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD> | <20>?| <20>?<3F><EFBFBD>摰?| <20>?| <20>?憿寧𤌍<E5AFA7>?| <20>?|
| 摰∟恣<E2889F><EFBFBD> | <20>?蝘<><E89D98><EFBFBD>?| <20>?<3F><EFBFBD>摰?| <20>?蝘<><E89D98><EFBFBD>?| <20>?憿寧𤌍<E5AFA7>?| <20>?|
| 銝𡁜𦛚璅<E79285>雿輻鍂 | <20>?| <20>?| <20>?| <20>?| <20>?|
---
## <20><><><E99A9E>蝏𤘪<E89D8F><EFBFBD><E59A97><EFBFBD>𡜐<EFBFBD>
### <20>𡒊垢
```
backend/src/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> modules/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> institution/ # <20><EFBFBD>蝞∠<E89D9E>蝡舀芋<E88880>?
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> controllers/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> hospital/
<EFBFBD>? <20>? <20>? <20><EFBFBD><E98EBF><EFBFBD> user.controller.ts
<EFBFBD>? <20>? <20>? <20><EFBFBD><E98EBF><EFBFBD> department.controller.ts
<EFBFBD>? <20>? <20>? <20><EFBFBD><E5A999><EFBFBD> quota.controller.ts
<EFBFBD>? <20>? <20>?
<EFBFBD>? <20>? <20><EFBFBD><E5A999><EFBFBD> pharma/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> user.controller.ts
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> project.controller.ts
<EFBFBD>? <20>? <20><EFBFBD><E5A999><EFBFBD> quota.controller.ts
<EFBFBD>? <20>?
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> services/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> hospital.service.ts
<EFBFBD>? <20>? <20><EFBFBD><E5A999><EFBFBD> pharma.service.ts
<EFBFBD>? <20>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> routes/
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> hospital.routes.ts
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> pharma.routes.ts
<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> common/
<20><EFBFBD><E5A999><EFBFBD> middleware/
<20><EFBFBD><E98EBF><EFBFBD> tenant.middleware.ts # 蝘<><E89D98><EFBFBD>𠉛氖嚗<E6B096><E59A97><EFBFBD><EFBFBD>
<20><EFBFBD><E5A999><EFBFBD> department.middleware.ts # 蝘穃恕<E7A983><E68195><EFBFBD><EFBFBD><E79289>?
```
### <20>滨垢
```
frontend-v2/src/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> modules/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> institution/ # <20><EFBFBD>蝞∠<E89D9E>蝡舀芋<E88880>?
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> pages/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> hospital/
<EFBFBD>? <20>? <20>? <20><EFBFBD><E98EBF><EFBFBD> UserManagement/
<EFBFBD>? <20>? <20>? <20><EFBFBD><E98EBF><EFBFBD> DepartmentManagement/
<EFBFBD>? <20>? <20>? <20><EFBFBD><E98EBF><EFBFBD> QuotaAllocation/
<EFBFBD>? <20>? <20>? <20><EFBFBD><E5A999><EFBFBD> AuditLog/
<EFBFBD>? <20>? <20>?
<EFBFBD>? <20>? <20><EFBFBD><E5A999><EFBFBD> pharma/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> UserManagement/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> ProjectManagement/
<EFBFBD>? <20>? <20><EFBFBD><E98EBF><EFBFBD> QuotaAllocation/
<EFBFBD>? <20>? <20><EFBFBD><E5A999><EFBFBD> AuditLog/
<EFBFBD>? <20>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> components/
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> UserForm/
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> DepartmentTree/
<EFBFBD>? <20><EFBFBD><E98EBF><EFBFBD> QuotaAllocator/
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> AuditLogViewer/
<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> layouts/
<20><EFBFBD><E5A999><EFBFBD> TenantLayout/ # 蝘<><E89D98>銝枏<E98A9D><EFBFBD><E692A3><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```
---
## <20>綫 UI/UX <20><EFBFBD>?
### 1. 蝘<><E89D98><EFBFBD><EFBFBD><EFBFBD>摰𡁜<E691B0>
```typescript
// 隞垾PI<50><EFBFBD><EFBFBD><E89D98><EFBFBD>滨蔭
const tenantConfig = await api.get('/api/public/tenant-config/:tenantCode');
// 摨𠉛鍂<F0A0899B><E98D82><EFBFBD><EFBFBD><EFBFBD>
document.documentElement.style.setProperty('--primary-color', config.primaryColor);
document.title = config.systemName;
```
**<EFBFBD><EFBFBD><EFBFBD>嚗?*
- <20><EFBFBD><E8AAA9>駁堺<E9A781><EFBFBD><E8A781><EFBFBD><EFBFBD><EFBFBD>Logo<67>?<3F><EFBFBD>銝游<E98A9D><E6B8B8>𠉛弦撟喳蝱"
- 颲厩<E9A2B2><E58EA9><EFBFBD><E887AD><EFBFBD><E8A781><EFBFBD>糓颲厩<E9A2B2>Logo<67>?颲厩<E9A2B2>IIT蝞∠<E89D9E>撟喳蝱"
### 2. 蝘穃恕<E7A983>𤑳<EFBFBD>隞塚<E99A9E><E5A19A>駁堺蝡荔<E89DA1>
```tsx
<DepartmentTree
departments={departments}
onSelect={(dept) => loadDeptUsers(dept)}
showQuota={true} // <20>曄內蝘穃恕<E7A983><EFBFBD>
allowEdit={hasPermission('dept:edit')}
/>
```
**<EFBFBD><EFBFBD>嚗?*
- 憭𡁶漣撅訫<E69285>/<2F><EFBFBD>
- <20>𡝗嗻<F0A19D97><EFBFBD>
- <20><EFBFBD><E6BCA4><EFBFBD><E888AA>?
### 3. <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD><EFBFBD>?
```tsx
<QuotaAllocator
totalQuota={1000000}
allocations={[
{ target: '敹<><E695B9>蝘?, allocated: 500000, used: 300000 },
{ target: '𧼮<EFBFBD>?, allocated: 300000, used: 150000 }
]}
onAllocate={(target, amount) => handleAllocate(target, amount)}
/>
```
**<EFBFBD><EFBFBD><EFBFBD>**
- <20><EFBFBD><E888AA>𤥁<EFBFBD>摨行辺
- 摰墧𧒄霈∠<E99C88><E288A0><EFBFBD><E68B90><EFBFBD>
-<><E9A09E><EFBFBD>
---
## <20><>儭?<3F>唳旿璅<E79285>
### <20>駁堺蝡?
```typescript
// 蝘穃恕
interface Department {
id: string;
tenantId: string;
name: string;
parentId?: string; // <20><EFBFBD>憭𡁶漣
description?: string;
members: User[];
quota?: QuotaAllocation;
}
// <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD>
interface QuotaAllocation {
id: string;
tenantId: string;
targetType: 'DEPARTMENT' | 'USER';
targetKey: string; // DepartmentID <20>?UserID
limitAmount: bigint;
usedAmount: bigint;
}
```
### <20><EFBFBD>蝡?
```typescript
// 憿寧𤌍嚗<F0A48C8D><E59A97><EFBFBD>㶏IT嚗?
interface Project {
id: string;
tenantId: string;
iitProjectId?: string; // <20><EFBFBD>IIT憿寧𤌍
name: string;
description?: string;
members: User[];
quota?: QuotaAllocation;
}
// 憿寧𤌍<E5AFA7>𣂼<EFBFBD>
interface ProjectMember {
id: string;
projectId: string;
userId: string;
role: 'PROJECT_MANAGER' | 'DATA_ANALYST' | 'MEMBER';
}
```
---
## <20><><><E69298><EFBFBD>蝔?
### Step 1: 霈曇恣<E69B87>嗆挾嚗<E68CBE><E59A97><EFBFBD><EFBFBD>
- [ ] 霂衣<E99C82><E8A1A3><EFBFBD><EFBFBD><E79899><EFBFBD><E78DA2>PRD嚗?
- [ ] API<50>亙藁霈曇恣
- [ ] <20>唳旿摨栞”霈曇恣
- [ ] UI<55><EFBFBD>霈曇恣
### Step 2: <20>𡒊垢撘<E59EA2><E69298>𡢅<EFBFBD>靘肽<E99D98>餈鞱𨯫蝡臬<E89DA1><E887AC><EFBFBD>
1. **<EFBFBD>駁堺蝡涉PI**
- <20><EFBFBD>蝞∠<E89D9E>API
- 蝘穃恕蝞∠<E89D9E>API
- <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD>API
- 摰∟恣<E2889F><EFBFBD>API
2. **<EFBFBD><EFBFBD>蝡涉PI**
- <20><EFBFBD>蝞∠<E89D9E>API
- 憿寧𤌍蝞∠<E89D9E>API
- <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD>API
- 摰∟恣<E2889F><EFBFBD>API嚗<49><E59A97><EFBFBD><E996AB>
### Step 3: <20>滨垢撘<E59EA2><E69298>?
1. **<EFBFBD><EFBFBD><EFBFBD>辣**
- TenantLayout嚗<74><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
- QuotaAllocator嚗<72><E59A97>憸嘥<E686B8><E598A5>滚膥嚗?
- AuditLogViewer嚗<72>恣霈⊥𠯫敹埈䰻<E59F88>见膥嚗?
2. **<EFBFBD>駁堺蝡舫△<EFBFBD>?*
- <20><EFBFBD>蝞∠<E89D9E>
- 蝘穃恕蝞∠<E89D9E>嚗㇄epartmentTree嚗?
- <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD>
3. **<EFBFBD><EFBFBD>蝡舫△<EFBFBD>?*
- <20><EFBFBD>蝞∠<E89D9E>
- 憿寧𤌍蝞∠<E89D9E>
- <20><EFBFBD><E6BCA4><EFBFBD><EFBFBD>
---
## <20><> <20><EFBFBD><E8A9A8><EFBFBD>﹝撖潸⏛
### 敶枏<E695B6><E69E8F><EFBFBD>霂?
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
`../ADMIN-餈鞱𨯫蝞∠<E89D9E>蝡?00-蝟餌<E89D9F>霈曇恣/00-<2D><><EFBFBD>銝舘<E98A9D><E88898><EFBFBD>蝟餅<E9A485><EFBC94>𥁒<EFBFBD>𠽤v1.0.md`
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝡荔<EFBFBD>**
`../ADMIN-餈鞱𨯫蝞∠<E89D9E>蝡?01-<2D><><EFBFBD><E79899><EFBFBD>?02-<2D>𡁶鍂<F0A181B6><EFBFBD><EFBFBD>07-餈鞱𨯫銝擧㦤<E693A7><E3A6A4><EFBFBD><E681A3>垢PRD_v2.1.md`
3. **餈鞱𨯫蝡舐𠶖<E88890>?*
`../ADMIN-餈鞱𨯫蝞∠<E89D9E>蝡?00-璅<E79285>敶枏<E695B6><E69E8F><EFBFBD><E59786><EFBFBD><EFBFBD><E69298><EFBFBD><E78390>?md`
### 敺<><E695BA>撱箸<E692B1>獢?
**00-蝟餌<E89D9F>霈曇恣/**
- [ ] `01-<2D><EFBFBD>蝞∠<E89D9E>蝡舀沲<E88880><E6B2B2>挽霈?md`
- [ ] `02-憭𡁶<E686AD><F0A181B6><EFBFBD>蝳餉挽霈?md`
- [ ] `03-<2D><EFBFBD>蝞∠<E89D9E>霈曇恣.md`
**01-<2D><><EFBFBD><E79899><EFBFBD>?**
- [ ] `01-<2D>駁堺蝞∠<E89D9E>蝡烈RD.md`
- [ ] `02-<2D><EFBFBD>蝞∠<E89D9E>蝡烈RD.md`
- [ ] `03-<2D><EFBFBD><E586BD><EFBFBD><EFBFBD>銝𡡞<E98A9D><F0A1A19E><EFBFBD><E59786>?md`
**02-<2D><><EFBFBD>航挽霈?**
- [ ] `01-API霈曇恣<E69B87><E681A3>﹝.md`
- [ ] `02-<2D>唳旿摨栞挽霈⊥<E99C88>獢?md`
- [ ] `03-蝘穃恕<E7A983><EFBFBD><E7A983>唳䲮獢?md`
- [ ] `04-<2D><EFBFBD>霈∠<E99C88>蝞埈<E89D9E>.md`
**03-UI霈曇恣/**
- [ ] `01-<2D>駁堺蝡臬<E89DA1><E887AC>贝挽霈?html`
- [ ] `02-<2D><EFBFBD>蝡臬<E89DA1><E887AC>贝挽霈?html`
- [ ] `03-<2D><><EFBFBD>摰𡁜<E691B0><F0A1819C><EFBFBD><EFBFBD>.md`
---
## <20>𩤃<EFBFBD> <20><><EFBFBD><EFBFBD><E888AA>?
### 1. 憭𡁶<E686AD><F0A181B6><EFBFBD>蝳?
```typescript
// 銝剝𡢿隞塚<E99A9E>蝖桐<E89D96><E6A190><EFBFBD>霈輸䔮<E8BCB8>芸楛蝘<E6A59B><E89D98><EFBFBD><EFBFBD><EFBFBD>?
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('<27><EFBFBD>霈輸䔮<E8BCB8><EFBFBD><EFBFBD><E89D98><EFBFBD><E99F8F>');
}
};
```
### 2. 蝘穃恕<E7A983><E68195><EFBFBD><EFBFBD><E79289>?
```typescript
// 蝘穃恕蝞∠<E89D9E><E288A0>睃蘨<E79D83>賜恣<E8B39C><E681A3>䌊撌梁<E6928C>摰?
export const requireDepartmentAccess = async (request: FastifyRequest) => {
const { role, departmentId } = request.user;
const { deptId } = request.params;
if (role === 'DEPARTMENT_ADMIN' && departmentId !== deptId) {
throw new ForbiddenError('<27><EFBFBD>霈輸䔮<E8BCB8><EFBFBD>蝘穃恕');
}
};
```
### 3. <20><EFBFBD>霈∠<E99C88>
```typescript
// 霈∠<E99C88><E288A0><EFBFBD><E887AC><EFBFBD>憸?
export const calculateAvailableQuota = async (tenantId: string) => {
// 1. <20><EFBFBD><EFBFBD><E89D98><EFBFBD><EFBFBD>憸?
const tenantQuota = await getTenantQuota(tenantId);
// 2. 霈∠<E99C88>撌脣<E6928C><E884A3><EFBFBD>憸?
const allocated = await prisma.tenantQuotaAllocation.aggregate({
where: { tenantId },
_sum: { limitAmount: true }
});
// 3. 餈𥪜<E9A488><F0A5AA9C>舐鍂<E88890><EFBFBD>
return tenantQuota.totalAmount - (allocated._sum.limitAmount || 0);
};
```
---
## <20><> 銝舘<E98A9D><E88898>亦恣<E4BAA6><E681A3><EFBFBD><E59EA2>笆瘥?
| <20><EFBFBD>?| 餈鞱𨯫蝞∠<E89D9E>蝡荔<E89DA1>ADMIN嚗?| <20><EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>INST嚗?|
|------|-------------------|------------------|
| **<EFBFBD><EFBFBD>** | <20>砍虬<E7A08D><E899AC><EFBFBD>餈鞱𨯫鈭箏<E988AD> | <20>駁堺/<2F><EFBFBD>蝞∠<E89D9E><E288A0>?|
| **<EFBFBD><EFBFBD><EFBFBD>** | <20><EFBFBD>蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD> | 蝘<><E89D98>蝥抒恣<E68A92><E681A3><EFBFBD><EFBFBD>?|
| **蝘<><E89D98>蝞∠<E89D9E>** | <20>?<3F>𥕦遣/蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD><EFBFBD><E58EA9>?| <20>?<3F><EFBFBD><E88ABE><EFBFBD><E8A781>芸楛蝘<E6A59B><E89D98> |
| **<EFBFBD><EFBFBD>蝞∠<EFBFBD>** | <20>?<3F><EFBFBD><E585B8><EFBFBD>蝞∠<E89D9E> | <20>?蝘<><E89D98><EFBFBD><EFBFBD><EFBFBD>瑞恣<E7919E>?|
| **<EFBFBD><EFBFBD>蝞∠<EFBFBD>** | <20>?<3F><><EFBFBD><EFBFBD><E89D98><EFBFBD><EFBFBD>憸?| <20>?<3F><><EFBFBD>蝘穃恕/憿寧𤌍<E5AFA7><EFBFBD> |
| **Prompt蝞∠<E89D9E>** | <20>?<3F>煺漣<E785BA><EFBFBD><EFBFBD><E99D9A> | <20>?<3F><EFBFBD><E4ADBE>?|
| **摰∟恣<E2889F><EFBFBD>** | <20>?<3F><EFBFBD><E585B8><EFBFBD> | <20>?蝘<><E89D98><EFBFBD><EFBFBD>𠯫敹?|
| **<EFBFBD><EFBFBD><EFBFBD>摰𡁜<EFBFBD>** | <20>?<3F>滨蔭<E6BBA8><E894AD><EFBFBD><EFBFBD><E58EA9><EFBFBD><E79195>?| <20>?<3F><EFBFBD><E88ABE><EFBFBD> |
---
## <20><><>恣撘<E681A3><E69298>烐𧒄<E78390>?
**<EFBFBD>齿<EFBFBD>嚗?* 餈鞱𨯫蝞∠<E89D9E>蝡臬抅蝖<E68A85><E89D96><EFBFBD>摰峕<E691B0>嚗Áeek 4嚗?
- **Week 5-6嚗?* <20>駁堺蝞∠<E89D9E>蝡荔<E89DA1>8鈭箏予嚗?
- **Week 7-8嚗?* <20><EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>8鈭箏予嚗?
- **Week 9嚗?* 瘚贝<E7989A>銝𦒘<E98A9D><F0A69298><EFBFBD>3鈭箏予嚗?
**<EFBFBD>餉恣嚗?* 蝥?9鈭箏予嚗ǚ4<C79A><EFBFBD>
---
## <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><EFBFBD>亦恣<E4BAA6><E681A3>垢摰䂿緵
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗𡁏䰻<F0A1818F>㞗00-<2D><><EFBFBD>銝舘<E98A9D><E88898><EFBFBD>蝟餅<E9A485><EFBC94>𥁒<EFBFBD>𠽤v1.0.md`
3. **UI<55><EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD>C/ASL蝑匧歇<E58CA7>㗇芋<E39787>?
---
## <20>㴓 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
- [ ] 蝑匧<E89D91>餈鞱𨯫蝞∠<E89D9E>蝡臬<E89DA1><E887AC>𣂼抅蝖<E68A85><E89D96><EFBFBD>
- [ ]<>憪讠<E686AA><E8AEA0>躰祕蝏<E7A595>RD
- [ ] 霈曇恣UI<55><EFBFBD>
- [ ] 霈曇恣API<50>亙藁
---
*<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>嚗?*