|
@@ -12,7 +12,7 @@
|
|
|
/>文档列表
|
|
|
</div>
|
|
|
<div class="bm-main-box mt-[1.25rem]" v-if="state.knowledge.ID">
|
|
|
- <div class="flex gap-[1rem]">
|
|
|
+ <div class="flex gap-[1rem]" v-if="state.step === 1">
|
|
|
<CzrButton
|
|
|
:type="state.uploadType == UploadTypeEnum.Text ? 'primary' : 'normal'"
|
|
|
title="文本文件"
|
|
@@ -124,7 +124,7 @@
|
|
|
@mouseleave="file.hover__ = false"
|
|
|
>
|
|
|
<img
|
|
|
- src="@/assets/images/file-word.png"
|
|
|
+ :src="DictionaryStore.getFileIcon(file.name)"
|
|
|
class="h-[1.25rem] w-[1.25rem]"
|
|
|
/>
|
|
|
<div
|
|
@@ -178,7 +178,7 @@
|
|
|
>
|
|
|
<CzrButton
|
|
|
type="primary"
|
|
|
- title="下一步"
|
|
|
+ title="保存并处理"
|
|
|
@click="onNextOne"
|
|
|
></CzrButton>
|
|
|
</div>
|
|
@@ -298,7 +298,7 @@
|
|
|
>
|
|
|
<img
|
|
|
class="h-[3rem] w-[3rem]"
|
|
|
- src="@/assets/images/file-word.png"
|
|
|
+ :src="DictionaryStore.getFileIcon(value.name)"
|
|
|
/>
|
|
|
<div class="flex flex-1 flex-col gap-[0.5rem]">
|
|
|
<div
|
|
@@ -332,29 +332,15 @@
|
|
|
class="flex items-center gap-[0.25rem] text-[0.75rem] text-[#909399]"
|
|
|
>
|
|
|
<div>{{ value.date }}</div>
|
|
|
- <div>{{ (value.size / 1024 / 1024).toFixed(2) }}MB</div>
|
|
|
- <div class="ml-auto">
|
|
|
- {{ value.process }}%(剩余时间{{
|
|
|
- comTime(value.timestamp, true)
|
|
|
- }})
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div
|
|
|
- class="relative h-[0.25rem] w-full rounded-[0.25rem]"
|
|
|
- :style="{
|
|
|
- backgroundColor: `rgba(var(--czr-main-color-rgb), 0.3)`,
|
|
|
- }"
|
|
|
- >
|
|
|
- <div
|
|
|
- class="absolute h-[0.25rem] rounded-[0.25rem]"
|
|
|
- :style="{
|
|
|
- backgroundColor: `rgba(var(--czr-main-color-rgb), 1)`,
|
|
|
- width: `${value.process}%`,
|
|
|
- }"
|
|
|
- />
|
|
|
+ <div class="ml-2">{{ formatFileSize(value.size) }}</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</div>
|
|
|
+ <div
|
|
|
+ class="flex items-center gap-[var(--czr-gap)] text-[0.75rem] text-[#6F7889]"
|
|
|
+ >
|
|
|
+ {{ DictionaryStore.indexingStatusMap.get(value.status) }}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</div>
|
|
@@ -367,7 +353,7 @@
|
|
|
>
|
|
|
<img
|
|
|
class="h-[3rem] w-[3rem]"
|
|
|
- src="@/assets/images/file-word.png"
|
|
|
+ :src="DictionaryStore.getFileIcon(value.name)"
|
|
|
/>
|
|
|
<div class="flex flex-1 flex-col gap-[0.5rem]">
|
|
|
<div
|
|
@@ -381,16 +367,14 @@
|
|
|
class="flex items-center gap-[0.25rem] text-[0.75rem] text-[#909399]"
|
|
|
>
|
|
|
<div>{{ value.date }}</div>
|
|
|
- <div>{{ (value.size / 1024 / 1024).toFixed(2) }}MB</div>
|
|
|
+ <div class="ml-2">{{ formatFileSize(value.size) }}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div
|
|
|
class="flex items-center gap-[var(--czr-gap)] text-[0.75rem] text-[#6F7889]"
|
|
|
>
|
|
|
- 处理完成<SvgIcon
|
|
|
- name="success"
|
|
|
- color="var(--czr-success-color)"
|
|
|
- />
|
|
|
+ {{ value.status }}
|
|
|
+ <SvgIcon name="success" color="var(--czr-success-color)" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -409,6 +393,7 @@ import {
|
|
|
getCurrentInstance,
|
|
|
inject,
|
|
|
onMounted,
|
|
|
+ onUnmounted,
|
|
|
reactive,
|
|
|
ref,
|
|
|
watch,
|
|
@@ -416,12 +401,16 @@ import {
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import { v4 } from 'uuid'
|
|
|
-import { useDialogStore } from '@/stores'
|
|
|
-import { comTime } from '@/utils/czr-util'
|
|
|
+import { useDialogStore, useDictionaryStore } from '@/stores'
|
|
|
+import { comTime, formatFileSize, YMD, YMDHms } from '@/utils/czr-util'
|
|
|
import { fileUploadFile } from '@/api/modules/global/upload'
|
|
|
-import { datasetsDetail } from '@/api/modules/knowledge'
|
|
|
-import { datasetsDocumentsDealView } from '@/api/modules/knowledge/document'
|
|
|
+import { datasetsDetail, datasetsUpdateExport } from '@/api/modules/knowledge'
|
|
|
+import {
|
|
|
+ datasetsDocumentsDealStatus,
|
|
|
+ datasetsDocumentsDealView,
|
|
|
+} from '@/api/modules/knowledge/document'
|
|
|
|
|
|
+const DictionaryStore = useDictionaryStore()
|
|
|
const DialogStore = useDialogStore()
|
|
|
const route = useRoute()
|
|
|
const router = useRouter()
|
|
@@ -453,51 +442,54 @@ const state: any = reactive({
|
|
|
},
|
|
|
},
|
|
|
taskFiles: {
|
|
|
- waiting: new Map([
|
|
|
- [
|
|
|
- 1,
|
|
|
- {
|
|
|
- name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
- date: '2022-09-17',
|
|
|
- size: 123123132,
|
|
|
- process: 80,
|
|
|
- timestamp: 1000 * 60 * 23,
|
|
|
- error: '',
|
|
|
- },
|
|
|
- ],
|
|
|
- [
|
|
|
- 2,
|
|
|
- {
|
|
|
- name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
- date: '2022-09-17',
|
|
|
- size: 1231231321,
|
|
|
- process: 100,
|
|
|
- timestamp: 1000 * 60 * 17,
|
|
|
- error: '',
|
|
|
- },
|
|
|
- ],
|
|
|
- [
|
|
|
- 22,
|
|
|
- {
|
|
|
- name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
- date: '2022-09-17',
|
|
|
- size: 1231231321,
|
|
|
- process: 100,
|
|
|
- timestamp: 1000 * 60 * 17,
|
|
|
- error: '123123123123123',
|
|
|
- },
|
|
|
- ],
|
|
|
- ]),
|
|
|
- success: new Map([
|
|
|
- [
|
|
|
- 3,
|
|
|
- {
|
|
|
- name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
- date: '2022-09-17',
|
|
|
- size: 1231231321,
|
|
|
- },
|
|
|
- ],
|
|
|
- ]),
|
|
|
+ timer: null,
|
|
|
+ waiting: new Map(),
|
|
|
+ success: new Map(),
|
|
|
+ // waiting: new Map([
|
|
|
+ // [
|
|
|
+ // 1,
|
|
|
+ // {
|
|
|
+ // name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
+ // date: '2022-09-17',
|
|
|
+ // size: 123123132,
|
|
|
+ // process: 80,
|
|
|
+ // timestamp: 1000 * 60 * 23,
|
|
|
+ // error: '',
|
|
|
+ // },
|
|
|
+ // ],
|
|
|
+ // [
|
|
|
+ // 2,
|
|
|
+ // {
|
|
|
+ // name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
+ // date: '2022-09-17',
|
|
|
+ // size: 1231231321,
|
|
|
+ // process: 100,
|
|
|
+ // timestamp: 1000 * 60 * 17,
|
|
|
+ // error: '',
|
|
|
+ // },
|
|
|
+ // ],
|
|
|
+ // [
|
|
|
+ // 22,
|
|
|
+ // {
|
|
|
+ // name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
+ // date: '2022-09-17',
|
|
|
+ // size: 1231231321,
|
|
|
+ // process: 100,
|
|
|
+ // timestamp: 1000 * 60 * 17,
|
|
|
+ // error: '123123123123123',
|
|
|
+ // },
|
|
|
+ // ],
|
|
|
+ // ]),
|
|
|
+ // success: new Map([
|
|
|
+ // [
|
|
|
+ // 3,
|
|
|
+ // {
|
|
|
+ // name: '高效办成一件事视频脚本20250411-调整.docx',
|
|
|
+ // date: '2022-09-17',
|
|
|
+ // size: 1231231321,
|
|
|
+ // },
|
|
|
+ // ],
|
|
|
+ // ]),
|
|
|
},
|
|
|
})
|
|
|
const UploadConfig = {
|
|
@@ -566,6 +558,7 @@ const handleBeforeUpload = (file) => {
|
|
|
url: '',
|
|
|
success: false,
|
|
|
process: 0,
|
|
|
+ size: file.size,
|
|
|
})
|
|
|
return true
|
|
|
}
|
|
@@ -635,16 +628,92 @@ watch(
|
|
|
(n) => {
|
|
|
if (
|
|
|
(n === 2 && state.uploadType === UploadTypeEnum.QA) ||
|
|
|
- (n && state.uploadType === UploadTypeEnum.Text)
|
|
|
+ (n === 3 && state.uploadType === UploadTypeEnum.Text)
|
|
|
) {
|
|
|
initTask()
|
|
|
}
|
|
|
},
|
|
|
)
|
|
|
-const initTask = () => {}
|
|
|
+const initTask = () => {
|
|
|
+ const refreshStatus = () => {
|
|
|
+ datasetsDocumentsDealStatus({
|
|
|
+ fileIds: state.uploadFileList.map((v) => v.url),
|
|
|
+ }).then(({ data }: any) => {
|
|
|
+ data.forEach((v) => {
|
|
|
+ const f = state.taskFiles.waiting.get(v.fileId)
|
|
|
+ f.status = v.indexingStatus
|
|
|
+ if (f.status === 'completed') {
|
|
|
+ state.taskFiles.success.set(v.fileId, f)
|
|
|
+ state.taskFiles.waiting.delete(v.fileId)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if (state.taskFiles.waiting.size === 0) {
|
|
|
+ clearInterval(state.taskFiles.timer)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (state.uploadType === UploadTypeEnum.Text) {
|
|
|
+ datasetsUpdateExport({
|
|
|
+ datasetId: state.ID,
|
|
|
+ datasetDocumentList: state.uploadFileList.map((v) => ({
|
|
|
+ name: v.name,
|
|
|
+ fileId: v.url,
|
|
|
+ contentConfig: {
|
|
|
+ maxParentSize: 500,
|
|
|
+ overlapSize: 20,
|
|
|
+ parentSeparator: '\n\n',
|
|
|
+ splitType: 'CustomSymbolSplitter',
|
|
|
+ },
|
|
|
+ })),
|
|
|
+ }).then(() => {
|
|
|
+ state.uploadFileList.forEach((v) => {
|
|
|
+ state.taskFiles.waiting.set(v.url, {
|
|
|
+ name: v.name,
|
|
|
+ url: v.url,
|
|
|
+ size: v.size,
|
|
|
+ date: YMD(new Date()),
|
|
|
+ status: '',
|
|
|
+ })
|
|
|
+ })
|
|
|
+ state.taskFiles.timer = setInterval(() => {
|
|
|
+ refreshStatus()
|
|
|
+ }, 1000 * 5)
|
|
|
+ refreshStatus()
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ datasetsUpdateExport({
|
|
|
+ datasetId: state.ID,
|
|
|
+ datasetQASList: state.uploadFileList.map((v) => ({
|
|
|
+ name: v.name,
|
|
|
+ fileId: v.url,
|
|
|
+ })),
|
|
|
+ }).then(() => {
|
|
|
+ state.uploadFileList.forEach((v) => {
|
|
|
+ state.taskFiles.waiting.set(v.url, {
|
|
|
+ name: v.name,
|
|
|
+ url: v.url,
|
|
|
+ size: v.size,
|
|
|
+ date: YMD(new Date()),
|
|
|
+ status: '',
|
|
|
+ })
|
|
|
+ })
|
|
|
+ state.taskFiles.timer = setInterval(() => {
|
|
|
+ refreshStatus()
|
|
|
+ }, 1000 * 5)
|
|
|
+ refreshStatus()
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
onMounted(() => {
|
|
|
initDetail()
|
|
|
+ initDictionary()
|
|
|
+})
|
|
|
+onUnmounted(() => {
|
|
|
+ clearInterval(state.taskFiles.timer)
|
|
|
})
|
|
|
+const initDictionary = () => {
|
|
|
+ DictionaryStore.initDict('indexing_status')
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|