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%)
436 lines
13 KiB
Markdown
436 lines
13 KiB
Markdown
# <20>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696>秩<EFBFBD>?
|
||
|
||
> **<2A><>﹝<EFBFBD><EFB99D>𧋦嚗?* v1.0
|
||
> **<2A>𥕦遣<F0A595A6>交<EFBFBD>嚗?* 2025-11-23
|
||
> **蝏湔擪<E6B994><E693AA><EFBFBD>** ASL撘<4C><E69298>穃𣪧<E7A983>?
|
||
> **<2A><>﹝<EFBFBD>桃<EFBFBD>嚗?* 霈啣<E99C88>ASL璅∪<E79285><E288AA>唳旿摨栞<E691A8>蝘餌𠶖<E9A48C><F0A0B696><EFBFBD>銝箸𧊋<E7AEB8>亙<EFBFBD><E4BA99>睲犖<E79DB2>䀹<EFBFBD>靘𥟇<E99D98><F0A59F87>啁<EFBFBD>銝𠹺<E98A9D><F0A0B9BA>?
|
||
|
||
---
|
||
|
||
## <20><> 敶枏<E695B6><E69E8F>唳旿摨梶𠶖<E6A2B6><F0A0B696><EFBFBD>餉<EFBFBD>
|
||
|
||
### <20>?ASL璅∪<E79285>嚗Òsl_schema嚗? 摰<><E691B0>甇<EFBFBD>&
|
||
|
||
| 銵典<E98AB5> | <20>嗆<EFBFBD>?| <20>券<EFBFBD>?| 霈啣<E99C88><E595A3>?|
|
||
|-----|------|------|--------|
|
||
| `literatures` | <20>?撌脫凒<E884AB>?| <20><>讃<EFBFBD>箇<EFBFBD>靽⊥<E99DBD>嚗<EFBFBD>鉄<EFBFBD>冽<EFBFBD>摮埈挾嚗?| - |
|
||
| `screening_projects` | <20>?甇<>虜 | 蝑偦<E89D91>厰★<E58EB0>?| - |
|
||
| `screening_tasks` | <20>?甇<>虜 | <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>隞餃𦛚 | - |
|
||
| `screening_results` | <20>?甇<>虜 | <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>蝏𤘪<E89D8F> | - |
|
||
| `fulltext_screening_tasks` | <20>?<3F>啣遣 | <20>冽<EFBFBD>憭滨<E686AD>隞餃𦛚 | 0 |
|
||
| `fulltext_screening_results` | <20>?<3F>啣遣 | <20>冽<EFBFBD>憭滨<E686AD>蝏𤘪<E89D8F> | 0 |
|
||
|
||
**<EFBFBD>詨<EFBFBD>蝏栞捏**嚗?
|
||
- <20>?ASL璅∪<E79285><E288AA><EFBFBD><EFBFBD>㗇㺭<E39787>桀<EFBFBD><E6A180>其<EFBFBD>鈭?`asl_schema`
|
||
- <20>?瘝⊥<E7989D><E28AA5>唳旿瘜<E697BF><E7989C><EFBFBD>?`public` schema
|
||
- <20>?Schema<6D>𠉛氖蝑𣇉裦<F0A38789>扯<EFBFBD>甇<EFBFBD>&
|
||
- <20>?隞<><E99A9E>霈輸䔮頝臬<E9A09D>甇<EFBFBD>&嚗Ǒprisma.aslLiterature`, `prisma.aslScreeningProject` 蝑㚁<E89D91>
|
||
|
||
---
|
||
|
||
## <20>𣞁 Public Schema<6D><61>蟮<EFBFBD>㛖<EFBFBD><E39B96>桅<EFBFBD>嚗<EFBFBD><E59A97>ASL<53>惩<EFBFBD>嚗?
|
||
|
||
### <20>桅<EFBFBD><E6A185>讛膩
|
||
|
||
<EFBFBD>券★<EFBFBD>格𡟺<EFBFBD>笔<EFBFBD><EFBFBD>睲葉嚗屸<EFBFBD><EFBFBD><EFBFBD>芋<EFBFBD>㛖<EFBFBD>銵刻◤<EFBFBD>躰秤<EFBFBD>啣<EFBFBD>撱箏銁 `public` schema 銝哨<E98A9D>餈嘥<E9A488>鈭<EFBFBD>chema<6D>𠉛氖蝑𣇉裦嚗?
|
||
|
||
| <20>躰秤銵典<E98AB5> | 摨𥪜銁Schema | 敶枏<E695B6><E69E8F>嗆<EFBFBD>?|
|
||
|---------|-----------|---------|
|
||
| `public.users` | `platform_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.projects` | `aia_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.conversations` | `aia_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.messages` | `aia_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.knowledge_bases` | `pkb_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.documents` | `pkb_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.batch_tasks` | `pkb_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
| `public.batch_results` | `pkb_schema` | <20>𩤃<EFBFBD> <20>滚<EFBFBD>摮睃銁 |
|
||
|
||
**<EFBFBD>唳旿撖寞<EFBFBD>嚗?025-11-23敹怎<E695B9>嚗?*嚗?
|
||
|
||
```
|
||
platform_schema.users: 3<>∟扇敶?
|
||
public.users: 2<>∟扇敶?
|
||
|
||
aia_schema.projects: 2<>∟扇敶?
|
||
public.projects: 2<>∟扇敶?
|
||
|
||
pkb_schema.knowledge_bases: 2<>∟扇敶?
|
||
public.knowledge_bases: 2<>∟扇敶?
|
||
```
|
||
|
||
**敶勗<E695B6><E58B97><EFBFBD>凒**嚗?
|
||
- <20>叚 **銝滚蔣<E6BB9A><E894A3>SL璅∪<E79285>**嚗㇁SL摰<4C><E691B0><EFBFBD>𠉛氖<F0A0899B>災sl_schema嚗?
|
||
- <20>𩤃<EFBFBD> 敶勗<E695B6>AIA璅∪<E79285>嚗㇁I<E38781>拇<EFBFBD>嚗?
|
||
- <20>𩤃<EFBFBD> 敶勗<E695B6>PKB璅∪<E79285>嚗<EFBFBD>䰻霂<E4B0BB><E99C82>嚗?
|
||
- <20>𩤃<EFBFBD> 敶勗<E695B6>Platform璅∪<E79285>嚗<EFBFBD>鍂<EFBFBD>瑞頂蝏<E9A082><E89D8F>
|
||
|
||
**韐<>遙敶鍦<E695B6>**嚗?
|
||
- <20>㩞 ASL<53>a<EFBFBD>嚗𡁏<E59A97>韐<EFBFBD>遙嚗峕㺭<E5B395>桃恣<E6A183><E681A3><EFBFBD><EFBFBD>冽迤蝖?
|
||
- <20>椬 <20>嗡<EFBFBD>璅∪<E79285><E288AA>a<EFBFBD>嚗𡁻<E59A97><F0A181BB>芾<EFBFBD>皜<EFBFBD><E79A9C>public schema<6D>唳旿
|
||
|
||
---
|
||
|
||
## <20><>儭?2025-11-23餈<33>宏<EFBFBD>滢<EFBFBD>霈啣<E99C88>
|
||
|
||
### 餈<>宏<EFBFBD>格<EFBFBD>
|
||
|
||
銝箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑𥕦<EFBFBD><EFBFBD>踝<EFBFBD>Day 4撘<34><E69298>𡢅<EFBFBD>瘛餃<E7989B><E9A483>唳旿摨𤘪𣈲<F0A498AA><F0A388B2><EFBFBD>
|
||
1. 靽格㺿 `literatures` 銵剁<E98AB5>瘛餃<E7989B><E9A483>冽<EFBFBD><E586BD>詨<EFBFBD>摮埈挾嚗?
|
||
2. <20>𥕦遣 `fulltext_screening_tasks` 銵?
|
||
3. <20>𥕦遣 `fulltext_screening_results` 銵?
|
||
|
||
### 餈<>宏蝑𣇉裦<F0A38789>㗇𥋘
|
||
|
||
**<EFBFBD>?<3F>寞<EFBFBD>A嚗䥪risma Migrate嚗<65>◤<EFBFBD>垍<EFBFBD>嚗?*
|
||
|
||
```bash
|
||
npx prisma migrate dev --name add_fulltext_screening
|
||
```
|
||
|
||
**<EFBFBD>垍<EFBFBD><EFBFBD>笔<EFBFBD>**嚗?
|
||
- Prisma隡𡁜<E99AA1>霂訫<E99C82><E8A8AB>?`public` schema銝剔<E98A9D><E58994>滚<EFBFBD>銵?
|
||
- <20>航<EFBFBD>敶勗<E695B6><E58B97>嗡<EFBFBD>璅∪<E79285><E288AA><EFBFBD>㺭<EFBFBD>?
|
||
- 餈嘥<E9A488>"蝞∪末<E288AA>芸楛"<22><><EFBFBD><EFBFBD>?
|
||
|
||
**<EFBFBD>?<3F>寞<EFBFBD>B嚗𡁏<E59A97><F0A1818F>沒QL<51>𡁏𧋦嚗<F0A78BA6>歇<EFBFBD><E6AD87>鍂嚗?*
|
||
|
||
```bash
|
||
# <20>𥕦遣<F0A595A6>见𢆡餈<F0A286A1>宏<EFBFBD>𡁏𧋦
|
||
backend/prisma/migrations/manual_fulltext_screening.sql
|
||
|
||
# <20>扯<EFBFBD>餈<EFBFBD>宏嚗<E5AE8F><E59A97><EFBFBD>滢<EFBFBD>asl_schema嚗?
|
||
Get-Content manual_fulltext_screening.sql | docker exec -i ai-clinical-postgres psql ...
|
||
```
|
||
|
||
**隡睃飵**嚗?
|
||
- <20>?<3F>芣<EFBFBD>雿?`asl_schema`嚗䔶<EFBFBD><EFBFBD>典<EFBFBD>隞騯chema
|
||
- <20>?銝滚<E98A9D><E6BB9A>支遙雿?`public` <20>唳旿
|
||
- <20>?摰匧<E691B0><E58CA7><EFBFBD>虾<EFBFBD>扼<EFBFBD><E689BC>虾摰∟恣
|
||
- <20>?蝚血<E89D9A>"蝞∪末<E288AA>芸楛"<22>笔<EFBFBD>
|
||
|
||
### 餈<>宏<EFBFBD><E5AE8F>捆霂行<E99C82>
|
||
|
||
#### 1. 靽格㺿 `literatures` 銵?
|
||
|
||
<EFBFBD>啣<EFBFBD>摮埈挾嚗?3銝迎<E98A9D>嚗?
|
||
|
||
**<EFBFBD><EFBFBD>讃<EFBFBD>笔𦶢<EFBFBD>冽<EFBFBD>**:
|
||
- `stage TEXT DEFAULT 'imported'` - <20>嗆挾<E59786><E68CBE>扇嚗ǎmported <20>?title_screened <20>?fulltext_pending <20>?fulltext_screened嚗?
|
||
|
||
**PDF蝞∠<E89D9E>**:
|
||
- `has_pdf BOOLEAN DEFAULT false` - <20>臬炏<E887AC>侨DF
|
||
- `pdf_storage_type TEXT` - 摮睃<E691AE>蝐餃<E89D90>嚗èss/dify/local嚗?
|
||
- `pdf_storage_ref TEXT` - 摮睃<E691AE>撘閧鍂嚗ɑey<65>𦎾D嚗?
|
||
- `pdf_status TEXT DEFAULT 'pending'` - <20>嗆<EFBFBD><E59786><EFBFBD>pending/extracting/completed/failed嚗?
|
||
- `pdf_uploaded_at TIMESTAMP(3)` - 銝𠹺<E98A9D><F0A0B9BA>園𡢿
|
||
|
||
**<EFBFBD>冽<EFBFBD>蝞∠<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>毺<EFBFBD>嚗?*:
|
||
- `full_text_storage_type TEXT` - 摮睃<E691AE>蝐餃<E89D90>嚗èss/dify嚗?
|
||
- `full_text_storage_ref TEXT` - 摮睃<E691AE>撘閧鍂
|
||
- `full_text_url TEXT` - 霈輸䔮URL
|
||
|
||
**<EFBFBD>冽<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>?*:
|
||
- `full_text_format TEXT` - <20>澆<EFBFBD>嚗éarkdown/plaintext嚗?
|
||
- `full_text_source TEXT` - <20>𣂼<EFBFBD><F0A382BC>孵<EFBFBD>嚗ěougat/pymupdf嚗?
|
||
- `full_text_token_count INTEGER` - Token<65>圈<EFBFBD>
|
||
- `full_text_extracted_at TIMESTAMP(3)` - <20>𣂼<EFBFBD><F0A382BC>園𡢿
|
||
|
||
**<EFBFBD>啣<EFBFBD>蝝W<EFBFBD>**:
|
||
- `idx_literatures_stage`
|
||
- `idx_literatures_has_pdf`
|
||
- `idx_literatures_pdf_status`
|
||
|
||
#### 2. <20>𥕦遣 `fulltext_screening_tasks` 銵?
|
||
|
||
隞餃𦛚蝞∠<EFBFBD>銵剁<EFBFBD>摮埈挾<EFBFBD><EFBFBD>𡠺嚗?
|
||
- <20>箇<EFBFBD>靽⊥<E99DBD>嚗䫤id`, `project_id`
|
||
- 璅∪<E79285><E288AA>滨蔭嚗䫤model_a`, `model_b`, `prompt_version`
|
||
- 餈𥕦漲頝蠘葵嚗䫤total_count`, `processed_count`, `success_count`, `failed_count`, `degraded_count`
|
||
- <20>鞉𧋦蝏蠘恣嚗䫤total_tokens`, `total_cost`
|
||
- <20>嗆<EFBFBD><E59786>恣<EFBFBD><E681A3><EFBFBD>`status`, `started_at`, `completed_at`, `estimated_end_at`
|
||
- <20>躰秤霈啣<E99C88>嚗䫤error_message`, `error_stack`
|
||
|
||
**蝝W<E89D9D>**:
|
||
- `idx_fulltext_tasks_project_id`
|
||
- `idx_fulltext_tasks_status`
|
||
- `idx_fulltext_tasks_created_at`
|
||
|
||
**憭㚚睸蝥行<E89DA5>**:
|
||
- `project_id` <20>?`screening_projects(id)` ON DELETE CASCADE
|
||
|
||
#### 3. <20>𥕦遣 `fulltext_screening_results` 銵?
|
||
|
||
蝏𤘪<EFBFBD>摮睃<EFBFBD>銵剁<EFBFBD>12摮埈挾璅⊥踎嚗㚁<EFBFBD>摮埈挾<EFBFBD><EFBFBD>𡠺嚗?
|
||
- <20>唾<EFBFBD>靽⊥<E99DBD>嚗䫤task_id`, `project_id`, `literature_id`
|
||
- Model A蝏𤘪<E89D8F>嚗䫤model_a_name`, `model_a_fields` (JSONB), `model_a_tokens`, `model_a_cost` 蝑?
|
||
- Model B蝏𤘪<E89D8F>嚗䫤model_b_name`, `model_b_fields` (JSONB), `model_b_tokens`, `model_b_cost` 蝑?
|
||
- 撉諹<E69289>蝏𤘪<E89D8F>嚗䫤medical_logic_issues` (JSONB), `evidence_chain_issues` (JSONB)
|
||
- <20>脩<EFBFBD>璉<EFBFBD>瘚页<E7989A>`is_conflict`, `conflict_severity`, `conflict_fields`, `review_priority`
|
||
- 鈭箏極憭齿瓲嚗䫤final_decision`, `final_decision_by`, `exclusion_reason`, `review_notes`
|
||
- 憭<><E686AD><EFBFBD>嗆<EFBFBD><E59786><EFBFBD>`processing_status`, `is_degraded`, `degraded_model`
|
||
- <20>航蕭皞舀<E79A9E>改<EFBFBD>`raw_output_a` (JSONB), `raw_output_b` (JSONB), `prompt_version`
|
||
|
||
**蝝W<E89D9D>**:
|
||
- `idx_fulltext_results_task_id`
|
||
- `idx_fulltext_results_project_id`
|
||
- `idx_fulltext_results_literature_id`
|
||
- `idx_fulltext_results_is_conflict`
|
||
- `idx_fulltext_results_final_decision`
|
||
- `idx_fulltext_results_review_priority`
|
||
|
||
**<EFBFBD>臭<EFBFBD>蝥行<EFBFBD>**:
|
||
- `unique_project_literature_fulltext (project_id, literature_id)`
|
||
|
||
**憭㚚睸蝥行<E89DA5>**:
|
||
- `task_id` <20>?`fulltext_screening_tasks(id)` ON DELETE CASCADE
|
||
- `project_id` <20>?`screening_projects(id)` ON DELETE CASCADE
|
||
- `literature_id` <20>?`literatures(id)` ON DELETE CASCADE
|
||
|
||
### 餈<>宏蝏𤘪<E89D8F>撉諹<E69289>
|
||
|
||
```sql
|
||
-- 撉諹<E69289>銵典<E98AB5>撱?
|
||
\dt asl_schema.*
|
||
|
||
-- 蝏𤘪<E89D8F>嚗?銝芾”
|
||
-- <20>?literatures (撌脫凒<E884AB>?
|
||
-- <20>?screening_projects
|
||
-- <20>?screening_tasks
|
||
-- <20>?screening_results
|
||
-- <20>?fulltext_screening_tasks (<28>啣遣)
|
||
-- <20>?fulltext_screening_results (<28>啣遣)
|
||
|
||
-- 撉諹<E69289><E8ABB9>啣<EFBFBD>畾?
|
||
\d asl_schema.literatures
|
||
|
||
-- 蝏𤘪<E89D8F>嚗?
|
||
-- <20>?stage
|
||
-- <20>?has_pdf
|
||
-- <20>?full_text_storage_type
|
||
-- <20>?full_text_storage_ref
|
||
-- <20>?full_text_url
|
||
-- <20>?full_text_format
|
||
-- ... 蝑?3銝芣鰵摮埈挾
|
||
```
|
||
|
||
**Prisma Client<6E><74><EFBFBD>**:
|
||
|
||
```bash
|
||
cd backend
|
||
npx prisma generate
|
||
|
||
# 蝏𤘪<E89D8F>嚗尠<E59A97> <20><><EFBFBD><EFBFBD>𣂼<EFBFBD>
|
||
# 隞<><E99A9E><EFBFBD>航挪<E888AA>殷<EFBFBD>
|
||
# - prisma.aslLiterature
|
||
# - prisma.aslFulltextScreeningTask
|
||
# - prisma.aslFulltextScreeningResult
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> Schema<6D>𠉛氖蝑𣇉裦<F0A38789>扯<EFBFBD><E689AF><EFBFBD><EFBFBD>
|
||
|
||
### 霈曇恣<E69B87>笔<EFBFBD>嚗<EFBFBD>䔉<EFBFBD>芰頂蝏<E9A082>沲<EFBFBD><E6B2B2><EFBFBD>獢<EFBFBD><E78DA2>
|
||
|
||
```
|
||
<EFBFBD><EFBFBD>芋<EFBFBD>埈㺭<EFBFBD>桅<EFBFBD>餉<EFBFBD><EFBFBD>𠉛氖嚗?
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> admin_schema (蝟餌<E89D9F>蝞∠<E89D9E>)
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> platform_schema (<28>冽<EFBFBD>蝟餌<E89D9F>)
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> aia_schema (AI<41>拇<EFBFBD>)
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> asl_schema (AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃) <20>?<3F>扯<EFBFBD>甇<EFBFBD>&
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> pkb_schema (<28>亥<EFBFBD>摨?
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> rvw_schema (摰⊿<E691B0><E28ABF>譍<EFBFBD>)
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> st_schema (蝏蠘恣<E8A098><E681A3><EFBFBD>)
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> dc_schema (<28>唳旿<E594B3><E697BF><EFBFBD>)
|
||
<EFBFBD>鎿<EFBFBD><EFBFBD><EFBFBD> ssa_schema (<28>瑟𧋦<E7919F>誩<EFBFBD><E8AAA9>?
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD> common_schema (<28>砍<EFBFBD><E7A08D>唳旿)
|
||
```
|
||
|
||
### ASL璅∪<E79285><E288AA>扯<EFBFBD><E689AF><EFBFBD><EFBFBD> <20>?
|
||
|
||
| 璉<><E79289>仿★ | <20>嗆<EFBFBD>?| 霂湔<E99C82> |
|
||
|-------|------|------|
|
||
| Schema<6D>賢<EFBFBD> | <20>?甇<>& | `asl_schema` |
|
||
| <20><><EFBFBD>㕑”<E39591>賢銁甇<E98A81>&Schema | <20>?甇<>& | 6銝芾”<E88ABE>券<EFBFBD><E588B8>?`asl_schema` |
|
||
| 瘝⊥<E7989D>銵典銁public | <20>?甇<>& | <20>䭾<EFBFBD>瞍?|
|
||
| Prisma Model<65>惩<EFBFBD>甇<EFBFBD>& | <20>?甇<>& | `@@schema("asl_schema")` |
|
||
| 隞<><E99A9E>霈輸䔮頝臬<E9A09D>甇<EFBFBD>& | <20>?甇<>& | `prisma.aslXxx` |
|
||
| 憭㚚睸蝥行<E89DA5><E8A18C><EFBFBD><EFBFBD><EFBFBD>?| <20>?甇<>& | <20><><EFBFBD>丽K<E4B8BD><4B><EFBFBD><EFBFBD>众chema銵?|
|
||
|
||
**隞<><E99A9E>蝷箔<E89DB7>**嚗<>迤蝖株挪<E6A0AA>格䲮撘𧶏<E69298>嚗?
|
||
|
||
```typescript
|
||
// <20>?甇<>&嚗𡁻<E59A97>朞<EFBFBD>Prisma Client霈輸䔮asl_schema
|
||
const project = await prisma.aslScreeningProject.findUnique({
|
||
where: { id: projectId },
|
||
});
|
||
|
||
const literatures = await prisma.aslLiterature.findMany({
|
||
where: { projectId },
|
||
});
|
||
|
||
const task = await prisma.aslFulltextScreeningTask.create({
|
||
data: { ... },
|
||
});
|
||
|
||
// <20>?<3F>躰秤嚗𡁶凒<F0A181B6>兄QL霈輸䔮public嚗<63><E59A97>隡𡁜<E99AA1><F0A1819C><EFBFBD><EFBFBD><EFBFBD>牐蛹銵其<E98AB5><E585B6>私ublic嚗?
|
||
await prisma.$queryRaw`SELECT * FROM public.literatures`;
|
||
```
|
||
|
||
---
|
||
|
||
## <20>睸 <20>芣䔉餈<E49489>宏蝑𣇉裦
|
||
|
||
### 撖嫣<E69296>ASL璅∪<E79285>
|
||
|
||
**<EFBFBD>刻<EFBFBD>蝑𣇉裦**嚗𡁶誧蝏凋蝙<E5878B>冽<EFBFBD><E586BD>沒QL<51>𡁏𧋦
|
||
|
||
**<EFBFBD>笔<EFBFBD>**嚗?
|
||
1. <20>?Public schema<6D><61><EFBFBD><EFBFBD>脤<EFBFBD><E884A4>䠷䔮憸条<E686B8><E69DA1><EFBFBD><EFBFBD>瘜閗圾<E99697>?
|
||
2. <20>?<3F>见𢆡<E8A781>𡁏𧋦<F0A1818F>游<EFBFBD><E6B8B8>具<EFBFBD><E585B7>虾<EFBFBD>?
|
||
3. <20>?<3F>踹<EFBFBD><E8B8B9>誩<EFBFBD>敶勗<E695B6><E58B97>嗡<EFBFBD>璅∪<E79285>
|
||
4. <20>?靘蹂<E99D98>隞<EFBFBD><E99A9E>摰⊥䰻<E28AA5><E4B0BB>恣霈?
|
||
|
||
**<EFBFBD>滢<EFBFBD>瘚<EFBFBD><EFBFBD>**嚗?
|
||
|
||
```bash
|
||
# 1. 靽格㺿 Prisma Schema
|
||
# backend/prisma/schema.prisma
|
||
|
||
# 2. 蝻硋<E89DBB><E7A18B>见𢆡SQL<51>𡁏𧋦
|
||
# backend/prisma/migrations/manual_xxx.sql
|
||
|
||
# 3. <20>扯<EFBFBD><E689AF>𡁏𧋦嚗<F0A78BA6>蘨<EFBFBD>滢<EFBFBD>asl_schema嚗?
|
||
Get-Content manual_xxx.sql | docker exec -i ai-clinical-postgres psql ...
|
||
|
||
# 4. 撉諹<E69289>蝏𤘪<E89D8F>
|
||
docker exec ai-clinical-postgres psql ... -c "\dt asl_schema.*"
|
||
|
||
# 5. <20><><EFBFBD>Prisma Client
|
||
npx prisma generate
|
||
|
||
# 6. <20>𣂷漱Git
|
||
git add .
|
||
git commit -m "feat(asl): add xxx tables for xxx feature"
|
||
```
|
||
|
||
**SQL<51>𡁏𧋦璅⊥踎**嚗?
|
||
|
||
```sql
|
||
-- <20>芣<EFBFBD>雿𦡞sl_schema嚗䔶<E59A97>敶勗<E695B6><E58B97>嗡<EFBFBD>schema
|
||
ALTER TABLE asl_schema.xxx ADD COLUMN IF NOT EXISTS ...;
|
||
CREATE TABLE IF NOT EXISTS asl_schema.xxx (...);
|
||
CREATE INDEX IF NOT EXISTS idx_xxx ON asl_schema.xxx(...);
|
||
```
|
||
|
||
### 撖嫣<E69296><E5ABA3>嗡<EFBFBD>璅∪<E79285>
|
||
|
||
**<EFBFBD>桅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㕑<EFBFBD>?*嚗𡁜<E59A97>璅∪<E79285>撘<EFBFBD><E69298>穃𣪧<E7A983>?
|
||
|
||
**撱箄悅<E7AE84>滢<EFBFBD>**嚗<>眏<EFBFBD><E79C8F>芋<EFBFBD>堒𣪧<E5A092>蠘䌊銵<E48C8A><E98AB5>摰𡄯<E691B0>嚗?
|
||
1. 璉<><E79289>?`public` schema銝剜糓<E5899C>行<EFBFBD><E8A18C>祆芋<E7A586>㛖<EFBFBD>銵?
|
||
2. 撖寞<E69296><E5AF9E>唳旿撌桀<E6928C>嚗Ǒpublic` vs 甇<>&schema嚗?
|
||
3. <20>喟<EFBFBD><E5969F>臬炏<E887AC><E7828F>閬<EFBFBD>㺭<EFBFBD>株<EFBFBD>蝘餅<E89D98>皜<EFBFBD><E79A9C>
|
||
4. <20>扯<EFBFBD>皜<EFBFBD><E79A9C><EFBFBD>滢<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>抵䌊韐<E48C8A><E99F90>
|
||
|
||
**ASL<53>a<EFBFBD>蝡见㦤**嚗?
|
||
- <20>㩞 銝滢蜓<E6BBA2>冽<EFBFBD><E586BD><EFBFBD><EFBFBD>隞𡝗芋<F0A19D97>㛖<EFBFBD>public銵?
|
||
- <20>㩞 銝滚笆<E6BB9A>嗡<EFBFBD>璅∪<E79285><E288AA>唳旿摰匧<E691B0>韐蠘提
|
||
- <20>㩞 銝𤘪釣鈭箢sl_schema<6D><61>捶<EFBFBD>誩<EFBFBD>蝔喳<E89D94><E596B3>?
|
||
|
||
---
|
||
|
||
## <20><> <20>唳旿摰峕㟲<E5B395>折<EFBFBD>霂?
|
||
|
||
### ASL璅∪<E79285><E288AA>唳旿<E594B3>喟頂<E5969F>?
|
||
|
||
```
|
||
asl_schema.screening_projects (憿寧𤌍)
|
||
<20>?1:N
|
||
asl_schema.literatures (<28><>讃)
|
||
<20>?1:1 <20>?1:1
|
||
asl_schema.screening_results asl_schema.fulltext_screening_results
|
||
(<28><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>蝏𤘪<E89D8F>) (<28>冽<EFBFBD>憭滨<E686AD>蝏𤘪<E89D8F>)
|
||
<20>?N:1 <20>?N:1
|
||
asl_schema.screening_tasks asl_schema.fulltext_screening_tasks
|
||
(<28><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD>隞餃𦛚) (<28>冽<EFBFBD>憭滨<E686AD>隞餃𦛚)
|
||
```
|
||
|
||
### 憭㚚睸蝥行<E89DA5>撉諹<E69289>
|
||
|
||
```sql
|
||
-- 撉諹<E69289><E8ABB9><EFBFBD><EFBFBD>匧<EFBFBD><E58CA7>桅<EFBFBD><E6A185><EFBFBD><EFBFBD>asl_schema<6D><61><EFBFBD>
|
||
SELECT
|
||
tc.constraint_name,
|
||
tc.table_name,
|
||
kcu.column_name,
|
||
ccu.table_name AS foreign_table_name,
|
||
ccu.column_name AS foreign_column_name
|
||
FROM information_schema.table_constraints AS tc
|
||
JOIN information_schema.key_column_usage AS kcu
|
||
ON tc.constraint_name = kcu.constraint_name
|
||
JOIN information_schema.constraint_column_usage AS ccu
|
||
ON ccu.constraint_name = tc.constraint_name
|
||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||
AND tc.table_schema = 'asl_schema'
|
||
ORDER BY tc.table_name;
|
||
|
||
-- 憸<><E686B8>蝏𤘪<E89D8F>嚗?
|
||
-- <20>?<3F><><EFBFBD>丽K<E4B8BD>?foreign_table_name <20>賢銁 asl_schema 銝?
|
||
-- <20>?瘝⊥<E7989D>頝究chema撘閧鍂
|
||
```
|
||
|
||
---
|
||
|
||
## <20>㴓 <20>喲睸蝏栞捏
|
||
|
||
### <20>?ASL璅∪<E79285>嚗𡁜<E59A97><F0A1819C>典<EFBFBD>摨?
|
||
|
||
1. **Schema<6D>𠉛氖**嚗?00%甇<>&嚗峕<E59A97><E5B395>㕑”<E39591>賢銁 `asl_schema`
|
||
2. **<EFBFBD>唳旿蝞∠<EFBFBD>**嚗𡁏<E59A97><F0A1818F>唳旿瘜<E697BF><E7989C><EFBFBD>?`public`
|
||
3. **隞<><E99A9E>閫<EFBFBD><E996AB>**嚗𡁏<E59A97><F0A1818F>㕑挪<E39591>株楝敺<E6A59D>迤蝖?
|
||
4. **餈<>宏蝑𣇉裦**嚗𡁏<E59A97><F0A1818F>沒QL<51>𡁏𧋦嚗<F0A78BA6><E59A97><EFBFBD>典虾<E585B8>?
|
||
|
||
### <20>𩤃<EFBFBD> 蝟餌<E89D9F>蝥折䔮憸矋<E686B8>Public Schema瘙⊥<E79899>
|
||
|
||
1. **<EFBFBD>桅<EFBFBD><EFBFBD>扯捶**嚗𡁜<E59A97><F0A1819C>脤<EFBFBD><E884A4>辷<EFBFBD>銝垾SL<53>惩<EFBFBD>
|
||
2. **敶勗<E695B6><E58B97><EFBFBD>凒**嚗鋫IA<49><41>KB<4B><42>latform璅∪<E79285>
|
||
3. **閫<><E996AB>韐<EFBFBD>遙**嚗𡁜<E59A97>璅∪<E79285><E288AA>a<EFBFBD><EFBD81>芾<EFBFBD>憭<EFBFBD><E686AD>
|
||
4. **ASL蝑𣇉裦**嚗帋<E59A97><E5B88B>私ublic嚗𣬚恣憟質䌊撌?
|
||
|
||
### <20><> 撘<><E69298>睲犖<E79DB2>䀹<EFBFBD><E480B9>?
|
||
|
||
**憒<><E68692>雿䭾糓ASL璅∪<E79285>撘<EFBFBD><E69298>𤏸<EFBFBD>?*嚗?
|
||
- <20>?蝏抒賒靽脲<E99DBD>敶枏<E695B6><E69E8F><EFBFBD>chema<6D>𠉛氖摰噼殿
|
||
- <20>?雿輻鍂<E8BCBB>见𢆡SQL<51>𡁏𧋦餈𥡝<E9A488><F0A5A19D>唳旿摨栞<E691A8>蝘?
|
||
- <20>?<3F><><EFBFBD>㕑”<E39591>賢<EFBFBD>撱箏銁 `asl_schema`
|
||
- <20>?銝滩<E98A9D>撠肽<E692A0>皜<EFBFBD><E79A9C> `public` schema
|
||
|
||
**憒<><E68692>雿䭾糓<E4ADBE>嗡<EFBFBD>璅∪<E79285>撘<EFBFBD><E69298>𤏸<EFBFBD>?*嚗?
|
||
- <20>椬 璉<><E79289>亥䌊撌望芋<E69C9B>㛖<EFBFBD>Schema<6D>𠉛氖<F0A0899B>嗅<EFBFBD>
|
||
- <20>椬 <20>喳<EFBFBD><E596B3>臬炏<E887AC><E7828F>閬<EFBFBD><E996AC><EFBFBD>?`public` 銝剔<E98A9D><E58994>滚<EFBFBD>銵?
|
||
- <20>椬 <20><><EFBFBD><EFBFBD>SL<53><4C><EFBFBD>蝘餌<E89D98><E9A48C>伐<EFBFBD><E4BC90>见𢆡SQL嚗?
|
||
- <20>椬 銝滩<E98A9D>靘肽<E99D98>ASL<53>a<EFBFBD>皜<EFBFBD><E79A9C>public
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
|
||
|
||
- [蝟餌<E89D9F><E9A48C>颱<EFBFBD>霈曇恣 - <20>唳旿摨𤘪沲<F0A498AA><E6B2B2>秩<EFBFBD>筕(../../../../00-蝟餌<E89D9F><E9A48C>颱<EFBFBD>霈曇恣/03-<2D>唳旿摨𤘪沲<F0A498AA><E6B2B2>秩<EFBFBD>?md)
|
||
- [ASL璅∪<E79285> - <20>唳旿摨栞挽霈((../../02-<2D><><EFBFBD>航挽霈?01-<2D>唳旿摨栞挽霈?md)
|
||
- [鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8><EFBFBD>(../../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md)
|
||
- [Day 2-3撘<33><E69298>𤏸扇敶騟(./2025-11-22_Day2-Day3_LLM<4C>滚𦛚銝𡡞<E98A9D>霂<EFBFBD>頂蝏笔<E89D8F><E7AC94>?md)
|
||
|
||
---
|
||
|
||
**<EFBFBD><EFBFBD>﹝蝏湔擪**嚗?
|
||
- <20>唳旿摨梶<E691A8><E6A2B6><EFBFBD><EFBFBD><EFBFBD>湔𧒄<E6B994>湔鰵
|
||
- <20>𤑳緵<F0A491B3>圈䔮憸䀹𧒄霈啣<E99C88>
|
||
- 摰𡁏<E691B0>摰⊥䰻Schema<6D>𠉛氖<F0A0899B>嗅<EFBFBD>
|
||
|
||
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-11-23
|
||
**<EFBFBD>湔鰵鈭?*嚗鋫SL撘<4C><E69298>穃𣪧<E7A983>?
|
||
**銝𧢲活摰⊥䰻**嚗帋<E59A97>甈⊥㺭<E28AA5>桀<EFBFBD>餈<EFBFBD>宏<EFBFBD>?
|
||
|
||
|