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%)
845 lines
27 KiB
Markdown
845 lines
27 KiB
Markdown
# Week 4嚗𡁶<E59A97><F0A181B6>𨅯<EFBFBD>蝷箔<E89DB7>撖澆枂 - 撘<><E69298>𤏸恣<F0A48FB8>𡜐<EFBFBD>鈭穃<E988AD><E7A983><EFBFBD>沲<EFBFBD><E6B2B2><EFBFBD>
|
||
|
||
> **<2A><>﹝<EFBFBD><EFB99D>𧋦嚗?* v1.0
|
||
> **<2A>𥕦遣<F0A595A6>交<EFBFBD>嚗?* 2025-11-21
|
||
> **霈∪<E99C88><E288AA>冽<EFBFBD>嚗?* 2憭抬<E686AD>Day 16-17嚗?
|
||
> **<2A>嗆<EFBFBD><E59786>笔<EFBFBD>嚗?* <20>?鈭穃<E988AD><E7A983>煺<EFBFBD><E785BA>?
|
||
> **<2A><><EFBFBD>擧凒<E693A7>堆<EFBFBD>** 2025-11-21
|
||
|
||
---
|
||
|
||
## <20><> <20><>﹝霂湔<E99C82>
|
||
|
||
<EFBFBD>祆<EFBFBD>獢<EFBFBD>糓 Week 4 <20>蠘<EFBFBD>撘<EFBFBD><E69298>𤑳<EFBFBD>霂衣<E99C82>霈∪<E99C88>嚗屸<E59A97>敺芯<E695BA><E88AAF>毺<EFBFBD>撘<EFBFBD><E69298>𤏸<EFBFBD><F0A48FB8><EFBFBD><EFBFBD>摰䂿緵蝑偦<E89D91>厩<EFBFBD><E58EA9>𦦵<EFBFBD>蝏蠘恣撅閧內<E996A7>袏xcel撖澆枂<E6BE86>蠘<EFBFBD><E8A098>?
|
||
|
||
**<EFBFBD>詨<EFBFBD><EFBFBD>格<EFBFBD>**嚗?
|
||
- <20>?蝏蠘恣璁<E681A3><E79281>嚗<EFBFBD><E59A97>餅㺭<E9A485><E3BAAD>熙<EFBFBD>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD><EFBFBD>斤<EFBFBD><E696A4><EFBFBD><EFBFBD>憭齿瓲嚗?
|
||
- <20>?PRISMA撘𤩺<E69298><F0A4A9BA>文<EFBFBD><E69687>删<EFBFBD>霈?
|
||
- <20>?蝏𤘪<E89D8F><F0A498AA>𡑒”Tab<61><62>揢銝擧䰻<E693A7>?
|
||
- <20>?Excel<65>寥<EFBFBD>撖澆枂
|
||
- <20>?摰峕㟲<E5B395>蠘<EFBFBD><E8A098>剔㴓嚗<E3B493><E59A97>隡罱<E99AA1>蝑偦<E89D91>争<EFBFBD>憭齿瓲<E9BDBF>垍<EFBFBD>霈﹦<E99C88>撖澆枂嚗?
|
||
|
||
**<EFBFBD>嗆<EFBFBD><EFBFBD>笔<EFBFBD>**嚗?
|
||
- <20>?**鈭穃<E988AD><E7A983>煺<EFBFBD><E785BA>?*嚗𡁻<E59A97>敺歧鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8><EFBFBD>(../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md)
|
||
- <20>?**憭滨鍂撟喳蝱<E596B3>賢<EFBFBD>**嚗帋蝙<E5B88B>典<EFBFBD>撅<EFBFBD>`prisma`<EFBFBD><EFBFBD>logger`蝑?
|
||
- <20>?**<2A>嗆<EFBFBD>隞嗉氜<E59789>?*嚗鍃xcel<65>滨垢<E6BBA8><E59EA2><EFBFBD><EFBFBD>𤈛SS摮睃<E691AE>
|
||
- <20>?**<2A>𡒊垢<F0A1928A>𡁜<EFBFBD>霈∠<E99C88>**嚗𡁶<E59A97>霈⊥㺭<E28AA5>桀<EFBFBD>蝡航<E89DA1><E888AA>?
|
||
|
||
---
|
||
|
||
## <20>㴓 銝<><E98A9D><EFBFBD><EFBFBD><EFBFBD>賢<EFBFBD>雿?
|
||
|
||
### 1.1 "摰⊥瓲撌乩<E6928C><E4B9A9>? vs "<22>萘<EFBFBD>蝏𤘪<E89D8F>" <20>箏<EFBFBD>
|
||
|
||
| 蝏游漲 | 摰⊥瓲撌乩<E6928C><E4B9A9>堆<EFBFBD>ScreeningWorkbench嚗?| <20>萘<EFBFBD>蝏𤘪<E89D8F>嚗𠄎creeningResults嚗?|
|
||
|------|--------------------------------|---------------------------|
|
||
| **摰帋<E691B0>** | 摰墧𧒄<E5A2A7>烐綉<E78390><E7B689><EFBFBD>蝒<EFBFBD><E89D92><EFBFBD><EFBFBD><EFBFBD><EFBFBD>犖撌亙<E6928C><E4BA99>?| <20><>蝏<EFBFBD><E89D8F><EFBFBD>𨅯<EFBFBD>蝷箝<E89DB7><E7AE9D><EFBFBD>霈∪<E99C88><E288AA>僐<EFBFBD><E58390>鸌<EFBFBD>誩紡<E8AAA9>?|
|
||
| **雿輻鍂<E8BCBB>嗆㦤** | 蝑偦<E89D91>㕑<EFBFBD>銵䔶葉 | 蝑偦<E89D91>匧<EFBFBD><E58CA7>𣂼<EFBFBD> |
|
||
| **<EFBFBD>詨<EFBFBD><EFBFBD>蠘<EFBFBD>** | 餈𥕦漲頧株砭<E6A0AA><E7A0AD><EFBFBD>鞉辺憭齿瓲<E9BDBF><E793B2><EFBFBD>蝒<EFBFBD><E89D92>鈭?| 蝏蠘恣璁<E681A3><E79281><EFBFBD><EFBFBD>RISMA<4D>餌<EFBFBD><E9A48C><EFBFBD>鸌<EFBFBD>誩紡<E8AAA9>?|
|
||
| **銵冽聢敶W<E695B6>** | <20>諹<EFBFBD>銵冽聢嚗㇄S + Qwen撖寞<E69296>嚗?| <20>閗<EFBFBD>銵冽聢嚗<E881A2>遬蝷箸<E89DB7>蝏<EFBFBD><E89D8F>蝑吔<E89D91> |
|
||
| **撘箄<E69298><E7AE84>滨<EFBFBD>** | 撌乩<E6928C>瘚?| 蝏𤘪<E89D8F>瘙<EFBFBD><E79899>?|
|
||
|
||
**瘥𥪜鸘**嚗?
|
||
```
|
||
摰⊥瓲撌乩<EFBFBD><EFBFBD>?= <20>煺漣頧阡𡢿嚗<F0A1A2BF>迤<EFBFBD>函<EFBFBD><E587BD>剹<EFBFBD><E589B9><EFBFBD><EFBFBD>賂<EFBFBD>
|
||
<EFBFBD>萘<EFBFBD>蝏𤘪<EFBFBD> = <20>𣂼<EFBFBD>隞枏<E99A9E>嚗<EFBFBD>歇摰峕<E691B0><E5B395><EFBFBD><EFBFBD>霈~<E99C88><EFBD9E>紡<EFBFBD>綽<EFBFBD>
|
||
```
|
||
|
||
### 1.2 <20>冽<EFBFBD>瘚<EFBFBD><E7989A>
|
||
|
||
```
|
||
霈曄蔭銝𤾸鍳<EFBFBD>?<3F>?摰⊥瓲撌乩<E6928C><E4B9A9>?<3F>?<3F>萘<EFBFBD>蝏𤘪<E89D8F>
|
||
(<28>滨蔭) (摰墧𧒄<E5A2A7>烐綉) (蝏𤘪<E89D8F>瘙<EFBFBD><E79899>?
|
||
<20>? <20>? <20>?
|
||
憛怠<E6869B>PICOS <20>鞉辺憭齿瓲 <20>寥<EFBFBD>撖澆枂
|
||
銝𠹺<E98A9D>Excel <20>脩<EFBFBD>憭<EFBFBD><E686AD> 蝏蠘恣<E8A098><E681A3><EFBFBD>
|
||
```
|
||
|
||
---
|
||
|
||
## <20><>儭?鈭䎚<E988AD><E48E9A><EFBFBD><EFBFBD>舀沲<E88880><E6B2B2><EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>
|
||
|
||
### 2.1 <20>詨<EFBFBD><E8A9A8>嗆<EFBFBD><E59786>喟<EFBFBD>
|
||
|
||
#### <20>喟<EFBFBD>1嚗𡁏㺭<F0A1818F>株繮<E6A0AA>𣇉<EFBFBD><F0A38789>?<3F>?<3F>𡒊垢<F0A1928A>𡁜<EFBFBD>API <20>?
|
||
|
||
**<EFBFBD>寞<EFBFBD>A**嚗<><E59A97><EFBFBD><EFBFBD>鍂嚗㚁<E59A97><E39A81>滨垢<E6BBA8>瑕<EFBFBD><E79195>券<EFBFBD><E588B8>唳旿嚗<E697BF><E59A97>蝡航恣蝞?
|
||
```typescript
|
||
// <20>?銝滨泵<E6BBA8><E6B3B5><EFBFBD><EFBFBD>毺<EFBFBD>嚗𡁜<E59A97>蝡航繮<E888AA>硋<EFBFBD><E7A18B>𤩺㺭<F0A4A9BA>殷<EFBFBD><E6AEB7>航<EFBFBD>銝𠰴<E98A9D><F0A0B0B4>∴<EFBFBD>
|
||
const { data } = await aslApi.getScreeningResultsList(projectId, {
|
||
pageSize: 9999 // <20>瑕<EFBFBD><E79195>券<EFBFBD>
|
||
});
|
||
// <20>滨垢霈∠<E99C88>蝏蠘恣...
|
||
```
|
||
|
||
**<EFBFBD>寞<EFBFBD>B**嚗<><E59A97><EFBFBD>剁<EFBFBD>嚗𡁜<E59A97>蝡航<E89DA1><E888AA>㇁PI <20>?
|
||
```typescript
|
||
// <20>?蝚血<E89D9A>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢<F0A1928A>𡁜<EFBFBD>嚗<EFBFBD><E59A97>撠𤑳<E692A0>蝏靝<E89D8F>颲?
|
||
GET /api/v1/asl/projects/:projectId/statistics
|
||
|
||
// <20>𡒊垢雿輻鍂Prisma<6D>𡁜<EFBFBD>
|
||
const stats = await prisma.aslScreeningResult.groupBy({
|
||
by: ['finalDecision', 'conflictStatus'],
|
||
_count: true,
|
||
where: { projectId }
|
||
});
|
||
```
|
||
|
||
**<EFBFBD>㗇𥋘<EFBFBD><EFBFBD>眏**嚗?
|
||
- <20>?<3F>𡒊垢<F0A1928A>𡁜<EFBFBD>嚗峕<E59A97>扯<EFBFBD>憟?
|
||
- <20>?<3F>誩<EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1>嚗<EFBFBD><E59A97>MB蝥折<E89DA5><E68A98>袁B蝥改<E89DA5>
|
||
- <20>?<3F>舀<EFBFBD>撅閙<E69285>批撩嚗<E692A9>𣈲<EFBFBD><F0A388B2>凒憭齿<E686AD><E9BDBF><EFBFBD><EFBFBD>霈∴<E99C88>
|
||
- <20>?蝚血<E89D9A>鈭穃<E988AD><E7A983>?霈∠<E99C88><E288A0>㰘<EFBFBD><E3B098>唳旿"<22>笔<EFBFBD>
|
||
|
||
---
|
||
|
||
#### <20>喟<EFBFBD>2嚗鍃xcel撖澆枂蝑𣇉裦 <20>?<3F>滨垢<E6BBA8><E59EA2><EFBFBD>嚗㇈VP嚗争<E59A97>
|
||
|
||
**<EFBFBD>寞<EFBFBD>A**嚗<><E59A97><EFBFBD>決VP嚗㚁<E59A97><E39A81>滨垢<E6BBA8><E59EA2><EFBFBD> <20>?
|
||
```typescript
|
||
// <20>?蝚血<E89D9A>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD>隞嗉氜<E59789>矋<EFBFBD>摰<EFBFBD><E691B0><EFBFBD>冽<EFBFBD>閫<EFBFBD>膥<EFBFBD><E886A5><EFBFBD>銝?
|
||
import * as XLSX from 'xlsx';
|
||
|
||
function exportToExcel(results) {
|
||
const ws = XLSX.utils.json_to_sheet(exportData);
|
||
const wb = XLSX.utils.book_new();
|
||
XLSX.utils.book_append_sheet(wb, ws, '蝑偦<E89D91>厩<EFBFBD><E58EA9>?);
|
||
XLSX.writeFile(wb, 'screening-results.xlsx'); // 瘚讛<E7989A><E8AE9B>其<EFBFBD>頧?
|
||
}
|
||
```
|
||
|
||
**隡条<E99AA1>**嚗?
|
||
- <20>?**<2A>嗆<EFBFBD>隞嗉氜<E59789>?*嚗<><E59A97><EFBFBD>典銁瘚讛<E7989A><E8AE9B>典<EFBFBD>摮䀝葉<E4809D><E89189><EFBFBD>嚗?
|
||
- <20>?**<2A>𣳇<EFBFBD><F0A3B387>𡒊垢摮睃<E691AE>**嚗<><E59A97><EFBFBD>删鍂OSS蝛粹𡢿嚗?
|
||
- <20>?**摰墧𧒄<E5A2A7><F0A79284><EFBFBD>**嚗<><E59A97>撘<EFBFBD>郊蝑匧<E89D91>嚗?
|
||
- <20>?**蝚血<E89D9A>鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>?*嚗<><E59A97><EFBFBD>𥒚erverless<73><73>辣<EFBFBD>滢<EFBFBD>嚗?
|
||
- <20>?**<2A>鞉𧋦雿?*嚗<><E59A97>瘨<EFBFBD><E798A8>堒<EFBFBD>蝡航<E89DA1>皞琜<E79A9E>
|
||
|
||
**<EFBFBD>𣂼<EFBFBD>**嚗?
|
||
- <20>𩤃<EFBFBD> <20><>鍂<EFBFBD>唳旿<E594B3>𧶏<EFBFBD><5000<30>?
|
||
- <20>𩤃<EFBFBD> <20><><EFBFBD><EFBFBD>笔漲嚗?1000<30>∠漲2-3蝘?
|
||
- <20>𩤃<EFBFBD> 銝齿𣈲<E9BDBF><F0A388B2><EFBFBD><EFBFBD><EFBFBD>聢撘𧶏<E69298>憭锭heet<65><74>㦛銵剁<E98AB5>
|
||
|
||
**<EFBFBD>寞<EFBFBD>B**嚗<>𧊋<EFBFBD>交<EFBFBD>撅𤏪<E69285>嚗𡁜<E59A97>蝡舐<E89DA1><E88890>?+ OSS摮睃<E691AE> <20>賂<EFBFBD>
|
||
```typescript
|
||
// <20>賂<EFBFBD> <20><><EFBFBD>臬<EFBFBD>箏𦛚嚗𡁜<E59A97><F0A1819C>唳旿<E594B3>?5000<30>⊥<EFBFBD><E28AA5><EFBFBD>閬<EFBFBD><E996AC><EFBFBD><EFBFBD>聢撘𤩺𧒄
|
||
// 1. <20>𡒊垢<F0A1928A><E59EA2><EFBFBD>Excel嚗<6C><E59A97>摮䀝葉嚗?
|
||
import ExcelJS from 'exceljs';
|
||
const workbook = new ExcelJS.Workbook();
|
||
// ... <20><><EFBFBD>Excel
|
||
|
||
// 2. 潃?銝𠹺<E98A9D><F0A0B9BA>記SS嚗<53>蝙<EFBFBD>典像<E585B8>啣<EFBFBD><E595A3>冽<EFBFBD><E586BD>∴<EFBFBD>
|
||
import { storage } from '@/common/storage';
|
||
const buffer = await workbook.xlsx.writeBuffer();
|
||
const url = await storage.upload(`asl/exports/${Date.now()}.xlsx`, buffer);
|
||
|
||
// 3. 餈𥪜<E9A488>OSS URL
|
||
res.send({ success: true, url });
|
||
```
|
||
|
||
**閫血<E996AB><E8A180>∩辣**嚗?
|
||
- <20>閙活撖澆枂<E6BE86>唳旿<E594B3>?>5000<30>?
|
||
- <20><>閬<EFBFBD><E996AC><EFBFBD><EFBFBD>xcel<65>澆<EFBFBD>嚗<EFBFBD><E59A97>Sheet<65><74>㦛銵函<E98AB5>嚗?
|
||
- <20>冽<EFBFBD><E586BD>漤<EFBFBD><E6BCA4>滨垢撖澆枂<E6BE86>⊿▼
|
||
|
||
**霈啣<E99C88>雿滨蔭**嚗靀<E59A97><E99D80><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C> - 隡睃<E99AA1>蝥?](../../06-<2D><><EFBFBD>臬<EFBFBD>箏𦛚/<2F><><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md)
|
||
|
||
---
|
||
|
||
### 2.2 鈭穃<E988AD><E7A983><EFBFBD>沲<EFBFBD><E6B2B2><EFBFBD><EFBFBD>?
|
||
|
||
<EFBFBD>箔<EFBFBD>[鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8><EFBFBD>(../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md)嚗峕𧋦撘<F0A78BA6><E69298>𤏸恣<F0A48FB8>㘾<EFBFBD>敺迎<E695BA>
|
||
|
||
| 璉<><E79289>仿★ | 閬<><E996AC> | <20>祈恣<E7A588>鍦<EFBFBD><E98DA6>?| <20>嗆<EFBFBD>?|
|
||
|--------|------|-----------|------|
|
||
| **摮睃<E691AE>** | 雿輻鍂`storage.upload()`嚗䔶<EFBFBD><EFBFBD>灼fs.writeFile()` | Excel<65>滨垢<E6BBA8><E59EA2><EFBFBD>嚗屸妟<E5B1B8>賜<EFBFBD> | <20>?|
|
||
| **<2A>唳旿摨?* | 雿輻鍂<E8BCBB>典<EFBFBD>`prisma`摰硺<E691B0> | 蝏蠘恣API雿輻鍂<E8BCBB>典<EFBFBD>`prisma` | <20>?|
|
||
| **<2A>蹂遙<E8B982>?* | 撘<>郊憭<E9838A><E686AD>嚗䔶<E59A97><E494B6>餃<EFBFBD>霂瑟<E99C82> | 蝏蠘恣API <500ms嚗峕<E59A97><E5B395><EFBFBD>撘<EFBFBD>郊 | <20>?|
|
||
| **<2A>亙<EFBFBD>** | 雿輻鍂`logger`嚗䔶<E59A97><E494B6>灼console.log` | <20>𡒊垢雿輻鍂`logger.info/error` | <20>?|
|
||
| **<EFBFBD>滨蔭** | 雿輻鍂`process.env` | <20>䭾鰵憓鮋<E68693>蝵?| <20>?|
|
||
| **霈∠<E99C88>** | 憭齿<E686AD>霈∠<E99C88><E288A0>𡒊垢摰峕<E691B0> | 蝏蠘恣<E8A098>𡁜<EFBFBD><F0A1819C>𡒊垢摰峕<E691B0> | <20>?|
|
||
|
||
---
|
||
|
||
## <20><> 銝剹<E98A9D><E589B9>△<EFBFBD>Z挽霈?
|
||
|
||
### 3.1 <20>港<EFBFBD>撣<EFBFBD><E692A3>
|
||
|
||
```
|
||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>嚗𡁏<E59A97>憸䀹<E686B8>閬<EFBFBD><E996AC>蝑?- 蝏𤘪<E89D8F> <20>?
|
||
<EFBFBD>? 霂湔<E99C82>嚗𡁶<E59A97><F0A181B6>厩<EFBFBD><E58EA9>𦦵<EFBFBD>霈~<E99C88><EFBD9E>RISMA瘚<41><E7989A><EFBFBD>整<EFBFBD><E695B4>鸌<EFBFBD>𤩺<EFBFBD>雿𨅯<E99BBF>撖澆枂 <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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
|
||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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><> 蝏蠘恣璁<E681A3><E79281>嚗?銝芸㨃<E88AB8>?+ 敺<><E695BA><EFBFBD>豢<EFBFBD>蝷綽<E89DB7> <20>?
|
||
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||
<EFBFBD>? <20>?<3F>餅㺭 <20>?<3F>?撌脩熙<E884A9>乒<EFBFBD> <20>?撌脫<E6928C><E884AB>手<EFBFBD> <20>?敺<><E695BA><EFBFBD>詹<EFBFBD> <20>?
|
||
<EFBFBD>? <20>? 199 <20>?<3F>? 85 <20>?<3F>? 90 <20>?<3F>? 24 <20>? <20>?
|
||
<EFBFBD>? <20>? 蝭? <20>?<3F>?42.7% <20>?<3F>?45.2% <20>?<3F>?12.1% <20>? <20>?
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||
<EFBFBD>? <20>?
|
||
<EFBFBD>? <20>𩤃<EFBFBD> <20>鞟內嚗朞<E59A97><E69C9E>?24 蝭<><E89DAD><EFBFBD>桀<EFBFBD>憭齿瓲嚗諹窈<E8ABB9>滚<EFBFBD>"摰⊥瓲撌乩<E6928C><E4B9A9>?憭<><E686AD> <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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
|
||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>㘾膄<E398BE>笔<EFBFBD>蝏蠘恣嚗<E681A3><E59A97><EFBFBD>嗅㦛嚗? <20>?
|
||
<EFBFBD>? <20>𢞖<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>? <20>?
|
||
<EFBFBD>? <20>?P銝滚龪<E6BB9A>㵪<EFBFBD>鈭箇黎嚗? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 40蝭?(44%) <20>? <20>?
|
||
<EFBFBD>? <20>?I銝滚龪<E6BB9A>㵪<EFBFBD>撟脤<E6929F>嚗? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 25蝭?(28%) <20>? <20>?
|
||
<EFBFBD>? <20>?S銝滚龪<E6BB9A>㵪<EFBFBD><E3B5AA>𠉛弦霈曇恣嚗争<E59A97><E4BA89><EFBFBD><EFBFBD><EFBFBD>?15蝭?(17%) <20>? <20>?
|
||
<EFBFBD>? <20>?<3F>嗡<EFBFBD><E597A1>笔<EFBFBD> <20><><EFBFBD> 10蝭?(11%) <20>? <20>?
|
||
<EFBFBD>? <20>婙<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>? <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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
|
||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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><> 蝏𤘪<E89D8F><F0A498AA>𡑒”嚗㇍abs + <20>閗<EFBFBD>銵冽聢 + <20>寥<EFBFBD><E5AFA5>滢<EFBFBD>嚗? <20>?
|
||
<EFBFBD>? <20>𢞖<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>? <20>?
|
||
<EFBFBD>? <20>?[<5B>券<EFBFBD> 199] [撌脩熙<E884A9>?85] [撌脫<E6928C><E884AB>?90] [敺<><E695BA><EFBFBD>?24] <20>? <20>?
|
||
<EFBFBD>? <20>鎿<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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>? <20>?[撖澆枂<E6BE86>券<EFBFBD>] [撖澆枂敶枏<E695B6>憿琶 [撖澆枂<E6BE86>劐葉憿鉛 <20>? <20>?
|
||
<EFBFBD>? <20>鎿<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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>? <20>?<3F>?摨誩噡 | <20><><EFBFBD> | <20><>蝏<EFBFBD><E89D8F>蝑?| <20>㘾膄<E398BE>笔<EFBFBD> | <20>滢<EFBFBD> <20>? <20>?
|
||
<EFBFBD>? <20>?<3F>?1 | ... | 撌脩熙<E884A9>? | - | [<5B>亦<EFBFBD>] <20>? <20>?
|
||
<EFBFBD>? <20>?<3F>?2 | ... | 撌脫<E6928C><E884AB>? | P銝滚龪<E6BB9A>? | [<5B>亦<EFBFBD>] <20>? <20>?
|
||
<EFBFBD>? <20>?<3F>?3 | ... | 敺<><E695BA><EFBFBD>? | <20>脩<EFBFBD> | [憭齿瓲] <20>? <20>?
|
||
<EFBFBD>? <20>婙<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>? <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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
```
|
||
|
||
### 3.2 銵冽聢霈曇恣
|
||
|
||
**<EFBFBD>堒<EFBFBD>銋?*嚗<><E59A97>銵諹”<E8ABB9>潘<EFBFBD><E6BD98>箏<EFBFBD>鈭𤾸恣<F0A4BEB8>詨極雿𨅯蝱<F0A885AF><E89DB1><EFBFBD>銵䕘<E98AB5>嚗?
|
||
|
||
| <20>堒<EFBFBD> | 摰賢漲 | 霂湔<E99C82> |
|
||
|------|------|------|
|
||
| <20>㗇𥋘 | 50px | Checkbox憭𡁻<E686AD>?|
|
||
| 摨誩噡 | 60px | 銵<>噡 |
|
||
| <20><>讃<EFBFBD><E8AE83><EFBFBD> | 400px | Tooltip<69>曄內<E69B84>冽<EFBFBD> |
|
||
| <20><>蝏<EFBFBD><E89D8F>蝑?| 100px | Tag<61>曄內嚗<E585A7>熙<EFBFBD>?<3F>㘾膄/敺<><E695BA>嚗?|
|
||
| <20>㘾膄<E398BE>笔<EFBFBD> | 150px | <20>曄內<E69B84>瑚<EFBFBD><E7919A>笔<EFBFBD> |
|
||
| 蝵桐縑摨?| 80px | DeepSeek蝵桐縑摨?|
|
||
| <20>滢<EFBFBD> | 100px | <20>亦<EFBFBD>霂行<E99C82><E8A18C>厰僼 |
|
||
|
||
**<EFBFBD>喲睸<EFBFBD>箏<EFBFBD>**嚗?
|
||
- **摰⊥瓲撌乩<E6928C><E4B9A9>?*嚗𡁜<E59A97>銵諹”<E8ABB9>潘<EFBFBD><E6BD98>曄內DS+Qwen撖寞<E69296>嚗<EFBFBD>撩靚<E692A9><E99D9A>蝒?
|
||
- **<2A>萘<EFBFBD>蝏𤘪<E89D8F>**嚗?*<2A>閗<EFBFBD>銵冽聢**嚗峕遬蝷箸<E89DB7>蝏<EFBFBD><E89D8F>蝑吔<E89D91>撘箄<E69298>蝏𤘪<E89D8F>
|
||
|
||
---
|
||
|
||
## <20>圲 <20>䜘<EFBFBD><E49C98><EFBFBD>蝡臬<E89DA1><E887AC>?
|
||
|
||
### 4.1 <20>啣<EFBFBD>蝏蠘恣API
|
||
|
||
#### API霈曇恣
|
||
```
|
||
GET /api/v1/asl/projects/:projectId/statistics
|
||
```
|
||
|
||
#### 霂瑟<E99C82><E7919F><EFBFBD>㺭
|
||
```
|
||
<EFBFBD>?
|
||
```
|
||
|
||
#### <20>滚<EFBFBD><E6BB9A>澆<EFBFBD>
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"total": 199,
|
||
"included": 85,
|
||
"excluded": 90,
|
||
"pending": 24,
|
||
"conflict": 24,
|
||
"reviewed": 175,
|
||
"exclusionReasons": {
|
||
"P銝滚龪<E6BB9A>㵪<EFBFBD>鈭箇黎嚗?: 40,
|
||
"I銝滚龪<EFBFBD>㵪<EFBFBD>撟脤<EFBFBD>嚗?: 25,
|
||
"S銝滚龪<E6BB9A>㵪<EFBFBD><E3B5AA>𠉛弦霈曇恣嚗?: 15,
|
||
"<EFBFBD>嗡<EFBFBD><EFBFBD>笔<EFBFBD>": 10
|
||
},
|
||
"includedRate": "42.7",
|
||
"excludedRate": "45.2",
|
||
"pendingRate": "12.1"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 摰䂿緵隞<E7B7B5><E99A9E>
|
||
```typescript
|
||
// backend/src/modules/asl/controllers/screeningController.ts
|
||
|
||
/**
|
||
* <20>瑕<EFBFBD>憿寧𤌍蝑偦<E89D91>厩<EFBFBD>霈⊥㺭<E28AA5>殷<EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢<F0A1928A>𡁜<EFBFBD>嚗?
|
||
* GET /api/v1/asl/projects/:projectId/statistics
|
||
*/
|
||
export async function getProjectStatistics(
|
||
request: FastifyRequest<{ Params: { projectId: string } }>,
|
||
reply: FastifyReply
|
||
) {
|
||
try {
|
||
const userId = (request as any).userId || 'asl-test-user-001';
|
||
const { projectId } = request.params;
|
||
|
||
// 1. 撉諹<E69289>憿寧𤌍敶鍦<E695B6>
|
||
const project = await prisma.aslScreeningProject.findFirst({
|
||
where: { id: projectId, userId },
|
||
});
|
||
|
||
if (!project) {
|
||
return reply.status(404).send({ error: 'Project not found' });
|
||
}
|
||
|
||
// 2. 潃?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>雿輻鍂Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗<E7A0AD>僎銵䕘<E98AB5>
|
||
const [
|
||
total,
|
||
includedCount,
|
||
excludedCount,
|
||
pendingCount,
|
||
conflictCount,
|
||
reviewedCount
|
||
] = await Promise.all([
|
||
prisma.aslScreeningResult.count({ where: { projectId } }),
|
||
prisma.aslScreeningResult.count({
|
||
where: { projectId, finalDecision: 'include' }
|
||
}),
|
||
prisma.aslScreeningResult.count({
|
||
where: { projectId, finalDecision: 'exclude' }
|
||
}),
|
||
prisma.aslScreeningResult.count({
|
||
where: { projectId, finalDecision: null }
|
||
}),
|
||
prisma.aslScreeningResult.count({
|
||
where: { projectId, conflictStatus: 'conflict', finalDecision: null }
|
||
}),
|
||
prisma.aslScreeningResult.count({
|
||
where: { projectId, NOT: { finalDecision: null } }
|
||
}),
|
||
]);
|
||
|
||
// 3. <20>亥砭<E4BAA5>㘾膄蝏𤘪<E89D8F>嚗<EFBFBD>鍂鈭𡒊<E988AD>霈∪<E99C88><E288AA>𩤃<EFBFBD>
|
||
const excludedResults = await prisma.aslScreeningResult.findMany({
|
||
where: {
|
||
projectId,
|
||
OR: [
|
||
{ finalDecision: 'exclude' },
|
||
{ finalDecision: null, dsConclusion: 'exclude' }
|
||
]
|
||
},
|
||
select: {
|
||
exclusionReason: true,
|
||
dsPJudgment: true,
|
||
dsIJudgment: true,
|
||
dsCJudgment: true,
|
||
dsSJudgment: true,
|
||
}
|
||
});
|
||
|
||
// 4. <20><><EFBFBD><EFBFBD>㘾膄<E398BE>笔<EFBFBD>
|
||
const exclusionReasons: Record<string, number> = {};
|
||
excludedResults.forEach(result => {
|
||
const reason = result.exclusionReason || extractAutoReason(result);
|
||
exclusionReasons[reason] = (exclusionReasons[reason] || 0) + 1;
|
||
});
|
||
|
||
// 5. 餈𥪜<E9A488>蝏蠘恣<E8A098>唳旿
|
||
return reply.send({
|
||
success: true,
|
||
data: {
|
||
total,
|
||
included: includedCount,
|
||
excluded: excludedCount,
|
||
pending: pendingCount,
|
||
conflict: conflictCount,
|
||
reviewed: reviewedCount,
|
||
exclusionReasons,
|
||
includedRate: total > 0 ? ((includedCount / total) * 100).toFixed(1) : '0.0',
|
||
excludedRate: total > 0 ? ((excludedCount / total) * 100).toFixed(1) : '0.0',
|
||
pendingRate: total > 0 ? ((pendingCount / total) * 100).toFixed(1) : '0.0',
|
||
}
|
||
});
|
||
} catch (error) {
|
||
logger.error('Failed to get statistics', { error });
|
||
return reply.status(500).send({
|
||
error: 'Failed to get statistics',
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 颲<>𨭌<EFBFBD>賣㺭嚗帋<E59A97>AI<41>斗鱏銝剜<E98A9D><E5899C>𡝗<EFBFBD><F0A19D97>文<EFBFBD><E69687>?
|
||
*/
|
||
function extractAutoReason(result: any): string {
|
||
if (result.dsPJudgment === 'mismatch') return 'P銝滚龪<E6BB9A>㵪<EFBFBD>鈭箇黎嚗?;
|
||
if (result.dsIJudgment === 'mismatch') return 'I銝滚龪<EFBFBD>㵪<EFBFBD>撟脤<EFBFBD>嚗?;
|
||
if (result.dsCJudgment === 'mismatch') return 'C銝滚龪<E6BB9A>㵪<EFBFBD>撖寧<E69296>嚗?;
|
||
if (result.dsSJudgment === 'mismatch') return 'S銝滚龪<EFBFBD>㵪<EFBFBD><EFBFBD>𠉛弦霈曇恣嚗?;
|
||
return '<27>嗡<EFBFBD><E597A1>笔<EFBFBD>';
|
||
}
|
||
```
|
||
|
||
#### 頝舐眏瘜典<E7989C>
|
||
```typescript
|
||
// backend/src/modules/asl/routes/index.ts
|
||
|
||
// 瘛餃<E7989B><E9A483>啗楝<E59597>望釣<E69C9B>?
|
||
fastify.get(
|
||
'/projects/:projectId/statistics',
|
||
screeningController.getProjectStatistics
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## <20>凃 鈭𢛵<E988AD><F0A29BB5><EFBFBD>蝡臬<E89DA1><E887AC>?
|
||
|
||
### 5.1 API摰X<E691B0>蝡?
|
||
|
||
```typescript
|
||
// frontend-v2/src/modules/asl/api/index.ts
|
||
|
||
/**
|
||
* <20>瑕<EFBFBD>憿寧𤌍蝏蠘恣<E8A098>唳旿
|
||
*/
|
||
export async function getProjectStatistics(
|
||
projectId: string
|
||
): Promise<ApiResponse<ProjectStatistics>> {
|
||
return request(`/projects/${projectId}/statistics`);
|
||
}
|
||
```
|
||
|
||
### 5.2 蝐餃<E89D90>摰帋<E691B0>
|
||
|
||
```typescript
|
||
// frontend-v2/src/modules/asl/types/index.ts
|
||
|
||
/**
|
||
* 憿寧𤌍蝏蠘恣<E8A098>唳旿
|
||
*/
|
||
export interface ProjectStatistics {
|
||
total: number;
|
||
included: number;
|
||
excluded: number;
|
||
pending: number;
|
||
conflict: number;
|
||
reviewed: number;
|
||
exclusionReasons: Record<string, number>;
|
||
includedRate: string;
|
||
excludedRate: string;
|
||
pendingRate: string;
|
||
}
|
||
```
|
||
|
||
### 5.3 Excel撖澆枂撌亙<E6928C>
|
||
|
||
```typescript
|
||
// frontend-v2/src/modules/asl/utils/excelExport.ts
|
||
import * as XLSX from 'xlsx';
|
||
import { ScreeningResult } from '../types';
|
||
|
||
/**
|
||
* 撖澆枂蝑偦<E89D91>厩<EFBFBD><E58EA9>𨅯<EFBFBD>Excel嚗<6C><E59A97><EFBFBD>毺<EFBFBD>嚗𡁜<E59A97>蝡舐<E89DA1><E88890>琜<EFBFBD><E7909C>嗆<EFBFBD>隞嗉氜<E59789>矋<EFBFBD>
|
||
*
|
||
* @param results 蝑偦<E89D91>厩<EFBFBD><E58EA9>𨀣㺭蝏?
|
||
* @param options 撖澆枂<E6BE86>厰★
|
||
*/
|
||
export function exportScreeningResults(
|
||
results: ScreeningResult[],
|
||
options: {
|
||
filter?: 'all' | 'included' | 'excluded' | 'pending';
|
||
projectName?: string;
|
||
} = {}
|
||
) {
|
||
// 1. <20><><EFBFBD>撖澆枂<E6BE86>唳旿
|
||
const exportData = results.map((r, idx) => ({
|
||
'摨誩噡': idx + 1,
|
||
'<27><>讃<EFBFBD><E8AE83><EFBFBD>': r.literature.title,
|
||
'<27>䁅<EFBFBD>': r.literature.abstract || '',
|
||
'雿𡏭<E99BBF>?: r.literature.authors || '',
|
||
'<EFBFBD>笔<EFBFBD>': r.literature.journal || '',
|
||
'<EFBFBD>𤏸”撟港遢': r.literature.publicationYear || '',
|
||
'PMID': r.literature.pmid || '',
|
||
'DOI': r.literature.doi || '',
|
||
'DeepSeek<EFBFBD>喟<EFBFBD>': r.dsConclusion || '',
|
||
'DeepSeek蝵桐縑摨?: r.dsConfidence ? `${(r.dsConfidence * 100).toFixed(0)}%` : '',
|
||
'DeepSeek<65><6B>眏': r.dsReason || '',
|
||
'Qwen<65>喟<EFBFBD>': r.qwenConclusion || '',
|
||
'Qwen蝵桐縑摨?: r.qwenConfidence ? `${(r.qwenConfidence * 100).toFixed(0)}%` : '',
|
||
'Qwen<EFBFBD><EFBFBD>眏': r.qwenReason || '',
|
||
'<EFBFBD>臬炏<EFBFBD>脩<EFBFBD>': r.conflictStatus === 'conflict' ? '<EFBFBD>? : '<27>?,
|
||
'<EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝑?: r.finalDecision || '敺<><E695BA>',
|
||
'<27>㘾膄<E398BE>笔<EFBFBD>': r.exclusionReason || '',
|
||
'憭齿瓲鈭?: r.finalDecisionBy || '',
|
||
'憭齿瓲<EFBFBD>園𡢿': r.finalDecisionAt ? new Date(r.finalDecisionAt).toLocaleString('zh-CN') : '',
|
||
}));
|
||
|
||
// 2. 潃?<3F><><EFBFBD>Excel嚗<6C><E59A97><EFBFBD>典銁<E585B8><E98A81><EFBFBD>銝哨<E98A9D><E593A8>嗆<EFBFBD>隞嗉氜<E59789>矋<EFBFBD>
|
||
const ws = XLSX.utils.json_to_sheet(exportData);
|
||
|
||
// 霈曄蔭<E69B84>堒捐
|
||
ws['!cols'] = [
|
||
{ wch: 6 }, // 摨誩噡
|
||
{ wch: 50 }, // <20><><EFBFBD>
|
||
{ wch: 60 }, // <20>䁅<EFBFBD>
|
||
{ wch: 30 }, // 雿𡏭<E99BBF>?
|
||
{ wch: 30 }, // <20>笔<EFBFBD>
|
||
{ wch: 10 }, // 撟港遢
|
||
{ wch: 12 }, // PMID
|
||
{ wch: 25 }, // DOI
|
||
{ wch: 12 }, // DS<44>喟<EFBFBD>
|
||
{ wch: 12 }, // DS蝵桐縑摨?
|
||
{ wch: 40 }, // DS<44><53>眏
|
||
{ wch: 12 }, // Qwen<65>喟<EFBFBD>
|
||
{ wch: 12 }, // Qwen蝵桐縑摨?
|
||
{ wch: 40 }, // Qwen<65><6E>眏
|
||
{ wch: 10 }, // <20>脩<EFBFBD>
|
||
{ wch: 12 }, // <20><>蝏<EFBFBD><E89D8F>蝑?
|
||
{ wch: 30 }, // <20>㘾膄<E398BE>笔<EFBFBD>
|
||
{ wch: 15 }, // 憭齿瓲鈭?
|
||
{ wch: 20 }, // 憭齿瓲<E9BDBF>園𡢿
|
||
];
|
||
|
||
const wb = XLSX.utils.book_new();
|
||
XLSX.utils.book_append_sheet(wb, ws, '蝑偦<EFBFBD>厩<EFBFBD><EFBFBD>?);
|
||
|
||
// 3. <20><><EFBFBD><EFBFBD><EFBFBD>辣<EFBFBD>?
|
||
const timestamp = new Date().toISOString().slice(0, 10);
|
||
const filterSuffix = options.filter && options.filter !== 'all' ? `_${options.filter}` : '';
|
||
const filename = `${options.projectName || '蝑偦<EFBFBD>厩<EFBFBD><EFBFBD>?}${filterSuffix}_${timestamp}.xlsx`;
|
||
|
||
// 4. 潃?閫血<E996AB>瘚讛<E7989A><E8AE9B>其<EFBFBD>頧踝<E9A0A7><E8B89D>嗆<EFBFBD>隞嗉氜<E59789>矋<EFBFBD>
|
||
XLSX.writeFile(wb, filename);
|
||
}
|
||
```
|
||
|
||
### 5.4 <20>萘<EFBFBD>蝏𤘪<E89D8F>憿菟𢒰
|
||
|
||
```typescript
|
||
// frontend-v2/src/modules/asl/pages/ScreeningResults.tsx
|
||
|
||
import { useState } from 'react';
|
||
import { useParams, useSearchParams } from 'react-router-dom';
|
||
import {
|
||
Card, Statistic, Row, Col, Tabs, Table, Button, Alert,
|
||
Progress, message, Checkbox, Tooltip
|
||
} from 'antd';
|
||
import {
|
||
DownloadOutlined, CheckCircleOutlined, CloseCircleOutlined,
|
||
QuestionCircleOutlined, WarningOutlined
|
||
} from '@ant-design/icons';
|
||
import { useQuery } from '@tanstack/react-query';
|
||
import * as aslApi from '../api';
|
||
import { exportScreeningResults } from '../utils/excelExport';
|
||
import { ConclusionTag } from '../components/ConclusionTag';
|
||
|
||
const ScreeningResults = () => {
|
||
const { projectId } = useParams<{ projectId: string }>();
|
||
const [searchParams, setSearchParams] = useSearchParams();
|
||
const [selectedRowKeys, setSelectedRowKeys] = useState<string[]>([]);
|
||
|
||
const activeTab = searchParams.get('tab') || 'all';
|
||
const page = parseInt(searchParams.get('page') || '1', 10);
|
||
const pageSize = 20;
|
||
|
||
// 1. 潃?<3F>瑕<EFBFBD>蝏蠘恣<E8A098>唳旿嚗<E697BF><E59A97><EFBFBD>毺<EFBFBD>嚗𡁜<E59A97>蝡航<E89DA1><E888AA><EFBFBD><EFBFBD>
|
||
const { data: statsData, isLoading: statsLoading } = useQuery({
|
||
queryKey: ['projectStatistics', projectId],
|
||
queryFn: () => aslApi.getProjectStatistics(projectId!),
|
||
enabled: !!projectId,
|
||
});
|
||
|
||
const stats = statsData?.data;
|
||
|
||
// 2. <20>瑕<EFBFBD>蝏𤘪<E89D8F><F0A498AA>𡑒”嚗<E2809D><E59A97>憿蛛<E686BF>
|
||
const { data: resultsData, isLoading: resultsLoading } = useQuery({
|
||
queryKey: ['screeningResults', projectId, activeTab, page],
|
||
queryFn: () =>
|
||
aslApi.getScreeningResultsList(projectId!, {
|
||
page,
|
||
pageSize,
|
||
filter: activeTab,
|
||
}),
|
||
enabled: !!projectId,
|
||
});
|
||
|
||
// 3. 潃?撖澆枂Excel嚗<6C><E59A97>蝡舐<E89DA1><E88890>琜<EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>
|
||
const handleExport = async (filter: string = 'all') => {
|
||
try {
|
||
message.loading('甇<>銁<EFBFBD><E98A81><EFBFBD>Excel...', 0);
|
||
|
||
// <20>瑕<EFBFBD><E79195>券<EFBFBD><E588B8>唳旿嚗<E697BF>鍂鈭𤾸紡<F0A4BEB8>綽<EFBFBD>
|
||
const { data } = await aslApi.getScreeningResultsList(projectId!, {
|
||
page: 1,
|
||
pageSize: 9999,
|
||
filter,
|
||
});
|
||
|
||
if (data.items.length === 0) {
|
||
message.warning('瘝⊥<E7989D><E28AA5>臬紡<E887AC>箇<EFBFBD><E7AE87>唳旿');
|
||
return;
|
||
}
|
||
|
||
// 潃?<3F>滨垢<E6BBA8><E59EA2><EFBFBD>Excel嚗<6C>妟<EFBFBD><E5A69F>辣<EFBFBD>賜<EFBFBD>嚗?
|
||
exportScreeningResults(data.items, {
|
||
filter,
|
||
projectName: `憿寧𤌍${projectId!.slice(0, 8)}`,
|
||
});
|
||
|
||
message.destroy();
|
||
message.success(`<EFBFBD>𣂼<EFBFBD>撖澆枂 ${data.items.length} <20>∟扇敶𧄧);
|
||
} catch (error) {
|
||
message.destroy();
|
||
message.error('撖澆枂憭梯揖: ' + (error as Error).message);
|
||
}
|
||
};
|
||
|
||
// 4. <20>寥<EFBFBD>撖澆枂<E6BE86>劐葉憿?
|
||
const handleExportSelected = () => {
|
||
if (selectedRowKeys.length === 0) {
|
||
message.warning('霂瑕<E99C82><E79195>㗇𥋘閬<F0A58B98>紡<EFBFBD>箇<EFBFBD>霈啣<E99C88>');
|
||
return;
|
||
}
|
||
|
||
const selectedResults = resultsData?.data.items.filter(
|
||
r => selectedRowKeys.includes(r.id)
|
||
) || [];
|
||
|
||
exportScreeningResults(selectedResults, {
|
||
projectName: `憿寧𤌍${projectId?.slice(0, 8)}_<EFBFBD>劐葉`,
|
||
});
|
||
|
||
message.success(`<EFBFBD>𣂼<EFBFBD>撖澆枂 ${selectedResults.length} <EFBFBD>∟扇敶𧄧);
|
||
};
|
||
|
||
// 銵冽聢<E586BD>堒<EFBFBD>銋剹<E98A8B><E589B9>ab<61>滨蔭蝑?..
|
||
// 嚗<><E59A97><EFBFBD>港誨<E6B8AF><E8AAA8><EFBFBD>摰鮋<E691B0>摰䂿緵嚗?
|
||
};
|
||
|
||
export default ScreeningResults;
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> <20>准<EFBFBD><E58786><EFBFBD><EFBFBD>睲遙<E79DB2>∪<EFBFBD>閫?
|
||
|
||
### Phase 1嚗𡁜<E59A97>蝡舐<E89DA1>霈,PI嚗㇄ay 16銝𠰴<E98A9D>嚗争𪃸儭?2撠𤩺𧒄
|
||
|
||
**隞餃𦛚**嚗?
|
||
1. <20>?`screeningController.ts` 銝剖<E98A9D><E58996>?`getProjectStatistics`
|
||
2. 雿輻鍂Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗<E7A0AD>僎銵峕䰻霂V<E99C82><EFBCB6>吔<EFBFBD>
|
||
3. 摰䂿緵<E482BF>㘾膄<E398BE>笔<EFBFBD><E7AC94>𣂼<EFBFBD><F0A382BC>餉<EFBFBD> `extractAutoReason`
|
||
4. <20>?`routes/index.ts` 銝剜釣<E5899C>諹楝<E8ABB9>?
|
||
5. Postman瘚贝<E7989A>API
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**嚗?
|
||
- <20>?API餈𥪜<E9A488>甇<EFBFBD>&蝏蠘恣<E8A098>唳旿
|
||
- <20>?<3F>扯<EFBFBD><E689AF>臬末嚗?500ms嚗?
|
||
- <20>?蝚血<E89D9A>鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>辷<EFBFBD><E8BEB7>𡒊垢<F0A1928A>𡁜<EFBFBD>嚗?
|
||
|
||
**<EFBFBD><EFBFBD>辣皜<EFBFBD><EFBFBD>**嚗?
|
||
- `backend/src/modules/asl/controllers/screeningController.ts`
|
||
- `backend/src/modules/asl/routes/index.ts`
|
||
|
||
---
|
||
|
||
### Phase 2嚗𡁜<E59A97>蝡涉PI摰X<E691B0>蝡荔<E89DA1>Day 16銝𠰴<E98A9D>嚗争𪃸儭?30<33><30><EFBFBD>
|
||
|
||
**隞餃𦛚**嚗?
|
||
1. <20>?`api/index.ts` 銝剜溶<E5899C>?`getProjectStatistics`
|
||
2. <20>?`types/index.ts` 銝剜溶<E5899C>?`ProjectStatistics` 蝐餃<E89D90>
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**嚗?
|
||
- <20>?API靚<49>鍂甇<E98D82>虜
|
||
- <20>?TypeScript蝐餃<E89D90>甇<EFBFBD>&
|
||
|
||
**<EFBFBD><EFBFBD>辣皜<EFBFBD><EFBFBD>**嚗?
|
||
- `frontend-v2/src/modules/asl/api/index.ts`
|
||
- `frontend-v2/src/modules/asl/types/index.ts`
|
||
|
||
---
|
||
|
||
### Phase 3嚗𡁶<E59A97>霈⊥<E99C88>閫<EFBFBD>㨃<EFBFBD><E3A883><EFBFBD>Day 16銝𠰴<E98A9D>嚗争𪃸儭?1.5撠𤩺𧒄
|
||
|
||
**隞餃𦛚**嚗?
|
||
1. 摰䂿緵蝏蠘恣<E8A098>∠<EFBFBD>蝏<EFBFBD>辣嚗?銝芸㨃<E88AB8><E3A883><EFBFBD>
|
||
2. 摰䂿緵"敺<><E695BA><EFBFBD>?<3F>鞟內Alert
|
||
3. 摰䂿緵PRISMA<4D>㘾膄蝏蠘恣嚗<E681A3><E59A97><EFBFBD>嗅㦛嚗?
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**嚗?
|
||
- <20>?蝏蠘恣<E8A098>唳旿甇<E697BF>&<EFBFBD>曄內
|
||
- <20>?<3F>㘾膄<E398BE>笔<EFBFBD><E7AC94>梁𠶖<E6A281>暹<EFBFBD><E69AB9>?
|
||
- <20>?"敺<><E695BA><EFBFBD>?<3F>鞟內<E99E9F>垍𤌍
|
||
|
||
**<EFBFBD><EFBFBD>辣皜<EFBFBD><EFBFBD>**嚗?
|
||
- `frontend-v2/src/modules/asl/pages/ScreeningResults.tsx`
|
||
|
||
---
|
||
|
||
### Phase 4嚗𡁶<E59A97><F0A181B6>𨅯<EFBFBD>銵汽ab嚗㇄ay 16銝见<E98A9D>嚗争𪃸儭?3撠𤩺𧒄
|
||
|
||
**隞餃𦛚**嚗?
|
||
1. 摰䂿緵Tab<61><62>揢嚗<E68FA2><E59A97><EFBFBD>?撌脩熙<E884A9>?撌脫<E6928C><E884AB>?敺<><E695BA><EFBFBD>賂<EFBFBD>
|
||
2. <20>𥕦遣<F0A595A6>閗<EFBFBD>銵冽聢嚗<E881A2>躹<EFBFBD>思<EFBFBD>摰⊥瓲撌乩<E6928C><E4B9A9>堆<EFBFBD>
|
||
3. 摰䂿緵Checkbox憭𡁻<E686AD>?
|
||
4. 摰䂿緵霂行<E99C82><E8A18C>亦<EFBFBD>Modal嚗<6C><E59A97><EFBFBD>典恣<E585B8>詨極雿𨅯蝱<F0A885AF><E89DB1>rawer嚗?
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**嚗?
|
||
- <20>?Tab<61><62>揢甇<E68FA2>虜
|
||
- <20>?銵冽聢<E586BD>唳旿甇<E697BF>&
|
||
- <20>?<3F>臬<EFBFBD><E887AC>㕑<EFBFBD>
|
||
- <20>?<3F>舀䰻<E88880>贝祕<E8B49D>?
|
||
|
||
**<EFBFBD><EFBFBD>辣皜<EFBFBD><EFBFBD>**嚗?
|
||
- `frontend-v2/src/modules/asl/pages/ScreeningResults.tsx`
|
||
|
||
---
|
||
|
||
### Phase 5嚗鍃xcel撖澆枂嚗㇄ay 17銝𠰴<E98A9D>嚗争𪃸儭?2撠𤩺𧒄
|
||
|
||
**隞餃𦛚**嚗?
|
||
1. <20>𥕦遣 `excelExport.ts` 撌亙<E6928C><E4BA99><EFBFBD>辣
|
||
2. 摰䂿緵<E482BF>滨垢撖澆枂<E6BE86>餉<EFBFBD>嚗<EFBFBD>蝙<EFBFBD>?`xlsx`嚗?
|
||
3. 瘛餃<E7989B>撖澆枂<E6BE86>厰僼嚗<E583BC>紡<EFBFBD>箏<EFBFBD><E7AE8F>?撖澆枂敶枏<E695B6>憿?撖澆枂<E6BE86>劐葉憿對<E686BF>
|
||
4. <20>舀<EFBFBD>餈<EFBFBD>誘撖澆枂嚗<E69E82><E59A97><EFBFBD>?隞<>熙<EFBFBD>?隞<><E99A9E><EFBFBD>歹<EFBFBD>
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**嚗?
|
||
- <20>?<3F>臬紡<E887AC>慟xcel
|
||
- <20>?<3F>唳旿摰峕㟲
|
||
- <20>?<3F>嗆<EFBFBD>隞嗉氜<E59789>矋<EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>
|
||
- <20>?<3F><><EFBFBD><EFBFBD>笔漲<3蝘𡜐<E89D98><1000<30>∴<EFBFBD>
|
||
|
||
**<EFBFBD><EFBFBD>辣皜<EFBFBD><EFBFBD>**嚗?
|
||
- `frontend-v2/src/modules/asl/utils/excelExport.ts`
|
||
- `frontend-v2/src/modules/asl/pages/ScreeningResults.tsx`
|
||
|
||
---
|
||
|
||
### Phase 6嚗𡁻<E59A97><F0A181BB>鞉<EFBFBD>霂蓥<E99C82>隡睃<E99AA1>嚗㇄ay 17銝见<E98A9D>-Day 18嚗争𪃸儭?4撠𤩺𧒄
|
||
|
||
**隞餃𦛚**嚗?
|
||
1. 摰峕㟲瘚<E39FB2><E7989A>瘚贝<E7989A>嚗<EFBFBD><E59A97>隡罱<E99AA1>蝑偦<E89D91>争<EFBFBD>憭齿瓲<E9BDBF>埝䰻<E59F9D>讠<EFBFBD><E8AEA0>鎿<EFBFBD>撖澆枂嚗?
|
||
2. 撘<>虜<EFBFBD>箸艶瘚贝<E7989A>嚗<EFBFBD><E59A97><EFBFBD>唳旿<E594B3><E697BF><EFBFBD>蝏𣈯<E89D8F>霂荔<E99C82>
|
||
3. UI/UX隡睃<E99AA1>嚗<EFBFBD><E59A97>頧賜𠶖<E8B39C><F0A0B696><EFBFBD><EFBFBD><EFBFBD>霂舀<E99C82>蝷綽<E89DB7>
|
||
4. <20>扯<EFBFBD>瘚贝<E7989A>嚗<EFBFBD><E59A97>霈,PI<50><49>xcel撖澆枂嚗?
|
||
5. 鈭穃<E988AD><E7A983>蠘<EFBFBD><E8A098><EFBFBD><EFBFBD><EFBFBD>?
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**嚗?
|
||
- <20>?瘚<><E7989A>摰峕㟲<E5B395>𣳇獈憛?
|
||
- <20>?撘<>虜憭<E8999C><E686AD>摰<EFBFBD><E691B0>
|
||
- <20>?<3F>扯<EFBFBD>颲暹<E9A2B2>
|
||
- <20>?蝚血<E89D9A>鈭穃<E988AD><E7A983>蠘<EFBFBD><E8A098>?
|
||
|
||
---
|
||
|
||
## <20>?銝<><E98A9D><EFBFBD><EFBFBD><EFBFBD>嗆<EFBFBD><E59786>?
|
||
|
||
### 7.1 <20>蠘<EFBFBD>撉峕𤣰
|
||
|
||
- [<5B><> 蝏蠘恣璁<E681A3><E79281><EFBFBD>∠<EFBFBD>甇<EFBFBD>&<EFBFBD>曄內嚗<E585A7><E59A97>餅㺭<E9A485><E3BAAD>熙<EFBFBD>乓<EFBFBD><E4B993><EFBFBD><EFBFBD>扎<EFBFBD><E6898E><EFBFBD>憭齿瓲嚗?
|
||
- [<5B><> <20>㘾膄<E398BE>笔<EFBFBD>蝏蠘恣<E8A098><E681A3>&嚗<EFBC86><E59A97><EFBFBD>嗅㦛嚗?
|
||
- [<5B><> 敺<><E695BA><EFBFBD>豢<EFBFBD>蝷粹<E89DB7><E7B2B9>?
|
||
- [<5B><> Tab<61><62>揢甇<E68FA2>虜嚗<E8999C><E59A97><EFBFBD>?撌脩熙<E884A9>?撌脫<E6928C><E884AB>?敺<><E695BA><EFBFBD>賂<EFBFBD>
|
||
- [<5B><> 銵冽聢<E586BD>唳旿甇<E697BF>&嚗<EFBC86><E59A97>銵諹”<E8ABB9>潘<EFBFBD>
|
||
- [<5B><> Checkbox憭𡁻<E686AD>㗇迤撣?
|
||
- [<5B><> <20>舀䰻<E88880>贝祕<E8B49D>?
|
||
- [<5B><> <20>臬紡<E887AC>慟xcel嚗<6C><E59A97><EFBFBD>?<3F>劐葉嚗?
|
||
- [<5B><> Excel<65>唳旿摰峕㟲
|
||
|
||
### 7.2 <20>扯<EFBFBD>撉峕𤣰
|
||
|
||
- [<5B><> 蝏蠘恣API<50>滚<EFBFBD><E6BB9A>園𡢿 <500ms
|
||
- [<5B><> Excel撖澆枂嚗?1000<30>∴<EFBFBD><3蝘?
|
||
- [<5B><> 銵冽聢<E586BD><E881A2>△<EFBFBD>㰘蝸甇<E89DB8>虜
|
||
|
||
### 7.3 鈭穃<E988AD><E7A983>罸<EFBFBD><E7BDB8>?
|
||
|
||
<EFBFBD>箔<EFBFBD>[鈭穃<EFBFBD><EFBFBD>笔<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>交<EFBFBD><EFBFBD>騟(../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md)嚗?
|
||
|
||
**<2A>𡒊垢API**嚗?
|
||
- [<5B><> 雿輻鍂<E8BCBB>典<EFBFBD> `prisma` 摰硺<E691B0>嚗<EFBFBD><E59A97>new PrismaClient嚗?
|
||
- [<5B><> 蝏蠘恣雿輻鍂Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗<E7A0AD><E59A97><EFBFBD>亙<EFBFBD><E4BA99>𤩺㺭<F0A4A9BA>殷<EFBFBD>
|
||
- [<5B><> <20>䭾𧋦<E4ADBE>唳<EFBFBD>隞嗅<E99A9E><E59785>剁<EFBFBD><E58981>霡s.writeFile嚗?
|
||
- [<5B><> 雿輻鍂 `logger` 霈啣<E99C88><E595A3>亙<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>牢onsole.log嚗?
|
||
- [<5B><> 蝏煺<E89D8F><E785BA>躰秤憭<E7A7A4><E686AD>
|
||
|
||
**<2A>滨垢摰䂿緵**嚗?
|
||
- [<5B><> Excel<65>滨垢<E6BBA8><E59EA2><EFBFBD>嚗<EFBFBD>妟<EFBFBD><E5A69F>辣<EFBFBD>賜<EFBFBD>嚗?
|
||
- [<5B><> 雿輻鍂 `xlsx` 摨橒<E691A8><E6A992>鞟<EFBFBD>蝔喳<E89D94>嚗?
|
||
- [<5B><> <20>见末<E8A781><E69CAB>鍂<EFBFBD>瑟<EFBFBD>蝷?
|
||
|
||
---
|
||
|
||
## <20><> <20>怒<EFBFBD><E68092>𧒄<EFBFBD>港摯蝞?
|
||
|
||
| <20>嗆挾 | 隞餃𦛚 | 憸<>恣<EFBFBD>埈𧒄 | 韐蠘提鈭?|
|
||
|------|------|---------|--------|
|
||
| Phase 1 | <20>𡒊垢蝏蠘恣API | 2撠𤩺𧒄 | <20>𡒊垢撘<E59EA2><E69298>?|
|
||
| Phase 2 | <20>滨垢API摰X<E691B0>蝡?| 0.5撠𤩺𧒄 | <20>滨垢撘<E59EA2><E69298>?|
|
||
| Phase 3 | 蝏蠘恣璁<E681A3><E79281> | 1.5撠𤩺𧒄 | <20>滨垢撘<E59EA2><E69298>?|
|
||
| Phase 4 | 蝏𤘪<E89D8F><F0A498AA>𡑒”Tab | 3撠𤩺𧒄 | <20>滨垢撘<E59EA2><E69298>?|
|
||
| Phase 5 | Excel撖澆枂 | 2撠𤩺𧒄 | <20>滨垢撘<E59EA2><E69298>?|
|
||
| Phase 6 | <20><><EFBFBD>瘚贝<E7989A> | 4撠𤩺𧒄 | <20>冽<EFBFBD>撘<EFBFBD><E69298>?|
|
||
| **<2A>餉恣** | | **13撠𤩺𧒄** | **蝥?憭?* |
|
||
|
||
---
|
||
|
||
## <20><> 銋腈<E98A8B><E88588>㮾<EFBFBD>單<EFBFBD>獢?
|
||
|
||
- [鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8><EFBFBD>(../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md) - 敹<>粉
|
||
- [隞餃𦛚<E9A483><F0A69B9A>圾](./03-隞餃𦛚<E9A483><F0A69B9A>圾.md) - Week 4隞餃𦛚皜<F0A69B9A><E79A9C>
|
||
- [璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786>(../00-璅∪<E79285>敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?md) - 璅∪<E79285><E288AA>笔<EFBFBD><E7AC94>嗆<EFBFBD>?
|
||
- [<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚皜<EFBFBD><EFBFBD>](../06-<2D><><EFBFBD>臬<EFBFBD>箏𦛚/<2F><><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md) - Excel<65>𡒊垢撖澆枂<E6BE86>寞<EFBFBD>
|
||
- [<5B>唳旿摨栞挽霈((../02-<2D><><EFBFBD>航挽霈?01-<2D>唳旿摨栞挽霈?md) - <20>唳旿銵函<E98AB5><E587BD>?
|
||
- [API霈曇恣閫<EFBFBD><EFBFBD>](../02-<2D><><EFBFBD>航挽霈?02-API霈曇恣閫<E681A3><E996AB>.md) - API閫<49><E996AB>
|
||
|
||
---
|
||
|
||
## <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚霈啣<E99C88>
|
||
|
||
### <20>箏𦛚1嚗鍃xcel<65>𡒊垢撖澆枂隡睃<E99AA1>
|
||
|
||
**閫血<E996AB><E8A180>∩辣**嚗?
|
||
- <20>閙活撖澆枂<E6BE86>唳旿<E594B3>?>5000<30>?
|
||
- <20><>閬<EFBFBD><E996AC><EFBFBD><EFBFBD>xcel<65>澆<EFBFBD>嚗<EFBFBD><E59A97>Sheet<65><74>㦛銵函<E98AB5>嚗?
|
||
- <20>冽<EFBFBD><E586BD>漤<EFBFBD><E6BCA4>滨垢撖澆枂<E6BE86>⊿▼
|
||
|
||
**閫<><E996AB><EFBFBD>寞<EFBFBD>**嚗?
|
||
- <20>𡒊垢<F0A1928A><E59EA2><EFBFBD>Excel嚗<6C>蝙<EFBFBD>?`ExcelJS`嚗?
|
||
- 銝𠹺<E98A9D><F0A0B9BA>記SS嚗<53>蝙<EFBFBD>?`storage.upload()`嚗?
|
||
- 餈𥪜<E9A488>銝贝蝸URL
|
||
|
||
**霈啣<E99C88>雿滨蔭**嚗靀<E59A97><E99D80><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C> - 隡睃<E99AA1>蝥?](../06-<2D><><EFBFBD>臬<EFBFBD>箏𦛚/<2F><><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md)
|
||
|
||
**憸<>恣<EFBFBD>埈𧒄**嚗?-2憭?
|
||
|
||
---
|
||
|
||
## <20>働 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>穃遣霈?
|
||
|
||
### 撖孵<E69296><E5ADB5>睲犖<E79DB2>?
|
||
|
||
1. **<EFBFBD><EFBFBD><EFBFBD>霂颱<EFBFBD><EFBFBD>毺<EFBFBD>閫<EFBFBD><EFBFBD>**嚗靀鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8><EFBFBD>(../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md)
|
||
2. **憭滨鍂撟喳蝱<E596B3>賢<EFBFBD>**嚗帋蝙<E5B88B>典<EFBFBD>撅<EFBFBD>`prisma`<EFBFBD><EFBFBD>logger`
|
||
3. **<EFBFBD>踹<EFBFBD><EFBFBD><EFBFBD>辣<EFBFBD>賜<EFBFBD>**嚗鍃xcel<65>滨垢<E6BBA8><E59EA2><EFBFBD>
|
||
4. **<EFBFBD>𡒊垢<EFBFBD>𡁜<EFBFBD>霈∠<EFBFBD>**嚗𡁶<E59A97>霈⊥㺭<E28AA5>桀<EFBFBD>蝡臬<E89DA1><E887AC>?
|
||
5. **<EFBFBD>扯<EFBFBD>隡睃<EFBFBD>**嚗䥪risma<6D>𡁜<EFBFBD><F0A1819C>亥砭雿輻鍂撟嗉<E6929F>
|
||
|
||
### 撖農I<E8BEB2>拇<EFBFBD>
|
||
|
||
1. **隡睃<E99AA1>鈭穃<E988AD><E7A983>?*嚗𡁏<E59A97><F0A1818F>㕑挽霈∩<E99C88><E288A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭穃<E988AD><E7A983><EFBFBD>沲<EFBFBD>?
|
||
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>緵<EFBFBD>劐誨<EFBFBD>?*嚗𡁜<E59A97><F0A1819C>典恣<E585B8>詨極雿𨅯蝱<F0A885AF><E89DB1><EFBFBD>隞?
|
||
3. **瘜冽<E7989C><E586BD>箏<EFBFBD>**嚗𡁜<E59A97>蝑𤤿<E89D91><F0A4A4BF>𨀣糓<F0A880A3>閗<EFBFBD>銵冽聢嚗<E881A2>恣<EFBFBD>詨極雿𨅯蝱<F0A885AF>臬<EFBFBD>銵諹”<E8ABB9>?
|
||
4. **瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>**嚗𡁜<E59A97><F0A1819C>湔<EFBFBD>蝔𧢲<E89D94>霂?
|
||
|
||
---
|
||
|
||
**<EFBFBD><EFBFBD>﹝蝏湔擪<EFBFBD>?*嚗鋫I<E98BAB>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>?
|
||
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-11-21
|
||
**<EFBFBD><EFBFBD>﹝<EFBFBD>嗆<EFBFBD>?*嚗尠<E59A97> 撌脩&霈歹<E99C88><E6ADB9>臬<EFBFBD>憪见<E686AA><E8A781>?
|
||
**撘<>憪𧢲𧒄<F0A7A2B2>?*嚗𡁜<E59A97>摰?
|
||
|
||
|
||
|
||
|
||
|