From 16697df76d7b27ff65d229937b3f3ac4cc0e56a0 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 09 六月 2026 17:27:27 +0800
Subject: [PATCH] docs(knowledge-base): 添加知识库模块传参方式和参数命名规范文档

---
 src/api/collaborativeApproval/knowledgeBase.js          |  172 +++++--
 doc/知识库模块传参方式和参数命名规范文档.md                               |  941 ++++++++++++++++++++++++++++++++++++++++++++
 src/views/collaborativeApproval/knowledgeBase/index.vue |  126 ++++-
 3 files changed, 1,146 insertions(+), 93 deletions(-)

diff --git "a/doc/\347\237\245\350\257\206\345\272\223\346\250\241\345\235\227\344\274\240\345\217\202\346\226\271\345\274\217\345\222\214\345\217\202\346\225\260\345\221\275\345\220\215\350\247\204\350\214\203\346\226\207\346\241\243.md" "b/doc/\347\237\245\350\257\206\345\272\223\346\250\241\345\235\227\344\274\240\345\217\202\346\226\271\345\274\217\345\222\214\345\217\202\346\225\260\345\221\275\345\220\215\350\247\204\350\214\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..e962ac2
--- /dev/null
+++ "b/doc/\347\237\245\350\257\206\345\272\223\346\250\241\345\235\227\344\274\240\345\217\202\346\226\271\345\274\217\345\222\214\345\217\202\346\225\260\345\221\275\345\220\215\350\247\204\350\214\203\346\226\207\346\241\243.md"
@@ -0,0 +1,941 @@
+# 鐭ヨ瘑搴撴ā鍧椾紶鍙傛柟寮忓拰鍙傛暟鍛藉悕瑙勮寖鏂囨。
+
+## 涓�銆佹杩�
+
+鏈枃妗h缁嗚鏄庣煡璇嗗簱妯″潡涓墍鏈夋帴鍙c�佺粍浠躲�佹柟娉曠殑浼犲弬鏂瑰紡鍜屽弬鏁板懡鍚嶈鑼�,鏃ㄥ湪:
+- 缁熶竴鍓嶅悗绔弬鏁板懡鍚嶈鑼�
+- 鏄庣‘鍙傛暟绫诲瀷鍜屽繀濉��
+- 瑙勮寖浼犲弬鏂瑰紡(GET params銆丳OST body銆丏ELETE data)
+- 鎻愪緵娓呮櫚鐨勫弬鏁版槧灏勫叧绯�
+
+---
+
+## 浜屻�佸弬鏁板懡鍚嶈鑼�
+
+### 2.1 鍩烘湰瑙勮寖
+
+#### 鍛藉悕椋庢牸
+- **鍚庣鍙傛暟**: 閬靛惊 Java 椹煎嘲鍛藉悕娉� (camelCase)
+- **鍓嶇鍙傛暟**: 閬靛惊 JavaScript 椹煎嘲鍛藉悕娉� (camelCase)
+- **鏁版嵁搴撳瓧娈�**: 閬靛惊 MySQL 涓嬪垝绾垮懡鍚嶆硶 (snake_case)
+- **鎺ュ彛URL**: 閬靛惊 RESTful 椋庢牸,浣跨敤灏忓啓鍜岃繛瀛楃
+
+#### 鍛藉悕绾﹀畾
+1. **ID鐩稿叧**: 缁熶竴浣跨敤 `id`銆乣Id` 鍚庣紑
+   - `knowledgeBaseId` - 鐭ヨ瘑搴揑D
+   - `storageBlobId` - 鏂囦欢blob ID
+   - `vectorId` - 鍚戦噺璁板綍ID
+   - `memoryId` - 浼氳瘽ID
+
+2. **鍒楄〃鐩稿叧**: 缁熶竴浣跨敤 `Ids` 鍚庣紑鎴栨暟缁勭被鍨�
+   - `storageBlobIds` - 鏂囦欢blob ID鍒楄〃
+   - `ids` - 閫氱敤ID鍒楄〃
+
+3. **鐘舵�佺浉鍏�**: 缁熶竴浣跨敤 `Status` 鍚庣紑
+   - `vectorStatus` - 鍚戦噺鍖栫姸鎬�
+
+4. **鏁伴噺鐩稿叧**: 缁熶竴浣跨敤 `Count` 鍚庣紑
+   - `fileCount` - 鏂囦欢鏁伴噺
+   - `chunkCount` - 鍒囩墖鏁伴噺
+   - `totalChunkCount` - 鎬诲垏鐗囨暟閲�
+   - `usageCount` - 浣跨敤娆℃暟
+
+5. **鏃堕棿鐩稿叧**: 缁熶竴浣跨敤 `Time` 鍚庣紑
+   - `createTime` - 鍒涘缓鏃堕棿
+   - `updateTime` - 鏇存柊鏃堕棿
+
+---
+
+## 涓夈�佹帴鍙d紶鍙傛柟寮忚鑼�
+
+### 3.1 GET 璇锋眰 - 浣跨敤 params
+
+**閫傜敤鍦烘櫙**: 鏌ヨ銆佸垪琛ㄣ�佸垎椤电瓑鑾峰彇鏁版嵁鐨勬帴鍙�
+
+**浼犲弬鏂瑰紡**: 閫氳繃 URL 鍙傛暟浼犻��,浣跨敤 `params`
+
+**绀轰緥**:
+```javascript
+// 鏌ヨ鐭ヨ瘑搴撳垪琛�
+export function listKnowledgeBase(query) {
+  return request({
+    url: "/knowledgeBase/getList",
+    method: "get",
+    params: query,  // 鉁� GET璇锋眰浣跨敤 params
+  });
+}
+
+// 瀹為檯璋冪敤
+listKnowledgeBase({
+  current: 1,      // 褰撳墠椤电爜
+  size: 20,        // 姣忛〉鏉℃暟
+  title: "",       // 鐭ヨ瘑鏍囬(鍙��)
+  type: ""         // 鐭ヨ瘑绫诲瀷(鍙��)
+});
+```
+
+**URL鏍煎紡**: `/knowledgeBase/getList?current=1&size=20&title=&type=`
+
+**瑙勮寖瑕佺偣**:
+- 鉁� 鏌ヨ鍙傛暟缁熶竴鏀惧湪 `params` 涓�
+- 鉁� 鍒嗛〉鍙傛暟鍛藉悕: `current` (褰撳墠椤�)銆乣size` (姣忛〉鏉℃暟)
+- 鉁� 鎼滅储鍙傛暟鍛藉悕: 涓庡疄浣撳瓧娈典繚鎸佷竴鑷�
+- 鉁� 璺緞鍙傛暟浣跨敤 URL 鍗犱綅绗�: `/path/{id}`
+
+---
+
+### 3.2 POST 璇锋眰 - 浣跨敤 data
+
+**閫傜敤鍦烘櫙**: 鏂板銆佹洿鏂般�佷繚瀛樼瓑鎻愪氦鏁版嵁鐨勬帴鍙�
+
+**浼犲弬鏂瑰紡**: 閫氳繃璇锋眰浣撲紶閫�,浣跨敤 `data`
+
+**绀轰緥**:
+```javascript
+// 鏂板鐭ヨ瘑搴�
+export function addKnowledgeBase(data) {
+  return request({
+    url: "/knowledgeBase/add",
+    method: "post",
+    data: data,  // 鉁� POST璇锋眰浣跨敤 data
+  });
+}
+
+// 瀹為檯璋冪敤
+addKnowledgeBase({
+  title: "鎿嶄綔鎵嬪唽",
+  type: "guide",
+  scenario: "绯荤粺鎿嶄綔鎸囧",
+  efficiency: "high",
+  problem: "鐢ㄦ埛涓嶄細鎿嶄綔绯荤粺",
+  solution: "鎸夌収鎿嶄綔鎵嬪唽鎵ц...",
+  keyPoints: "姝ラ1,姝ラ2,姝ラ3",
+  creator: "寮犱笁",
+  usageCount: 0
+});
+```
+
+**璇锋眰浣撴牸寮�**: JSON 鏍煎紡,`Content-Type: application/json`
+
+**瑙勮寖瑕佺偣**:
+- 鉁� 鎻愪氦鏁版嵁缁熶竴鏀惧湪 `data` 涓�
+- 鉁� 鍙傛暟鍚嶄笌鍚庣瀹炰綋瀛楁淇濇寔涓�鑷�
+- 鉁� 蹇呭~鍙傛暟闇�瑕佸湪琛ㄥ崟楠岃瘉瑙勫垯涓0鏄�
+- 鉁� 鏁板�肩被鍨嬪弬鏁伴渶鎸囧畾榛樿鍊�
+
+---
+
+### 3.3 DELETE 璇锋眰 - 浣跨敤 data
+
+**閫傜敤鍦烘櫙**: 鍒犻櫎銆佹壒閲忓垹闄ょ瓑鎿嶄綔
+
+**浼犲弬鏂瑰紡**: 閫氳繃璇锋眰浣撲紶閫掓暟缁勬垨瀵硅薄,浣跨敤 `data`
+
+**绀轰緥**:
+```javascript
+// 鍒犻櫎鐭ヨ瘑搴�
+export function delKnowledgeBase(query) {
+  return request({
+    url: "/knowledgeBase/delete",
+    method: "delete",
+    data: query,  // 鉁� DELETE璇锋眰浣跨敤 data 浼犻�掓暟缁�
+  });
+}
+
+// 瀹為檯璋冪敤(鎵归噺鍒犻櫎)
+delKnowledgeBase([1, 2, 3]);  // 鉁� 鐩存帴浼犻�扞D鏁扮粍
+```
+
+**璇锋眰浣撴牸寮�**: JSON 鏁扮粍 `[1, 2, 3]`
+
+**瑙勮寖瑕佺偣**:
+- 鉁� DELETE璇锋眰鐨勫弬鏁版斁鍦� `data` 涓�
+- 鉁� 鎵归噺鍒犻櫎浼犻�扞D鏁扮粍
+- 鉁� 鍗曚釜鍒犻櫎涔熷彲浠ヤ紶閫掓暟缁� `[id]`
+- 鈿狅笍 涓嶈浣跨敤 `params` 浼犻�掑垹闄ゅ弬鏁�
+
+---
+
+### 3.4 娴佸紡璇锋眰 - 浣跨敤 Fetch API
+
+**閫傜敤鍦烘櫙**: AI闂瓟銆佹祦寮忚緭鍑虹瓑闇�瑕佸疄鏃跺搷搴旂殑鎺ュ彛
+
+**浼犲弬鏂瑰紡**: 浣跨敤鍘熺敓 Fetch API,涓嶆敮鎸� axios
+
+**绀轰緥**:
+```javascript
+// 鐭ヨ瘑搴撻棶绛�(娴佸紡)
+export function knowledgeChat(data) {
+  const token = getToken();
+  return fetch(import.meta.env.VITE_APP_BASE_API + '/ai/knowledge/chat', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+      'Authorization': 'Bearer ' + token
+    },
+    body: JSON.stringify(data)  // 鉁� 浣跨敤 body 浼犻�掑弬鏁�
+  });
+}
+
+// 瀹為檯璋冪敤
+knowledgeChat({
+  knowledgeBaseId: 10,
+  memoryId: "session-xxx",
+  question: "濡備綍鎿嶄綔瀹℃壒娴佺▼?"
+});
+```
+
+**瑙勮寖瑕佺偣**:
+- 鉁� 娴佸紡鎺ュ彛蹇呴』浣跨敤 Fetch API
+- 鉁� 鍙傛暟浣跨敤 `JSON.stringify()` 搴忓垪鍖�
+- 鉁� 蹇呴』鎼哄甫 Authorization header
+- 鈿狅笍 axios 涓嶆敮鎸佹祦寮忓搷搴�,涓嶈浣跨敤
+
+---
+
+## 鍥涖�佸畬鏁村弬鏁板鐓ц〃
+
+### 4.1 鐭ヨ瘑搴撶鐞嗘帴鍙e弬鏁�
+
+#### 鏌ヨ鍒楄〃 (`GET /knowledgeBase/getList`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| current | Integer | 鏄� | params | 褰撳墠椤电爜 | 1 |
+| size | Integer | 鏄� | params | 姣忛〉鏉℃暟 | 20 |
+| title | String | 鍚� | params | 鐭ヨ瘑鏍囬(妯$硦鎼滅储) | "鎿嶄綔" |
+| type | String | 鍚� | params | 鐭ヨ瘑绫诲瀷(绮剧‘鍖归厤) | "guide" |
+
+**鍓嶇璋冪敤**:
+```javascript
+listKnowledgeBase({
+  current: 1,
+  size: 20,
+  title: "",
+  type: ""
+});
+```
+
+---
+
+#### 鏂板鐭ヨ瘑搴� (`POST /knowledgeBase/add`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| title | String | 鏄� | data | 鐭ヨ瘑鏍囬 | "鎿嶄綔鎵嬪唽" |
+| type | String | 鏄� | data | 鐭ヨ瘑绫诲瀷 | "guide" |
+| scenario | String | 鍚� | data | 閫傜敤鍦烘櫙 | "绯荤粺鎿嶄綔" |
+| efficiency | String | 鍚� | data | 瑙e喅鏁堢巼 | "high" |
+| problem | String | 鏄� | data | 闂鎻忚堪 | "鐢ㄦ埛涓嶄細鎿嶄綔" |
+| solution | String | 鏄� | data | 瑙e喅鏂规 | "鍙傝�冩墜鍐�" |
+| keyPoints | String | 鍚� | data | 鍏抽敭瑕佺偣 | "姝ラ1,姝ラ2" |
+| creator | String | 鍚� | data | 鍒涘缓浜� | "寮犱笁" |
+| usageCount | Integer | 鍚� | data | 浣跨敤娆℃暟 | 0 |
+
+**鍓嶇璋冪敤**:
+```javascript
+addKnowledgeBase({
+  title: "鎿嶄綔鎵嬪唽",
+  type: "guide",
+  scenario: "绯荤粺鎿嶄綔鎸囧",
+  efficiency: "high",
+  problem: "鐢ㄦ埛涓嶄細鎿嶄綔绯荤粺",
+  solution: "鎸夌収鎿嶄綔鎵嬪唽鎵ц...",
+  keyPoints: "姝ラ1,姝ラ2,姝ラ3",
+  creator: "寮犱笁",
+  usageCount: 0
+});
+```
+
+---
+
+#### 鏇存柊鐭ヨ瘑搴� (`POST /knowledgeBase/update`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| id | Long | 鏄� | data | 鐭ヨ瘑搴揑D | 10 |
+| *(鍏朵粬鍙傛暟鍚屾柊澧�)* | - | - | data | - | - |
+
+**鍓嶇璋冪敤**:
+```javascript
+updateKnowledgeBase({
+  id: 10,
+  title: "鎿嶄綔鎵嬪唽(鏇存柊)",
+  type: "guide",
+  // ...鍏朵粬鍙傛暟
+});
+```
+
+---
+
+#### 鍒犻櫎鐭ヨ瘑搴� (`DELETE /knowledgeBase/delete`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| ids | Long[] | 鏄� | data | 鐭ヨ瘑搴揑D鏁扮粍 | [1, 2, 3] |
+
+**鍓嶇璋冪敤**:
+```javascript
+delKnowledgeBase([1, 2, 3]);
+```
+
+---
+
+### 4.2 鏂囦欢绠$悊鎺ュ彛鍙傛暟
+
+#### 鏌ヨ鍚戦噺鍖栫姸鎬� (`GET /knowledgeBase/vector/status/{knowledgeBaseId}`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| knowledgeBaseId | Long | 鏄� | URL璺緞 | 鐭ヨ瘑搴揑D | 10 |
+
+**鍓嶇璋冪敤**:
+```javascript
+getVectorStatus(10);
+```
+
+**URL**: `/knowledgeBase/vector/status/10`
+
+---
+
+#### 淇濆瓨鏂囦欢鍏宠仈 (`POST /knowledgeBase/file/save`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| knowledgeBaseId | Long | 鏄� | data | 鐭ヨ瘑搴揑D | 10 |
+| storageBlobIds | Long[] | 鏄� | data | 鏂囦欢blob ID鏁扮粍 | [123, 124] |
+
+**鍓嶇璋冪敤**:
+```javascript
+saveKnowledgeBaseFiles({
+  knowledgeBaseId: 10,
+  storageBlobIds: [123, 124]
+});
+```
+
+**閲嶈璇存槑**:
+- 鈿狅笍 **蹇呴』鍏堣皟鐢� `/common/upload` 涓婁紶鏂囦欢**
+- 鈿狅笍 **鑾峰彇杩斿洖鐨� `data.id` 浣滀负 `storageBlobId`**
+- 鈿狅笍 **姝ゆ帴鍙hЕ鍙戝紓姝ュ悜閲忓寲澶勭悊**
+
+---
+
+#### 鍒犻櫎鐭ヨ瘑搴撴枃浠� (`DELETE /knowledgeBase/file/delete`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| ids | Long[] | 鏄� | data | 鍚戦噺璁板綍ID鏁扮粍 | [1, 2, 3] |
+
+**鍓嶇璋冪敤**:
+```javascript
+deleteKnowledgeBaseFile([row.id]);
+// 娉ㄦ剰: row.id 鏄悜閲忚褰曠殑ID,涓嶆槸 storageBlobId
+```
+
+---
+
+#### 閲嶆柊鍚戦噺鍖� (`POST /knowledgeBase/vector/reprocess/{vectorId}`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| vectorId | Long | 鏄� | URL璺緞 | 鍚戦噺璁板綍ID | 1 |
+
+**鍓嶇璋冪敤**:
+```javascript
+reprocessVector(1);
+```
+
+**URL**: `/knowledgeBase/vector/reprocess/1`
+
+---
+
+### 4.3 鐭ヨ瘑闂瓟鎺ュ彛鍙傛暟
+
+#### 鐭ヨ瘑搴撻棶绛� (`POST /ai/knowledge/chat` - 娴佸紡)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| knowledgeBaseId | Long | 鏄� | body | 鐭ヨ瘑搴揑D | 10 |
+| memoryId | String | 鏄� | body | 浼氳瘽ID | "kb-chat-xxx" |
+| question | String | 鏄� | body | 鐢ㄦ埛闂 | "濡備綍鎿嶄綔?" |
+
+**鍓嶇璋冪敤**:
+```javascript
+knowledgeChat({
+  knowledgeBaseId: chatKnowledgeBaseId.value,
+  memoryId: memoryId.value,
+  question: currentQuestion
+});
+```
+
+**浼氳瘽ID鐢熸垚瑙勮寖**:
+```javascript
+// 鏂瑰紡1: 浣跨敤 crypto.randomUUID() (鎺ㄨ崘)
+memoryId.value = crypto.randomUUID();
+
+// 鏂瑰紡2: 浣跨敤鏃堕棿鎴�
+memoryId.value = 'kb-chat-' + Date.now();
+```
+
+---
+
+#### 鏌ヨ闂瓟鍘嗗彶 (`GET /ai/knowledge/history/{memoryId}`)
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 浼犲弬浣嶇疆 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|----------|------|--------|
+| memoryId | String | 鏄� | URL璺緞 | 浼氳瘽ID | "kb-chat-xxx" |
+
+**鍓嶇璋冪敤**:
+```javascript
+getKnowledgeHistory('kb-chat-xxx');
+```
+
+---
+
+## 浜斻�佸搷搴旀暟鎹瓧娈靛鐓ц〃
+
+### 5.1 鐭ヨ瘑搴撳垪琛ㄥ搷搴�
+
+```javascript
+{
+  code: 200,
+  data: {
+    total: 100,
+    records: [
+      {
+        id: 1,                     // 鐭ヨ瘑搴揑D
+        title: "鎿嶄綔鎵嬪唽",          // 鐭ヨ瘑鏍囬
+        type: "guide",             // 鐭ヨ瘑绫诲瀷
+        scenario: "绯荤粺鎿嶄綔",       // 閫傜敤鍦烘櫙
+        efficiency: "high",        // 瑙e喅鏁堢巼
+        problem: "...",            // 闂鎻忚堪
+        solution: "...",           // 瑙e喅鏂规
+        keyPoints: "...",          // 鍏抽敭瑕佺偣
+        creator: "寮犱笁",           // 鍒涘缓浜�
+        usageCount: 10,            // 浣跨敤娆℃暟
+        fileCount: 3,              // 鏂囦欢鏁伴噺
+        totalChunkCount: 45,       // 鎬诲垏鐗囨暟閲�
+        createTime: "2026-06-08",  // 鍒涘缓鏃堕棿
+        updateTime: "2026-06-08"   // 鏇存柊鏃堕棿
+      }
+    ]
+  }
+}
+```
+
+---
+
+### 5.2 鏂囦欢鍚戦噺鍖栫姸鎬佸搷搴�
+
+```javascript
+{
+  code: 200,
+  data: [
+    {
+      id: 1,                      // 鍚戦噺璁板綍ID
+      storageBlobId: 123,         // 鏂囦欢blob ID
+      fileName: "鎿嶄綔鎵嬪唽.docx",  // 鏂囦欢鍚�
+      fileType: "docx",           // 鏂囦欢绫诲瀷
+      vectorStatus: 2,            // 鍚戦噺鍖栫姸鎬�: 0-寰呭鐞�, 1-澶勭悊涓�, 2-宸插畬鎴�, 3-澶辫触
+      chunkCount: 15,             // 鍒囩墖鏁伴噺
+      namespace: "kb-10",         // 鍚戦噺鍛藉悕绌洪棿
+      vectorError: null,          // 鍚戦噺鍖栭敊璇俊鎭�
+      createTime: "2026-06-08"    // 鍒涘缓鏃堕棿
+    }
+  ]
+}
+```
+
+---
+
+### 5.3 鏂囦欢涓婁紶鍝嶅簲
+
+```javascript
+{
+  code: 200,
+  data: {
+    id: 123,                      // 鈿狅笍 杩欐槸 storageBlobId,鐢ㄤ簬淇濆瓨鏂囦欢鍏宠仈
+    name: "鎿嶄綔鎵嬪唽.docx",        // 鏂囦欢鍚�
+    url: "/profile/upload/...",   // 鏂囦欢URL
+    previewURL: "...",            // 棰勮URL
+    downloadURL: "..."            // 涓嬭浇URL
+  }
+}
+```
+
+**閲嶈**: 涓婁紶鎴愬姛鍚�,闇�瑕佹彁鍙� `response.data.id` 浣滀负 `storageBlobId`
+
+---
+
+## 鍏�佸墠绔粍浠朵紶鍙傝鑼�
+
+### 6.1 琛ㄦ牸缁勪欢浼犲弬
+
+```vue
+<PIMTable
+  rowKey="id"              <!-- 琛屽敮涓�鏍囪瘑瀛楁 -->
+  :column="tableColumn"    <!-- 鍒楅厤缃� -->
+  :tableData="tableData"   <!-- 琛ㄦ牸鏁版嵁 -->
+  :page="page"             <!-- 鍒嗛〉閰嶇疆 -->
+  :isSelection="true"      <!-- 鏄惁鏀寔閫夋嫨 -->
+  @selection-change="handleSelectionChange"
+  :tableLoading="tableLoading"
+  @pagination="pagination"
+  :total="page.total"
+/>
+```
+
+**鍒嗛〉閰嶇疆**:
+```javascript
+page: {
+  current: 1,    // 褰撳墠椤电爜
+  size: 20,      // 姣忛〉鏉℃暟
+  total: 0       // 鎬昏褰曟暟
+}
+```
+
+---
+
+### 6.2 寮圭獥缁勪欢浼犲弬
+
+```vue
+<FormDialog
+  v-model="dialogVisible"       <!-- 鎺у埗鏄剧ず -->
+  :title="dialogTitle"          <!-- 寮圭獥鏍囬 -->
+  :width="'800px'"              <!-- 寮圭獥瀹藉害 -->
+  @close="closeDialog"          <!-- 鍏抽棴鍥炶皟 -->
+  @confirm="submitForm"         <!-- 纭鍥炶皟 -->
+  @cancel="closeDialog"         <!-- 鍙栨秷鍥炶皟 -->
+>
+  <!-- 寮圭獥鍐呭 -->
+</FormDialog>
+```
+
+---
+
+### 6.3 涓婁紶缁勪欢浼犲弬
+
+```vue
+<el-upload
+  :action="uploadUrl"                    <!-- 涓婁紶鍦板潃 -->
+  :headers="uploadHeaders"              <!-- 璇锋眰澶� -->
+  :on-success="handleUploadSuccess"     <!-- 鎴愬姛鍥炶皟 -->
+  :on-error="handleUploadError"         <!-- 澶辫触鍥炶皟 -->
+  :before-upload="beforeUpload"         <!-- 涓婁紶鍓嶆牎楠� -->
+  multiple                               <!-- 鏀寔澶氶�� -->
+  :show-file-list="false"               <!-- 涓嶆樉绀烘枃浠跺垪琛� -->
+  accept=".txt,.md,.docx,.xlsx,.xls,.pdf"  <!-- 鏂囦欢绫诲瀷闄愬埗 -->
+/>
+```
+
+**涓婁紶閰嶇疆**:
+```javascript
+const uploadUrl = import.meta.env.VITE_APP_BASE_API + "/common/upload";
+const uploadHeaders = {
+  Authorization: "Bearer " + getToken()
+};
+```
+
+---
+
+## 涓冦�佸弬鏁扮被鍨嬭浆鎹㈣鑼�
+
+### 7.1 瀛楃涓茶浆鏁板��
+
+```javascript
+// 鍚庣杩斿洖鐨勬暟鍊煎彲鑳芥槸瀛楃涓�,闇�瑕佽浆鎹�
+const id = Number(row.id);
+const count = parseInt(row.chunkCount, 10);
+```
+
+---
+
+### 7.2 鏁板�艰浆瀛楃涓�
+
+```javascript
+// URL璺緞鍙傛暟闇�瑕佸瓧绗︿覆
+const url = `/knowledgeBase/vector/status/${String(knowledgeBaseId)}`;
+```
+
+---
+
+### 7.3 鏁扮粍澶勭悊
+
+```javascript
+// ID鏁扮粍澶勭悊
+const ids = selection.map(item => item.id);  // 鉁� 鎻愬彇ID
+await delKnowledgeBase(ids);                 // 鉁� 浼犻�掓暟缁�
+
+// 鏂囦欢blob ID鏁扮粍
+const blobIds = uploadedFiles.map(file => file.id);
+await saveKnowledgeBaseFiles({
+  knowledgeBaseId: currentKnowledgeBase.id,
+  storageBlobIds: blobIds
+});
+```
+
+---
+
+## 鍏�佸弬鏁伴獙璇佽鑼�
+
+### 8.1 琛ㄥ崟楠岃瘉瑙勫垯
+
+```javascript
+const rules = {
+  title: [
+    { required: true, message: "璇疯緭鍏ョ煡璇嗘爣棰�", trigger: "blur" }
+  ],
+  type: [
+    { required: true, message: "璇烽�夋嫨鐭ヨ瘑绫诲瀷", trigger: "change" }
+  ],
+  problem: [
+    { required: true, message: "璇锋弿杩伴亣鍒扮殑闂", trigger: "blur" }
+  ],
+  solution: [
+    { required: true, message: "璇疯缁嗘弿杩拌В鍐虫柟妗�", trigger: "blur" }
+  ]
+};
+```
+
+---
+
+### 8.2 涓婁紶鏂囦欢鏍¢獙
+
+```javascript
+const beforeUpload = (file) => {
+  // 鏂囦欢绫诲瀷鏍¢獙
+  const allowedTypes = ['.txt', '.md', '.docx', '.xlsx', '.xls', '.pdf'];
+  const fileName = file.name.toLowerCase();
+  const isAllowed = allowedTypes.some(type => fileName.endsWith(type));
+
+  if (!isAllowed) {
+    ElMessage.error('鍙敮鎸� txt銆乵d銆乨ocx銆亁lsx銆亁ls銆乸df 鏍煎紡鐨勬枃浠�');
+    return false;
+  }
+
+  // 鏂囦欢澶у皬鏍¢獙
+  const isLt50M = file.size / 1024 / 1024 < 50;
+  if (!isLt50M) {
+    ElMessage.error('鏂囦欢澶у皬涓嶈兘瓒呰繃 50MB');
+    return false;
+  }
+
+  return true;
+};
+```
+
+---
+
+### 8.3 闂瓟鍙傛暟鏍¢獙
+
+```javascript
+const sendQuestion = async () => {
+  // 绌哄唴瀹规牎楠�
+  if (!questionInput.value.trim()) {
+    ElMessage.warning("璇疯緭鍏ラ棶棰�");
+    return;
+  }
+
+  // 鐭ヨ瘑搴撻�夋嫨鏍¢獙
+  if (!chatKnowledgeBaseId.value) {
+    ElMessage.warning("璇峰厛閫夋嫨鐭ヨ瘑搴�");
+    return;
+  }
+
+  // 鍙戦�佺姸鎬佹牎楠�
+  if (sending.value) {
+    return;  // 闃叉閲嶅鍙戦��
+  }
+
+  // ...鍙戦�佽姹�
+};
+```
+
+---
+
+## 涔濄�佸父瑙侀敊璇拰瑙e喅鏂规
+
+### 9.1 鍙傛暟鍚嶄笉鍖归厤
+
+**閿欒绀轰緥**:
+```javascript
+// 鉂� 閿欒: 浣跨敤浜嗕笅鍒掔嚎鍛藉悕
+saveKnowledgeBaseFiles({
+  knowledge_base_id: 10,
+  storage_blob_ids: [123]
+});
+
+// 鉁� 姝g‘: 浣跨敤椹煎嘲鍛藉悕
+saveKnowledgeBaseFiles({
+  knowledgeBaseId: 10,
+  storageBlobIds: [123]
+});
+```
+
+---
+
+### 9.2 浼犲弬浣嶇疆閿欒
+
+**閿欒绀轰緥**:
+```javascript
+// 鉂� 閿欒: POST璇锋眰浣跨敤 params
+export function addKnowledgeBase(data) {
+  return request({
+    url: "/knowledgeBase/add",
+    method: "post",
+    params: data  // 鉂� 閿欒
+  });
+}
+
+// 鉁� 姝g‘: POST璇锋眰浣跨敤 data
+export function addKnowledgeBase(data) {
+  return request({
+    url: "/knowledgeBase/add",
+    method: "post",
+    data: data  // 鉁� 姝g‘
+  });
+}
+```
+
+---
+
+### 9.3 DELETE璇锋眰鍙傛暟閿欒
+
+**閿欒绀轰緥**:
+```javascript
+// 鉂� 閿欒: DELETE浣跨敤 params 浼犻�掓暟缁�
+export function delKnowledgeBase(ids) {
+  return request({
+    url: "/knowledgeBase/delete",
+    method: "delete",
+    params: ids  // 鉂� 閿欒
+  });
+}
+
+// 鉁� 姝g‘: DELETE浣跨敤 data 浼犻�掓暟缁�
+export function delKnowledgeBase(ids) {
+  return request({
+    url: "/knowledgeBase/delete",
+    method: "delete",
+    data: ids  // 鉁� 姝g‘
+  });
+}
+```
+
+---
+
+### 9.4 娴佸紡鎺ュ彛閿欒
+
+**閿欒绀轰緥**:
+```javascript
+// 鉂� 閿欒: 娴佸紡鎺ュ彛浣跨敤 axios
+export function knowledgeChat(data) {
+  return request({
+    url: "/ai/knowledge/chat",
+    method: "post",
+    data: data  // 鉂� axios涓嶆敮鎸佹祦寮�
+  });
+}
+
+// 鉁� 姝g‘: 娴佸紡鎺ュ彛浣跨敤 Fetch API
+export function knowledgeChat(data) {
+  const token = getToken();
+  return fetch(import.meta.env.VITE_APP_BASE_API + '/ai/knowledge/chat', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+      'Authorization': 'Bearer ' + token
+    },
+    body: JSON.stringify(data)  // 鉁� 姝g‘
+  });
+}
+```
+
+---
+
+### 9.5 鏂囦欢涓婁紶ID鑾峰彇閿欒
+
+**閿欒绀轰緥**:
+```javascript
+// 鉂� 閿欒: 涓婁紶鎴愬姛鍚庢病鏈変繚瀛� storageBlobId
+const handleUploadSuccess = (response) => {
+  if (response.code === 200) {
+    ElMessage.success("涓婁紶鎴愬姛");
+    // 鉂� 娌℃湁淇濆瓨 response.data.id
+  }
+};
+
+// 鉁� 姝g‘: 淇濆瓨 storageBlobId 鐢ㄤ簬鍚庣画鍏宠仈
+const handleUploadSuccess = (response, file) => {
+  if (response.code === 200) {
+    uploadedBlobIds.value.push(response.data.id);  // 鉁� 淇濆瓨ID
+    ElMessage.success(`鏂囦欢 ${file.name} 涓婁紶鎴愬姛`);
+  }
+};
+```
+
+---
+
+## 鍗併�佹渶浣冲疄璺靛缓璁�
+
+### 10.1 鍙傛暟鍛藉悕涓�鑷存��
+
+鉁� **鍓嶇鍙傛暟鍚嶄笌鍚庣瀹炰綋瀛楁淇濇寔涓�鑷�**
+```javascript
+// 鍓嶇
+{
+  knowledgeBaseId: 10,
+  storageBlobIds: [123]
+}
+
+// 鍚庣瀹炰綋瀛楁
+private Long knowledgeBaseId;
+private List<Long> storageBlobIds;
+```
+
+---
+
+### 10.2 鍙傛暟绫诲瀷涓�鑷存��
+
+鉁� **鏄庣‘鍙傛暟绫诲瀷,閬垮厤鑷姩绫诲瀷杞崲**
+```javascript
+// 鏁板�肩被鍨�
+const id = 10;  // number
+const count = 0;  // number
+
+// 瀛楃涓茬被鍨�
+const title = "";  // string
+const type = "";  // string
+
+// 鏁扮粍绫诲瀷
+const ids = [];  // array
+```
+
+---
+
+### 10.3 蹇呭~鍙傛暟鏍¢獙
+
+鉁� **鍦ㄨ皟鐢ㄦ帴鍙e墠鏍¢獙蹇呭~鍙傛暟**
+```javascript
+const saveFiles = async () => {
+  if (!currentKnowledgeBase.value?.id) {
+    ElMessage.error("鐭ヨ瘑搴撲俊鎭紓甯�");
+    return;
+  }
+
+  if (uploadedBlobIds.value.length === 0) {
+    ElMessage.warning("璇峰厛涓婁紶鏂囦欢");
+    return;
+  }
+
+  // ...璋冪敤鎺ュ彛
+};
+```
+
+---
+
+### 10.4 鍙傛暟榛樿鍊�
+
+鉁� **涓哄彲閫夊弬鏁拌缃悎鐞嗙殑榛樿鍊�**
+```javascript
+const form = {
+  title: "",
+  type: "",
+  usageCount: 0,  // 鉁� 鏁板�肩被鍨嬮粯璁ゅ�间负0
+  creator: userStore.nickName || ""  // 鉁� 浣跨敤褰撳墠鐢ㄦ埛鍚嶄綔涓洪粯璁ゅ��
+};
+```
+
+---
+
+### 10.5 URL璺緞鍙傛暟
+
+鉁� **璺緞鍙傛暟浣跨敤妯℃澘瀛楃涓�**
+```javascript
+const url = `/knowledgeBase/vector/status/${knowledgeBaseId}`;
+const url = `/knowledgeBase/vector/reprocess/${vectorId}`;
+```
+
+---
+
+## 鍗佷竴銆佸弬鏁版槧灏勫叧绯绘�荤粨
+
+### 鐭ヨ瘑搴揑D鐩稿叧
+| 鍦烘櫙 | 鍙傛暟鍚� | 绫诲瀷 | 鏉ユ簮 |
+|------|--------|------|------|
+| 鐭ヨ瘑搴撳垪琛ㄦ煡璇� | - | - | URL璺緞鏃犲弬鏁� |
+| 鐭ヨ瘑搴撹鎯� | id | Long | URL璺緞鍙傛暟 |
+| 鏂囦欢鍏宠仈淇濆瓨 | knowledgeBaseId | Long | POST body鍙傛暟 |
+| 鍚戦噺鍖栫姸鎬佹煡璇� | knowledgeBaseId | Long | URL璺緞鍙傛暟 |
+| 鐭ヨ瘑闂瓟 | knowledgeBaseId | Long | POST body鍙傛暟 |
+
+---
+
+### 鏂囦欢ID鐩稿叧
+| 鍦烘櫙 | 鍙傛暟鍚� | 绫诲瀷 | 鏉ユ簮 |
+|------|--------|------|------|
+| 鏂囦欢涓婁紶鍝嶅簲 | data.id | Long | 鍝嶅簲鏁版嵁(浣滀负storageBlobId) |
+| 鏂囦欢鍏宠仈淇濆瓨 | storageBlobIds | Long[] | POST body鍙傛暟 |
+| 鏂囦欢鍒犻櫎 | ids | Long[] | DELETE body鍙傛暟(鍚戦噺璁板綍ID) |
+| 閲嶆柊鍚戦噺鍖� | vectorId | Long | URL璺緞鍙傛暟 |
+
+---
+
+### 浼氳瘽ID鐩稿叧
+| 鍦烘櫙 | 鍙傛暟鍚� | 绫诲瀷 | 鏉ユ簮 |
+|------|--------|------|------|
+| 鐭ヨ瘑闂瓟 | memoryId | String | 鍓嶇鐢熸垚UUID |
+| 闂瓟鍘嗗彶鏌ヨ | memoryId | String | URL璺緞鍙傛暟 |
+
+---
+
+## 鍗佷簩銆侀檮褰�
+
+### 闄勫綍A: 鍙傛暟绫诲瀷瀵圭収琛�
+
+| 鍙傛暟绫诲瀷 | JavaScript | Java | MySQL |
+|----------|------------|------|-------|
+| ID | number/Long | Long | BIGINT |
+| 鏍囬 | String | String | VARCHAR |
+| 绫诲瀷 | String | String | VARCHAR |
+| 鐘舵�� | Integer | Integer | TINYINT |
+| 鏁伴噺 | Integer | Integer | INT |
+| 鏃堕棿 | String/Date | LocalDateTime | DATETIME |
+| 鏁扮粍 | Array | List | - |
+
+---
+
+### 闄勫綍B: HTTP鏂规硶涓庝紶鍙備綅缃鐓ц〃
+
+| HTTP鏂规硶 | 浼犲弬浣嶇疆 | request閰嶇疆 | 閫傜敤鍦烘櫙 |
+|----------|----------|--------------|----------|
+| GET | URL鍙傛暟 | `params: query` | 鏌ヨ銆佸垪琛� |
+| POST | 璇锋眰浣� | `data: data` | 鏂板銆佹洿鏂般�佷繚瀛� |
+| DELETE | 璇锋眰浣� | `data: ids` | 鍒犻櫎銆佹壒閲忓垹闄� |
+| PUT | 璇锋眰浣� | `data: data` | 鏇存柊(閮ㄥ垎浣跨敤POST) |
+| 娴佸紡POST | 璇锋眰浣� | `body: JSON.stringify()` | AI闂瓟 |
+
+---
+
+### 闄勫綍C: 鍚戦噺鍖栫姸鎬佸�煎鐓ц〃
+
+| 鐘舵�佸�� | 鐘舵�佸悕绉� | 鍓嶇鏄剧ず | 鏍囩棰滆壊 |
+|--------|----------|----------|----------|
+| 0 | 寰呭鐞� | "寰呭鐞�" | info (鐏拌壊) |
+| 1 | 澶勭悊涓� | "澶勭悊涓�" | warning (姗欒壊) |
+| 2 | 宸插畬鎴� | "宸插畬鎴�" | success (缁胯壊) |
+| 3 | 澶辫触 | "澶辫触" | danger (绾㈣壊) |
+
+---
+
+## 鍗佷笁銆佹�荤粨
+
+鏈枃妗h缁嗚鑼冧簡鐭ヨ瘑搴撴ā鍧楃殑鍙傛暟鍛藉悕鍜屼紶鍙傛柟寮�,閬靛惊浠ヤ笅鍘熷垯:
+
+1. 鉁� **鍛藉悕涓�鑷存��**: 鍓嶅悗绔弬鏁板悕淇濇寔涓�鑷�(椹煎嘲鍛藉悕)
+2. 鉁� **浼犲弬瑙勮寖鎬�**: GET鐢╬arams銆丳OST鐢╠ata銆丏ELETE鐢╠ata
+3. 鉁� **绫诲瀷鏄庣‘鎬�**: 鏄庣‘鍙傛暟绫诲瀷,鍚堢悊璁剧疆榛樿鍊�
+4. 鉁� **鏍¢獙瀹屾暣鎬�**: 蹇呭~鍙傛暟闇�鏍¢獙,鍙�夊弬鏁版湁榛樿鍊�
+5. 鉁� **閿欒閬垮厤**: 閬靛惊瑙勮寖閬垮厤甯歌閿欒
+
+寤鸿鍥㈤槦鎴愬憳涓ユ牸閬靛惊鏈鑼�,纭繚鍓嶅悗绔弬鏁颁紶閫掔殑涓�鑷存�у拰鍙潬鎬с��
\ No newline at end of file
diff --git a/src/api/collaborativeApproval/knowledgeBase.js b/src/api/collaborativeApproval/knowledgeBase.js
index d7dce3e..eb44ac2 100644
--- a/src/api/collaborativeApproval/knowledgeBase.js
+++ b/src/api/collaborativeApproval/knowledgeBase.js
@@ -1,60 +1,92 @@
 import request from "@/utils/request";
 import { getToken } from '@/utils/auth';
 
-// 鏌ヨ鐭ヨ瘑搴撳垪琛�
+/**
+ * 鐭ヨ瘑搴撶鐞嗘帴鍙�
+ * 浼犲弬瑙勮寖:
+ * - GET璇锋眰: 浣跨敤 params
+ * - POST璇锋眰: 浣跨敤 data
+ * - DELETE璇锋眰: 浣跨敤 data
+ * - 娴佸紡璇锋眰: 浣跨敤 Fetch API
+ */
+
+// ==================== 鐭ヨ瘑搴揅RUD鎺ュ彛 ====================
+
+/**
+ * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+ * @param {Object} query - 鏌ヨ鍙傛暟
+ * @param {number} query.current - 褰撳墠椤电爜(蹇呭~)
+ * @param {number} query.size - 姣忛〉鏉℃暟(蹇呭~)
+ * @param {string} [query.title] - 鐭ヨ瘑鏍囬(鍙��,妯$硦鎼滅储)
+ * @param {string} [query.type] - 鐭ヨ瘑绫诲瀷(鍙��,绮剧‘鍖归厤)
+ * @returns {Promise}
+ */
 export function listKnowledgeBase(query) {
   return request({
     url: "/knowledgeBase/getList",
     method: "get",
-    params: query,
+    params: query,  // GET璇锋眰浣跨敤params
   });
 }
 
-// 鏌ヨ鐭ヨ瘑搴撹缁�
-// export function getKnowledgeBase(knowledgeBaseId) {
-//   return request({
-//     url: "/collaborativeApproval/knowledgeBase/" + knowledgeBaseId,
-//     method: "get",
-//   });
-// }
-
-// 鏂板鐭ヨ瘑搴�
+/**
+ * 鏂板鐭ヨ瘑搴�
+ * @param {Object} data - 鐭ヨ瘑搴撴暟鎹�
+ * @param {string} data.title - 鐭ヨ瘑鏍囬(蹇呭~)
+ * @param {string} data.type - 鐭ヨ瘑绫诲瀷(蹇呭~)
+ * @param {string} [data.scenario] - 閫傜敤鍦烘櫙(鍙��)
+ * @param {string} [data.efficiency] - 瑙e喅鏁堢巼(鍙��)
+ * @param {string} data.problem - 闂鎻忚堪(蹇呭~)
+ * @param {string} data.solution - 瑙e喅鏂规(蹇呭~)
+ * @param {string} [data.keyPoints] - 鍏抽敭瑕佺偣(鍙��)
+ * @param {string} [data.creator] - 鍒涘缓浜�(鍙��)
+ * @param {number} [data.usageCount=0] - 浣跨敤娆℃暟(鍙��)
+ * @returns {Promise}
+ */
 export function addKnowledgeBase(data) {
   return request({
     url: "/knowledgeBase/add",
     method: "post",
-    data: data,
+    data: data,  // POST璇锋眰浣跨敤data
   });
 }
 
-// 淇敼鐭ヨ瘑搴�
+/**
+ * 淇敼鐭ヨ瘑搴�
+ * @param {Object} data - 鐭ヨ瘑搴撴暟鎹�
+ * @param {number} data.id - 鐭ヨ瘑搴揑D(蹇呭~)
+ * @param {string} data.title - 鐭ヨ瘑鏍囬(蹇呭~)
+ * @param {string} data.type - 鐭ヨ瘑绫诲瀷(蹇呭~)
+ * @returns {Promise}
+ */
 export function updateKnowledgeBase(data) {
   return request({
     url: "/knowledgeBase/update",
     method: "post",
-    data: data,
+    data: data,  // POST璇锋眰浣跨敤data
   });
 }
 
-// 鍒犻櫎鐭ヨ瘑搴�
-export function delKnowledgeBase(query) {
+/**
+ * 鍒犻櫎鐭ヨ瘑搴�(鏀寔鎵归噺鍒犻櫎)
+ * @param {number[]} ids - 鐭ヨ瘑搴揑D鏁扮粍
+ * @returns {Promise}
+ */
+export function delKnowledgeBase(ids) {
   return request({
     url: "/knowledgeBase/delete",
     method: "delete",
-    data: query,
+    data: ids,  // DELETE璇锋眰浣跨敤data浼犻�掓暟缁�
   });
 }
 
-// 鎵归噺鍒犻櫎鐭ヨ瘑搴�
-export function delKnowledgeBaseBatch(knowledgeBaseIds) {
-  return request({
-    url: "/knowledgeBase/batch",
-    method: "delete",
-    data: knowledgeBaseIds,
-  });
-}
+// ==================== 鏂囦欢绠$悊鎺ュ彛 ====================
 
-// 鑾峰彇鐭ヨ瘑搴撴枃浠跺悜閲忓寲鐘舵��
+/**
+ * 鏌ヨ鐭ヨ瘑搴撴枃浠跺悜閲忓寲鐘舵��
+ * @param {number} knowledgeBaseId - 鐭ヨ瘑搴揑D
+ * @returns {Promise} 杩斿洖鏂囦欢鍒楄〃鍙婂悜閲忓寲鐘舵��
+ */
 export function getVectorStatus(knowledgeBaseId) {
   return request({
     url: `/knowledgeBase/vector/status/${knowledgeBaseId}`,
@@ -62,7 +94,39 @@
   });
 }
 
-// 閲嶆柊鍚戦噺鍖栨枃浠�
+/**
+ * 淇濆瓨鐭ヨ瘑搴撴枃浠跺叧鑱�(瑙﹀彂鍚戦噺鍖�)
+ * @param {Object} data - 鏂囦欢鍏宠仈鏁版嵁
+ * @param {number} data.knowledgeBaseId - 鐭ヨ瘑搴揑D(蹇呭~)
+ * @param {number[]} data.storageBlobIds - 鏂囦欢blob ID鏁扮粍(蹇呭~)
+ * @returns {Promise}
+ */
+export function saveKnowledgeBaseFiles(data) {
+  return request({
+    url: "/knowledgeBase/file/save",
+    method: "post",
+    data: data,  // POST璇锋眰浣跨敤data
+  });
+}
+
+/**
+ * 鍒犻櫎鐭ヨ瘑搴撴枃浠�
+ * @param {number[]} ids - 鍚戦噺璁板綍ID鏁扮粍
+ * @returns {Promise}
+ */
+export function deleteKnowledgeBaseFile(ids) {
+  return request({
+    url: "/knowledgeBase/file/delete",
+    method: "delete",
+    data: ids,  // DELETE璇锋眰浣跨敤data浼犻�掓暟缁�
+  });
+}
+
+/**
+ * 閲嶆柊鍚戦噺鍖栨枃浠�
+ * @param {number} vectorId - 鍚戦噺璁板綍ID
+ * @returns {Promise}
+ */
 export function reprocessVector(vectorId) {
   return request({
     url: `/knowledgeBase/vector/reprocess/${vectorId}`,
@@ -70,36 +134,22 @@
   });
 }
 
-// 淇濆瓨鐭ヨ瘑搴撴枃浠跺叧鑱�
-export function saveKnowledgeBaseFiles(data) {
-  return request({
-    url: "/knowledgeBase/file/save",
-    method: "post",
-    data: data,
-  });
-}
+// ==================== 鐭ヨ瘑闂瓟鎺ュ彛 ====================
 
-// 鍒犻櫎鐭ヨ瘑搴撴枃浠�
-export function deleteKnowledgeBaseFiles(vectorIds) {
-  return request({
-    url: "/knowledgeBase/file/delete",
-    method: "delete",
-    data: vectorIds,
-  });
-}
-
-// 鏌ヨ鐭ヨ瘑搴撻棶绛斿巻鍙�
-export function getKnowledgeHistory(memoryId) {
-  return request({
-    url: `/ai/knowledge/history/${memoryId}`,
-    method: "get",
-  });
-}
-
-// 鐭ヨ瘑搴撻棶绛�(娴佸紡)
-export async function knowledgeChat(data) {
+/**
+ * 鐭ヨ瘑搴撻棶绛�(娴佸紡)
+ * 鍚庣鎺ュ彛: POST /ai/knowledge/chat
+ * 鍝嶅簲绫诲瀷: text/stream;charset=utf-8 (Spring Flux<String>)
+ *
+ * @param {Object} data - 闂瓟鍙傛暟
+ * @param {number} data.knowledgeBaseId - 鐭ヨ瘑搴揑D(蹇呭~)
+ * @param {string} data.memoryId - 浼氳瘽ID(蹇呭~,鐢ㄤ簬淇濇寔涓婁笅鏂�)
+ * @param {string} data.question - 鐢ㄦ埛闂(蹇呭~)
+ * @returns {Promise<Response>} 杩斿洖Fetch Response瀵硅薄
+ */
+export function knowledgeChat(data) {
   const token = getToken();
-  const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/ai/knowledge/chat', {
+  return fetch(import.meta.env.VITE_APP_BASE_API + '/ai/knowledge/chat', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json',
@@ -107,6 +157,16 @@
     },
     body: JSON.stringify(data)
   });
-  return response.body;
 }
 
+/**
+ * 鏌ヨ鐭ヨ瘑搴撻棶绛斿巻鍙�
+ * @param {string} memoryId - 浼氳瘽ID
+ * @returns {Promise}
+ */
+export function getKnowledgeHistory(memoryId) {
+  return request({
+    url: `/ai/knowledge/history/${memoryId}`,
+    method: "get",
+  });
+}
diff --git a/src/views/collaborativeApproval/knowledgeBase/index.vue b/src/views/collaborativeApproval/knowledgeBase/index.vue
index 907e51f..0c31e24 100644
--- a/src/views/collaborativeApproval/knowledgeBase/index.vue
+++ b/src/views/collaborativeApproval/knowledgeBase/index.vue
@@ -244,6 +244,7 @@
             :on-success="handleUploadSuccess"
             :on-error="handleUploadError"
             :before-upload="beforeUpload"
+            name="files"
             multiple
             :show-file-list="false"
             accept=".txt,.md,.docx,.xlsx,.xls,.pdf"
@@ -379,7 +380,7 @@
   getVectorStatus,
   reprocessVector,
   saveKnowledgeBaseFiles,
-  deleteKnowledgeBaseFiles,
+  deleteKnowledgeBaseFile,
   knowledgeChat
 } from "@/api/collaborativeApproval/knowledgeBase.js";
 import useUserStore from '@/store/modules/user';
@@ -624,21 +625,31 @@
 
 const getList = () => {
   tableLoading.value = true;
-  listKnowledgeBase({...page.value, ...searchForm.value})
+
+  // 鉁� GET璇锋眰浣跨敤params浼犲弬
+  listKnowledgeBase({
+    current: page.value.current,
+    size: page.value.size,
+    title: searchForm.value.title,
+    type: searchForm.value.type
+  })
   .then(res => {
     tableLoading.value = false;
     page.value.total = res.data.total;
-    // 濡傛灉褰撳墠椤垫暟瓒呰繃鎬婚〉鏁帮紝閲嶇疆鍒扮1椤靛苟閲嶆柊鏌ヨ
+
+    // 濡傛灉褰撳墠椤垫暟瓒呰繃鎬婚〉鏁�,閲嶇疆鍒扮1椤靛苟閲嶆柊鏌ヨ
     const maxPage = Math.ceil(res.data.total / page.value.size) || 1;
     if (page.value.current > maxPage && maxPage > 0) {
       page.value.current = 1;
-      // 閲嶆柊鏌ヨ绗�1椤垫暟鎹�
       return getList();
     }
+
     tableData.value = res.data.records;
-  }).catch(err => {
-    tableLoading.value = false;
   })
+  .catch(err => {
+    tableLoading.value = false;
+    console.error("鏌ヨ鐭ヨ瘑搴撳垪琛ㄥけ璐�:", err);
+  });
 };
 
 // 鍒嗛〉澶勭悊
@@ -813,27 +824,47 @@
 const submitForm = async () => {
   try {
     await formRef.value.validate();
+
+    // 鉁� POST璇锋眰浣跨敤data浼犲弬,鏄庣‘鍙傛暟缁撴瀯
+    const formData = {
+      title: form.value.title,
+      type: form.value.type,
+      scenario: form.value.scenario || "",
+      efficiency: form.value.efficiency || "",
+      problem: form.value.problem,
+      solution: form.value.solution,
+      keyPoints: form.value.keyPoints || "",
+      creator: form.value.creator || "",
+      usageCount: form.value.usageCount || 0
+    };
+
     if (dialogType.value === "add") {
       // 鏂板鐭ヨ瘑
-      addKnowledgeBase({...form.value}).then(res => {
+      addKnowledgeBase(formData).then(res => {
         if(res.code == 200){
           ElMessage.success("娣诲姞鎴愬姛");
           closeKnowledgeDialog();
           getList();
         }
       }).catch(err => {
-        ElMessage.error(err.msg);
-      })
+        console.error("娣诲姞鐭ヨ瘑搴撳け璐�:", err);
+        ElMessage.error(err.msg || "娣诲姞澶辫触");
+      });
     } else {
-      updateKnowledgeBase({...form.value}).then(res => {
+      // 鏇存柊鐭ヨ瘑 - 娣诲姞id鍙傛暟
+      updateKnowledgeBase({
+        id: form.value.id,
+        ...formData
+      }).then(res => {
         if(res.code == 200){
           ElMessage.success("鏇存柊鎴愬姛");
           closeKnowledgeDialog();
           getList();
         }
       }).catch(err => {
-        ElMessage.error(err.msg);
-      })
+        console.error("鏇存柊鐭ヨ瘑搴撳け璐�:", err);
+        ElMessage.error(err.msg || "鏇存柊澶辫触");
+      });
     }
   } catch (error) {
     console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
@@ -847,19 +878,22 @@
     return;
   }
 
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄�,鏄惁纭鍒犻櫎?", "鍒犻櫎", {
     confirmButtonText: "纭",
     cancelButtonText: "鍙栨秷",
     type: "warning",
   }).then(() => {
-    // console.log(selectedIds.value);
+    // 鉁� DELETE璇锋眰浣跨敤data浼犻�扞D鏁扮粍
     delKnowledgeBase(selectedIds.value).then(res => {
       if(res.code == 200){
         ElMessage.success("鍒犻櫎鎴愬姛");
         selectedIds.value = [];
         getList();
       }
-    })
+    }).catch(err => {
+      console.error("鍒犻櫎鐭ヨ瘑搴撳け璐�:", err);
+      ElMessage.error(err.msg || "鍒犻櫎澶辫触");
+    });
   }).catch(() => {
     // 鐢ㄦ埛鍙栨秷
   });
@@ -963,9 +997,24 @@
 
 // 涓婁紶鎴愬姛
 const handleUploadSuccess = (response, file) => {
+  console.log("涓婁紶鍝嶅簲:", response);  // 璋冭瘯鏃ュ織
+
   if (response.code === 200) {
-    uploadedBlobIds.value.push(response.data.id);
-    ElMessage.success(`鏂囦欢 ${file.name} 涓婁紶鎴愬姛`);
+    // 鉁� 鍚庣杩斿洖鐨勬槸 List<StorageBlobVO>,鎵�浠ata鏄暟缁�
+    if (Array.isArray(response.data) && response.data.length > 0) {
+      // 鍙栨暟缁勭涓�涓厓绱犵殑id
+      const blobId = response.data[0].id;
+      if (blobId) {
+        uploadedBlobIds.value.push(blobId);
+        ElMessage.success(`鏂囦欢 ${file.name} 涓婁紶鎴愬姛`);
+      } else {
+        console.error("涓婁紶鍝嶅簲涓湭鎵惧埌id:", response.data[0]);
+        ElMessage.error("涓婁紶澶辫触: 鏈幏鍙栧埌鏂囦欢ID");
+      }
+    } else {
+      console.error("涓婁紶鍝嶅簲鏍煎紡閿欒:", response);
+      ElMessage.error("涓婁紶澶辫触: 鍝嶅簲鏍煎紡閿欒");
+    }
   } else {
     ElMessage.error(response.msg || "涓婁紶澶辫触");
   }
@@ -978,22 +1027,30 @@
 
 // 淇濆瓨鏂囦欢鍏宠仈
 const saveFiles = async () => {
+  // 鍙傛暟鏍¢獙
+  if (!currentKnowledgeBase.value?.id) {
+    ElMessage.error("鐭ヨ瘑搴撲俊鎭紓甯�");
+    return;
+  }
+
   if (uploadedBlobIds.value.length === 0) {
     ElMessage.warning("璇峰厛涓婁紶鏂囦欢");
     return;
   }
 
   savingFiles.value = true;
+
   try {
+    // 鉁� POST璇锋眰浣跨敤data浼犲弬,鏄庣‘鍙傛暟缁撴瀯
     await saveKnowledgeBaseFiles({
-      knowledgeBaseId: currentKnowledgeBase.value.id,
-      storageBlobIds: uploadedBlobIds.value
+      knowledgeBaseId: currentKnowledgeBase.value.id,  // 鐭ヨ瘑搴揑D
+      storageBlobIds: uploadedBlobIds.value             // 鏂囦欢blob ID鏁扮粍
     });
 
-    ElMessage.success("鏂囦欢鍏宠仈淇濆瓨鎴愬姛锛屾鍦ㄥ悗鍙板鐞嗗悜閲忓寲");
+    ElMessage.success("鏂囦欢鍏宠仈淇濆瓨鎴愬姛,姝e湪鍚庡彴澶勭悊鍚戦噺鍖�");
     uploadedBlobIds.value = [];
 
-    // 寤惰繜鍒锋柊鏂囦欢鍒楄〃锛岀粰鍚庡彴澶勭悊鏃堕棿
+    // 寤惰繜鍒锋柊鏂囦欢鍒楄〃,缁欏悗鍙板鐞嗘椂闂�
     setTimeout(() => {
       loadFileList();
     }, 1000);
@@ -1030,7 +1087,7 @@
 const deleteFile = async (row) => {
   try {
     await ElMessageBox.confirm(
-      "纭畾瑕佸垹闄よ鏂囦欢鍚楋紵鍒犻櫎鍚庡皢鏃犳硶鎭㈠鍚戦噺鏁版嵁",
+      "纭畾瑕佸垹闄よ鏂囦欢鍚�?鍒犻櫎鍚庡皢鏃犳硶鎭㈠鍚戦噺鏁版嵁",
       "鍒犻櫎纭",
       {
         confirmButtonText: "纭畾",
@@ -1039,7 +1096,8 @@
       }
     );
 
-    await deleteKnowledgeBaseFiles([row.id]);
+    // 鉁� DELETE璇锋眰浣跨敤data浼犻�扞D鏁扮粍
+    await deleteKnowledgeBaseFile([row.id]);  // 娉ㄦ剰: row.id鏄悜閲忚褰旾D,涓嶆槸storageBlobId
     ElMessage.success("鍒犻櫎鎴愬姛");
     loadFileList();
   } catch (error) {
@@ -1095,6 +1153,7 @@
 
 // 鍙戦�佹秷鎭�
 const sendMessage = async () => {
+  // 鍙傛暟鏍¢獙
   if (!inputQuestion.value.trim()) {
     ElMessage.warning("璇疯緭鍏ラ棶棰�");
     return;
@@ -1121,18 +1180,11 @@
   scrollToBottom();
 
   try {
-    // 娴佸紡璇锋眰
-    const response = await fetch('/api/ai/knowledge/chat', {
-      method: 'POST',
-      headers: {
-        'Content-Type': 'application/json',
-        'Authorization': 'Bearer ' + getToken()
-      },
-      body: JSON.stringify({
-        knowledgeBaseId: currentKnowledgeBase.value.id,
-        memoryId: memoryId.value,
-        question: question
-      })
+    // 鉁� 娴佸紡璇锋眰浣跨敤Fetch API
+    const response = await knowledgeChat({
+      knowledgeBaseId: currentKnowledgeBase.value.id,  // 鐭ヨ瘑搴揑D
+      memoryId: memoryId.value,                         // 浼氳瘽ID
+      question: question                                // 鐢ㄦ埛闂
     });
 
     if (!response.ok) {
@@ -1140,7 +1192,7 @@
       throw new Error(errorText || '璇锋眰澶辫触');
     }
 
-    // 澶勭悊SSE娴佸紡鍝嶅簲
+    // 鉁� 鍚庣杩斿洖 text/stream;charset=utf-8
     const reader = response.body.getReader();
     const decoder = new TextDecoder();
     let aiContent = '';
@@ -1151,7 +1203,7 @@
       const { done, value } = await reader.read();
       if (done) break;
 
-      const text = decoder.decode(value);
+      const text = decoder.decode(value, { stream: true });  // 鉁� 娣诲姞stream閫夐」
       aiContent += text;
       messages.value[messages.value.length - 1].content = aiContent;
 

--
Gitblit v1.9.3