Skip to content

Commit 61e5383

Browse files
committed
feat: questions
1 parent 1971b2a commit 61e5383

14 files changed

Lines changed: 564 additions & 24 deletions

File tree

‎ui/src/api/API_README.md‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,9 +511,24 @@ putDocument 统一更新名称、启停及设置,不按字段重复封装;
511511
| putBatchDeleteParagraphs | PUT batch_delete,`{ id_list }`,服务端清理关联与索引 |
512512

513513
标题最多 256,后端内容上限 102400;界面限制见 View 文档。
514-
问题候选在 knowledge/problem.ts 的 getProblemsPage,支持 content 搜索,类型 ParagraphProblem。
514+
问题候选在 knowledge/problem.ts 的 getProblemsPage,支持 content 搜索,分页记录类型为 ProblemItem。
515515
Workspace 共享 Paragraph API 仅 getParagraphPage、getParagraphDetail,不补问题查询或维护。
516516

517+
### 知识库问题
518+
519+
四范围 `knowledge/problem.ts` 使用各自知识库前缀追加 `/<knowledgeId>/problem`,
520+
由知识库及文档详情上下文的 `resourceApi.problem` 选择,不固定 Workspace。
521+
`getProblemsPage(knowledgeId, page, query)` 返回 `ResponsePage<ProblemItem>`,query 仅传 content。
522+
`ProblemItem` 包含 id、content、paragraph_count、hit_num、last_hit_time、create_time、update_time;
523+
分段已有问题仍使用轻量 `ParagraphProblem`,不要求包含列表统计字段。
524+
525+
Workspace、System 资源管理、System 共享提供完整问题 API:
526+
`postProblems` 直接提交内容字符串数组,`putProblem` 提交 `{ content }`,单项 DELETE 使用问题 ID,
527+
`putBatchDeleteProblems` 直接提交问题 ID 数组;单个问题内容最多 256 字符。
528+
`getProblemParagraphs` 返回 `ProblemParagraph[]`,包含分段字段及 knowledge_id、document_name。
529+
取消关联复用 Paragraph API 的 `putUnassociateParagraphProblem`,不调用问题或分段删除接口。
530+
Workspace 共享仅有 `getProblemsPage`,不补造详情或写接口,不回退其他范围。
531+
517532
### 标签与文档关联
518533

519534
四范围 tags.ts 按上述知识库前缀维护;Workspace 共享只 getKnowledgeTags,其余范围提供维护和关联。

‎ui/src/api/admin/system/resource-management/knowledge/problem.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { del, get, post, put } from '@/api/admin/core/request'
22
import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
3-
import type { ParagraphProblem, ProblemBatchAssociationPayload, ProblemParagraph } from '@/api/types'
3+
import type { ProblemItem, ProblemBatchAssociationPayload, ProblemParagraph } from '@/api/types'
44

55
const getPrefix = (knowledgeId: string) => `/system/resource/knowledge/${knowledgeId}/problem`
66

77
/** 批量创建知识库问题。 */
88
const postProblems = (knowledgeId: string, contents: string[]) => post<string[], void>(getPrefix(knowledgeId), contents)
99

10-
/** 分页搜索知识库问题,供分段选择已有问题进行关联。 */
10+
/** 分页搜索知识库问题,供问题列表及分段关联候选使用。 */
1111
const getProblemsPage = (knowledgeId: string, page: ParamsPage, query?: { content?: string }) =>
12-
get<ResponsePage<ParagraphProblem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
12+
get<ResponsePage<ProblemItem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
1313

1414
/** 编辑单个知识库问题的内容。 */
1515
const putProblem = (knowledgeId: string, problemId: string, content: string) =>

‎ui/src/api/admin/system/shared-resources/knowledge/problem.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { del, get, post, put } from '@/api/admin/core/request'
22
import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
3-
import type { ParagraphProblem, ProblemBatchAssociationPayload, ProblemParagraph } from '@/api/types'
3+
import type { ProblemItem, ProblemBatchAssociationPayload, ProblemParagraph } from '@/api/types'
44

55
const getPrefix = (knowledgeId: string) => `/system/shared/knowledge/${knowledgeId}/problem`
66

77
/** 批量创建知识库问题。 */
88
const postProblems = (knowledgeId: string, contents: string[]) => post<string[], void>(getPrefix(knowledgeId), contents)
99

10-
/** 分页搜索知识库问题,供分段选择已有问题进行关联。 */
10+
/** 分页搜索知识库问题,供问题列表及分段关联候选使用。 */
1111
const getProblemsPage = (knowledgeId: string, page: ParamsPage, query?: { content?: string }) =>
12-
get<ResponsePage<ParagraphProblem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
12+
get<ResponsePage<ProblemItem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
1313

1414
/** 编辑单个知识库问题的内容。 */
1515
const putProblem = (knowledgeId: string, problemId: string, content: string) =>

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { del, get, post, put } from '../../core/request'
22
import type { ParamsPage, ResponsePage } from '../../core/types'
3-
import type { ParagraphProblem, ProblemBatchAssociationPayload, ProblemParagraph } from '@/api/types'
3+
import type { ProblemItem, ProblemBatchAssociationPayload, ProblemParagraph } from '@/api/types'
44
import { getWorkspaceId } from '@/utils/resource-context'
55

66
const getPrefix = (knowledgeId: string) => `/workspace/${getWorkspaceId()}/knowledge/${knowledgeId}/problem`
77

88
/** 批量创建知识库问题。 */
99
const postProblems = (knowledgeId: string, contents: string[]) => post<string[], void>(getPrefix(knowledgeId), contents)
1010

11-
/** 分页搜索知识库问题,供分段选择已有问题进行关联。 */
11+
/** 分页搜索知识库问题,供问题列表及分段关联候选使用。 */
1212
const getProblemsPage = (knowledgeId: string, page: ParamsPage, query?: { content?: string }) =>
13-
get<ResponsePage<ParagraphProblem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
13+
get<ResponsePage<ProblemItem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
1414

1515
/** 编辑单个知识库问题的内容。 */
1616
const putProblem = (knowledgeId: string, problemId: string, content: string) =>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { get } from '../../../core/request'
22
import type { ParamsPage, ResponsePage } from '../../../core/types'
3-
import type { ParagraphProblem } from '@/api/types'
3+
import type { ProblemItem } from '@/api/types'
44
import { getWorkspaceId } from '@/utils/resource-context'
55

66
const getPrefix = (knowledgeId: string) => `/system/shared/workspace/${getWorkspaceId()}/knowledge/${knowledgeId}/problem`
77

88
/** 分页查询工作空间共享知识库的问题,只提供只读访问。 */
99
const getProblemsPage = (knowledgeId: string, page: ParamsPage, query?: { content?: string }) =>
10-
get<ResponsePage<ParagraphProblem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
10+
get<ResponsePage<ProblemItem>>(`${getPrefix(knowledgeId)}/${page.currentPage}/${page.pageSize}`, query)
1111

1212
export default { getProblemsPage }

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ export interface ParagraphProblem {
2020
content: string
2121
}
2222

23+
/** 知识库问题列表,包含关联数量和召回统计。 */
24+
export interface ProblemItem extends ParagraphProblem {
25+
paragraph_count: number
26+
hit_num: number
27+
last_hit_time: string | null
28+
create_time: string
29+
update_time: string
30+
}
31+
2332
/** 从问题详情查询到的关联分段,额外携带所属知识库与文档名称。 */
2433
export interface ProblemParagraph extends ParagraphItem {
2534
knowledge_id: string

‎ui/src/views/VIEW_README.md‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106

107107
`knowledge-detail/context.ts` 仅通过 `provideKnowledgeDetailContext` 和
108108
`useKnowledgeDetailContext` 公开详情、更新能力、ID、来源导航及完整 API。
109-
`resourceApi.knowledge / scheduledSync / document / paragraph / image / tags / termbase / chatUser / externalRetrieval` 按当前范围响应式读取,无需 `.value`,
109+
`resourceApi.knowledge / scheduledSync / document / paragraph / image / tags / termbase / problem / chatUser / externalRetrieval` 按当前范围响应式读取,无需 `.value`,
110110
不要在 setup 时解构具体 API。`workflow` 当前仅普通 Workspace 提供,其他范围不回退。
111111
共有查询方法必填,部分范围缺失的方法可选调用;未发请求时不提示成功、不关闭、不刷新或修改快照,loading 正常清理。
112112
不增加查询/维护双入口、接口别名或专属 Context hook,也不以方法存在性新增操作显隐规则。
@@ -207,9 +207,21 @@ System 资源管理或 System 共享 Knowledge API 的 `postKnowledgeHitTest`;
207207
文档 `DocumentTags`、标签 Drawer 和批量 Action 各自维护添加弹窗;添加候选仅取前 100 组并本地搜索,
208208
不禁选已关联值,后台去重。创建候选成功重载但不自动选择。删除仅解除文档关联,不删除知识库标签。
209209

210+
### 问题管理
211+
212+
`question/` 使用 `resourceApi.problem`,默认每页 20 条,不提供表头排序,搜索将 content 传给后端。
213+
`ButtonCreateProblem` 内聚创建按钮和多行输入弹窗;快捷创建使用 `MkQuickCreate`,每个问题最多 256 字符。
214+
单项与批量删除直接提交,删除后末页为空时回退到最后有效页;名称编辑复用 `MkEditName`。
215+
点击数据行打开 `ProblemDetailDrawer`,勾选、名称编辑和操作按钮不触发行详情。
216+
详情支持问题名称快捷编辑、关联分段卡片和跨页上一个/下一个;卡片复用 `.mk-paragraph-card` 样式,
217+
点击打开已有 `ParagraphDialog`,悬浮取消关联按钮仅解除当前关联,成功刷新卡片与列表计数。
218+
分段详情关闭后重查关联,保持编辑与解除关联后的数据一致。
219+
单项、批量、详情的“关联分段”入口暂时禁用,待交互确认后接入,不创建关联弹窗或发送关联请求。
220+
Workspace 共享只展示和搜索问题列表,不显示维护入口,也不打开缺少查询接口的问题详情。
221+
210222
## 文档分段
211223

212-
`document-detail/context.ts` 装配四范围完整 Document/Paragraph API 和返回导航,
224+
`document-detail/context.ts` 装配四范围完整 Document/Paragraph/Problem API 和返回导航,
213225
无注入时按当前路由创建上下文,供导入预览复用。页面提供上下文;Action 接收选定 Paragraph API,
214226
`paragraph-dialog/` 直接读取上下文,不透传 API。共有查询必填,维护方法按真实差异可选。
215227
Workspace 共享只读,隐藏创建、编辑、排序、关联修改及批量操作;缺少详情接口保留默认标题,不回退。

‎ui/src/views/document-detail/context.ts‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,18 @@ import ParagraphApi from '@/api/admin/workspace/knowledge/paragraph'
99
import SharedParagraphApi from '@/api/admin/workspace/shared/knowledge/paragraph'
1010
import SystemResourceParagraphApi from '@/api/admin/system/resource-management/knowledge/paragraph'
1111
import SystemSharedParagraphApi from '@/api/admin/system/shared-resources/knowledge/paragraph'
12+
import ProblemApi from '@/api/admin/workspace/knowledge/problem'
13+
import SharedProblemApi from '@/api/admin/workspace/shared/knowledge/problem'
14+
import SystemResourceProblemApi from '@/api/admin/system/resource-management/knowledge/problem'
15+
import SystemSharedProblemApi from '@/api/admin/system/shared-resources/knowledge/problem'
1216
import type { ResourceScope } from '@/router/admin/types'
1317

1418
const resourceConfigs = {
15-
workspace: { document: DocumentApi, paragraph: ParagraphApi },
16-
'workspace-shared': { document: SharedDocumentApi, paragraph: SharedParagraphApi },
17-
'system-resource': { document: SystemResourceDocumentApi, paragraph: SystemResourceParagraphApi },
18-
'system-shared': { document: SystemSharedDocumentApi, paragraph: SystemSharedParagraphApi },
19-
} satisfies Record<ResourceScope, { document: typeof SharedDocumentApi; paragraph: typeof SharedParagraphApi }>
19+
workspace: { document: DocumentApi, paragraph: ParagraphApi, problem: ProblemApi },
20+
'workspace-shared': { document: SharedDocumentApi, paragraph: SharedParagraphApi, problem: SharedProblemApi },
21+
'system-resource': { document: SystemResourceDocumentApi, paragraph: SystemResourceParagraphApi, problem: SystemResourceProblemApi },
22+
'system-shared': { document: SystemSharedDocumentApi, paragraph: SystemSharedParagraphApi, problem: SystemSharedProblemApi },
23+
} satisfies Record<ResourceScope, { document: typeof SharedDocumentApi; paragraph: typeof SharedParagraphApi; problem: typeof SharedProblemApi }>
2024

2125
/** 共有查询方法保持必填,仅部分范围提供的方法标记为可选。 */
2226
type ApiKeys<Api> = Api extends unknown ? keyof Api : never
@@ -41,6 +45,9 @@ function createDocumentDetailContext() {
4145
get paragraph(): DocumentParagraphApi {
4246
return resourceConfig.value.paragraph
4347
},
48+
get problem(): OptionalApiMethods<(typeof resourceConfigs)[ResourceScope]['problem']> {
49+
return resourceConfig.value.problem
50+
},
4451
})
4552

4653
function handleBack() {

‎ui/src/views/document-detail/paragraph-dialog/components/ParagraphQuestions.vue‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import { nextTick, onMounted, ref } from 'vue'
33
import type { SelectInstance } from 'element-plus'
44
import { useDocumentDetailContext } from '@/views/document-detail/context'
5-
import ProblemApi from '@/api/admin/workspace/knowledge/problem'
65
import type { ParagraphProblem } from '@/api/types'
76
import type { ParagraphQuestionDraft } from '../types'
87
import { isWorkspaceSharedResource } from '@/utils/resource-context'
@@ -25,7 +24,8 @@ const optionLoading = ref(false)
2524
2625
function loadProblemOptions(query = '') {
2726
optionLoading.value = true
28-
return ProblemApi.getProblemsPage(props.knowledgeId, { currentPage: 1, pageSize: 100 }, query.trim() ? { content: query.trim() } : undefined)
27+
return resourceApi.problem
28+
.getProblemsPage(props.knowledgeId, { currentPage: 1, pageSize: 100 }, query.trim() ? { content: query.trim() } : undefined)
2929
.then(({ records }) => {
3030
problemOptions.value = records
3131
})

‎ui/src/views/knowledge-detail/context.ts‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ import TermbaseApi from '@/api/admin/workspace/knowledge/termbase'
2525
import SharedTermbaseApi from '@/api/admin/workspace/shared/knowledge/termbase'
2626
import SystemResourceTermbaseApi from '@/api/admin/system/resource-management/knowledge/termbase'
2727
import SystemSharedTermbaseApi from '@/api/admin/system/shared-resources/knowledge/termbase'
28+
import ProblemApi from '@/api/admin/workspace/knowledge/problem'
29+
import SharedProblemApi from '@/api/admin/workspace/shared/knowledge/problem'
30+
import SystemResourceProblemApi from '@/api/admin/system/resource-management/knowledge/problem'
31+
import SystemSharedProblemApi from '@/api/admin/system/shared-resources/knowledge/problem'
2832
import WorkflowApi from '@/api/admin/workspace/knowledge/workflow'
2933
import ScheduledSyncApi from '@/api/admin/workspace/knowledge/scheduled-sync'
3034
import SharedScheduledSyncApi from '@/api/admin/workspace/shared/knowledge/scheduled-sync'
@@ -51,6 +55,7 @@ interface KnowledgeResourceApi {
5155
readonly paragraph: OptionalApiMethods<
5256
typeof ParagraphApi | typeof SharedParagraphApi | typeof SystemResourceParagraphApi | typeof SystemSharedParagraphApi
5357
>
58+
readonly problem: OptionalApiMethods<typeof ProblemApi | typeof SharedProblemApi | typeof SystemResourceProblemApi | typeof SystemSharedProblemApi>
5459
readonly chatUser: OptionalApiMethods<
5560
typeof ChatUserApi | typeof SharedChatUserApi | typeof SystemResourceChatUserApi | typeof SystemSharedChatUserApi
5661
>
@@ -93,6 +98,7 @@ const resourceConfigs = {
9398
image: ImageApi,
9499
tags: TagsApi,
95100
termbase: TermbaseApi,
101+
problem: ProblemApi,
96102
workflow: WorkflowApi,
97103
},
98104
listRouteName: 'workspace-knowledge-list',
@@ -107,6 +113,7 @@ const resourceConfigs = {
107113
paragraph: SharedParagraphApi,
108114
tags: SharedTagsApi,
109115
termbase: SharedTermbaseApi,
116+
problem: SharedProblemApi,
110117
},
111118
listRouteName: 'workspace-knowledge-list',
112119
},
@@ -121,6 +128,7 @@ const resourceConfigs = {
121128
image: SystemResourceImageApi,
122129
tags: SystemResourceTagsApi,
123130
termbase: SystemResourceTermbaseApi,
131+
problem: SystemResourceProblemApi,
124132
},
125133
listRouteName: 'system-resource-knowledge',
126134
},
@@ -134,6 +142,7 @@ const resourceConfigs = {
134142
paragraph: SystemSharedParagraphApi,
135143
tags: SystemSharedTagsApi,
136144
termbase: SystemSharedTermbaseApi,
145+
problem: SystemSharedProblemApi,
137146
},
138147
listRouteName: 'system-shared-knowledge',
139148
},
@@ -183,6 +192,9 @@ function createKnowledgeDetailContext(state: KnowledgeDetailState): KnowledgeDet
183192
get termbase() {
184193
return resourceConfig.value.resourceApi.termbase
185194
},
195+
get problem() {
196+
return resourceConfig.value.resourceApi.problem
197+
},
186198
get knowledge() {
187199
return resourceConfig.value.resourceApi.knowledge
188200
},
@@ -237,7 +249,11 @@ type ScopedResourceApi<Scope extends ResourceScope> = {
237249
}
238250

239251
type ScopedKnowledgeDetailContext<Scope extends ResourceScope> = Omit<KnowledgeDetailContext, 'resourceApi'> & {
240-
resourceApi: Omit<ScopedResourceApi<Scope>, 'scheduledSync' | 'tags' | 'termbase' | 'document' | 'chatUser' | 'externalRetrieval' | 'image'> & {
252+
resourceApi: Omit<
253+
ScopedResourceApi<Scope>,
254+
'scheduledSync' | 'tags' | 'termbase' | 'problem' | 'document' | 'chatUser' | 'externalRetrieval' | 'image'
255+
> & {
256+
readonly problem: OptionalApiMethods<(typeof resourceConfigs)[Scope]['resourceApi']['problem']>
241257
readonly image: KnowledgeResourceApi['image']
242258
readonly chatUser: OptionalApiMethods<(typeof resourceConfigs)[Scope]['resourceApi']['chatUser']>
243259
readonly scheduledSync: OptionalApiMethods<(typeof resourceConfigs)[Scope]['resourceApi']['scheduledSync']>

0 commit comments

Comments
 (0)