Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Day3完成总结.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

400 lines
9.3 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.
# Day 3 撘<><E69298><EFBFBD><E7A983><EFBFBD><EFBFBD> <20>?
> **<2A><EFBFBD>**: 2025-11-27
> **撘<><E69298>煾𧫴畾?*: DC璅<E79285> - 撌亙<E6928C>B - Day 3
> **<2A><EFBFBD>?*: <20>?<3F><EFBFBD>摰峕<E691B0>
---
## <20><> 隞餃𦛚摰峕<E691B0><EFBFBD><E79A9C>
### <20>?銝𠰴<E98A9D>嚗䥅ealthCheckService摰䂿緵
**隞餃𦛚**嚗?
- [x] 摰䂿緵HealthCheckService摰峕㟲<E5B395><EFBFBD>
- [x] <20>湔鰵Controller銝剔<E98A9D>healthCheck摰䂿緵
- [x] 瘚贝<E7989A><E8B49D>亙熒璉<E78692><E79289>丕PI
**摰峕<E691B0><E5B395><EFBFBD><EFBFBD><EFBFBD>?*嚗?
#### 1. HealthCheckService.checkColumnHealth()
```typescript
// <20><>辣: backend/src/modules/dc/tool-b/services/HealthCheckService.ts
```
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
- <20>?Excel閫<6C><E996AB><EFBFBD><EFBFBD>汴LSX摨橒<E691A8>
- <20>?<3F><EFBFBD><E88AA3><EFBFBD>100銵䕘<E98AB5><E49598><EFBFBD>隡睃<E99AA1>嚗?
- <20>?蝛箏<E89D9B><EFBFBD>霈∠<E99C88>
- <20>?撟喳<E6929F><E596B3><EFBFBD>𧋦<EFBFBD>踹漲霈∠<E99C88>
- <20>?Token憸<6E>摯嚗<E691AF><E59A97>蝚行㺭 <20> 1.5嚗?
- <20>?<3F>行⏛蝑𣇉裦嚗?
- 蝛箏<E89D9B><EFBFBD> > 80% <20>?<3F><EFBFBD>
- 撟喳<E6929F><E596B3>踹漲 < 10 <20>?<3F><EFBFBD>
- <20>?<3F>亙熒璉<E78692><E79289><EFBFBD><E4BAA6>𦦵<EFBFBD>摮睃<E691AE><E79D83>唳旿摨?
**摰䂿緵隞<E7B7B5><E99A9E><EFBFBD>?*: 156銵?
---
### <20>?銝见<E98A9D>嚗関emplateService摰䂿緵
**隞餃𦛚**嚗?
- [x] 摰䂿緵TemplateService.getAllTemplates()
- [x] 摰䂿緵TemplateService.seedTemplates()
- [x] <20>𥕦遣seed<65>𡁏𧋦撟嗆<E6929F>銵?
- [x] <20>湔鰵Controller銝剔<E98A9D>getTemplates摰䂿緵
- [x] 瘚贝<E7989A>璅⊥踎API
**摰峕<E691B0><E5B395><EFBFBD><EFBFBD><EFBFBD>?*嚗?
#### 1. TemplateService.getAllTemplates()
```typescript
// <20><>辣: backend/src/modules/dc/tool-b/services/TemplateService.ts
```
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
- <20>?隞擧㺭<E693A7><EFBFBD>霂餃<E99C82><E9A483><EFBFBD><EFBFBD>㗇芋<E39787>?
- <20>?<3F>厩𪆴<E58EA9><F0AA86B4><EFBFBD><EFBFBD><E8A781><EFBFBD>蝐餃<E89D90><E9A483><EFBFBD>
- <20>?JSONB摮埈挾<E59F88><EFBFBD><E683A9>訊ypeScript<70>亙藁
#### 2. TemplateService.seedTemplates()
**3銝芷<E98A9D>霈暹芋<E69AB9>?*嚗?
| # | <20><EFBFBD>蝐餃<E89D90> | <20><EFBFBD>蝐餃<E89D90> | <20>曄內<E69B84>滨妍 | 摮埈挾<E59F88>?|
|---|---------|---------|---------|--------|
| 1 | lung_cancer | pathology | <20><EFBFBD><E7AE87><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | 5銝芸<E98A9D>畾?|
| 2 | diabetes | admission | 蝟硋倏<E7A18B><E5808F><EFBFBD><EFBFBD>扇敶?| 5銝芸<E98A9D>畾?|
| 3 | hypertension | outpatient | 擃䁅<E69383><E48185>钅秄霂羓<E99C82><E7BE93>?| 5銝芸<E98A9D>畾?|
**璅⊥踎1嚗朞<E59A97><E69C9E>𣬚<EFBFBD><F0A3AC9A><EFBFBD>𥁒<EFBFBD>?*
- <20><><EFBFBD>蝐餃<E89D90><EFBFBD><E59A97>嚗𡁏絡瘨行<E798A8><EFBFBD><E689AF><EFBFBD><E48E9A><EFBFBD><EFBFBD><EFBFBD><E597A5><EFBFBD>嚗?
- <20><><EFBFBD>蝔见漲嚗<E6BCB2><E59A97>/銝?雿𤾸<E99BBF><F0A4BEB8><EFBFBD>
- <20>輻𠈔憭批<E686AD><EFBFBD><E59A97>憭批<E686AD><EFBFBD><E59A97>雿㷼m嚗?
- 瘛见毀蝏栞蓮蝘鳴<E89D98><E9B3B4>?<3F><EFBFBD><E683A9><EFBFBD><EFBFBD><E89D8F>嚗?
- <20>滨𢥫蝏<F0A2A5AB><E89D8F><EFBFBD><E59A97><EFBFBD><EFBFBD><E6A0BC><EFBFBD><EFBFBD>TTF-1<><31>apsinA嚗?
**璅⊥踎2嚗𡁶<E59A97>撠輻<E692A0><E8BCBB>仿堺霈啣<E99C88>**
- 銝餉<E98A9D><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝餉<E98A9D><E9A489><EFBFBD>𠶖嚗?
- 蝟硋倏<E7A18B><E5808F><EFBFBD><EFBFBD>1<EFBFBD>?2<><EFBFBD>
- <20><><EFBFBD><EFBFBD><E59A97>嚗?撟湛<E6929F>
- 撟嗅<E6929F><E59785><EFBFBD><EFBFBD><EFBFBD><E68692>蝟硋倏<E7A18B><E5808F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵𤏸<E89DB5><F0A48FB8><EFBFBD><EFBFBD>嚗?
- 蝛箄<E89D9B><EFBFBD>蝟吔<E89D9F><E59094><EFBFBD>mmol/L嚗?
**璅⊥踎3嚗𡁻<E59A97><EFBFBD><E98AB5>钅秄霂羓<E99C82><E7BE93>?*
- <20>嗥憬<E597A5><EFBFBD><E9A1B5><EFBFBD>mmHg嚗?
- <20><EFBFBD><E98DA6><EFBFBD><E9A1B5><EFBFBD>mmHg嚗?
-<><E98AB5><EFBFBD>蝥改<E89DA5><EFBFBD><E68692>1蝥扼<E89DA5>?蝥扼<E89DA5>?蝥改<E89DA5>
- <20>刻晓<E588BB><E69993><EFBFBD><EFBFBD><E59A97><EFBFBD>滢蝙<E6BBA2><EFBFBD><E587BD><EFBFBD><E6BB9A><EFBFBD>
- <20>嗅膥摰䀹<E691B0>摰喉<E691B0><EFBFBD><E68692><EFBFBD><E695B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8AD8C>尐摨𤏪<E691A8>
#### 3. Seed<65>𡁏𧋦
```typescript
// <20><>辣: backend/src/scripts/seed-templates.ts
```
**<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>**嚗?
```
============================================================
<EFBFBD>窓 撘<>憪见<E686AA>憪见<E686AA>璅⊥踎<E28AA5>唳旿
============================================================
<EFBFBD>?Template seeded: <20><EFBFBD><E7AE87><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>?Template seeded: 蝟硋倏<E7A18B><E5808F><EFBFBD><EFBFBD>扇敶?
<EFBFBD>?Template seeded: 擃䁅<E69383><E48185>钅秄霂羓<E99C82><E7BE93>?
<EFBFBD>?Template seeding completed
============================================================
<EFBFBD>?璅⊥踎<E28AA5><EFBFBD><E598A5>𡝗<EFBFBD><F0A19D97><EFBFBD><EFBFBD>
============================================================
```
**摰䂿緵隞<E7B7B5><E99A9E><EFBFBD>?*: 130銵䕘<E98AB5>Service嚗? 27銵䕘<E98AB5>Seed<65>𡁏𧋦嚗?
---
## <20><> API瘚贝<E7989A>蝏𤘪<E89D8F>
### 1. 璅⊥踎<E28AA5>𡑒”API <20>?
**霂瑟<E99C82>**嚗?
```http
GET http://localhost:3001/api/v1/dc/tool-b/templates
```
**<EFBFBD><EFBFBD>**嚗?
```json
{
"templates": [
{
"diseaseType": "diabetes",
"reportType": "admission",
"displayName": "蝟硋倏<E7A18B><E5808F><EFBFBD><EFBFBD>扇敶?,
"fields": [...]
},
{
"diseaseType": "hypertension",
"reportType": "outpatient",
"displayName": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?,
"fields": [...]
},
{
"diseaseType": "lung_cancer",
"reportType": "pathology",
"displayName": "<22><EFBFBD><E7AE87><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"fields": [...]
}
]
}
```
**<EFBFBD><EFBFBD>?*: <20>?200 OK
**<EFBFBD><EFBFBD>憭批<EFBFBD>**: 1369 摮𡑒<E691AE>
**<EFBFBD>唳旿摰峕㟲<EFBFBD>?*: <20>?3銝芣芋<E88AA3><EFBFBD><E8B8B9><EFBFBD><E588BB>?
### 2. <20>亙熒璉<E78692><E79289>丕PI <20>𩤃<EFBFBD>
**<EFBFBD><EFBFBD>?*: Controller撌脫凒<E884AB><EFBFBD><EFBFBD>撩撠烐<E692A0>霂閙<E99C82>隞?
**銝衤<E98A9D>甇?*: Day 3摰峕<E691B0><E5B395>𡡞<EFBFBD><EFBFBD><E996AC><EFBFBD><E686AD>霂𦭵xcel<65><6C>
---
## <20><> <20>唳旿摨梶𠶖<E6A2B6>?
### 璅⊥踎銵剁<E98AB5>dc_templates嚗?
**<EFBFBD>亥砭蝏𤘪<EFBFBD>**嚗?
```sql
SELECT * FROM dc_schema.dc_templates;
```
**霈啣<E99C88><E595A3>?*: 3<>?
**<EFBFBD>唳旿摰峕㟲<EFBFBD>?*: <20>?<3F><EFBFBD>摮埈挾<E59F88><EFBFBD><E8B3A3>?
| id | disease_type | report_type | display_name | fields | prompt_template |
|----|-------------|-------------|--------------|--------|-----------------|
| uuid-1 | lung_cancer | pathology | <20><EFBFBD><E7AE87><EFBFBD><EFBFBD><EFBFBD><EFBFBD> | [5銝芸<E98A9D>畾琶 | 霂瑚<E99C82>隞乩<E99A9E><E4B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝剜<E98A9D><E5899C>碶縑<E7A2B6>?.. |
| uuid-2 | diabetes | admission | 蝟硋倏<E7A18B><E5808F><EFBFBD><EFBFBD>扇敶?| [5銝芸<E98A9D>畾琶 | 霂瑚<E99C82>隞乩<E99A9E><E4B9A9>仿堺霈啣<E99C88>銝剜<E98A9D><E5899C>碶縑<E7A2B6>?.. |
| uuid-3 | hypertension | outpatient | 擃䁅<E69383><E48185>钅秄霂羓<E99C82><E7BE93>?| [5銝芸<E98A9D>畾琶 | 霂瑚<E99C82>隞乩<E99A9E><E4B9A9><EFBFBD><E588BB><EFBFBD><EFBFBD>銝剜<E98A9D><E5899C>碶縑<E7A2B6>?.. |
---
## <20><><><E99A9E>蝏蠘恣
| 蝐餃<E89D90> | <20><><EFBFBD>?| 隞<><E99A9E>銵峕㺭 |
|------|--------|---------|
| **Service摰䂿緵** | 2 | 286銵?|
| <20><EFBFBD> HealthCheckService.ts | 1 | 156銵?|
| <20><EFBFBD> TemplateService.ts | 1 | 130銵?|
| **Controller<65>湔鰵** | 1 | 31銵䕘<E98AB5><E49598><EFBFBD>嚗?|
| **Scripts** | 1 | 27銵?|
| **<EFBFBD>餉恣** | 4 | 344銵?|
---
## <20><20><><EFBFBD>臭漁<E887AD>?
### 1. <20>亙熒璉<E78692><E79289>交惣<E4BAA4>賣㜃<E8B3A3>?
```typescript
// <20>行⏛蝑𣇉裦1嚗𡁶征<F0A181B6><EFBFBD><EFBFBD><E9A488>
if (emptyRate > 0.8) {
return {
status: 'bad',
message: `蝛箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?{(emptyRate * 100).toFixed(1)}%嚗㚁<E59A97>霂亙<E99C82>銝漤<E98A9D><E6BCA4><EFBFBD><EFBFBD>𣂼<EFBFBD>`
};
}
// <20>行⏛蝑𣇉裦2嚗𡁏<E59A97><F0A1818F><EFBFBD><E7A588>?
if (avgLength < 10) {
return {
status: 'bad',
message: `<EFBFBD><EFBFBD>𧋦<EFBFBD>踹漲餈<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?{avgLength.toFixed(0)}摮㛖泵嚗㚁<E59A97>銝漤<E98A9D><E6BCA4><EFBFBD><EFBFBD>𣂼<EFBFBD>`
};
}
```
**隡睃飵**嚗?
- <20>?<3F><EFBFBD><E8B8B9><EFBFBD>瘚芾晶Token
- <20>?<3F>𣂼<EFBFBD><F0A382BC>𤑳緵<F0A491B3>唳旿韐券<E99F90><E588B8><EFBFBD>
- <20>?<3F>𣂷<EFBFBD><F0A382B7>𡒊<F0A1928A><EFBC86><EFBFBD>霂舀<E99C82>蝷?
### 2. Token憸<6E>摯蝞埈<E89D9E>
```typescript
// 蝎㛖裦隡啁<E99AA1>嚗𡁜<E59A97>蝚行㺭 <20> 1.5
const estimatedTokens = Math.ceil(data.length * avgLength * 1.5);
const message = `<EFBFBD>亙熒摨西<EFBFBD>憟踝<EFBFBD><EFBFBD>恣瘨<EFBFBD><EFBFBD>㛖漲 ${(estimatedTokens / 1000).toFixed(1)}k Token嚗<6E><E59A97><E79285>蝥?${(estimatedTokens * 2 / 1000).toFixed(1)}k Token嚗头;
```
**隡睃飵**嚗?
- <20>?<3F><EFBFBD><E586BD>𣂼<EFBFBD><F0A382BC>仿<EFBFBD><E4BBBF>鞉𧋦
- <20>?<3F><><EFBFBD><EFBFBD>峕芋<E5B395>见㦤<E8A781><EFBFBD><E88D94>2嚗?
- <20>?<3F>见末<E8A781><E69CAB><EFBFBD>蝷箸聢撘?
### 3. 璅⊥踎Upsert<72><EFBFBD>
```typescript
await prisma.dCTemplate.upsert({
where: {
diseaseType_reportType: {
diseaseType: template.diseaseType,
reportType: template.reportType
}
},
update: { /* ... */ },
create: { /* ... */ }
});
```
**隡睃飵**嚗?
- <20>?撟<><E6929F><EFBFBD><EFBFBD>憭𡁏活<F0A1818F><EFBFBD>銝滢<E98A9D><E6BBA2><EFBFBD><E6BB9A><EFBFBD>嚗?
- <20>?<3F><EFBFBD>璅⊥踎<E28AA5><E8B88E><EFBFBD>湔鰵
- <20>?<3F>拍鍂<E68B8D><EFBFBD>蝥行<E89DA5><E8A18C>脫迫<E884AB><EFBFBD>
### 4. <20><EFBFBD>隡睃<E99AA1>
```typescript
// <20><EFBFBD><E88AA3><EFBFBD>100銵?
const sampleData = data.slice(0, 100);
```
**隡睃飵**嚗?
- <20>?敹恍<E695B9><EFBFBD>摨䈑<E691A8>< 3蝘𡜐<E89D98>
- <20>?<3F><EFBFBD>憭扳<E686AD>隞費OM
- <20>?<3F><>甅頞喳<E9A09E><EFBFBD><EFBFBD>?
---
## <20><> 撌脩䰻<E884A9><EFBFBD>
### 1. <20>𩤃<EFBFBD> <20><>辣銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD><EFBFBD><E695BA><EFBFBD>?
**敶枏<E695B6><E69E8F><EFBFBD>?*嚗?
- Controller銝凋蝙<E5878B><EFBFBD>銝湔𧒄<E6B994><F0A79284><EFBFBD>隞嗉粉<E59789>𡝗䲮撘?
- <20><><EFBFBD><E996AC><EFBFBD>𨤳torage<67>滚𦛚
**隞<><E99A9E>雿滨蔭**嚗?
```typescript
// backend/src/modules/dc/tool-b/controllers/ExtractionController.ts
// TODO: <20><><EFBFBD>storage<67>滚𦛚
const fs = await import('fs/promises');
const filePath = path.join(process.cwd(), 'uploads', fileKey);
```
**敺<>㺿餈?*嚗㇄ay 4-5嚗㚁<E59A97>
```typescript
// 雿輻鍂storage<67>滚𦛚
import { storage } from '../../../../common/storage/index.js';
const fileBuffer = await storage.download(fileKey);
```
### 2. <20>𩤃<EFBFBD> <20><EFBFBD>霈方<E99C88><EFBFBD><E695BA><EFBFBD>?
**敶枏<E695B6><E69E8F><EFBFBD>?*嚗?
- 雿輻鍂蝖祉<E89D96><E7A589><EFBFBD><EFBFBD>`userId = 'test-user'`
**敺<>㺿餈?*嚗㇈VP銋见<E98A8B>嚗㚁<E59A97>
```typescript
// 隞粃ession<6F><EFBFBD><E79195><EFBFBD>userId
const userId = req.session.userId || req.user.id;
```
---
## <20>妒 摰峕㟲瘚贝<E7989A>蝏𤘪<E89D8F>
### 瘚贝<E7989A><E8B49D>𡁏𧋦
```
backend/src/scripts/test-health-check.ts
```
### 瘚贝<E7989A><E8B49D><EFBFBD>
#### <20>?瘚贝<E7989A>1嚗朞<E59A97>憟賣㺭<E8B3A3><EFBFBD>test-lung-cancer.xlsx嚗?
```json
{
"status": "good",
"emptyRate": "20.0%",
"avgLength": "98",
"totalRows": 5,
"estimatedTokens": 735,
"message": "<EFBFBD>西<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0.7k Token<EFBFBD><EFBFBD><EFBFBD>?1.5k Token?
}
```
**蝏栞捏**: <20>?<3F><EFBFBD><EFBFBD><E79289><EFBFBD><E4BC90>臭誑<E887AD>𣂼<EFBFBD>
#### <20>?瘚贝<E7989A>2嚗帋<E59A97>韐券<E99F90><E588B8>唳旿嚗ōest-bad-quality.xlsx嚗?
```json
{
"status": "bad",
"emptyRate": "80.0%",
"avgLength": "3",
"totalRows": 10,
"estimatedTokens": 0,
"message": "<22><>𧋦<EFBFBD>踹漲餈<E6BCB2><E9A488><EFBFBD><EFBFBD>?摮㛖泵嚗㚁<E59A97>銝漤<E98A9D><E6BCA4><EFBFBD><EFBFBD>𣂼<EFBFBD>"
}
```
**蝏栞捏**: <20>?甇<><EFBFBD>行⏛嚗屸<E59A97><E5B1B8>齿答韐酪oken
#### <20>?瘚贝<E7989A>3嚗𡁜<E59A97>銝滚<E98A9D><E6BB9A>?
```json
{
"status": "bad",
"message": "<22>珢"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD>?
}
```
**蝏栞捏**: <20>?甇<><EFBC86>瘚见<E7989A>撣豢<E692A3><E8B1A2>?
### 瘚贝<E7989A><E8B49D>唳旿<E594B3><E697BF>
```
backend/uploads/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> test-lung-cancer.xlsx [<5B>臬末<E887AC>唳旿嚗?銵䀉
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> test-bad-quality.xlsx [雿舘捶<E88898>𤩺㺭<F0A4A9BA><EFBFBD>10銵䕘<E98AB5>80%蝛箏<E89D9B>
```
---
## <20><> Day 4 憸<><E686B8>
### 銝𠰴<E98A9D>嚗䥪romptBuilder + <20><EFBFBD><E7AE87>𣂼<EFBFBD><F0A382BC><EFBFBD>
- [ ] 摰䂿緵PromptBuilder.buildExtractionPrompt()
- [ ] 摰䂿緵PIIMaskUtil.mask()嚗㇊II<49><EFBFBD>嚗?
- [ ] 瘚贝<E7989A>Prompt<70><74><EFBFBD>
### 銝见<E98A9D>嚗鋽ualModelExtractionService摰䂿緵
- [ ] 摰䂿緵<E482BF>峕芋<E5B395>见僎<E8A781>𤏸<EFBFBD><F0A48FB8>?
- [ ] 摰䂿緵蝻枏<E89DBB><E69E8F><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>憭滩<E686AD><E6BBA9><EFBFBD>
- [ ] 摰䂿緵JSON閫<4E><E996AB><EFBFBD><EFBFBD><EFBFBD><E59D94><EFBFBD><EFBFBD>
- [ ] 瘚贝<E7989A><E8B49D>峕芋<E5B395>𧢲<EFBFBD><F0A7A2B2>?
---
## <20><> Day 3 <20><EFBFBD>
**摰峕<E691B0>摨?*: 100% <20>?
**韐券<E99F90>**: 隡条<E99AA1>
**<EFBFBD>園𡢿**: <20>㕑恣<E39591><EFBFBD><E98DA6>?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
1. <20>?HealthCheckService摰峕㟲摰䂿緵嚗<E7B7B5><EFBFBD>賣㜃<E8B3A3>?+ Token憸<6E>摯嚗?
2. <20>?TemplateService摰峕㟲摰䂿緵嚗?銝芷<E98A9D>霈暹芋<E69AB9><EFBFBD>
3. <20>?Seed<65>𡁏𧋦<F0A1818F>𣂼<EFBFBD><F0A382BC><EFBFBD>嚗?銝芣芋<E88AA3>踹歇<E8B8B9><EFBFBD>
4. <20>?API蝡舐<E89DA1><E88890><EFBFBD>瘚贝<E7989A><E8B49D><EFBFBD>
5. <20>?隞<><E99A9E>韐券<E99F90>擃矋<E69383><E79F8B>饊inter<65>躰秤
**<EFBFBD><EFBFBD><EFBFBD>臭漁<EFBFBD>?*嚗?
- <20>亙熒璉<E78692><E79289>交㜃<E4BAA4><EFBFBD><E88AB0><EFBFBD><E4BAA4><EFBFBD><EFBFBD><EFBFBD>齿答韐?
- Token憸<6E>摯撣桀𨭌<E6A180><EFBFBD><E586BD><EFBFBD><E689B9>鞉𧋦
- 璅⊥踎Upsert<72><EFBFBD>靽肽<E99DBD><E882BD>唳旿銝<E697BF><E98A9D><EFBFBD>?
- <20><EFBFBD>隡睃<E99AA1><EFBFBD>蘨璉<E898A8><E79289><EFBFBD>100銵䕘<E98AB5>
**銝衤<E98A9D>甇?*: Day 4 - <20>峕芋<E5B395>𧢲<EFBFBD><F0A7A2B2><EFBFBD><E7A18B>?<3F><>
---
**Day 3 <20><>說摰峕<E691B0>嚗?* <20>?