From 1c2105ebf9da58725ffd41c83bf3e6e2f32bee29 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Tue, 29 Sep 2026 17:16:34 +0800 Subject: [PATCH] feat: document status --- ui/src/api/API_README.md | 3 + .../api/admin/workspace/knowledge/document.ts | 25 +++- ui/src/api/enums/state.ts | 6 +- ui/src/assets/iconfont.js | 2 +- ui/src/components/COMPONENT_README.md | 27 ++-- .../PermissionConfigDialog.vue | 4 +- .../components/global/mk-dropdown/index.vue | 33 ++++- .../global/mk-status-label/index.vue | 44 ++---- .../global/mk-status-label/types.ts | 6 + ui/src/constants/CONSTANT_README.md | 10 +- ui/src/constants/state.ts | 23 ++- ui/src/styles/STYLE_README.md | 3 + ui/src/styles/app.scss | 2 +- ui/src/views/VIEW_README.md | 31 ++-- .../application-card/ApplicationCard.vue | 2 +- .../CancelDocumentTaskAction.vue | 9 +- .../action-dropdown/DeleteDocumentAction.vue | 29 ++-- .../EmbeddingDocumentAction.vue | 104 ------------- .../TokenizeDocumentAction.vue | 6 +- .../BatchEmbeddingDocumentAction.vue | 45 ++++++ .../embedding/DocumentEmbeddingDialog.vue | 37 +++++ .../embedding/EmbeddingDocumentAction.vue | 70 +++++++++ .../document/action-dropdown/index.ts | 3 +- .../document/components/DocumentStatus.vue | 19 +-- .../views/knowledge-detail/document/index.vue | 137 ++++++++---------- .../views/knowledge-detail/document/status.ts | 46 ++++++ .../views/knowledge-detail/document/utils.ts | 9 ++ .../dialog/BatchSetPermissionDialog.vue | 2 +- .../system/resource-management/tool/index.vue | 2 +- .../ExecutionDetailDrawer.vue | 4 +- .../TriggerTaskRecordDrawer.vue | 39 ++--- .../ExecutionDetailDrawer.vue | 7 +- .../ExecutionRecordDrawer.vue | 31 ++-- .../ExecutionDetailDrawer.vue | 7 +- .../ExecutionRecordDrawer.vue | 13 +- 35 files changed, 500 insertions(+), 340 deletions(-) create mode 100644 ui/src/components/global/mk-status-label/types.ts delete mode 100644 ui/src/views/knowledge-detail/document/action-dropdown/EmbeddingDocumentAction.vue create mode 100644 ui/src/views/knowledge-detail/document/action-dropdown/embedding/BatchEmbeddingDocumentAction.vue create mode 100644 ui/src/views/knowledge-detail/document/action-dropdown/embedding/DocumentEmbeddingDialog.vue create mode 100644 ui/src/views/knowledge-detail/document/action-dropdown/embedding/EmbeddingDocumentAction.vue create mode 100644 ui/src/views/knowledge-detail/document/status.ts create mode 100644 ui/src/views/knowledge-detail/document/utils.ts diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index 1fc36ad9177..72f45454fdb 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -506,6 +506,9 @@ System 接口由资源管理服务提供;本地开源后端没有对应扩展 批量任务沿用 v2 的 `id_list` / `state_list`;生成问题使用 `document_id_list`, 添加标签使用 `document_ids` / `tag_ids`,迁移和批量导出直接提交文档 ID 数组。 向量化、生成问题默认排除成功分段,也可选择全部分段。任务类型使用 `DOCUMENT_TASK_TYPE`。 +单项向量化使用 `putDocumentRefresh(knowledgeId, documentId, stateList)` 请求 `//refresh`; +单项取消使用 `putCancelTask(knowledgeId, documentId, taskType)` 请求 `//cancel_task`,提交 `{ type }`。 +批量向量化与取消分别沿用 `batch_refresh` 和 `batch_cancel_task`,不以单元素批量请求代替单项接口。 文档设置的共享载荷为 `DocumentSettingPayload`,生成问题使用 `DocumentGeneratePayload`; 单项设置通过 `meta` 保留来源数据,批量设置将 `allow_download` 放在顶层。 飞书同步沿用 v2 扩展接口 `/knowledge/lark//_batch`,需部署环境支持。 diff --git a/ui/src/api/admin/workspace/knowledge/document.ts b/ui/src/api/admin/workspace/knowledge/document.ts index 8b73776328e..fa5581d7c59 100644 --- a/ui/src/api/admin/workspace/knowledge/document.ts +++ b/ui/src/api/admin/workspace/knowledge/document.ts @@ -26,8 +26,6 @@ const putQuickCreateDocuments = (knowledgeId: string, documents: DocumentQuickCr const putDocumentActive = (knowledgeId: string, documentId: string, isActive: boolean) => put(`${getPrefix(knowledgeId)}/${documentId}`, { is_active: isActive }) - - /** 删除单个文档。 */ const deleteDocument = (knowledgeId: string, documentId: string) => del(`${getPrefix(knowledgeId)}/${documentId}`) @@ -35,19 +33,36 @@ const deleteDocument = (knowledgeId: string, documentId: string) => del(`${getPr const putBatchDeleteDocuments = (knowledgeId: string, documentIds: string[]) => put(`${getPrefix(knowledgeId)}/batch_delete`, { id_list: documentIds }) +/** 单个文档向量化。 */ +const putDocumentRefresh = (knowledgeId: string, documentId: string, stateList: DocumentTaskState[]) => + put(`${getPrefix(knowledgeId)}/${documentId}/refresh`, { state_list: stateList }) -/** 批量提交文档向量化。 */ +/** 批量文档向量化。 */ const putBatchRefreshDocuments = (knowledgeId: string, documentIds: string[], stateList: DocumentTaskState[]) => put(`${getPrefix(knowledgeId)}/batch_refresh`, { id_list: documentIds, state_list: stateList }) -/** 批量提交文档分词索引。 */ +/** 单个文档分词索引。 */ +const putDocumentTokenize: (knowledge_id: string, document_id: string, state_list: Array, loading?: Ref) => Promise> = ( + knowledge_id, + document_id, + state_list, + loading, +) => { + return put(`${getPrefix(knowledge_id)}/${document_id}/tokenize`, { state_list }, undefined, loading) +} +/** 批量文档分词索引。 */ const putBatchTokenizeDocuments = (knowledgeId: string, documentIds: string[], stateList: DocumentTaskState[]) => put(`${getPrefix(knowledgeId)}/batch_tokenize`, { id_list: documentIds, state_list: stateList }) +/** 单个取消文档任务。 */ +const putCancelTask = (knowledgeId: string, documentId: string, taskType: DocumentTaskType) => + put(`${getPrefix(knowledgeId)}/${documentId}/cancel_task`, { type: taskType }) + /** 批量取消指定文档任务。 */ const putBatchCancelDocumentTask = (knowledgeId: string, documentIds: string[], taskType: DocumentTaskType) => put(`${getPrefix(knowledgeId)}/batch_cancel_task`, { id_list: documentIds, type: taskType }) + /** 保存单个文档的召回及来源设置。 */ const putDocumentSetting = (knowledgeId: string, documentId: string, data: DocumentSettingPayload) => put(`${getPrefix(knowledgeId)}/${documentId}`, data) @@ -103,8 +118,10 @@ export default { putDocumentActive, deleteDocument, putBatchDeleteDocuments, + putDocumentRefresh, putBatchRefreshDocuments, putBatchTokenizeDocuments, + putCancelTask, putBatchCancelDocumentTask, putDocumentSetting, putBatchDocumentSetting, diff --git a/ui/src/api/enums/state.ts b/ui/src/api/enums/state.ts index 454bdb704c3..d8953bc5c36 100644 --- a/ui/src/api/enums/state.ts +++ b/ui/src/api/enums/state.ts @@ -1,11 +1,7 @@ -/** 跨业务复用的任务状态,按需扩展。 */ +/** 执行记录接口状态;文档任务阶段在所属 View 中维护。 */ export const STATE_TYPES = { PENDING: 'PENDING', STARTED: 'STARTED', - EMBEDDING: 'EMBEDDING', - GENERATE: 'GENERATE', - SYNC: 'SYNC', - TOKENIZE: 'TOKENIZE', SUCCESS: 'SUCCESS', FAILURE: 'FAILURE', REVOKE: 'REVOKE', diff --git a/ui/src/assets/iconfont.js b/ui/src/assets/iconfont.js index af81f216b8b..f9240124287 100644 --- a/ui/src/assets/iconfont.js +++ b/ui/src/assets/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_5200172='',(h=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var o,v,t,i,c,d=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}o=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_5200172,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?d(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(v=function(){document.removeEventListener("DOMContentLoaded",v,!1),o()},document.addEventListener("DOMContentLoaded",v,!1)):document.attachEvent&&(t=o,i=h.document,c=!1,e(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,m())})}function m(){c||(c=!0,t())}function e(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(e,50)}m()}})(window); \ No newline at end of file +window._iconfont_svg_string_5200172='',(h=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var o,v,t,i,c,d=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}o=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_5200172,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?d(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(v=function(){document.removeEventListener("DOMContentLoaded",v,!1),o()},document.addEventListener("DOMContentLoaded",v,!1)):document.attachEvent&&(t=o,i=h.document,c=!1,m(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){c||(c=!0,t())}function m(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(m,50)}e()}})(window); \ No newline at end of file diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index 0c3ee5232e4..617badd2459 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -193,6 +193,11 @@ Drawer 没有 `MkDialog` 的外壳挂载控制;需要按需挂载时,由业 菜单项通过 `icon` Prop 传 Element Plus 图标,或使用 `icon` 插槽;`selectable` 预留勾选位, `selected` 控制选中。触发器遵循单根节点规则。 +`hide-when-empty` 默认关闭。开启后检查 `dropdown` 插槽,展开标准 `MkDropdownMenu` 的默认插槽 +和 Fragment,忽略注释、空白文本;没有有效 VNode 时不渲染下拉入口,不改变 `persistent`。 +业务 Action 的组件 VNode 视为有效内容,不检查其内部的 `v-if`。此能力用于文档批量 More, +表格和卡片 More 保持原有的默认插槽判断。 + ### MkViewLayout 满高页面布局,`loading` 覆盖整个根节点。`title` 默认读取路由标题,传空字符串隐藏; @@ -276,19 +281,21 @@ Element Plus 的 `v-infinite-scroll`。组件通过 `v-model` 管理已经加载 ### MkStatusLabel -`active` 控制布尔状态,默认“已启用 / 已禁用”;用 `activeText`、`inactiveText` 修改文案。 -多状态通过 `status` 直接传入 `STATE_LABELS` 的状态键,文案统一读取 `constants/state.ts`。 -传入 `status` 时仅显示该状态配置的图标;未配置状态或没有图标时只显示文案,不回退到其他状态图标。 -未传 `status` 时,`active` 为 true 显示成功图标,为 false 显示 `icon_ban_filled`。 -组件直接使用公共枚举 `STATE_TYPES` 匹配图标;新增状态需补齐 `STATE_LABELS` 文案,图标可按需配置。 -`STARTED`、`PENDING`、`REVOKE` 及 `EMBEDDING`、`GENERATE`、`SYNC`、`TOKENIZE` -统一显示内置加载图标,使用方直接传入 `status`,无需额外组合 `LoadingIcon`。 -`status` 优先于 `active`,状态文案统一使用 `STATE_LABELS`,不提供 `text` 覆盖。 +提供 `success`、`failure`、`loading`、`disabled` 四种图标类型,通过 `type + label` 展示业务状态。 +组件不依赖 API 状态枚举或业务文案;业务方维护状态与 `{ type, label }` 的映射。 +`StatusLabelType`、`StatusLabelOptions` 从 `global/mk-status-label/types.ts` 导入。 +传入 `type` 时使用该类型和外部 `label`,优先于布尔模式,不回退到启用/禁用文案。 + +未传 `type` 时保留 `active` 便捷模式,默认“已启用 / 已禁用”; +`activeText`、`inactiveText` 可修改文案,`inactiveIcon` 可覆盖未激活图标(默认 `icon_ban_filled`)。 +成功图标固定为 `icon_succeed_colorful`,失败图标为 `icon_close_colorful`,加载类型使用 `LoadingIcon`, +禁用图标使用灰色样式。`inactiveIcon` 仅影响布尔模式。 +不再接收 `status`;未知业务状态由调用方显示原始文案,不伪装成成功或禁用状态。 ```vue - - + + ``` ### MkTable diff --git a/ui/src/components/business/resource-authorization-drawer/PermissionConfigDialog.vue b/ui/src/components/business/resource-authorization-drawer/PermissionConfigDialog.vue index 7167014975a..8ab16931a95 100644 --- a/ui/src/components/business/resource-authorization-drawer/PermissionConfigDialog.vue +++ b/ui/src/components/business/resource-authorization-drawer/PermissionConfigDialog.vue @@ -44,7 +44,7 @@ defineExpose({ open, close }) - + 仅当前资源 包含所有子文件夹 diff --git a/ui/src/components/global/mk-dropdown/index.vue b/ui/src/components/global/mk-dropdown/index.vue index c24951d3c48..b932ca20c85 100644 --- a/ui/src/components/global/mk-dropdown/index.vue +++ b/ui/src/components/global/mk-dropdown/index.vue @@ -1,24 +1,43 @@