Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/01-需求分析/PRD:Tool A - 医疗数据超级合并器 (The Super Merger).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

120 lines
5.5 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.
# **PRD嚗関ool A \- <20><EFBFBD><E9A48C>唳旿頞<E697BF><EFBFBD><E6BCA3><EFBFBD>?(The Super Merger)**
| <20><><EFBFBD><EFB99D>𧋦 | V2.0 (<28><EFBFBD><E7AE8F>𡁜<EFBFBD><F0A1819C>? |
| :---- | :---- |
| **鈭批<E988AD><E695B6>?* | Web 蝡臬極<E887AC><EFBFBD><E79880><EFBFBD><EFBFBD>穃紡撘?Wizard嚗?|
| **<EFBFBD><EFBFBD>隞瑕<EFBFBD>?* | **閫<><E996AB>銝游<E98A9D>蝘𤑳<E89D98>銝凌<E98A9D><EFBFBD>撖孵<E69296><E5ADB5>脲㺭<E884B2>桀笆朣鞾𠗕憸塩<E686B8>?* <20><EFBFBD><E7AE94>𡏭挪閫<E68CAA><E996AB>Visit嚗争<E59A97><EFBFBD><E598A5>𨀣𧒄<F0A880A3><EFBFBD><E6B8A1><EFBFBD><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><E5839A><EFBFBD>撉䎚<E69289><E48E9A><EFBFBD><EFBFBD>交㺭<E4BAA4>桃移<E6A183><E7A7BB><EFBFBD>頧賢<E9A0A7>雿誯堺/<2F><EFBFBD>霈啣<E99C88>銝𨳍<E98A9D>?|
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | 銝游<E98A9D><E6B8B8><EFBFBD><E9A48C><EFBFBD><EFBFBD><EFBFBD>𥪜𨭌<F0A5AA9C>?|
## **銝<><E98A9D>?鈭批<E988AD><EFBFBD><E7989A><EFBFBD>?(User Flow)**
1\. <20>唳旿鋆<E697BF>蝸 (Payload) \-\> 2\. 摰𡁜抅<F0A1819C>?(Anchor & Window) \-\> 3\. <20><EFBFBD>銝𡡞<E98A9D>閫?(Schema) \-\> 4\. <20><EFBFBD><E7AE84><EFBFBD>僎 \-\> 5\. 蝏𤘪<E89D8F>銝擧<E98A9D>頧?
## **鈭䎚<E988AD>?<3F><EFBFBD><E8A9A8><EFBFBD><E8A098><EFBFBD>瘙?(Functional Requirements)**
### **1\. 甇仿炊銝<E7828A>嚗𡁏㺭<F0A1818F><EFBFBD>頧?(Payload)**
* **P0:** **憭𡁏<E686AD>隞嗡<E99A9E>隡𩤃<E99AA1>** <20><EFBFBD><E88880>𡝗嗻銝𠹺<E98A9D> .xlsx, .csv<73><76>遣霈桀之撠?\< 50MB/<2F><><EFBFBD>?
* **P0:** **<EFBFBD>芸𢆡憸<EFBFBD><EFBFBD> (Pre-flight Check)嚗?*
* 銝𠹺<E98A9D><F0A0B9BA>唾圾<E594BE>鞱”憭氬<E686AD>?
* **蝥<E89DA5><EFBCB9>行⏛嚗?* <20><><EFBFBD><EFBFBD><E683A9><EFBFBD>”憭港蛹蝛箝<E89D9B><E7AE9D><EFBFBD>隞嗆<E99A9E><E59786>?\-\> 蝳<>迫銝衤<E98A9D>甇乓<E79487>?
* **P1:** **<EFBFBD>㰘蝸<EFBFBD>滨蔭/璅⊥踎嚗?* <20>亦鍂<E4BAA6><EFBFBD><E7919A><EFBFBD>摮䁅<E691AE><E48185>𡏭<EFBFBD><F0A18FAD>屸秄霂𠰴<E99C82>撟嗉<E6929F><E59789><EFBFBD><EFBFBD><E59885><EFBFBD>捂銝<E68D82><E98A9D><EFBFBD>頧踝<E9A0A7>頝唾<E9A09D><E594BE>𡒊賒<F0A1928A>滨蔭<E6BBA8>?
### **2\. 甇仿炊鈭䕘<E988AD>摰𡁜抅<F0A1819C>?(The Anchor) <20><EFBFBD>?<3F><EFBFBD>蝞埈<E89D9E><E59F88><EFBFBD>**
甇斗郊撉文<EFBFBD>摰帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>之銵函<EFBFBD><EFBFBD>𣈯爸<EFBFBD><EFBFBD><EFBFBD>銵峕㺭嚗匧<EFBFBD><EFBFBD>𨅯<EFBFBD>蝐駁<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
#### **2.1 銝餉”<E9A489>㗇𥋘 (The Backbone)**
* **P0:** <20><EFBFBD><EFBFBD>◆隞𦒘<E99A9E>隡删<E99AA1><E588A0><EFBFBD>辣銝剜<E98A9D>摰帋<E691B0>銝芯<E98A9D>銝?**<2A>靝蜓銵?(Visit Base)<29>?*<2A>?
* **摰帋<E691B0>嚗?* 銝餉”<E9A489><E2809D><EFBFBD><EFBFBD>銵䕘<E98AB5><EFBFBD><EFBFBD><E2809D><EFBFBD>之銵函<E98AB5><EFBFBD>銝芸抅<E88AB8><E68A85><EFBFBD><EFBFBD><E59A97>停霂?霈輯<E99C88>嚗剹<E59A97><E589B9><EFBFBD>𡁜虜<F0A1819C><EFBFBD>𠹺<EFBFBD><F0A0B9BA>扇敶𨰻<E695B6>𧢲<EFBFBD><F0A7A2B2>𢠃秄霂𦠜<E99C82><F0A6A09C><EFBFBD><EFBFBD>?
#### **2.2 <20>喲睸<E596B2><EFBFBD>撠?(Key Mapping)**
* **P0:** **ID <20>堒笆朣琜<E69CA3>** <20><EFBFBD><E586BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝餉”<E9A489>?Patient\_ID <20>𨰜<EFBFBD><F0A8B09C>頂蝏蠘䌊<E8A098>典銁颲<E98A81>”銝剖粉<E58996><EFBFBD><E69B89><EFBFBD><EFBFBD><E59A97>霈訾犖撌乩耨甇<E880A8><E79487>?
* **P0:** **<EFBFBD>園𡢿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** <20><EFBFBD><E586BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝餉”<E9A489>?Date <20><EFBFBD><EFBFBD><E68692>𨅯<EFBFBD><F0A885AF>𠯫<EFBCB8><EFBFBD><EFBFBD><E59885><EFBFBD><EFBFBD><EFBFBD><E692A0>銝箸𧒄<E7AEB8><EFBFBD><E6B8A1><EFBFBD><EFBFBD><EFBFBD><E695B9>?
#### **2.3 颲<><EFBFBD><EFBFBD>蝑𣇉裦 (Matching Strategy)**
* **P0:** **<EFBFBD>園𡢿蝒烾<EFBFBD>蝵?(Time Window)嚗?*
* 霈曉<E99C88><EFBFBD><E996AB>嚗朞<E59A97>銵函<E98AB5><EFBFBD><E79289>交𧒄<E4BAA4><EFBFBD>憿餃銁 \[銝餉”<E9A489>園𡢿 \- X憭? 銝餉”<E9A489>園𡢿 \+ Y憭坼] <20><><EFBFBD><E58792><EFBFBD>?
* **暺䁅恕<E48185><EFBFBD>** $\\pm 7$ 憭押<E686AD>?
* **P0:** **<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Collision Handling)嚗?*
* *<2A>箸艶嚗? <20>閙活<E99699>園𡢿蝒堒<E89D92>嚗諹<E59A97>銵冽<E98AB5>憭𡁏辺霈啣<E99C88><EFBFBD><E59A97><EFBFBD><EFBFBD>銝斗活銵<E6B4BB>撣貉<E692A3>嚗剹<E59A97>?
* *<2A>厰★ A (暺䁅恕 \- 蝥萄<E89DA5>撅訫<E69285>)嚗? 靽萘<E99DBD><E89098><EFBFBD><EFBFBD>㕑扇敶𨰻<E695B6><F0A8B0BB>蜓銵其縑<E585B6><EFBFBD><E887AC><EFBFBD>銵峕㺭憓𧼮<E68693><F0A7BCAE>?
* *<2A>厰★ B (<28><>餈穃龪<E7A983>?嚗? 隞<><E99A9E><EFBFBD>嗵氖銝餉”<E9A489>園𡢿<E59C92><F0A1A2BF>餈𤑳<E9A488><EFBFBD><E98A9D><EFBFBD><E98A9D><EFBCB7><EFBFBD><E597A1>?
### **3\. 甇仿炊銝㚁<E98A9D><E39A81><EFBFBD>銝𡡞<E98A9D>閫?(The Schema)**
甇斗郊撉文<EFBFBD>摰帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>之銵函<EFBFBD><EFBFBD>𡏭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>堒捐嚗剹<EFBFBD>?
#### **3.1 <20>𤑳𠶖<F0A491B3>㗇𥋘<E39787>?(Tree Picker)**
* **P0:** 撅閧內<E996A7><E585A7><EFBFBD><EFBFBD>隞嗥<E99A9E><E597A5><EFBFBD><E39B96><EFBFBD><EFBFBD>?
* <20><> 銝餉”
* <20>?雿誯堺<E8AAAF>?
* <20>?霂𦠜鱏
* <20><><>” A (<28><EFBFBD>)
* <20>?<3F><EFBFBD><E8B39C>?
* 漎?摰⊥瓲<E28AA5><EFBFBD> (銝滚㗲<E6BB9A>?
* **鈭支<E988AD>嚗?* <20><EFBFBD><E88880><EFBFBD>隞嗅<E99A9E><E59785>?<3F><EFBFBD><EFBFBD>?
#### **3.2 摰墧𧒄蝏𤘪<E89D8F><EFBFBD><E686B8> (Live Schema Preview)**
* **P0:** <20><EFBFBD>撟訫𢰧靘批<E99D98><E689B9><EFBFBD>蝷暝*\*<2A>𨀣<EFBFBD><EFBFBD>”憭渡<E686AD><E6B8A1><EFBFBD><EFBFBD>𩄼*\*嚗<><E59A97>銵典仍嚗䔶<E59A97>霈∠<E99C88><E288A0>唳旿嚗剹<E59A97>?
* **隞瑕<E99A9E><EFBFBD>** 霈拍鍂<E68B8D>瑞凒閫<E58792><E996AB><EFBFBD><EFBFBD><E5A086>𨅯𣑐嚗<F0A39190><E59A97><EFBFBD><EFBFBD><E4BAA4><EFBFBD>”隡𡁜<E99AA1><F0A1819C><EFBFBD><EFBFBD>鵭嚗<E9B5AD><E59A97><EFBFBD><EFBFBD>鈭𥕦<E988AD><F0A595A6><EFBFBD>?
### **4\. 甇仿炊<E4BBBF>𨥈<EFBFBD>蝏𤘪<E89D8F>銝擧<E98A9D>頧?(The Result)**
* **P0:** **憭<><E686AD>餈𥕦漲<F0A595A6><EFBFBD>** <20>曄內<E69B84><EFBFBD><E586BD><EFBFBD><EFBFBD><E78DA2><EFBFBD>𨀣迤<F0A880A3><EFBFBD>撱箏<E692B1>撣𣬚揣撘?..<2E><EFBFBD><E88588><EFBFBD>𨀣迤<F0A880A3><EFBFBD>銵峕𧒄<E5B395><EFBFBD>蝣唳<E89DA3>...<2E><EFBFBD><E59885>?
* **P0:** **暺<><E69ABA><EFBFBD><E686B8> (Golden Preview)嚗?*
*<>◆撅閧內<E996A7><E585A7>僎蝏𤘪<E89D8F><F0A498AA>?**<2A>?5-10 銵?* <20><EFBFBD><E7AC94>唳旿<E594B3>?
* <20><EFBFBD><E585B6><EFBFBD><E586BD>厩尐<E58EA9>詨笆 ID <20>臬炏撖寥<E69296><E5AFA5>?
* **P0:** **韐券<E99F90><E588B8>𧢲踎嚗?*
* <20>𣂼<EFBFBD><F0A382BC><EFBFBD><EFBFBD>銵峕㺭<E5B395>?
*<E98A9D>銵峕㺭嚗㇆D銝滚龪<E6BB9A>齿<EFBFBD><E9BDBF>園𡢿蝒堒<E89D92>嚗剹<E59A97>?
* **P0:** **銵<>𢆡瘚<F0A286A1>蓮嚗?*
* \[銝贝蝸 Excel\]
* \[<5B><EFBFBD><E785BE><EFBFBD> AI 蝏𤘪<E89D8F><F0A498AA>硋極<E7A18B>愧] (瘚<>蓮 Token)
* \[<5B><EFBFBD><E785BE><EFBFBD> 蝻𤥁<E89DBB><F0A4A581><EFBFBD>瘣珢] (瘚<>蓮 Token)
## **銝剹<E98A9D>?<3F><EFBFBD>蝞埈<E89D9E><E59F88><EFBFBD> (Technical Logic)**
### **1\. 蝞埈<E89D9E><E59F88>滨妍嚗𡁜抅鈭擧𧒄<E693A7><EFBFBD><E6B8A1><EFBFBD><EFBFBD>撣峕<E692A3>撘讛<E69298><E8AE9B>?(Time-Windowed Stream Hash Join)**
### **2\. <20><EFBFBD>隡芯誨<E88AAF>?*
// 1\. <20><><EFBFBD><EFBFBD><EFBFBD>遣 (Build Phase)
// 撠<><E692A0>銵?(Small Tables) 霂餃<E99C82><E9A483><EFBFBD><EFBFBD> Map
const lookupMap \= {
"patient\_001": \[
{ type: "lab", date: "2023-01-02", data: {...} }, // 霈啣<E99C88>1
{ type: "lab", date: "2023-05-01", data: {...} } // 霈啣<E99C88>2
\]
};
// 2\. 瘚<><E7989A><EFBFBD><EFBFBD> (Probe Phase)
// <20><EFBFBD>霂餃<E99C82>銝餉” (Main Table)
streamMainTable.on('data', (mainRow) \=\> {
const pId \= mainRow.id;
const tStart \= mainRow.date \- 7 days;
const tEnd \= mainRow.date \+ 7 days;
// <20><EFBFBD>銵其葉撖餅𪄳蝚血<E89D9A><E8A180>園𡢿蝒㛖<E89D92>霈啣<E99C88>
const matchLabs \= lookupMap\[pId\].filter(lab \=\>
lab.date \>= tStart && lab.date \<= tEnd
);
if (matchLabs.length \=== 0\) {
// 瘝<E288AA><EFBFBD><EFBFBD>蘨颲枏枂銝餉”靽⊥<E99DBD>
output.write({ ...mainRow, lab\_data: null });
} else {
// <20><EFBFBD><E5AFA5><EFBFBD> (憭<><E686AD><EFBFBD>撖孵<E69296>)
matchLabs.forEach(lab \=\> {
output.write({ ...mainRow, ...lab.data }); // 蝥萄<E89DA5>撅訫<E69285>
});
}
});
## **<2A><EFBFBD>?<3F>屸𢒰<E5B1B8><EFBFBD><E7AC94><EFBFBD><EFBFBD>?(UI Reference)**
霂瑕<EFBFBD><EFBFBD>?撌亙<E6928C>A\_頞<5F><EFBFBD><E6BCA3><EFBFBD>沔_<E6B294><EFBFBD>霈曇恣.tsx (V1.0) 銝剔<E98A9D> Step 2 <20>?Step 3 <20>屸𢒰<E5B1B8>?
* **Step 2 <20><EFBFBD>嚗?* 銝餉”<E9A489>㗇𥋘<E39787><EFBFBD><EFBFBD><E39787><EFBFBD>𧒄<EFBFBD><EFBFBD>銝𧢲<E98A9D><EFBFBD><E78DA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4BA99>厰僼<E58EB0>?
* **Step 3 <20><EFBFBD>嚗?* 撌血𢰧<E8A180><F0A2B0A7><EFBFBD><EFBFBD><E692A3><EFBFBD>椰靘扳<E99D98><E689B3>嗅㗲<E59785><EFBFBD><E39A81>喃儒銵冽聢撉冽沲憸<E6B2B2><E686B8>嚗剹<E59A97>?
## **鈭𢛵<E988AD>?憌𡡞埯閫<E59FAF><E996AB><EFBFBD><E79289>?(Risk Check)**
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝餉”<EFBFBD>𦒘<EFBFBD><EFBFBD><EFBFBD>**
* *撖寧<E69296>嚗? <20>?Step 2 <20>屸𢒰憓𧼮<E68693><F0A7BCAE>曄尐<E69B84>?**Tip**嚗尠<E59A97>靝蜓銵券<E98AB5>𡁜虜<F0A1819C><EFBFBD><E887AC><EFBFBD><EFBFBD><E79D83>𠯫<EFBCB8><EFBFBD><EFBFBD><E8B9B1><EFBFBD><E48185>凋縑<E5878B><EFBFBD><EFBFBD>銵冽聢<E586BD><EFBFBD>?
2. **<EFBFBD>園𡢿<EFBFBD><EFBFBD>銋曹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𦒘<EFBFBD><EFBFBD><EFBFBD>**
* *撖寧<E69296>嚗? <20>𡒊垢<F0A1928A>刻圾<E588BB>鞉𧒄<E99E89><EFBFBD><E6B8B8><EFBFBD><EFBFBD>◆雿輻鍂撘箏<E69298><E7AE8F>?Parser嚗<72>𣈲<EFBFBD>?2023/1/1, 2023-01-01, 44927 蝑㗇聢撘𧶏<E69298><F0A7B68F><EFBFBD><EFBFBD><EFBFBD>𡏭圾<F0A18FAD>𣂼仃韐伐<E99F90>敶雴蛹<E99BB4>𨀣𧒄<F0A880A3><EFBFBD><E6B994><EFBFBD><EFBFBD><EFBFBD>銝滩<E98A9D><EFBFBD><EFBFBD><EFBFBD>