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%)
446 lines
12 KiB
Markdown
446 lines
12 KiB
Markdown
# 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>蝟餅4<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>蝟餅4<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>嚗?*
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|