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

12 KiB
Raw Blame History

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>

  1. <EFBFBD>駁堺蝡涉PI

    • <EFBFBD><EFBFBD>蝞∠<EFBFBD>API
    • 蝘穃恕蝞∠<EFBFBD>API
    • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>API
    • 摰∟恣<EFBFBD><EFBFBD>API
  2. <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>?

  1. <EFBFBD><EFBFBD><EFBFBD>

    • TenantLayout嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
    • QuotaAllocator嚗<EFBFBD><EFBFBD>憸嘥<EFBFBD><EFBFBD>滚膥嚗?
    • AuditLogViewer嚗<EFBFBD>恣霈⊥𠯫敹埈䰻<EFBFBD>见膥嚗?
  2. *<EFBFBD>駁堺蝡舫△<EFBFBD>?

    • <EFBFBD><EFBFBD>蝞∠<EFBFBD>
    • 蝘穃恕蝞∠<EFBFBD>嚗㇄epartmentTree嚗?
    • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  3. *<EFBFBD><EFBFBD>蝡舫△<EFBFBD>?

    • <EFBFBD><EFBFBD>蝞∠<EFBFBD>
    • 憿寧𤌍蝞∠<EFBFBD>
    • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD> <20><EFBFBD><E8A9A8><EFBFBD>﹝撖潸⏛

敶枏<EFBFBD><EFBFBD><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. *餈鞱𨯫蝡舐𠶖<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>挽霈?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

<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>

  1. **<2A><EFBFBD><E59786><EFBFBD>**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><EFBFBD>亦恣<E4BAA6><E681A3>垢摰䂿緵
  2. **<2A><><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>?

<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>嚗?