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%)
12 KiB
INST-<2D>箸<EFBFBD>蝞∠<E89D9E>蝡?- 璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD> 2026-01-11
<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD> <20>𣞁 <20>芸<EFBFBD>憪页<E686AA>蝑匧<E89D91>餈鞱𨯫蝞∠<E89D9E>蝡臬<E89DA1><E887AC>琜<EFBFBD>
*<EFBFBD><EFBFBD>𧋦嚗? v0.0 (Planning)
<EFBFBD>㴓 銝<><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>?
<EFBFBD><EFBFBD> 敶枏<E695B6>撘<EFBFBD><E69298>𤑳𠶖<F0A491B3>?
<EFBFBD>?撌脣<E6928C><E884A3>?
- **<2A>?*嚗<><E59A97><EFBFBD>芸<EFBFBD>憪页<E686AA>
<EFBFBD>银 餈𥡝<E9A488>銝?
- *<EFBFBD>?
<EFBFBD>?敺<><E695BA><EFBFBD>𡢅<EFBFBD>靘肽<E99D98>餈鞱𨯫蝞∠<E89D9E>蝡荔<E89DA1>
<EFBFBD>滨蔭<EFBFBD>∩辣嚗<EFBFBD><EFBFBD>憿餃<EFBFBD>摰峕<EFBFBD>嚗㚁<EFBFBD>
- 餈鞱𨯫蝞∠<EFBFBD>蝡臬抅蝖<EFBFBD><EFBFBD>嗆<EFBFBD>嚗㇊hase 0-2嚗?
- 蝘<EFBFBD><EFBFBD>蝞∠<EFBFBD><EFBFBD>蠘<EFBFBD>
- 蝘<EFBFBD><EFBFBD>銝枏<EFBFBD><EFBFBD>餃<EFBFBD>憿?
- <EFBFBD><EFBFBD><EFBFBD>摰𡁜<EFBFBD><EFBFBD>滨蔭
<EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡臬<EFBFBD><EFBFBD>𤏸恣<EFBFBD>𡜐<EFBFBD>憸<EFBFBD>恣Week 5+嚗㚁<E59A97>
*P1 - <20>駁堺蝞∠<E89D9E>蝡荔<E89DA1>Week 5-6嚗?
- <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗㇃RUD + 蝘穃恕<E7A983><E68195><EFBFBD>嚗?
- 蝘穃恕蝞∠<EFBFBD>嚗<EFBFBD>𣈲<EFBFBD><EFBFBD><EFBFBD>蝥抒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD>摰?銝芯犖嚗?
- 摰∟恣<EFBFBD>亙<EFBFBD><EFBFBD>亥砭
*P1 - <20>臭<EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>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>嚗?
<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>?
<0A>? <20>箸<EFBFBD>蝞∠<E89D9E>蝡荔<E89DA1>INST Portal嚗? <20>?
<0A>鎿<EFBFBD><E98EBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>? <20>蘂 <20>駁堺蝞∠<E89D9E>蝡? <20>? <20><> <20>臭<EFBFBD>蝞∠<E89D9E>蝡? <20>?
<0A>鎿<EFBFBD><E98EBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>?繚 <20>冽<EFBFBD>蝞∠<E89D9E> <20>? 繚 <20>冽<EFBFBD>蝞∠<E89D9E> <20>?
<0A>?繚 蝘穃恕蝞∠<E89D9E> <20>? 繚 憿寧𤌍蝞∠<E89D9E> <20>?
<0A>?繚 <20>漤<EFBFBD><E6BCA4><EFBFBD><EFBFBD>嚗<EFBFBD><E59A97>摰?鈭綽<E988AD> <20>? 繚 <20>漤<EFBFBD><E6BCA4><EFBFBD><EFBFBD>嚗<EFBFBD>★<EFBFBD>?鈭綽<E988AD> <20>?
<0A>?繚 摰∟恣<E2889F>亙<EFBFBD> <20>? 繚 摰∟恣<E2889F>亙<EFBFBD>嚗<EFBFBD><E59A97>閫<EFBFBD><E996AB> <20>?
<0A>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>氯<EFBFBD><E6B0AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>?
<0A>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>? Platform Layer <20>?
<0A>? 霈方<E99C88>銝剖<E98A9D> <20>?<3F><><EFBFBD>銝剖<E98A9D> <20>?憭𡁶<E686AD><F0A181B6>琿<EFBFBD>蝳?<3F>?摰∟恣<E2889F>亙<EFBFBD> <20>?
<0A>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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><EFBFBD>拚猐
| <EFBFBD>蠘<EFBFBD> | HOSPITAL_ADMIN | DEPARTMENT_ADMIN | PHARMA_ADMIN | PROJECT_MANAGER | USER |
|---|---|---|---|---|---|
| <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>瑕<EFBFBD>嚗? | <EFBFBD>?<3F>券<EFBFBD> | <EFBFBD>?<3F>祉<EFBFBD>摰? | <EFBFBD>?<3F>券<EFBFBD> | <EFBFBD>?憿寧𤌍<E5AFA7>𣂼<EFBFBD> | <EFBFBD>? |
| 蝘穃恕蝞∠<EFBFBD> | <EFBFBD>? | <EFBFBD>? | N/A | N/A | <EFBFBD>? |
| 憿寧𤌍蝞∠<EFBFBD> | N/A | N/A | <EFBFBD>?<3F>亦<EFBFBD> | <EFBFBD>?蝞∠<E89D9E> | <EFBFBD>? |
| <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>? | <EFBFBD>?<3F>祉<EFBFBD>摰? | <EFBFBD>? | <EFBFBD>?憿寧𤌍<E5AFA7>? | <EFBFBD>? |
| 摰∟恣<EFBFBD>亙<EFBFBD> | <EFBFBD>?蝘<><E89D98><EFBFBD>? | <EFBFBD>?<3F>祉<EFBFBD>摰? | <EFBFBD>?蝘<><E89D98><EFBFBD>? | <EFBFBD>?憿寧𤌍<E5AFA7>? | <EFBFBD>? |
| 銝𡁜𦛚璅∪<EFBFBD>雿輻鍂 | <EFBFBD>? | <EFBFBD>? | <EFBFBD>? | <EFBFBD>? | <EFBFBD>? |
<EFBFBD><EFBFBD> 隞<><E99A9E>蝏𤘪<E89D8F>嚗<EFBFBD><E59A97><EFBFBD>𡜐<EFBFBD>
<EFBFBD>𡒊垢
backend/src/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> modules/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> institution/ # <20>箸<EFBFBD>蝞∠<E89D9E>蝡舀芋<E88880>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> controllers/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> user.controller.ts
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> department.controller.ts
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> quota.controller.ts
<0A>? <20>? <20>?
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> user.controller.ts
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> project.controller.ts
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> quota.controller.ts
<0A>? <20>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> services/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital.service.ts
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma.service.ts
<0A>? <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> routes/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital.routes.ts
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma.routes.ts
<0A>?
<0A>婙<EFBFBD><E5A999><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>?
<EFBFBD>滨垢
frontend-v2/src/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> modules/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> institution/ # <20>箸<EFBFBD>蝞∠<E89D9E>蝡舀芋<E88880>?
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> pages/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> hospital/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> UserManagement/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DepartmentManagement/
<0A>? <20>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> QuotaAllocation/
<0A>? <20>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> AuditLog/
<0A>? <20>? <20>?
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> pharma/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> UserManagement/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> ProjectManagement/
<0A>? <20>? <20>鎿<EFBFBD><E98EBF><EFBFBD> QuotaAllocation/
<0A>? <20>? <20>婙<EFBFBD><E5A999><EFBFBD> AuditLog/
<0A>? <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> components/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> UserForm/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> DepartmentTree/
<0A>? <20>鎿<EFBFBD><E98EBF><EFBFBD> QuotaAllocator/
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> AuditLogViewer/
<0A>?
<0A>婙<EFBFBD><E5A999><EFBFBD> layouts/
<20>婙<EFBFBD><E5A999><EFBFBD> TenantLayout/ # 蝘<><E89D98>銝枏<E98A9D>撣<EFBFBD><E692A3>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD>塚<EFBFBD>
<EFBFBD>綫 UI/UX <20>寞<EFBFBD>?
1. 蝘<><E89D98><EFBFBD><EFBFBD><EFBFBD>摰𡁜<E691B0>
// 隞垾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>嚗?
- <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>撟喳蝱"
2. 蝘穃恕<E7A983>𤑳<EFBFBD>隞塚<E99A9E><E5A19A>駁堺蝡荔<E89DA1>
<DepartmentTree
departments={departments}
onSelect={(dept) => loadDeptUsers(dept)}
showQuota={true} // <20>曄內蝘穃恕<E7A983>漤<EFBFBD>
allowEdit={hasPermission('dept:edit')}
/>
*<EFBFBD>舀<EFBFBD>嚗?
- 憭𡁶漣撅訫<EFBFBD>/<2F>睃<EFBFBD>
- <EFBFBD>𡝗嗻<EFBFBD>鍦<EFBFBD>
- <EFBFBD>漤<EFBFBD><EFBFBD>航<EFBFBD><EFBFBD>?
3. <20>漤<EFBFBD><E6BCA4><EFBFBD><EFBFBD><EFBFBD>?
<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>
- <EFBFBD>航<EFBFBD><EFBFBD>𤥁<EFBFBD>摨行辺
- 摰墧𧒄霈∠<EFBFBD><EFBFBD>拐<EFBFBD><EFBFBD>漤<EFBFBD>
- 頞<EFBFBD><EFBFBD>憸<EFBFBD>郎
<EFBFBD><EFBFBD>儭?<3F>唳旿璅∪<E79285>
<EFBFBD>駁堺蝡?
// 蝘穃恕
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;
}
<EFBFBD>臭<EFBFBD>蝡?
// 憿寧𤌍嚗<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';
}
<EFBFBD><EFBFBD> 撘<><E69298>烐<EFBFBD>蝔?
Step 1: 霈曇恣<E69B87>嗆挾嚗<E68CBE><E59A97><EFBFBD>㵪<EFBFBD>
- 霂衣<EFBFBD><EFBFBD><EFBFBD>瘙<EFBFBD><EFBFBD>獢<EFBFBD><EFBFBD>PRD嚗?
- API<EFBFBD>亙藁霈曇恣
- <EFBFBD>唳旿摨栞”霈曇恣
- UI<EFBFBD>笔<EFBFBD>霈曇恣
Step 2: <20>𡒊垢撘<E59EA2><E69298>𡢅<EFBFBD>靘肽<E99D98>餈鞱𨯫蝡臬<E89DA1><E887AC>琜<EFBFBD>
-
<EFBFBD>駁堺蝡涉PI
- <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>API
- 蝘穃恕蝞∠<EFBFBD>API
- <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>API
- 摰∟恣<EFBFBD>亙<EFBFBD>API
-
<EFBFBD>臭<EFBFBD>蝡涉PI
- <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>API
- 憿寧𤌍蝞∠<EFBFBD>API
- <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>API
- 摰∟恣<EFBFBD>亙<EFBFBD>API嚗<EFBFBD><EFBFBD>閫<EFBFBD><EFBFBD>
Step 3: <20>滨垢撘<E59EA2><E69298>?
-
<EFBFBD>砍<EFBFBD>蝏<EFBFBD>辣
- TenantLayout嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗅<EFBFBD>撅<EFBFBD>嚗?
- QuotaAllocator嚗<EFBFBD><EFBFBD>憸嘥<EFBFBD><EFBFBD>滚膥嚗?
- AuditLogViewer嚗<EFBFBD>恣霈⊥𠯫敹埈䰻<EFBFBD>见膥嚗?
-
*<EFBFBD>駁堺蝡舫△<EFBFBD>?
- <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>
- 蝘穃恕蝞∠<EFBFBD>嚗㇄epartmentTree嚗?
- <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
-
*<EFBFBD>臭<EFBFBD>蝡舫△<EFBFBD>?
- <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>
- 憿寧𤌍蝞∠<EFBFBD>
- <EFBFBD>漤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝撖潸⏛
敶枏<EFBFBD><EFBFBD>舫<EFBFBD>霂?
-
<EFBFBD>港<EFBFBD><EFBFBD>嗆<EFBFBD>
../ADMIN-餈鞱𨯫蝞∠<E89D9E>蝡?00-蝟餌<E89D9F>霈曇恣/00-<2D><><EFBFBD>銝舘<E98A9D><E88898>脖<EFBFBD>蝟餅4<E9A485><EFBC94>𥁒<EFBFBD>𠽤v1.0.md -
<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 -
*餈鞱𨯫蝡舐𠶖<EFBFBD>?
../ADMIN-餈鞱𨯫蝞∠<E89D9E>蝡?00-璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?md
敺<EFBFBD><EFBFBD>撱箸<EFBFBD>獢?
00-蝟餌<E89D9F>霈曇恣/
01-<2D>箸<EFBFBD>蝞∠<E89D9E>蝡舀沲<E88880><E6B2B2>挽霈?md02-憭𡁶<E686AD><F0A181B6>琿<EFBFBD>蝳餉挽霈?md03-<2D>漤<EFBFBD>蝞∠<E89D9E>霈曇恣.md
01-<2D><>瘙<EFBFBD><E79899><EFBFBD>?
01-<2D>駁堺蝞∠<E89D9E>蝡烈RD.md02-<2D>臭<EFBFBD>蝞∠<E89D9E>蝡烈RD.md03-<2D>冽<EFBFBD><E586BD><EFBFBD><EFBFBD>銝𡡞<E98A9D><F0A1A19E>嗆<EFBFBD><E59786>?md
02-<2D><><EFBFBD>航挽霈?
01-API霈曇恣<E69B87><E681A3>﹝.md02-<2D>唳旿摨栞挽霈⊥<E99C88>獢?md03-蝘穃恕<E7A983>穃<EFBFBD><E7A983>唳䲮獢?md04-<2D>漤<EFBFBD>霈∠<E99C88>蝞埈<E89D9E>.md
03-UI霈曇恣/
01-<2D>駁堺蝡臬<E89DA1><E887AC>贝挽霈?html02-<2D>臭<EFBFBD>蝡臬<E89DA1><E887AC>贝挽霈?html03-<2D><><EFBFBD>摰𡁜<E691B0><F0A1819C><EFBFBD><EFBFBD>.md
<EFBFBD>𩤃<EFBFBD> <20><><EFBFBD>航<EFBFBD><E888AA>?
1. 憭𡁶<E686AD><F0A181B6>琿<EFBFBD>蝳?
// 銝剝𡢿隞塚<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>?
// 蝘穃恕蝞∠<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>
// 霈∠<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);
};
<EFBFBD><EFBFBD> 銝舘<E98A9D><E88898>亦恣<E4BAA6><E681A3>垢<EFBFBD><E59EA2>笆瘥?
| <EFBFBD>寞<EFBFBD>? | 餈鞱𨯫蝞∠<EFBFBD>蝡荔<EFBFBD>ADMIN嚗? | <EFBFBD>箸<EFBFBD>蝞∠<EFBFBD>蝡荔<EFBFBD>INST嚗? |
|---|---|---|
| <EFBFBD>冽<EFBFBD> | <EFBFBD>砍虬<EFBFBD><EFBFBD><EFBFBD>餈鞱𨯫鈭箏<EFBFBD> | <EFBFBD>駁堺/<2F>臭<EFBFBD>蝞∠<E89D9E><E288A0>? |
| <EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>典<EFBFBD>蝞∠<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | 蝘<EFBFBD><EFBFBD>蝥抒恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? |
| 蝘<EFBFBD><EFBFBD>蝞∠<EFBFBD> | <EFBFBD>?<3F>𥕦遣/蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD>厩<EFBFBD><E58EA9>? | <EFBFBD>?<3F>芾<EFBFBD><E88ABE>见<EFBFBD><E8A781>芸楛蝘<E6A59B><E89D98> |
| <EFBFBD>冽<EFBFBD>蝞∠<EFBFBD> | <EFBFBD>?<3F>典<EFBFBD><E585B8>冽<EFBFBD>蝞∠<E89D9E> | <EFBFBD>?蝘<><E89D98><EFBFBD><EFBFBD>鍂<EFBFBD>瑞恣<E7919E>? |
| <EFBFBD>漤<EFBFBD>蝞∠<EFBFBD> | <EFBFBD>?<3F><><EFBFBD>蝘<EFBFBD><E89D98><EFBFBD>駁<EFBFBD>憸? | <EFBFBD>?<3F><><EFBFBD>蝘穃恕/憿寧𤌍<E5AFA7>漤<EFBFBD> |
| Prompt蝞∠<EFBFBD> | <EFBFBD>?<3F>煺漣<E785BA>臬<EFBFBD>靚<EFBFBD><E99D9A> | <EFBFBD>?<3F>䭾<EFBFBD><E4ADBE>? |
| 摰∟恣<EFBFBD>亙<EFBFBD> | <EFBFBD>?<3F>典<EFBFBD><E585B8>亙<EFBFBD> | <EFBFBD>?蝘<><E89D98><EFBFBD><EFBFBD>𠯫敹? |
| <EFBFBD><EFBFBD><EFBFBD>摰𡁜<EFBFBD> | <EFBFBD>?<3F>滨蔭<E6BBA8><E894AD><EFBFBD>厩<EFBFBD><E58EA9>瑕<EFBFBD><E79195>? | <EFBFBD>?<3F>芾<EFBFBD><E88ABE>亦<EFBFBD> |
<EFBFBD><EFBFBD> 憸<>恣撘<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>
<EFBFBD><EFBFBD> <20><>閬<EFBFBD>葬<EFBFBD>抬<EFBFBD>
- **<2A>嗆<EFBFBD><E59786>桅<EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><EFBFBD>亦恣<E4BAA6><E681A3>垢摰䂿緵
- **<2A><><EFBFBD><EFBFBD>桅<EFBFBD>**嚗𡁏䰻<F0A1818F>㞗00-<2D><><EFBFBD>銝舘<E98A9D><E88898>脖<EFBFBD>蝟餅4<E9A485><EFBC94>𥁒<EFBFBD>𠽤v1.0.md`
- **UI<55>桅<EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD>C/ASL蝑匧歇<E58CA7>㗇芋<E39787>?
<EFBFBD>㴓 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
- 蝑匧<EFBFBD>餈鞱𨯫蝞∠<EFBFBD>蝡臬<EFBFBD><EFBFBD>𣂼抅蝖<EFBFBD><EFBFBD>嗆<EFBFBD>
- 撘<EFBFBD>憪讠<EFBFBD><EFBFBD>躰祕蝏<EFBFBD>RD
- 霈曇恣UI<EFBFBD>笔<EFBFBD>
- 霈曇恣API<EFBFBD>亙藁
*<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>嚗?