Skip to content

Commit eb706db

Browse files
fix: home error
1 parent f25c8e6 commit eb706db

11 files changed

Lines changed: 878 additions & 111 deletions

File tree

‎ui/src/api/API_README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,16 @@ System 接口由资源管理服务提供;本地开源后端没有对应扩展
501501

502502
### 知识库文档
503503

504+
`workspace/knowledge/document.ts` 同时维护文档启停、删除、召回设置、向量化、分词索引、
505+
任务取消、生成问题、迁移、同步、导出、原文件下载/替换及标签关联。
506+
批量任务沿用 v2 的 `id_list` / `state_list`;生成问题使用 `document_id_list`,
507+
添加标签使用 `document_ids` / `tag_ids`,迁移和批量导出直接提交文档 ID 数组。
508+
向量化、生成问题默认排除成功分段,也可选择全部分段。任务类型使用 `DOCUMENT_TASK_TYPE`。
509+
文档设置的共享载荷为 `DocumentSettingPayload`,生成问题使用 `DocumentGeneratePayload`;
510+
单项设置通过 `meta` 保留来源数据,批量设置将 `allow_download` 放在顶层。
511+
飞书同步沿用 v2 扩展接口 `/knowledge/lark/<knowledgeId>/_batch`,需部署环境支持。
512+
共享文档 API 继续仅提供查询,不增加写入方法。
513+
504514
`workspace/knowledge/document.ts` 维护文档分页查询,路径为
505515
`/workspace/<workspaceId>/knowledge/<knowledgeId>/document/<currentPage>/<pageSize>`。
506516
`putQuickCreateDocuments(knowledgeId, documents)` 通过 PUT `document/batch_create` 创建空白文档,

‎ui/src/api/admin/workspace/knowledge/document.ts‎

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1-
import { get, put } from '../../core/request'
1+
import { del, downloadRequest, get, getExportFile, post, put } from '../../core/request'
22
import type { ParamsPage, ResponsePage } from '../../core/types'
3-
import type { Dict, DocumentItem, DocumentQuickCreatePayload } from '@/api/types'
3+
import type {
4+
Dict,
5+
DocumentGeneratePayload,
6+
DocumentItem,
7+
DocumentQuickCreatePayload,
8+
DocumentSettingPayload,
9+
DocumentTaskState,
10+
DocumentTaskType,
11+
KnowledgeTagGroup,
12+
} from '@/api/types'
413
import { getWorkspaceId } from '@/utils/resource-context'
514

615
const getPrefix = (knowledgeId: string) => `/workspace/${getWorkspaceId()}/knowledge/${knowledgeId}/document`
@@ -13,4 +22,97 @@ const getDocumentPage = (knowledgeId: string, page: ParamsPage, query?: Dict<unk
1322
const putQuickCreateDocuments = (knowledgeId: string, documents: DocumentQuickCreatePayload[]) =>
1423
put<DocumentQuickCreatePayload[], DocumentItem[]>(`${getPrefix(knowledgeId)}/batch_create`, documents)
1524

16-
export default { getDocumentPage, putQuickCreateDocuments }
25+
/** 更新文档启用状态。 */
26+
const putDocumentActive = (knowledgeId: string, documentId: string, isActive: boolean) =>
27+
put(`${getPrefix(knowledgeId)}/${documentId}`, { is_active: isActive })
28+
29+
/** 删除单个文档。 */
30+
const deleteDocument = (knowledgeId: string, documentId: string) => del(`${getPrefix(knowledgeId)}/${documentId}`)
31+
32+
/** 批量删除文档。 */
33+
const putBatchDeleteDocuments = (knowledgeId: string, documentIds: string[]) =>
34+
put(`${getPrefix(knowledgeId)}/batch_delete`, { id_list: documentIds })
35+
36+
/** 批量提交文档向量化。 */
37+
const putBatchRefreshDocuments = (knowledgeId: string, documentIds: string[], stateList: DocumentTaskState[]) =>
38+
put(`${getPrefix(knowledgeId)}/batch_refresh`, { id_list: documentIds, state_list: stateList })
39+
40+
/** 批量提交文档分词索引。 */
41+
const putBatchTokenizeDocuments = (knowledgeId: string, documentIds: string[], stateList: DocumentTaskState[]) =>
42+
put(`${getPrefix(knowledgeId)}/batch_tokenize`, { id_list: documentIds, state_list: stateList })
43+
44+
/** 批量取消指定文档任务。 */
45+
const putBatchCancelDocumentTask = (knowledgeId: string, documentIds: string[], taskType: DocumentTaskType) =>
46+
put(`${getPrefix(knowledgeId)}/batch_cancel_task`, { id_list: documentIds, type: taskType })
47+
48+
/** 保存单个文档的召回及来源设置。 */
49+
const putDocumentSetting = (knowledgeId: string, documentId: string, data: DocumentSettingPayload) =>
50+
put(`${getPrefix(knowledgeId)}/${documentId}`, data)
51+
52+
/** 批量保存文档召回设置。 */
53+
const putBatchDocumentSetting = (knowledgeId: string, documentIds: string[], data: DocumentSettingPayload) =>
54+
put(`${getPrefix(knowledgeId)}/batch_hit_handling`, { ...data, id_list: documentIds })
55+
56+
/** 根据文档内容生成关联问题。 */
57+
const putGenerateDocumentQuestions = (knowledgeId: string, data: DocumentGeneratePayload) =>
58+
put(`${getPrefix(knowledgeId)}/batch_generate_related`, data)
59+
60+
/** 将选中文档迁移至目标知识库。 */
61+
const putMigrateDocuments = (knowledgeId: string, targetKnowledgeId: string, documentIds: string[]) =>
62+
put(`${getPrefix(knowledgeId)}/migrate/${targetKnowledgeId}`, documentIds)
63+
64+
/** 同步 Web 文档。 */
65+
const putSyncDocuments = (knowledgeId: string, documentIds: string[]) => put(`${getPrefix(knowledgeId)}/batch_sync`, { id_list: documentIds })
66+
67+
/** 同步飞书文档。 */
68+
const putSyncLarkDocuments = (knowledgeId: string, documentIds: string[]) =>
69+
put(`/workspace/${getWorkspaceId()}/knowledge/lark/${knowledgeId}/_batch`, { id_list: documentIds })
70+
71+
/** 导出所选文档为 Excel 或 ZIP。 */
72+
const exportDocuments = (knowledgeId: string, documentIds: string[], format: 'excel' | 'zip') =>
73+
downloadRequest(`${getPrefix(knowledgeId)}/${format === 'excel' ? 'batch_export' : 'batch_export_zip'}`, 'POST', documentIds)
74+
75+
/** 下载文档原文件。 */
76+
const downloadDocumentSource = (knowledgeId: string, document: DocumentItem) =>
77+
getExportFile(document.name, `${getPrefix(knowledgeId)}/${document.id}/download_source_file`)
78+
79+
/** 替换文档原文件。 */
80+
const postReplaceDocumentSource = (knowledgeId: string, documentId: string, file: File) => {
81+
const data = new FormData()
82+
data.append('file', file)
83+
return post(`${getPrefix(knowledgeId)}/${documentId}/replace_source_file`, data)
84+
}
85+
86+
/** 查询文档当前标签。 */
87+
const getDocumentTags = (knowledgeId: string, documentId: string) => get<KnowledgeTagGroup[]>(`${getPrefix(knowledgeId)}/${documentId}/tags`)
88+
89+
/** 批量添加文档标签。 */
90+
const postAddDocumentTags = (knowledgeId: string, documentIds: string[], tagIds: string[]) =>
91+
post(`${getPrefix(knowledgeId)}/batch_add_tag`, { document_ids: documentIds, tag_ids: tagIds })
92+
93+
/** 移除文档标签关联。 */
94+
const putDeleteDocumentTags = (knowledgeId: string, documentId: string, tagIds: string[]) =>
95+
put(`${getPrefix(knowledgeId)}/${documentId}/tags/batch_delete`, tagIds)
96+
97+
export default {
98+
getDocumentPage,
99+
putQuickCreateDocuments,
100+
putDocumentActive,
101+
deleteDocument,
102+
putBatchDeleteDocuments,
103+
putBatchRefreshDocuments,
104+
putBatchTokenizeDocuments,
105+
putBatchCancelDocumentTask,
106+
putDocumentSetting,
107+
putBatchDocumentSetting,
108+
putGenerateDocumentQuestions,
109+
putMigrateDocuments,
110+
putSyncDocuments,
111+
putSyncLarkDocuments,
112+
exportDocuments,
113+
downloadDocumentSource,
114+
postReplaceDocumentSource,
115+
getDocumentTags,
116+
postAddDocumentTags,
117+
putDeleteDocumentTags,
118+
}

‎ui/src/api/types/document.ts‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,23 @@ export interface DocumentQuickCreatePayload {
99
name: string
1010
}
1111

12+
/** 文档召回及来源设置。 */
13+
export interface DocumentSettingPayload {
14+
hit_handling_method: DocumentHitHandling
15+
directly_return_similarity: number
16+
meta?: Record<string, unknown>
17+
allow_download?: boolean
18+
}
19+
20+
/** 根据文档分段生成问题。 */
21+
export interface DocumentGeneratePayload {
22+
document_id_list: string[]
23+
model_id: string
24+
model_params_setting: Record<string, unknown>
25+
prompt: string
26+
state_list: DocumentTaskState[]
27+
}
28+
1229
/** 文件各任务的分段计数及状态发生时间。 */
1330
export interface DocumentStatusMeta {
1431
aggs?: { status: string | null; count: number }[]

‎ui/src/views/VIEW_README.md‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,14 +666,25 @@ Workspace API 内部通过 `getWorkspaceId()` 读取当前路由工作空间。
666666
设置页中。当前设置页仅接入 Workspace 路由和 API,暂不增加前端权限判断。
667667
更换向量模型需确认,先保存再重新向量化,整条流程禁止重复提交;向量化失败时保留原模型比较基准,
668668
允许再次保存重试。Web、飞书设置保留未编辑的 `meta` 字段,上传限制使用详情顶层值。
669-
`knowledge-detail/document/index.vue` 仅维护文档列表查询,使用 `MkComplexSearch`、`MkTable`。
669+
`knowledge-detail/document/index.vue` 维护文档列表查询、多选和文档操作,使用 `MkComplexSearch`、`MkTable`。
670670
搜索只提供名称 `name` 和创建者 `create_user`;创建者通过 Workspace `CommonApi.getAllUsers`
671671
加载,支持按 `nick_name` 远程搜索。列表使用 `documentData`、`paginationConfig`、`documentQuery`,
672672
查询方法为 `loadDocuments`,搜索处理为 `handleSearchChange`,搜索变化后回到第一页。
673673
文档页通过 `onMounted` 加载文档列表,创建者选项在展开下拉或输入关键词时通过 `remoteMethod`
674674
按需加载,不在进入页面时预加载;其他列表页的同类创建者筛选遵循相同方式。不额外监听路由重置状态。切换工作空间
675675
整页加载并返回知识库列表;当前知识库与共享资源入口均从其他页面进入,挂载时初始化筛选和分页。
676-
无轮询、排序入口、选择列和文档操作。
676+
无轮询和排序入口。非共享文档显示选择列,按文档 ID 跨页保留选择,搜索或筛选变化时清空;
677+
选中后通过 `footer-batch-actions` 展示批量操作。右侧固定操作列提供启停、向量化、分词索引和更多菜单,
678+
运行或排队中的任务切换为取消入口。Web、飞书提供同步,普通与工作流文档提供原文下载和替换。
679+
单项与批量操作共用页面请求状态,删除和同步先确认,成功后清空选择并刷新,导出和下载保留选择。
680+
文档操作入口与专属弹窗合并放在 `document/components/`:`ButtonDocumentTask` 负责向量化分段范围与生成问题配置,
681+
`ButtonDocumentSetting` 负责召回及来源设置,`ButtonMigrateDocument` 选择目标知识库,
682+
`ButtonDocumentTags` 添加已有标签和移除文档标签关联。组件接收知识库 ID、文档 ID 或文档数组及禁用状态,
683+
点击时快照本次操作对象,内部管理弹窗和请求,成功后通过 `refresh` 通知页面刷新,失败保留输入。
684+
任务组件通过 `action` 区分向量化与生成问题,通过 `batch` 切换批量按钮;行内入口使用 `display` 区分菜单与图标按钮。
685+
设置组件通过 `batch` 区分单项与批量,标签组件通过 `manageTags` 区分标签管理与批量添加。
686+
页面不再维护这些弹窗 Ref 和打开方法;承载入口的 `MkTableMoreDropdown` 使用 `persistent`,避免菜单收起时卸载弹窗。
687+
不新增前端权限判断;共享文档不展示选择列及操作入口。
677688
文档分页接口维护在 `workspace/knowledge/document.ts`,页面管理 loading。文件状态表头使用
678689
`MkDropdown` 单选筛选全部、成功、失败、索引中、分词索引中、排队中和生成中;查询组合
679690
`status` 与可选的 `task_type`,切换选项清除旧任务类型并回到第一页,保留名称和创建者条件。

‎ui/src/views/home/index.vue‎

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -41,54 +41,52 @@ watch(
4141
)
4242
</script>
4343
<template>
44-
<el-scrollbar class="h-full">
45-
<div class="px-6 py-4">
46-
<!-- 快捷创建 -->
47-
<h4 class="mb-4">快捷创建</h4>
48-
<HomeQuickCreate :workspace-id="workspaceId" />
49-
<!-- 资源 -->
50-
<h4 class="mb-4 mt-4">资源</h4>
51-
<HomeResourceOverview :api="HomepageApi" :workspace-id="workspaceId" />
52-
<!-- 监控 -->
53-
<HomeStatistics class="mt-4" :workspace-id="workspaceId" :application-id="applicationId" :api="HomepageApi">
54-
<template #application="{ loading }">
55-
<el-select
56-
v-model="applicationId"
57-
filterable
58-
remote
59-
fit-input-width
60-
class="w-55!"
61-
:remote-method="loadApplications"
62-
:loading="applicationsLoading"
63-
:disabled="loading"
64-
@change="handleApplicationChange"
65-
>
66-
<el-option label="全部智能体" value="all">
44+
<MkViewLayout title="">
45+
<!-- 快捷创建 -->
46+
<h4 class="mb-4 mt-4">快捷创建</h4>
47+
<HomeQuickCreate :workspace-id="workspaceId" />
48+
<!-- 资源 -->
49+
<h4 class="mb-4 mt-4">资源</h4>
50+
<HomeResourceOverview :api="HomepageApi" :workspace-id="workspaceId" />
51+
<!-- 监控 -->
52+
<HomeStatistics class="mt-4" :workspace-id="workspaceId" :application-id="applicationId" :api="HomepageApi">
53+
<template #application="{ loading }">
54+
<el-select
55+
v-model="applicationId"
56+
filterable
57+
remote
58+
fit-input-width
59+
class="w-55!"
60+
:remote-method="loadApplications"
61+
:loading="applicationsLoading"
62+
:disabled="loading"
63+
@change="handleApplicationChange"
64+
>
65+
<el-option label="全部智能体" value="all">
66+
<div class="flex-align-center gap-2">
67+
<MkIcon name="icon_card_outlined" :size="20" class="shrink-0 text-N600" />
68+
<span>全部智能体</span>
69+
</div>
70+
</el-option>
71+
<template v-for="application in applications" :key="application.id">
72+
<el-option :label="application.name" :value="application.id">
6773
<div class="flex-align-center gap-2">
68-
<MkIcon name="icon_card_outlined" :size="20" class="shrink-0 text-N600" />
69-
<span>全部智能体</span>
74+
<ApplicationIcon :icon="application.icon" :size="20" class="shrink-0" />
75+
<span class="truncate" :title="application.name">{{ application.name }}</span>
7076
</div>
7177
</el-option>
72-
<template v-for="application in applications" :key="application.id">
73-
<el-option :label="application.name" :value="application.id">
74-
<div class="flex-align-center gap-2">
75-
<ApplicationIcon :icon="application.icon" :size="20" class="shrink-0" />
76-
<span class="truncate" :title="application.name">{{ application.name }}</span>
77-
</div>
78-
</el-option>
79-
</template>
80-
<template #label="{ label, value }">
81-
<div class="flex-align-center gap-2">
82-
<MkIcon v-if="value === 'all'" name="icon_card_outlined" :size="18" class="shrink-0" />
83-
<ApplicationIcon v-else :icon="selectedApplication?.icon" :size="18" class="shrink-0" />
84-
<span class="truncate" :title="label">{{ label }}</span>
85-
</div>
86-
</template>
87-
</el-select>
88-
</template>
89-
</HomeStatistics>
90-
<!-- 排行榜 TOP5 -->
91-
<HomeRankings class="mt-4" :workspace-id="workspaceId" :api="HomepageApi" />
92-
</div>
93-
</el-scrollbar>
78+
</template>
79+
<template #label="{ label, value }">
80+
<div class="flex-align-center gap-2">
81+
<MkIcon v-if="value === 'all'" name="icon_card_outlined" :size="18" class="shrink-0" />
82+
<ApplicationIcon v-else :icon="selectedApplication?.icon" :size="18" class="shrink-0" />
83+
<span class="truncate" :title="label">{{ label }}</span>
84+
</div>
85+
</template>
86+
</el-select>
87+
</template>
88+
</HomeStatistics>
89+
<!-- 排行榜 TOP5 -->
90+
<HomeRankings class="mt-4" :workspace-id="workspaceId" :api="HomepageApi" />
91+
</MkViewLayout>
9492
</template>

0 commit comments

Comments
 (0)