feat: document

This commit is contained in:
wangdan-fit2cloud 2025-06-19 21:32:14 +08:00
parent 73df001e41
commit 7acdd887bf
10 changed files with 82 additions and 105 deletions

View File

@ -54,11 +54,14 @@ const getDocumentPage: (
* *
* @param knowledge_id * @param knowledge_id
*/ */
const getDocumentDetail: (knowledge_id: string, document_id: string) => Promise<Result<any>> = ( const getDocumentDetail: (
knowledge_id, knowledge_id: string,
document_id, document_id: string,
) => { loading?: Ref<boolean>,
return get(`${prefix.value}/${knowledge_id}/document/${document_id}`) ) => Promise<Result<any>> = (knowledge_id, document_id, loading) => {
return get(`${prefix.value}/${knowledge_id}/document/${document_id}`,
{},
loading,)
} }
/** /**
@ -108,12 +111,7 @@ const putBatchCancelTask: (
data: any, data: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
) => Promise<Result<boolean>> = (knowledge_id, data, loading) => { ) => Promise<Result<boolean>> = (knowledge_id, data, loading) => {
return put( return put(`${prefix.value}/${knowledge_id}/document/batch_cancel_task`, data, undefined, loading)
`${prefix.value}/${knowledge_id}/document/batch_cancel_task`,
data,
undefined,
loading,
)
} }
/** /**
@ -560,12 +558,11 @@ const putMulLarkSyncDocument: (
const importLarkDocument: ( const importLarkDocument: (
knowledge_id: string, knowledge_id: string,
data: any, data: any,
loading?: Ref<boolean> loading?: Ref<boolean>,
) => Promise<Result<Array<any>>> = (knowledge_id, data, loading) => { ) => Promise<Result<Array<any>>> = (knowledge_id, data, loading) => {
return post(`${prefix.value}/lark/${knowledge_id}/import`, data, null, loading) return post(`${prefix.value}/lark/${knowledge_id}/import`, data, null, loading)
} }
export default { export default {
getDocumentList, getDocumentList,
getDocumentPage, getDocumentPage,
@ -596,5 +593,5 @@ export default {
getLarkDocumentList, getLarkDocumentList,
putLarkDocumentSync, putLarkDocumentSync,
putMulLarkSyncDocument, putMulLarkSyncDocument,
importLarkDocument importLarkDocument,
} }

View File

@ -300,5 +300,6 @@ export default {
putMulParagraph, putMulParagraph,
putBatchGenerateRelated, putBatchGenerateRelated,
putMigrateMulParagraph, putMigrateMulParagraph,
putDisassociationProblem putDisassociationProblem,
putAdjustPosition
} }

View File

@ -27,15 +27,19 @@ const getDocument: (
) )
} }
/** /**
* *
* @param knowledge_id * @param knowledge_id
*/ */
const getDocumentDetail: (knowledge_id: string, document_id: string) => Promise<Result<any>> = ( const getDocumentDetail: (
knowledge_id, knowledge_id: string,
document_id, document_id: string,
) => { loading?: Ref<boolean>,
return get(`${prefix}/${knowledge_id}/document/${document_id}`) ) => Promise<Result<any>> = (knowledge_id, document_id, loading) => {
return get(`${prefix}/${knowledge_id}/document/${document_id}`,
{},
loading,)
} }
/** /**

View File

@ -26,16 +26,16 @@ const getDocumentPage: (
loading, loading,
) )
} }
/** /**
* *
* @param knowledge_id * @param knowledge_id
*/ */
const getDocumentDetail: (knowledge_id: string, document_id: string) => Promise<Result<any>> = ( const getDocumentDetail: (
knowledge_id, knowledge_id: string,
document_id, document_id: string,
) => { loading?: Ref<boolean>,
return get(`${prefix}/${knowledge_id}/document/${document_id}`) ) => Promise<Result<any>> = (knowledge_id, document_id, loading) => {
return get(`${prefix}/${knowledge_id}/document/${document_id}`, {}, loading)
} }
/** /**
@ -85,12 +85,7 @@ const putBatchCancelTask: (
data: any, data: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
) => Promise<Result<boolean>> = (knowledge_id, data, loading) => { ) => Promise<Result<boolean>> = (knowledge_id, data, loading) => {
return put( return put(`${prefix}/${knowledge_id}/document/batch_cancel_task`, data, undefined, loading)
`${prefix}/${knowledge_id}/document/batch_cancel_task`,
data,
undefined,
loading,
)
} }
/** /**
@ -470,12 +465,7 @@ const getLarkDocumentList: (
data: any, data: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
) => Promise<Result<any>> = (knowledge_id, folder_token, data, loading) => { ) => Promise<Result<any>> = (knowledge_id, folder_token, data, loading) => {
return post( return post(`${prefix}/lark/${knowledge_id}/${folder_token}/doc_list`, data, undefined, loading)
`${prefix}/lark/${knowledge_id}/${folder_token}/doc_list`,
data,
undefined,
loading,
)
} }
/** /**

View File

@ -5,6 +5,7 @@
@mouseenter="cardEnter()" @mouseenter="cardEnter()"
@mouseleave="cardLeave()" @mouseleave="cardLeave()"
@click.stop="editParagraph(data)" @click.stop="editParagraph(data)"
v-loading="loading"
> >
<h2 class="mb-16">{{ data.title || '-' }}</h2> <h2 class="mb-16">{{ data.title || '-' }}</h2>
<div v-show="show" class="mk-sticky" v-if="!disabled"> <div v-show="show" class="mk-sticky" v-if="!disabled">
@ -30,7 +31,7 @@
</el-button> </el-button>
</span> </span>
<span class="mr-8"> <span class="mr-8">
<el-button link> <el-button link @click.stop="addParagraph(data)">
<el-icon :size="16" :title="$t('views.applicationWorkflow.control.zoomOut')"> <el-icon :size="16" :title="$t('views.applicationWorkflow.control.zoomOut')">
<el-icon><CirclePlus /></el-icon> <el-icon><CirclePlus /></el-icon>
</el-icon> </el-icon>
@ -154,6 +155,11 @@ function editParagraph(row: any) {
} }
} }
function addParagraph(row: any) {
title.value = t('views.paragraph.addParagraph')
ParagraphDialogRef.value.open(row, 'add')
}
const SelectDocumentDialogRef = ref() const SelectDocumentDialogRef = ref()
function openSelectDocumentDialog(row?: any) { function openSelectDocumentDialog(row?: any) {
SelectDocumentDialogRef.value.open([row.id]) SelectDocumentDialogRef.value.open([row.id])

View File

@ -7,13 +7,14 @@
destroy-on-close destroy-on-close
:close-on-click-modal="false" :close-on-click-modal="false"
:close-on-press-escape="false" :close-on-press-escape="false"
@click.stop
> >
<el-row v-loading="loading"> <el-row v-loading="loading">
<el-col :span="18"> <el-col :span="18">
<el-scrollbar height="500" wrap-class="paragraph-scrollbar"> <el-scrollbar height="500" wrap-class="paragraph-scrollbar">
<div class="p-24" style="padding-bottom: 8px"> <div class="p-24" style="padding-bottom: 8px">
<div style="position: absolute; right: 20px; top: 20px"> <div style="position: absolute; right: 20px; top: 20px">
<el-button text @click="isEdit = true" v-if="problemId && !isEdit"> <el-button text @click="isEdit = true" v-if="paragraphId && !isEdit">
<el-icon><EditPen /></el-icon> <el-icon><EditPen /></el-icon>
</el-button> </el-button>
</div> </div>
@ -21,7 +22,7 @@
<ParagraphForm ref="paragraphFormRef" :data="detail" :isEdit="isEdit" /> <ParagraphForm ref="paragraphFormRef" :data="detail" :isEdit="isEdit" />
</div> </div>
</el-scrollbar> </el-scrollbar>
<div class="text-right p-24 pt-0" v-if="problemId && isEdit"> <div class="text-right p-24 pt-0" v-if="paragraphId && isEdit">
<el-button @click.prevent="cancelEdit"> {{ $t('common.cancel') }} </el-button> <el-button @click.prevent="cancelEdit"> {{ $t('common.cancel') }} </el-button>
<el-button type="primary" :disabled="loading" @click="handleDebounceClick"> <el-button type="primary" :disabled="loading" @click="handleDebounceClick">
{{ $t('common.save') }} {{ $t('common.save') }}
@ -31,14 +32,14 @@
<el-col :span="6" class="border-l" style="width: 300px"> <el-col :span="6" class="border-l" style="width: 300px">
<!-- 关联问题 --> <!-- 关联问题 -->
<ProblemComponent <ProblemComponent
:problemId="problemId" :paragraphId="paragraphId"
:docId="document_id" :docId="document_id"
:knowledgeId="dataset_id" :knowledgeId="dataset_id"
ref="ProblemRef" ref="ProblemRef"
/> />
</el-col> </el-col>
</el-row> </el-row>
<template #footer v-if="!problemId"> <template #footer v-if="!paragraphId">
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click.prevent="dialogVisible = false"> {{ $t('common.cancel') }} </el-button> <el-button @click.prevent="dialogVisible = false"> {{ $t('common.cancel') }} </el-button>
<el-button :disabled="loading" type="primary" @click="handleDebounceClick"> <el-button :disabled="loading" type="primary" @click="handleDebounceClick">
@ -76,16 +77,17 @@ const paragraphFormRef = ref<any>()
const dialogVisible = ref<boolean>(false) const dialogVisible = ref<boolean>(false)
const loading = ref(false) const loading = ref(false)
const problemId = ref('') const paragraphId = ref('')
const detail = ref<any>({}) const detail = ref<any>({})
const isEdit = ref(false) const isEdit = ref(false)
const document_id = ref('') const document_id = ref('')
const dataset_id = ref('') const dataset_id = ref('')
const cloneData = ref(null) const cloneData = ref(null)
const position = ref(null)
watch(dialogVisible, (bool) => { watch(dialogVisible, (bool) => {
if (!bool) { if (!bool) {
problemId.value = '' paragraphId.value = ''
detail.value = {} detail.value = {}
isEdit.value = false isEdit.value = false
document_id.value = '' document_id.value = ''
@ -99,28 +101,31 @@ const cancelEdit = () => {
detail.value = cloneDeep(cloneData.value) detail.value = cloneDeep(cloneData.value)
} }
const open = (data: any) => { const open = (data: any, str: any) => {
if (data) { if (data && !str) {
detail.value.title = data.title detail.value.title = data.title
detail.value.content = data.content detail.value.content = data.content
cloneData.value = cloneDeep(detail.value) cloneData.value = cloneDeep(detail.value)
problemId.value = data.id paragraphId.value = data.id
document_id.value = data.document_id document_id.value = data.document_id
dataset_id.value = data.dataset_id || id dataset_id.value = data.dataset_id || id
} else { } else {
isEdit.value = true isEdit.value = true
if (str === 'add') {
position.value = data.position
}
} }
dialogVisible.value = true dialogVisible.value = true
} }
const submitHandle = async () => { const submitHandle = async () => {
if (await paragraphFormRef.value?.validate()) { if (await paragraphFormRef.value?.validate()) {
loading.value = true loading.value = true
if (problemId.value) { if (paragraphId.value) {
paragraph paragraph
.asyncPutParagraph( .asyncPutParagraph(
dataset_id.value, dataset_id.value,
documentId || document_id.value, documentId || document_id.value,
problemId.value, paragraphId.value,
paragraphFormRef.value?.form, paragraphFormRef.value?.form,
loading, loading,
) )
@ -132,10 +137,14 @@ const submitHandle = async () => {
const obj = const obj =
ProblemRef.value.problemList.length > 0 ProblemRef.value.problemList.length > 0
? { ? {
position: String(position.value) ? position.value : null,
problem_list: ProblemRef.value.problemList, problem_list: ProblemRef.value.problemList,
...paragraphFormRef.value?.form, ...paragraphFormRef.value?.form,
} }
: paragraphFormRef.value?.form : {
position: String(position.value) ? position.value : null,
...paragraphFormRef.value?.form,
}
paragraphApi.postParagraph(id, documentId, obj, loading).then((res) => { paragraphApi.postParagraph(id, documentId, obj, loading).then((res) => {
dialogVisible.value = false dialogVisible.value = false
emit('refresh') emit('refresh')

View File

@ -61,7 +61,7 @@ import paragraphApi from '@/api/knowledge/paragraph'
import useStore from '@/stores' import useStore from '@/stores'
const props = defineProps({ const props = defineProps({
problemId: String, paragraphId: String,
docId: String, docId: String,
knowledgeId: String, knowledgeId: String,
}) })
@ -83,7 +83,7 @@ const problemOptions = ref<any[]>([])
const optionLoading = ref(false) const optionLoading = ref(false)
watch( watch(
() => props.problemId, () => props.paragraphId,
(value) => { (value) => {
if (value) { if (value) {
getProblemList() getProblemList()
@ -100,7 +100,7 @@ function delProblemHandle(item: any, index: number) {
.asyncDisassociationProblem( .asyncDisassociationProblem(
props.knowledgeId || id, props.knowledgeId || id,
documentId || props.docId, documentId || props.docId,
props.problemId || '', props.paragraphId || '',
item.id, item.id,
loading, loading,
) )
@ -115,7 +115,7 @@ function delProblemHandle(item: any, index: number) {
function getProblemList() { function getProblemList() {
loading.value = true loading.value = true
paragraphApi paragraphApi
.getParagraphProblem(props.knowledgeId || id, documentId || props.docId, props.problemId || '') .getParagraphProblem(props.knowledgeId || id, documentId || props.docId, props.paragraphId || '')
.then((res) => { .then((res) => {
problemList.value = res.data problemList.value = res.data
loading.value = false loading.value = false
@ -132,19 +132,19 @@ function addProblem() {
}) })
} }
function addProblemHandle(val: string) { function addProblemHandle(val: string) {
if (props.problemId) { if (props.paragraphId) {
const api = problemOptions.value.some((option) => option.id === val) const api = problemOptions.value.some((option) => option.id === val)
? paragraph.asyncAssociationProblem( ? paragraph.asyncAssociationProblem(
props.knowledgeId || id, props.knowledgeId || id,
documentId || props.docId, documentId || props.docId,
props.problemId, props.paragraphId,
val, val,
loading, loading,
) )
: paragraphApi.postParagraphProblem( : paragraphApi.postParagraphProblem(
props.knowledgeId || id, props.knowledgeId || id,
documentId || props.docId, documentId || props.docId,
props.problemId, props.paragraphId,
{ {
content: val, content: val,
}, },

View File

@ -81,19 +81,14 @@
handle=".handle" handle=".handle"
:animation="150" :animation="150"
ghostClass="ghost" ghostClass="ghost"
@end="onEnd"
> >
<template v-for="(item, index) in paragraphDetail" :key="item.id"> <template v-for="(item, index) in paragraphDetail" :key="item.id">
<div :id="`m${item.id}`" class="flex mb-16"> <div :id="`m${item.id}`" class="flex mb-16">
<!-- 批量操作 --> <!-- 批量操作 -->
<div class="paragraph-card flex w-full" v-if="isBatch === true"> <div class="paragraph-card flex w-full" v-if="isBatch === true">
<el-checkbox :value="item.id" /> <el-checkbox :value="item.id" />
<ParagraphCard <ParagraphCard :data="item" class="mb-8 w-full" :disabled="true" />
:data="item"
class="mb-8 w-full"
@refresh="refresh"
@refreshMigrateParagraph="refreshMigrateParagraph"
:disabled="true"
/>
</div> </div>
<!-- 非批量操作 --> <!-- 非批量操作 -->
<div class="handle paragraph-card flex w-full" :id="item.id" v-else> <div class="handle paragraph-card flex w-full" :id="item.id" v-else>
@ -109,6 +104,8 @@
class="mb-8 w-full" class="mb-8 w-full"
@changeState="changeState" @changeState="changeState"
@deleteParagraph="deleteParagraph" @deleteParagraph="deleteParagraph"
@refresh="refresh"
@refreshMigrateParagraph="refreshMigrateParagraph"
/> />
</div> </div>
</div> </div>
@ -265,15 +262,8 @@ function addParagraph() {
} }
function getDetail() { function getDetail() {
loading.value = true documentApi.getDocumentDetail(id, documentId, loading).then((res) => {
documentApi
.getDocumentDetail(id, documentId)
.then((res) => {
documentDetail.value = res.data documentDetail.value = res.data
loading.value = false
})
.catch(() => {
loading.value = false
}) })
} }
@ -320,17 +310,11 @@ function openGenerateDialog(row?: any) {
} }
function onEnd(event?: any) { function onEnd(event?: any) {
const { oldIndex, newIndex } = event const obj = {
if (oldIndex === undefined || newIndex === undefined) return paragraph_id: paragraphDetail.value[event.newIndex].id,
const list = cloneDeep(paragraphDetail.value) new_position: paragraphDetail.value[event.newIndex].position,
if (oldIndex === list.length - 1 || newIndex === list.length - 1) {
return
} }
const newInstance = { ...list[oldIndex], type: list[newIndex].type, id: list[newIndex].id } paragraphApi.putAdjustPosition(id, documentId, obj, loading)
const oldInstance = { ...list[newIndex], type: list[oldIndex].type, id: list[oldIndex].id }
list[newIndex] = newInstance
list[oldIndex] = oldInstance
paragraphDetail.value = list
} }
onMounted(() => { onMounted(() => {

View File

@ -254,15 +254,8 @@ function addParagraph() {
} }
function getDetail() { function getDetail() {
loading.value = true documentApi.getDocumentDetail(id, documentId, loading).then((res) => {
documentApi
.getDocumentDetail(id, documentId)
.then((res) => {
documentDetail.value = res.data documentDetail.value = res.data
loading.value = false
})
.catch(() => {
loading.value = false
}) })
} }

View File

@ -252,15 +252,8 @@ function addParagraph() {
} }
function getDetail() { function getDetail() {
loading.value = true documentApi.getDocumentDetail(id, documentId, loading).then((res) => {
documentApi
.getDocumentDetail(id, documentId)
.then((res) => {
documentDetail.value = res.data documentDetail.value = res.data
loading.value = false
})
.catch(() => {
loading.value = false
}) })
} }