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%)
This commit is contained in:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -1,75 +1,75 @@
# PKB个人知识库 - 前端迁移与批处理功能完善
# PKB<EFBFBD>汉鐭ヨ瘑搴?- 鍓嶇<E98D93>杩佺Щ涓庢壒澶勭悊鍔熻兘瀹屽杽
**开发日期**2026年1月7日
**开发人员**AI Assistant
**寮€鍙戞棩鏈?*锛?026骞?鏈?鏃?
**寮€鍙戜汉鍛?*锛欰I Assistant
**鐗堟湰**锛歷2.0
---
## 一、开发目标
## 涓€銆佸紑鍙戠洰鏍?
1. **前端架构迁移**将PKB前端迁移到 `frontend-v2/modules/pkb` 新架构
1. **鍓嶇<EFBFBD>鏋舵瀯杩佺Щ**锛氬皢PKB鍓嶇<E98D93>杩佺Щ鍒?`frontend-v2/modules/pkb` 鏂版灦鏋?
2. **宸ヤ綔妯″紡瀹炵幇**锛氬疄鐜板叏鏂囬槄璇汇€侀€愮瘒绮捐<E7BBAE>銆佹壒澶勭悊涓夌<E6B693>宸ヤ綔妯″紡
3. **批处理功能**:完善批处理任务的执行、进度显示和结果导出
3. **鎵瑰<EFBFBD>鐞嗗姛鑳?*锛氬畬鍠勬壒澶勭悊浠诲姟鐨勬墽琛屻€佽繘搴︽樉绀哄拰缁撴灉瀵煎嚭
4. **UI浼樺寲**锛氫紭鍖栫晫闈㈢粏鑺傦紝鎻愬崌鐢ㄦ埛浣撻獙
---
## 二、主要工作内容
## 浜屻€佷富瑕佸伐浣滃唴瀹?
### 1. 鍓嶇<E98D93>鏋舵瀯鎼<E780AF>
#### 鐩<>綍缁撴瀯鍒涘缓
```
frontend-v2/src/modules/pkb/
├── api/ # API客户端
│ └── knowledgeBaseApi.ts
├── stores/ # 状态管理
│ └── useKnowledgeBaseStore.ts
鈹溾攢鈹€ api/ # API瀹㈡埛绔?
鈹? 鈹斺攢鈹€ knowledgeBaseApi.ts
鈹溾攢鈹€ stores/ # 鐘舵€佺<EFBFBD>鐞?
鈹? 鈹斺攢鈹€ useKnowledgeBaseStore.ts
鈹溾攢鈹€ components/ # 閫氱敤缁勪欢
│ ├── DocumentUpload.tsx
│ └── Workspace/ # 工作台组件
├── FullTextMode.tsx
├── DeepReadMode.tsx
├── BatchModeComplete.tsx
└── WorkModeSelector.tsx
鈹? 鈹溾攢鈹€ DocumentUpload.tsx
鈹? 鈹斺攢鈹€ Workspace/ # 宸ヤ綔鍙扮粍浠?
鈹? 鈹溾攢鈹€ FullTextMode.tsx
鈹? 鈹溾攢鈹€ DeepReadMode.tsx
鈹? 鈹溾攢鈹€ BatchModeComplete.tsx
鈹? 鈹斺攢鈹€ WorkModeSelector.tsx
鈹溾攢鈹€ pages/ # 椤甸潰缁勪欢
│ ├── DashboardPage.tsx
│ └── WorkspacePage.tsx
鈹? 鈹溾攢鈹€ DashboardPage.tsx
鈹? 鈹斺攢鈹€ WorkspacePage.tsx
鈹溾攢鈹€ hooks/ # 鑷<>畾涔塇ooks
│ └── useWorkMode.ts
鈹? 鈹斺攢鈹€ useWorkMode.ts
鈹斺攢鈹€ styles/ # 鏍峰紡鏂囦欢
鈹斺攢鈹€ workspace.css
```
#### 鏍稿績鏂囦欢鍒涘缓
- **DashboardPage.tsx**:知识库列表和创建入口
- **DashboardPage.tsx**锛氱煡璇嗗簱鍒楄〃鍜屽垱寤哄叆鍙?
- **WorkspacePage.tsx**锛氱煡璇嗗簱宸ヤ綔鍙颁富椤甸潰
- **涓夌<E6B693>宸ヤ綔妯″紡缁勪欢**锛氬叏鏂囬槄璇汇€侀€愮瘒绮捐<E7BBAE>銆佹壒澶勭悊
### 2. Chat缁勪欢闆嗘垚
**鎶€鏈<E282AC>€夊瀷**锛欰nt Design X
**特点**
**鐗圭偣**锛?
- 缁熶竴鐨勫<E990A8>璇濈粍浠讹紝鏀<E7B49D>寔娴佸紡鍝嶅簲
-<>畾涔夋秷鎭<E7A7B7>覆鏌撳櫒
-<>姩婊氬姩鍜岃緭鍏ユ<E98D8F>
**集成问题修复**
- ✅ 输入框清除:使用受控模式 `value={inputValue}`
- ✅ 自动滚动:添加 `messagesEndRef` 锚点
- ✅ 参考文献格式化:实现 `customMessageRenderer`
**闆嗘垚闂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**锛?
- 鉁?杈撳叆妗嗘竻闄わ細浣跨敤鍙楁帶妯″紡 `value={inputValue}`
- 鉁?鑷<>姩婊氬姩锛氭坊鍔?`messagesEndRef` 閿氱偣
- 鉁?鍙傝€冩枃鐚<E69E83>牸寮忓寲锛氬疄鐜?`customMessageRenderer`
### 3. 宸ヤ綔妯″紡瀹炵幇
#### 3.1 鍏ㄦ枃闃呰<E99783>妯″紡
**功能**
**鍔熻兘**锛?
- 鍔犺浇鐭ヨ瘑搴撳叏閮ㄦ枃妗o紙宸插畬鎴愮姸鎬侊級
- 使用 `fullTextDocumentIds` 参数传递完整文献
- 浣跨敤 `fullTextDocumentIds` 鍙傛暟浼犻€掑畬鏁存枃鐚?
- AI鍏峰<E98D8F>鍏ㄧ煡瑙嗚<E79199>锛屽彲杩涜<E69DA9>缁煎悎鍒嗘瀽
**API调用**
**API璋冪敤**锛?
```typescript
body: JSON.stringify({
content: message,
@@ -79,51 +79,51 @@ body: JSON.stringify({
})
```
**修复问题**
- ❌ 初次加载显示"0篇文档"
- ✅ 将文档数量加入 `conversationKey`,强制重新渲染
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**锛?
- 鉂?鍒濇<E98D92>鍔犺浇鏄剧ず"0绡囨枃妗?
- 鉁?灏嗘枃妗f暟閲忓姞鍏?`conversationKey`锛屽己鍒堕噸鏂版覆鏌?
#### 3.2 閫愮瘒绮捐<E7BBAE>妯″紡
**功能**
- 选择1-5篇文档进行深度解读
- 每篇文档独立对话上下文
- 切换文档时清空对话历史
**鍔熻兘**锛?
- 閫夋嫨1-5绡囨枃妗繘琛屾繁搴﹁В璇?
- 姣忕瘒鏂囨。鐙<EFBFBD>珛瀵硅瘽涓婁笅鏂?
- 鍒囨崲鏂囨。鏃舵竻绌哄<EFBFBD>璇濆巻鍙?
**技术实现**
**鎶€鏈<EFBFBD>疄鐜?*锛?
```typescript
const conversationKey = useMemo(() => {
return `kb-deepread-${kbId}-${selectedDoc.id}`;
}, [kbId, selectedDoc.id]);
```
**修复问题**
- ❌ 切换文档报错:`TypeError: formattedContent.replace is not a function`
- ✅ 添加类型检查,正确处理 `MessageRenderParams`
- ❌ 输入框不清除、不自动滚动
- ✅ 在ChatContainer添加受控输入和滚动锚点
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**锛?
- 鉂?鍒囨崲鏂囨。鎶ラ敊锛歚TypeError: formattedContent.replace is not a function`
- 鉁?娣诲姞绫诲瀷妫€鏌ワ紝姝g‘澶勭悊 `MessageRenderParams`
- 鉂?杈撳叆妗嗕笉娓呴櫎銆佷笉鑷<E7AC89>姩婊氬姩
- 鉁?鍦–hatContainer娣诲姞鍙楁帶杈撳叆鍜屾粴鍔ㄩ敋鐐?
#### 3.3 批处理模式
#### 3.3 鎵瑰<EFBFBD>鐞嗘ā寮?
**功能**
- 选择3-50篇文档批量提取信息
- 支持临床研究信息提取模板8个字段
**鍔熻兘**锛?
- 閫夋嫨3-50绡囨枃妗f壒閲忔彁鍙栦俊鎭?
- <EFBFBD>寔涓村簥鐮旂┒淇℃伅鎻愬彇妯℃澘锛?涓<>瓧娈碉級
- 瀹炴椂鏄剧ず澶勭悊杩涘害
- 缁撴灉鍙<E78189><E98D99>鍑轰负CSV
**开发历程**
**寮€鍙戝巻绋?*锛?
**问题1选择数量翻倍**
- ❌ 原因点击行和Checkbox都触发选择导致重复添加
- ✅ 解决:使用统一的 `toggle` 函数Checkbox`onClick stopPropagation`
**<EFBFBD><EFBFBD>1锛氶€夋嫨鏁伴噺缈诲€?*
- 鉂?鍘熷洜锛氱偣鍑昏<E98D91>鍜孋heckbox閮借Е鍙戦€夋嫨锛屽<E9949B>鑷撮噸澶嶆坊鍔?
- 鉁?瑙e喅锛氫娇鐢ㄧ粺涓€鐨?`toggle` 鍑芥暟锛孋heckbox鐢?`onClick stopPropagation`
**闂<><E99782>2锛欰PI 404閿欒<E996BF>**
- ❌ 路径错误:`/api/v1/batch-tasks`
- ✅ 正确路径:`/api/v2/pkb/batch-tasks/batch/execute`
- 鉂?璺<>緞閿欒<E996BF>锛歚/api/v1/batch-tasks`
- 鉁?姝<E28098>緞锛歚/api/v1/pkb/batch-tasks/batch/execute`
**闂<><E99782>3锛欰PI 500閿欒<E996BF>**
- ❌ 字段名不匹配:前端发送 `knowledgeBaseId`,后端期望 `kb_id`
- ✅ 修复请求体格式:
- 鉂?瀛楁<E7809B>鍚嶄笉鍖归厤锛氬墠绔<E5A2A0>彂閫?`knowledgeBaseId`锛屽悗绔<EFBFBD>湡鏈?`kb_id`
- 鉁?淇<><E6B787>璇锋眰浣撴牸寮忥細
```typescript
{
kb_id: kbId, // 鍚庣<E98D9A>鏍煎紡
@@ -134,37 +134,37 @@ const conversationKey = useMemo(() => {
}
```
**问题4模板ID不匹配**
- ❌ 前端:`clinicalResearch`(驼峰)
- ❌ 后端:`clinical_research`(下划线)
- ✅ 统一为 `clinical_research`
**<EFBFBD><EFBFBD>4锛氭ā鏉縄D涓嶅尮閰?*
- 鉂?鍓嶇<E98D93>锛歚clinicalResearch`锛堥┘宄帮級
- 鉂?鍚庣<E98D9A>锛歚clinical_research`锛堜笅鍒掔嚎锛?
- 鉁?缁熶竴涓?`clinical_research`
**闂<><E99782>5锛氬墠绔<E5A2A0>笉鏄剧ず缁撴灉**
- ❌ 后端返回 `status: "success"`,前端判断 `status === 'completed'`
- ✅ 修复状态判断:
- 鉂?鍚庣<E98D9A>杩斿洖 `status: "success"`锛屽墠绔<EFBFBD>垽鏂?`status === 'completed'`
- 鉁?淇<><E6B787>鐘舵€佸垽鏂<E59EBD>
```typescript
const isSuccess = docResult.status === 'success' || docResult.status === 'completed';
```
**问题6表格显示粗糙**
- ❌ 文件名过长,内容显示不全
- ✅ 实现方案A
- 文件名最多2行
- 内容最多3行 (`-webkit-line-clamp: 3`)
- 悬停显示完整内容Tooltip
- 结果数据列更宽(280px
**<EFBFBD><EFBFBD>6锛氳〃鏍兼樉绀虹矖绯?*
- 鉂?鏂囦欢鍚嶈繃闀匡紝鍐呭<E98D90>鏄剧ず涓嶅叏
- 鉁?瀹炵幇鏂规<E98F82>A锛?
- 鏂囦欢鍚嶆渶澶?琛?
- 鍐呭<EFBFBD>鏈€澶?琛?(`-webkit-line-clamp: 3`)
- <EFBFBD>仠鏄剧ず瀹屾暣鍐呭<EFBFBD>锛圱ooltip锛?
- 缁撴灉鏁版嵁鍒楁洿瀹斤紙280px锛?
### 4. 鏂囨。涓婁紶鍔熻兘
**问题**
- ❌ "上传新文件"按钮无响应
- ❌ 没有绑定 `onClick` 事件
**<EFBFBD><EFBFBD>**锛?
- 鉂?"涓婁紶鏂版枃浠?鎸夐挳鏃犲搷搴?
- 鉂?娌℃湁缁戝畾 `onClick` 浜嬩欢
**解决方案**
1. 导入 `DocumentUpload` 组件和 `Modal`
2. 添加 `uploadModalVisible` 状态
3. 为按钮绑定 `onClick={() => setUploadModalVisible(true)}`
4. 添加上传弹窗,集成 `DocumentUpload` 组件
**喅鏂规<EFBFBD>**锛?
1. 瀵煎叆 `DocumentUpload` 缁勪欢鍜?`Modal`
2. 娣诲姞 `uploadModalVisible` 鐘舵€?
3. 涓烘寜閽<EFBFBD>粦瀹?`onClick={() => setUploadModalVisible(true)}`
4. 娣诲姞涓婁紶寮圭獥锛岄泦鎴?`DocumentUpload` 缁勪欢
5.<><E6B787>瀵煎叆璺<E58F86>緞锛歚../stores/useKnowledgeBaseStore`
---
@@ -187,59 +187,59 @@ interface MessageRenderParams {
}
```
**解决**:正确解析 `params.message.content`
**瑙e喅**锛氭<E9949B><EFBFBD>В鏋?`params.message.content`
### 2. 批处理结果获取
### 2. 鎵瑰<EFBFBD>鐞嗙粨鏋滆幏鍙?
**问题**:后端返回嵌套结构 `{ success: true, data: { results: [...] } }`
**<EFBFBD><EFBFBD>**锛氬悗绔<E68297>繑鍥炲祵濂楃粨鏋?`{ success: true, data: { results: [...] } }`
**解决**
**瑙e喅**锛?
```typescript
const resultsData = resultsJson.data?.results || [];
const newResults = resultsData.map((docResult: any) => ({
documentId: docResult.document_id,
documentName: docResult.document_name,
result: docResult.data, // 提取数据在这里
result: docResult.data, // 鎻愬彇鏁版嵁鍦ㄨ繖閲?
}));
```
### 3. React Key閲嶅<E996B2>璀﹀憡
**问题**:批处理结果列表使用 `documentId` 作为key可能重复
**<EFBFBD><EFBFBD>**锛氭壒澶勭悊缁撴灉鍒楄〃浣跨敤 `documentId` 浣滀负key锛屽彲鑳介噸澶?
**解决**
**瑙e喅**锛?
- 鍦ㄦ枃妗i€夋嫨鍒楄〃浣跨敤 `useMemo` 鍘婚噸
- 鍦ㄧ粨鏋滄槧灏勬椂浣跨敤 `${documentId}-${index}`<>繚鍞<E7B99A>
### 4. 前后端字段映射
### 4. 鍓嶅悗绔<EFBFBD>瓧娈垫槧灏?
| 鍚庣<E98D9A>瀛楁<E7809B> | 鍓嶇<E98D93>鏄剧ず |
|---------|---------|
| `research_purpose` | 鐮旂┒鐩<E29492>殑 |
| `research_design` | 鐮旂┒璁捐<E79281> |
| `research_subjects` | 鐮旂┒瀵硅薄 |
| `sample_size` | 样本量 |
| `intervention_group` | 干预组 |
| `control_group` | 对照组 |
| `results_data` | 结果及数据 |
| `sample_size` | 鏍锋湰閲?|
| `intervention_group` | 骞查<EFBFBD>缁?|
| `control_group` | 瀵圭収缁?|
| `results_data` | 缁撴灉鍙婃暟鎹?|
| `oxford_level` | 鐗涙触璇勭骇 |
---
## 鍥涖€丄PI璺<49>敱鎬荤粨
### 新架构路由v2
### 鏂版灦鏋勮矾鐢憋紙v2锛?
| 鍔熻兘 | 鏂规硶 | 璺<>緞 |
|------|------|------|
| 知识库列表 | GET | `/api/v2/pkb/knowledge-bases` |
| 创建知识库 | POST | `/api/v2/pkb/knowledge-bases` |
| 上传文档 | POST | `/api/v2/pkb/knowledge-bases/:id/documents` |
| 文档列表 | GET | `/api/v2/pkb/knowledge-bases/:id/documents` |
| 批处理执行 | POST | `/api/v2/pkb/batch-tasks/batch/execute` |
| 批处理状态 | GET | `/api/v2/pkb/batch-tasks/batch/tasks/:id` |
| 批处理结果 | GET | `/api/v2/pkb/batch-tasks/batch/tasks/:id/results` |
| 鐭ヨ瘑搴撳垪琛?| GET | `/api/v1/pkb/knowledge-bases` |
| 鍒涘缓鐭ヨ瘑搴?| POST | `/api/v1/pkb/knowledge-bases` |
| 涓婁紶鏂囨。 | POST | `/api/v1/pkb/knowledge-bases/:id/documents` |
| 鏂囨。鍒楄〃 | GET | `/api/v1/pkb/knowledge-bases/:id/documents` |
| 鎵瑰<EFBFBD>鐞嗘墽琛?| POST | `/api/v1/pkb/batch-tasks/batch/execute` |
| 鎵瑰<EFBFBD>鐞嗙姸鎬?| GET | `/api/v1/pkb/batch-tasks/batch/tasks/:id` |
| 鎵瑰<EFBFBD>鐞嗙粨鏋?| GET | `/api/v1/pkb/batch-tasks/batch/tasks/:id/results` |
### 对话路由(通用)
### 瀵硅瘽璺<EFBFBD>敱锛堥€氱敤锛?
| 鍔熻兘 | 鏂规硶 | 璺<>緞 |
|------|------|------|
| 娴佸紡瀵硅瘽 | POST | `/api/v1/chat/stream` |
@@ -249,20 +249,20 @@ const newResults = resultsData.map((docResult: any) => ({
## 浜斻€乁I/UX浼樺寲缁嗚妭
### 1. WorkspacePage甯冨眬
- **单层Header**整合返回、标题、Tab切换、设置、头像
- **Header高度**`h-14`56px
- **工作模式选择器**:紧凑的 `h-10`
- **鍗曞眰Header**锛氭暣鍚堣繑鍥炪€佹爣棰樸€乀ab鍒囨崲銆佽<EFBFBD><EFBFBD>€佸ご鍍?
- **Header楂樺害**锛歚h-14`锛?6px锛?
- **宸ヤ綔妯″紡閫夋嫨鍣?*锛氱揣鍑戠殑 `h-10` 鏍?
- **Chat鍖哄煙**锛氭渶澶у寲鍓╀綑绌洪棿
### 2. 批处理结果表格
- **固定表头**:背景 `#F9FAFB`,文字 `#6B7280`
- **文件名列**220px最多2行
- **内容列**180-280px最多3行
- **悬停提示**最大宽度450px最大高度300px
### 2. 鎵瑰<EFBFBD>鐞嗙粨鏋滆〃鏍?
- **鍥哄畾琛ㄥご**锛氳儗鏅?`#F9FAFB`锛屾枃瀛?`#6B7280`
- **鏂囦欢鍚嶅垪**锛?20px锛屾渶澶?琛?
- **鍐呭<EFBFBD>鍒?*锛?80-280px锛屾渶澶?琛?
- **<EFBFBD>仠鎻愮ず**锛氭渶澶у<E6BEB6>搴?50px锛屾渶澶ч珮搴?00px
### 3. 参考文献格式
### 3. 鍙傝€冩枃鐚<EFBFBD>牸寮?
```typescript
// 卡片式显示
// 鍗$墖寮忔樉绀?
<div className="flex items-start p-3 bg-blue-50 rounded-lg border border-blue-100">
<BookOpen className="w-4 h-4 text-blue-500 mr-2" />
<span className="text-sm text-slate-700">{citation}</span>
@@ -271,21 +271,21 @@ const newResults = resultsData.map((docResult: any) => ({
---
## 六、测试结果
## <EFBFBD>€佹祴璇曠粨鏋?
### 鍔熻兘娴嬭瘯
| 功能模块 | 测试项 | 结果 |
| 鍔熻兘妯″潡 | 娴嬭瘯椤?| 缁撴灉 |
|---------|--------|------|
| 知识库列表 | 创建/查看/删除 | |
| 文档上传 | 拖拽/点击上传 | |
| 全文阅读 | 加载文档/问答 | |
| 逐篇精读 | 文档切换/问答 | |
| 批处理 | 模板选择/执行/结果显示 | |
| 结果导出 | CSV导出 | |
| 鐭ヨ瘑搴撳垪琛?| 鍒涘缓/鏌ョ湅/鍒犻櫎 | 鉁?|
| 鏂囨。涓婁紶 | 鎷栨嫿/鐐瑰嚮涓婁紶 | 鉁?|
| 鍏ㄦ枃闃呰<EFBFBD> | 鍔犺浇鏂囨。/闂<> | 鉁?|
| 閫愮瘒绮捐<EFBFBD> | 鏂囨。鍒囨崲/闂<> | 鉁?|
| 鎵瑰<EFBFBD>鐞?| 妯℃澘閫夋嫨/鎵ц<E98EB5>/缁撴灉鏄剧ず | 鉁?|
| 缁撴灉瀵煎嚭 | CSV瀵煎嚭 | 鉁?|
### 鎬ц兘娴嬭瘯
- **3篇文档批处理**~17-28
- **6篇文档全文加载**~14k-15k tokens
- **3绡囨枃妗f壒澶勭悊**锛殈17-28绉?
- **6绡囨枃妗e叏鏂囧姞杞?*锛殈14k-15k tokens
- **鏂囨。涓婁紶**锛氳繘搴﹀疄鏃舵樉绀猴紝鏀<E7B49D>寔10MB浠ュ唴
---
@@ -293,44 +293,44 @@ const newResults = resultsData.map((docResult: any) => ({
## 涓冦€佸凡鐭ラ棶棰樹笌鏀硅繘鏂瑰悜
### 褰撳墠闄愬埗
1. 批处理只支持1个模板临床研究信息提取
2. 批处理最少3篇文档后端限制
3. 逐篇精读最多5篇文档前端限制
1. 鎵瑰<EFBFBD>鐞嗗彧鏀<EFBFBD>寔1涓<EFBFBD>ā鏉匡紙涓村簥鐮旂┒淇℃伅鎻愬彇锛?
2. 鎵瑰<EFBFBD>鐞嗘渶灏?绡囨枃妗紙鍚庣<E98D9A>闄愬埗锛?
3. 閫愮瘒绮捐<EFBFBD>鏈€澶?绡囨枃妗紙鍓嶇<E98D93>闄愬埗锛?
### 鏈<>潵浼樺寲
1. **澧炲姞妯℃澘**锛氳嵂鐗╁畨鍏ㄦ€с€佹偅鑰呭熀绾跨壒寰佺瓑
2. **自定义模板**:允许用户自定义提取字段
2. **<EFBFBD>畾涔夋ā鏉?*锛氬厑璁哥敤鎴疯嚜瀹氫箟鎻愬彇瀛楁<E7809B>
3. **缁撴灉棰勮<E6A3B0>**锛氬湪琛ㄦ牸涓<E789B8>敮鎸佸崟鍏冩牸灞曞紑
4. **批处理恢复**:支持中断后继续执行
4. **鎵瑰<EFBFBD>鐞嗘仮澶?*锛氭敮鎸佷腑鏂<E88591>悗缁х画鎵ц<E98EB5>
5. **鏂囨。棰勮<E6A3B0>**锛氶泦鎴怭DF棰勮<E6A3B0>鍔熻兘
---
## 八、代码统计
## <EFBFBD>€佷唬鐮佺粺璁?
### 鏂板<E98F82>鏂囦欢
- 前端页面2个Dashboard、Workspace
- 前端组件6个3种工作模式 + 选择器 + 上传 + 文档列表)
- API客户端1个
- 状态管理1个
- 样式文件1个
- 鍓嶇<EFBFBD>椤甸潰锛?涓<>Dashboard銆乄orkspace锛?
- 鍓嶇<EFBFBD>缁勪欢锛?涓<>紙3绉嶅伐浣滄ā寮?+ 閫夋嫨鍣?+ 涓婁紶 + 鏂囨。鍒楄〃锛?
- API瀹㈡埛绔<EFBFBD>細1涓?
- 鐘舵€佺<EFBFBD>鐞嗭細1涓?
- 鏍峰紡鏂囦欢锛?涓?
### 代码量估算
- TypeScript~2500
- CSS~200
- 文档:~1000
### 浠g爜閲忎及绠?
- TypeScript锛殈2500琛?
- CSS锛殈200琛?
- 鏂囨。锛殈1000琛?
---
## 九、团队协作
## 涔濄€佸洟闃熷崗浣?
### 参考旧版实现
### 鍙傝€冩棫鐗堝疄鐜?
- 鏂囨。涓婁紶锛歚frontend/src/components/knowledge/DocumentUpload.tsx`
- 鎵瑰<E98EB5>鐞嗭細`frontend/src/components/chat/BatchMode.tsx`
- 鏂囨。閫夋嫨锛歚frontend/src/components/chat/DocumentSelection.tsx`
### Git鎻愪氦
- 遵循语义化提交规范
- 閬靛惊璇<EFBFBD>箟鍖栨彁浜よ<EFBFBD>鑼?
-<>枃浣跨敤UTF-8缂栫爜
- 鍒嗗<E98D92>娆℃彁浜わ紝姣忔<E5A7A3>鑱氱劍鍗曚竴鍔熻兘
@@ -338,23 +338,24 @@ const newResults = resultsData.map((docResult: any) => ({
## 鍗併€佹€荤粨
本次开发完成了PKB个人知识库模块从架构设计到核心功能的完整实现特别是
<EFBFBD><EFBFBD>寮€鍙戝畬鎴愪簡PKB涓<EFBFBD>汉鐭ヨ瘑搴撴ā鍧椾粠鏋舵瀯璁捐<EFBFBD>鍒版牳蹇冨姛鑳界殑瀹屾暣瀹炵幇锛岀壒鍒<EFBFBD>槸锛?
1. **新架构迁移**:成功迁移到 `frontend-v2` 新架构
2. **三种工作模式**:全文阅读、逐篇精读、批处理全部实现
3. **批处理完整流程**:从模板选择到结果导出的完整链路
4. **UI/UX优化**:参照原型图精细化实现,用户体验良好
5. **问题解决能力**快速定位并解决10+个技术问题
1. 鉁?**鏂版灦鏋勮縼绉?*锛氭垚鍔熻縼绉诲埌 `frontend-v2` 鏂版灦鏋?
2. 鉁?**涓夌<E6B693>宸ヤ綔妯″紡**锛氬叏鏂囬槄璇汇€侀€愮瘒绮捐<E7BBAE>銆佹壒澶勭悊鍏ㄩ儴瀹炵幇
3. 鉁?**鎵瑰<E98EB5>鐞嗗畬鏁存祦绋?*锛氫粠妯℃澘閫夋嫨鍒扮粨鏋滃<E98F8B>鍑虹殑瀹屾暣閾捐矾
4. 鉁?**UI/UX浼樺寲**锛氬弬鐓у師鍨嬪浘绮剧粏鍖栧疄鐜帮紝鐢ㄦ埛浣撻獙鑹<E78D99>
5. 鉁?**闂<><E99782>喅鑳藉姏**锛氬揩閫熷畾浣嶅苟瑙喅10+涓<>妧鏈<E5A6A7>棶棰?
**里程碑意义**PKB模块已具备生产环境可用性为后续功能扩展奠定了坚实基础
**閲岀▼纰戞剰涔?*锛歅KB妯″潡宸插叿澶囩敓浜х幆澧冨彲鐢ㄦ€э紝涓哄悗缁<E68297>姛鑳芥墿灞曞<E7819E>瀹氫簡鍧氬疄鍩虹<E98DA9>锛?
---
**下一步建议**
1. 进行完整的用户验收测试(UAT
**涓嬩竴姝ュ缓璁?*锛?
1. 杩涜<EFBFBD>瀹屾暣鐨勭敤鎴烽獙鏀舵祴璇曪紙UAT锛?
2. 浼樺寲鎵瑰<E98EB5>鐞嗘€ц兘锛堝苟鍙戙€佺紦瀛橈級
3. 澧炲姞鏇村<E98F87>妯℃澘鍜岃嚜瀹氫箟鑳藉姏
4. 完善错误处理和用户反馈
4. 瀹屽杽閿欒<EFBFBD>澶勭悊鍜岀敤鎴峰弽棣?

View File

@@ -1,9 +1,9 @@
# PKB模块前端V3设计实现 - 开发记录
# PKB妯″潡鍓嶇<EFBFBD>V3璁捐<EFBFBD>瀹炵幇 - 寮€鍙戣<E98D99>褰?
> **日期:** 2026-01-07
> **开发者:** PKB开发团队
> **版本:** v1.0
> **状态:** ✅ 基础框架完成,待细化优化
> **鏃ユ湡锛?* 2026-01-07
> **寮€鍙戣€咃細** PKB寮€鍙戝洟闃?
> **鐗堟湰锛?* v1.0
> **鐘舵€侊細** 鉁?鍩虹<E98DA9>妗嗘灦瀹屾垚锛屽緟缁嗗寲浼樺寲
---
@@ -13,119 +13,119 @@
1. **鍚庣<E98D9A>妯″潡杩佺Щ**锛氬皢PKB鍚庣<E98D9A>爜杩佺Щ鍒版柊鐨勬ā鍧楀寲鏋舵瀯
2. **鍓嶇<E98D93>V3璁捐<E79281>瀹炵幇**锛氬熀浜庡師鍨嬪浘瀹炵幇Dashboard鍜學orkspace椤甸潰
3. **3种工作模式实现**:全文阅读、逐篇精读、批处理
3. **3绉嶅伐浣滄ā寮忓疄鐜?*锛氬叏鏂囬槄璇汇€侀€愮瘒绮捐<E7BBAE>銆佹壒澶勭悊
4. **Chat缁勪欢闆嗘垚**锛氫娇鐢ˋnt Design X Chat缁勪欢瀹炵幇AI瀵硅瘽
---
## ✅ 完成的工作
## 鉁?瀹屾垚鐨勫伐浣?
### 1. 鍚庣<E98D9A>妯″潡杩佺Щ
**迁移内容**
- 将Controller、Service、Route代码迁移到 `backend/src/modules/pkb/`
**杩佺Щ鍐呭<EFBFBD>**锛?
- 灏咰ontroller銆丼ervice銆丷oute浠g爜杩佺Щ鍒?`backend/src/modules/pkb/`
- 鏇存柊import璺<74>
- 注册新API路由 `/api/v2/pkb/*`
- 娉ㄥ唽鏂癆PI璺<EFBFBD> `/api/v1/pkb/*`
- 淇濇寔鏃х増璺<E5A297>`/api/v1/knowledge*` 鍏煎<E98D8F>
**目录结构**
**<EFBFBD>綍缁撴瀯**锛?
```
backend/src/modules/pkb/
鈹溾攢鈹€ controllers/
│ ├── knowledgeBaseController.ts
│ ├── documentController.ts
│ └── batchController.ts
鈹? 鈹溾攢鈹€ knowledgeBaseController.ts
鈹? 鈹溾攢鈹€ documentController.ts
鈹? 鈹斺攢鈹€ batchController.ts
鈹溾攢鈹€ services/
│ ├── knowledgeBaseService.ts
│ ├── documentService.ts
│ └── batchService.ts
鈹? 鈹溾攢鈹€ knowledgeBaseService.ts
鈹? 鈹溾攢鈹€ documentService.ts
鈹? 鈹斺攢鈹€ batchService.ts
鈹溾攢鈹€ routes/
│ └── index.ts
鈹? 鈹斺攢鈹€ index.ts
鈹斺攢鈹€ index.ts
```
**路由注册**
- v2路由:`/api/v2/pkb/knowledge`(新架构)
**<EFBFBD>敱娉ㄥ唽**锛?
- v2<EFBFBD>敱锛歚/api/v1/pkb/knowledge`锛堟柊鏋舵瀯锛?
- v1璺<31>敱锛歚/api/v1/knowledge`銆乣/api/v1/batch-tasks`锛堝吋瀹癸級
### 2. 鍓嶇<E98D93>V3璁捐<E79281>瀹炵幇
**基于原型图**
- `知识库仪表盘V5.html` DashboardPage
- `工作台V3.html` WorkspacePage
**鍩轰簬鍘熷瀷鍥?*锛?
- `鐭ヨ瘑搴撲华琛ㄧ洏V5.html` 鈫?DashboardPage
- `宸ヤ綔鍙癡3.html` 鈫?WorkspacePage
**前端目录结构**
**鍓嶇<EFBFBD><EFBFBD>綍缁撴瀯**锛?
```
frontend-v2/src/modules/pkb/
鈹溾攢鈹€ api/
│ └── knowledgeBaseApi.ts # API客户端
鈹? 鈹斺攢鈹€ knowledgeBaseApi.ts # API瀹㈡埛绔?
鈹溾攢鈹€ stores/
│ └── useKnowledgeBaseStore.ts # Zustand状态管理
鈹? 鈹斺攢鈹€ useKnowledgeBaseStore.ts # Zustand鐘舵€佺<EFBFBD>鐞?
鈹溾攢鈹€ pages/
│ ├── DashboardPage.tsx # 仪表盘页面
│ └── WorkspacePage.tsx # 工作台页面
鈹? 鈹溾攢鈹€ DashboardPage.tsx # <EFBFBD>〃鐩橀〉闈?
鈹? 鈹斺攢鈹€ WorkspacePage.tsx # 宸ヤ綔鍙伴〉闈?
鈹溾攢鈹€ components/
│ └── Workspace/
├── WorkModeSelector.tsx # 工作模式选择器
├── FullTextMode.tsx # 全文阅读模式
├── DeepReadMode.tsx # 逐篇精读模式
├── BatchMode.tsx # 批处理模式
└── BatchModeComplete.tsx # 批处理完整实现
鈹? 鈹斺攢鈹€ Workspace/
鈹? 鈹溾攢鈹€ WorkModeSelector.tsx # 宸ヤ綔妯″紡閫夋嫨鍣?
鈹? 鈹溾攢鈹€ FullTextMode.tsx # 鍏ㄦ枃闃呰<EFBFBD>妯″紡
鈹? 鈹溾攢鈹€ DeepReadMode.tsx # 閫愮瘒绮捐<EFBFBD>妯″紡
鈹? 鈹溾攢鈹€ BatchMode.tsx # 鎵瑰<EFBFBD>鐞嗘ā寮?
鈹? 鈹斺攢鈹€ BatchModeComplete.tsx # 鎵瑰<EFBFBD>鐞嗗畬鏁村疄鐜?
鈹溾攢鈹€ hooks/
│ └── useWorkMode.ts # 工作模式Hook
鈹? 鈹斺攢鈹€ useWorkMode.ts # 宸ヤ綔妯″紡Hook
鈹溾攢鈹€ types/
│ └── index.ts # 类型定义
鈹? 鈹斺攢鈹€ index.ts # 绫诲瀷瀹氫箟
鈹斺攢鈹€ styles/
└── workspace.css # 自定义样式
鈹斺攢鈹€ workspace.css # <EFBFBD>畾涔夋牱寮?
```
### 3. WorkspacePage甯冨眬璁捐<E79281>
**最终采用的布局**
**鏈€缁堥噰鐢ㄧ殑甯冨眬**锛?
```
┌─────────────────────────────────────────────────┐
│ [返回] │ 知识库名 │ [问答][资产] │ 设置 头像 │ Header 56px
├─────────────────────────────────────────────────┤
│ [工作模式▼] [文档▼] 已加载 x/y 篇 │ 工作模式栏 40px
├─────────────────────────────────────────────────┤
聊天区域(最大化)
└─────────────────────────────────────────────────┘
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?[杩斿洖] 鈹?鐭ヨ瘑搴撳悕 鈹?[闂<>瓟][璧勪骇] 鈹?璁剧疆 澶村儚 鈹?Header 56px
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?[宸ヤ綔妯″紡鈻糫 [鏂囨。鈻糫 宸插姞杞?x/y 绡?鈹?宸ヤ綔妯″紡鏍?40px
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 鈹?
鈹? 鑱婂ぉ鍖哄煙锛堟渶澶у寲锛? 鈹?
鈹? 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
```
**设计特点**
**璁捐<EFBFBD>鐗圭偣**锛?
- 鍗曞眰Header鏁村悎瀵艰埅鍜孴ab鍒囨崲
- 紧凑的工作模式选择栏
- 最大化的聊天区域
- 全屏模式fixed定位
- 绱у噾鐨勫伐浣滄ā寮忛€夋嫨鏍?
- 鏈€澶у寲鐨勮亰澶╁尯鍩?
- 鍏ㄥ睆妯″紡锛坒ixed瀹氫綅锛?
### 4. 3种工作模式
### 4. 3绉嶅伐浣滄ā寮?
| 妯″紡 | 璇存槑 | 鍚庣<E98D9A>API |
|------|------|---------|
| **鍏ㄦ枃闃呰<E99783>** | 鍔犺浇鍏ㄩ儴鏂囨。锛孉I鍏峰<E98D8F>鍏ㄧ煡瑙嗚<E79199> | `/api/v1/chat/stream` |
| **逐篇精读** | 选择1-5篇文档深度解读 | `/api/v1/chat/stream` |
| **批处理** | 批量提取信息,生成结构化表格 | `/api/v1/batch-tasks` |
| **閫愮瘒绮捐<EFBFBD>** | 閫夋嫨1-5绡囨枃妗繁搴﹁В璇?| `/api/v1/chat/stream` |
| **鎵瑰<EFBFBD>鐞?* | 鎵归噺鎻愬彇淇℃伅锛岀敓鎴愮粨鏋勫寲琛ㄦ牸 | `/api/v1/batch-tasks` |
### 5. Chat缁勪欢闆嗘垚
**使用Ant Design X Chat组件**
**浣跨敤Ant Design X Chat缁勪欢**锛?
- 澶嶇敤 `frontend-v2/src/shared/components/Chat/`
-<>寔SSE娴佸紡鍝嶅簲
-<>畾涔夋秷鎭<E7A7B7>覆鏌擄紙寮曠敤鏍煎紡鍖栵級
- 上下文管理
- 涓婁笅鏂囩<EFBFBD>鐞?
---
## 🔧 技术细节
## 馃敡 鎶€鏈<E282AC>粏鑺?
### API璋冪敤閰嶇疆
```typescript
// knowledgeBaseApi.ts
const api = axios.create({
baseURL: `${API_BASE_URL}/api/v2/pkb`,
baseURL: `${API_BASE_URL}/api/v1/pkb`,
timeout: 30000,
});
@@ -135,20 +135,20 @@ const chatApi = axios.create({
});
```
### 状态管理
### 鐘舵€佺<EFBFBD>鐞?
浣跨敤Zustand绠悊鍏ㄥ眬鐘舵€侊細
- 知识库列表
- 当前知识库
- 鐭ヨ瘑搴撳垪琛?
- 褰撳墠鐭ヨ瘑搴?
- 鏂囨。鍒楄〃
- 宸ヤ綔妯″紡
- 选中的文档
- 閫変腑鐨勬枃妗?
### 鏍峰紡鏂规<E98F82>
- TailwindCSS浣滀负涓昏<E6B693>鏍峰紡鏂规<E98F82>
- Ant Design组件库
- 自定义CSS处理特殊样式workspace.css
- Ant Design缁勪欢搴?
- <EFBFBD>畾涔塁SS澶勭悊鐗规畩鏍峰紡锛坵orkspace.css锛?
---
@@ -156,32 +156,32 @@ const chatApi = axios.create({
### 1. 鎵瑰<E98EB5>鐞嗘墽琛屽姛鑳藉緟璋冭瘯
- **闂<><E99782>**锛氭壒澶勭悊妯″紡鏃犳硶鎵ц<E98EB5>
- **原因**后端API `/api/v1/batch-tasks` 需要验证
- **优先级**:🔴 高
- **鍘熷洜**锛氬悗绔疉PI `/api/v1/batch-tasks` 闇€瑕侀獙璇?
- **浼樺厛绾?*锛氿煍?楂?
### 2. 知识资产页面导航条
### 2. 鐭ヨ瘑璧勪骇椤甸潰瀵艰埅鏉?
- **闂<><E99782>**锛氱煡璇嗚祫浜ч〉闈㈢己灏戝<E7818F><EFBFBD>
- **影响**:用户无法在资产页面进行筛选操作
- **优先级**:🟡 中
- **褰卞搷**锛氱敤鎴锋棤娉曞湪璧勪骇椤甸潰杩涜<E69DA9>绛涢€夋搷浣?
- **浼樺厛绾?*锛氿煙?涓?
### 3. UI精细化
- **问题**:与原型图仍有差距,需要进一步优化
- **影响**:用户体验
- **优先级**:🟡 中
### 3. UI绮剧粏鍖?
- **<EFBFBD><EFBFBD>**锛氫笌鍘熷瀷鍥句粛鏈夊樊璺濓紝闇€瑕佽繘涓€姝ヤ紭鍖?
- **褰卞搷**锛氱敤鎴蜂綋楠?
- **浼樺厛绾?*锛氿煙?涓?
---
## 📝 下一步计划
## 馃摑 涓嬩竴姝ヨ<E5A79D>鍒?
### 楂樹紭鍏堢骇
1. 璋冭瘯鎵瑰<E98EB5>鐞咥PI鎵ц<E98EB5>鍔熻兘
2. 完善知识资产页面导航条
3. 引用格式化优化
2. 瀹屽杽鐭ヨ瘑璧勪骇椤甸潰瀵艰埅鏉?
3. 寮曠敤鏍煎紡鍖栦紭鍖?
### 涓<>紭鍏堢骇
4. UI精细化(与原型图对比优化)
4. UI绮剧粏鍖栵紙涓庡師鍨嬪浘瀵规瘮浼樺寲锛?
5. 閿欒<E996BF>澶勭悊瀹屽杽
6. 加载状态优化
6. 鍔犺浇鐘舵€佷紭鍖?
### 浣庝紭鍏堢骇
7. RAG妫€绱㈡ā寮忓疄鐜帮紙鍚庣<E98D9A>寰呭紑鍙戯級
@@ -194,39 +194,40 @@ const chatApi = axios.create({
| 鏂囦欢 | 琛屾暟 | 璇存槑 |
|------|------|------|
| WorkspacePage.tsx | ~513 | 宸ヤ綔鍙颁富椤甸潰 |
| DashboardPage.tsx | ~450 | 仪表盘页面 |
| BatchModeComplete.tsx | ~511 | 批处理完整实现 |
| WorkModeSelector.tsx | ~200 | 工作模式选择器 |
| DashboardPage.tsx | ~450 | <EFBFBD>〃鐩橀〉闈?|
| BatchModeComplete.tsx | ~511 | 鎵瑰<EFBFBD>鐞嗗畬鏁村疄鐜?|
| WorkModeSelector.tsx | ~200 | 宸ヤ綔妯″紡閫夋嫨鍣?|
| FullTextMode.tsx | ~150 | 鍏ㄦ枃闃呰<E99783>妯″紡 |
| DeepReadMode.tsx | ~150 | 閫愮瘒绮捐<E7BBAE>妯″紡 |
| knowledgeBaseApi.ts | ~200 | API客户端 |
| useKnowledgeBaseStore.ts | ~150 | 状态管理 |
| **总计** | **~2300行** | PKB前端模块 |
| knowledgeBaseApi.ts | ~200 | API瀹㈡埛绔?|
| useKnowledgeBaseStore.ts | ~150 | 鐘舵€佺<EFBFBD>鐞?|
| **鎬昏<EFBFBD>** | **~2300琛?* | PKB鍓嶇<EFBFBD>妯″潡 |
---
## 馃幆 鎬荤粨
浠婂ぉ瀹屾垚浜哖KB妯″潡鐨勬牳蹇冨墠绔<EFBFBD><EFBFBD>鏋舵惌寤猴紝瀹炵幇浜嗭細
- ✅ 后端模块迁移和路由注册
- ✅ 前端V3设计基础实现
- ✅ 3种工作模式框架
- Chat组件集成
- ✅ 响应式布局
- 鉁?鍚庣<E98D9A>妯″潡杩佺Щ鍜岃矾鐢辨敞鍐?
- 鉁?鍓嶇<E98D93>V3璁捐<E79281>鍩虹<E98DA9>瀹炵幇
- 鉁?3绉嶅伐浣滄ā寮忔<E5AFAE>鏋?
- 鉁?Chat缁勪欢闆嗘垚
- 鉁?鍝嶅簲寮忓竷灞€
虽然还有一些功能需要调试和优化,但整体架构已经搭建完成,可以作为后续开发的基础。
铏界劧杩樻湁涓€浜涘姛鑳介渶瑕佽皟璇曞拰浼樺寲锛屼絾鏁翠綋鏋舵瀯宸茬粡鎼<EFBFBD>缓瀹屾垚锛屽彲浠ヤ綔涓哄悗缁<EFBFBD>紑鍙戠殑鍩虹<EFBFBD>銆?
---
**Git提交**
**Git鎻愪氦**锛?
```
5a17d09 feat(pkb): Complete PKB module frontend migration with V3 design
```
---
**文档编写时间**2026-01-07
**下次更新**:批处理功能调试完成后
**鏂囨。缂栧啓鏃堕棿**锛?026-01-07
**涓嬫<EFBFBD>鏇存柊**锛氭壒澶勭悊鍔熻兘璋冭瘯瀹屾垚鍚?