feat: 知识库

This commit is contained in:
JiangSheng
2025-11-25 16:52:29 +08:00
parent 711f3c72d3
commit e07658b4ca
9 changed files with 103 additions and 53 deletions

View File

@@ -62,7 +62,7 @@ const props = withDefaults(defineProps<Props>(), {
isInitial: false, isInitial: false,
modelValue: false, modelValue: false,
}); });
const emits = defineEmits(['update:modelValue', 'ok']); const emits = defineEmits(['update:modelValue', 'confirm']);
const visible = computed({ const visible = computed({
get: () => props.modelValue, get: () => props.modelValue,
set: (val) => emits('update:modelValue', val), set: (val) => emits('update:modelValue', val),
@@ -103,7 +103,7 @@ const onConfirmFun = async () => {
} }
await formRef.value.validate((valid, fields) => { await formRef.value.validate((valid, fields) => {
if (valid) { if (valid) {
emits('ok', form); emits('confirm', form);
} else { } else {
console.log('error submit!', fields); console.log('error submit!', fields);
} }

View File

@@ -46,7 +46,7 @@ const props = withDefaults(defineProps<Props>(), {
poolList: () => [], poolList: () => [],
}); });
const emits = defineEmits(['update:modelValue', 'ok']); const emits = defineEmits(['update:modelValue', 'confirm']);
const form = ref({ const form = ref({
name: '', name: '',
}); });
@@ -110,7 +110,7 @@ const onConfirmFun = async () => {
} }
await formRef.value.validate((valid) => { await formRef.value.validate((valid) => {
if (valid) { if (valid) {
emits('ok', form.value); emits('confirm', form.value);
} }
}); });
}; };

View File

@@ -38,7 +38,7 @@ const props = withDefaults(defineProps<Props>(), {
modelValue: false, modelValue: false,
}); });
const emits = defineEmits(['update:modelValue', 'ok']); const emits = defineEmits(['update:modelValue', 'confirm']);
const visible = computed({ const visible = computed({
get: () => props.modelValue, get: () => props.modelValue,
@@ -64,7 +64,7 @@ const onDelPoolFun = async (pool: Pool) => {
if (res.code === 200) { if (res.code === 200) {
ElMessage.success(res.message); ElMessage.success(res.message);
queryListFun(); queryListFun();
emits('ok'); emits('confirm');
} else { } else {
ElMessage.error(res.message); ElMessage.error(res.message);
} }

View File

@@ -66,7 +66,7 @@ const props = withDefaults(defineProps<Props>(), {
poolList: () => [], poolList: () => [],
}); });
const emits = defineEmits(['update:modelValue', 'ok']); const emits = defineEmits(['update:modelValue', 'confirm']);
const form = ref<{ const form = ref<{
fileList: any[]; fileList: any[];
file: any | null; file: any | null;
@@ -144,7 +144,7 @@ const onConfirmFun = async () => {
if (form.value.fileList && form.value.fileList.length > 0) { if (form.value.fileList && form.value.fileList.length > 0) {
form.value.file = form.value.fileList[0]; form.value.file = form.value.fileList[0];
} }
emits('ok', form.value); emits('confirm', form.value);
} }
}); });
}; };

View File

@@ -169,20 +169,20 @@
<addApprove <addApprove
v-model="dialogApproveUserVisible" v-model="dialogApproveUserVisible"
:isInitial="isEmptyPool" :isInitial="isEmptyPool"
@ok="onConfirmFun" @confirm="onAddApproveConfirmFun"
></addApprove> ></addApprove>
<add-pool-modal <add-pool-modal
v-model="addPoolModalVisible" v-model="addPoolModalVisible"
mode="add" mode="add"
:poolList="poolList" :poolList="poolList"
detail="{}" detail="{}"
@ok="onAddPoolOkFun" @confirm="onAddPoolConfirmFun"
/> />
<del-pool-modal v-model="delPoolModalVisible" @ok="onDelPoolOkFun" /> <del-pool-modal v-model="delPoolModalVisible" @confirm="onDelPoolConfirmFun" />
<import-pool-modal <import-pool-modal
v-model="importPoolModalVisible" v-model="importPoolModalVisible"
:poolList="poolList" :poolList="poolList"
@ok="onImportPoolOkFun" @confirm="onImportPoolConfirmFun"
/> />
</template> </template>
@@ -303,7 +303,7 @@ const onTableTypeChangeFun = (type: string) => {
mergeListTableColumnsFun(); mergeListTableColumnsFun();
} }
}; };
const onConfirmFun = async (formData: any) => { const onAddApproveConfirmFun = async (formData: any) => {
dialogApproveUserVisible.value = false; dialogApproveUserVisible.value = false;
if (isEmptyPool.value) { if (isEmptyPool.value) {
await createTaskPoolFun(formData); await createTaskPoolFun(formData);
@@ -865,7 +865,7 @@ const addPoolModalVisible = ref(false);
const addPoolFun = () => { const addPoolFun = () => {
addPoolModalVisible.value = true; addPoolModalVisible.value = true;
}; };
const onAddPoolOkFun = (formData: any) => { const onAddPoolConfirmFun = (formData: any) => {
const newPool = { const newPool = {
tenantId, tenantId,
poolName: formData.name, poolName: formData.name,
@@ -882,7 +882,7 @@ const delPoolModalVisible = ref(false);
const openDelPoolFun = () => { const openDelPoolFun = () => {
delPoolModalVisible.value = true; delPoolModalVisible.value = true;
}; };
const onDelPoolOkFun = () => { const onDelPoolConfirmFun = () => {
refreshPoolFun(); refreshPoolFun();
}; };
const importPoolModalVisible = ref(false); const importPoolModalVisible = ref(false);
@@ -934,7 +934,7 @@ const dict = computed(() => ({
section: taskPoolDictOptions.value.sectionListOptions, section: taskPoolDictOptions.value.sectionListOptions,
group: taskPoolDictOptions.value.groupListOptions, group: taskPoolDictOptions.value.groupListOptions,
})); }));
const onImportPoolOkFun = async (formData: any) => { const onImportPoolConfirmFun = async (formData: any) => {
importPoolModalVisible.value = false; importPoolModalVisible.value = false;
const req = { const req = {
poolName: formData.poolName, poolName: formData.poolName,

View File

@@ -43,7 +43,7 @@ const props = withDefaults(defineProps<Props>(), {
mode: 'add', mode: 'add',
}); });
const emits = defineEmits(['update:modelValue', 'ok']); const emits = defineEmits(['update:modelValue', 'confirm']);
const form = ref({ const form = ref({
name: '', name: '',
}); });
@@ -91,7 +91,7 @@ const onConfirmFun = async () => {
} }
await formRef.value.validate((valid) => { await formRef.value.validate((valid) => {
if (valid) { if (valid) {
emits('ok', form.value); emits('confirm', form.value);
} }
}); });
}; };

View File

@@ -63,7 +63,7 @@ const props = withDefaults(defineProps<Props>(), {
folder: null, folder: null,
tableName: '', tableName: '',
}); });
const emits = defineEmits(['update:modelValue', 'ok']); const emits = defineEmits(['update:modelValue', 'confirm']);
const visible = computed({ const visible = computed({
get: () => props.modelValue, get: () => props.modelValue,
set: (val) => emits('update:modelValue', val), set: (val) => emits('update:modelValue', val),
@@ -100,19 +100,21 @@ const form = ref<RuleForm>({
const onShowFun = () => { const onShowFun = () => {
resetFun(); resetFun();
initData(); if (props.detail && props.detail.id) {
initData();
}
}; };
const initData = () => { const initData = () => {
const file = [{ const file = [{
name: props.detail.originalName, name: props.detail?.originalName,
}]; }];
tableFormRef.value?.setFormDataFun({ ...props.detail, ...{ originalName: file } }); tableFormRef.value?.setFormDataFun({ ...props.detail, ...{ originalName: file } });
form.value.projectId = props.detail.projectId; form.value.projectId = props.detail?.projectId;
form.value.analysisDirectionId = props.detail.analysisDirectionId; form.value.analysisDirectionId = props.detail?.analysisDirectionId;
}; };
watchEffect(() => { watchEffect(() => {
nextTick(() => { nextTick(() => {
if (props.detail) { if (props.detail && props.detail.id) {
initData(); initData();
} }
}); });
@@ -143,9 +145,14 @@ const onConfirmFun = async () => {
if (valid) { if (valid) {
const formData = tableFormRef.value?.getFormDataFun(); const formData = tableFormRef.value?.getFormDataFun();
if (formData.originalName && formData.originalName.length > 0) { if (formData.originalName && formData.originalName.length > 0) {
formData.file = formData.originalName[0] || {}; formData.file = formData.originalName.map((item:any) => {
return {
fileName: item.raw?.name,
size: item.raw?.size,
};
});
} }
emits('ok', formData); emits('confirm', formData);
} }
}; };
onMounted(() => { onMounted(() => {

View File

@@ -104,9 +104,14 @@
:detail="currentRow" :detail="currentRow"
:folder="currentFolder" :folder="currentFolder"
tableName="SIMULATION_KNOWLEDGE" tableName="SIMULATION_KNOWLEDGE"
@ok="onOkFun" @confirm="onConfirmFun"
/>
<folderModal
v-model="folderModalVisible"
:detail="currentFolder"
:mode="currentFolderMode"
@confirm="onFolderConfirmFun"
/> />
<folderModal v-model="folderModalVisible" :detail="currentFolder" :mode="currentFolderMode" @ok="onFolderOkFun" />
<FilePreview v-model="previewVisible" :fileId="currentRow?.id" /> <FilePreview v-model="previewVisible" :fileId="currentRow?.id" />
</div> </div>
</template> </template>
@@ -118,7 +123,7 @@ import BaseTable from '@/components/common/table/baseTable.vue';
import FileTree from '@/components/common/fileTree/index.vue'; import FileTree from '@/components/common/fileTree/index.vue';
import knowledgeDetailModal from './components/knowledgeDetailModal.vue'; import knowledgeDetailModal from './components/knowledgeDetailModal.vue';
import folderModal from './components/folderDetailModal.vue'; import folderModal from './components/folderDetailModal.vue';
import { dataCreateDirApi, dataListDirApi, dataRenameDirApi, dataUploadFilesApi, dataDelDirApi, dataQueryDirApi, dataFileSearchApi, dataDelFileApi, dataUpdateFileApi } from '@/api/data/data'; import { dataCreateDirApi, dataListDirApi, dataRenameDirApi, dataUploadFilesApi, dataDelDirApi, dataQueryDirApi, dataFileSearchApi, dataDelFileApi, dataUpdateFileApi, batchAddFileInfoApi } from '@/api/data/data';
import { ElMessage, ElMessageBox } from 'element-plus'; import { ElMessage, ElMessageBox } from 'element-plus';
import type { RenderContentContext } from 'element-plus'; import type { RenderContentContext } from 'element-plus';
import { formatFileSize } from '@/utils/file'; import { formatFileSize } from '@/utils/file';
@@ -130,6 +135,7 @@ import { useDict } from '@/utils/useDict';
import ApprovalProcess from '@/components/common/approvalProcess/index.vue'; import ApprovalProcess from '@/components/common/approvalProcess/index.vue';
import i18n from '@/utils/i18n'; import i18n from '@/utils/i18n';
import FilePreview from '@/components/common/filePreview/index.vue'; import FilePreview from '@/components/common/filePreview/index.vue';
import emitter from '@/utils/eventBus';
const { KNOWLEDGE_APPROVE_STATUS, KNOWLEDGE_APPROVE_TYPE } = useDict('KNOWLEDGE_APPROVE_STATUS', 'KNOWLEDGE_APPROVE_TYPE'); const { KNOWLEDGE_APPROVE_STATUS, KNOWLEDGE_APPROVE_TYPE } = useDict('KNOWLEDGE_APPROVE_STATUS', 'KNOWLEDGE_APPROVE_TYPE');
const env = import.meta.env; const env = import.meta.env;
@@ -180,20 +186,41 @@ const removeFun = async (data: Data) => {
}; };
const res: any = await dataDelDirApi(req); const res: any = await dataDelDirApi(req);
if (res.code === 200) { if (res.code === 200) {
refreshTreeFun(data.parentId); refreshTreeAfterModifyOrRemove(data);
ElMessage.success(res.message); ElMessage.success(res.message);
} else { } else {
ElMessage.error(res.message); ElMessage.error(res.message);
} }
}; };
const refreshTreeFun = (parentId?: number) => { const refreshTreeRoot = () => {
if (parentId) { fileTreeRef.value?.reloadFun();
fileTreeRef.value?.openDirFun(parentId);
} else {
fileTreeRef.value?.reloadFun();
}
baseTableRef.value?.resetFun(); baseTableRef.value?.resetFun();
}; };
const refreshTreeOpenDir = (dirId: number) => {
fileTreeRef.value?.openDirFun(dirId);
baseTableRef.value?.resetFun();
};
const refreshTreeAfterAdd = (parentNode?: any | null) => {
if (parentNode && typeof parentNode.id === 'number') {
refreshTreeOpenDir(parentNode.id);
} else {
refreshTreeRoot();
}
};
const isTopLevel = (node: any) => {
if (!node || !node.objectKey) return false;
const key = String(node.objectKey).replace(/\/$/, '');
const parts = key.split('/');
return parts.length === 2;
};
const refreshTreeAfterModifyOrRemove = (node?: any | null) => {
if (isTopLevel(node)) {
refreshTreeRoot();
} else {
refreshTreeOpenDir(node.parentId);
}
};
const isSearching = ref(false); const isSearching = ref(false);
const searchParams = ref<any>({ const searchParams = ref<any>({
fileId: currentFolder.value?.id || '', fileId: currentFolder.value?.id || '',
@@ -264,21 +291,19 @@ const resetFun = (data: object) => {
const refreshTableFun = async () => { const refreshTableFun = async () => {
baseTableRef.value?.resetFun(); baseTableRef.value?.resetFun();
}; };
const onFolderOkFun = async (formData: any) => { const onFolderConfirmFun = async (formData: any) => {
if (currentFolderMode.value === 'add') { if (currentFolderMode.value === 'add') {
const req = { const req = {
dirType: DIR_TYPE.KNOWLEDGE, dirType: DIR_TYPE.KNOWLEDGE,
parDirId: currentFolder.value.id, parDirId: currentFolder.value?.id,
dirName: formData.name, dirName: formData.name,
type: 0, type: 0,
}; };
const res: any = await dataCreateDirApi(req); const res: any = await dataCreateDirApi(req);
if (res.code === 200) { if (res.code === 200) {
refreshTreeFun(currentFolder.value.id); refreshTreeAfterAdd(currentFolder.value);
folderModalVisible.value = false; folderModalVisible.value = false;
ElMessage.success(res.message); ElMessage.success(res.message);
} else {
ElMessage.error(res.message);
} }
} else if (currentFolderMode.value === 'edit') { } else if (currentFolderMode.value === 'edit') {
@@ -290,11 +315,9 @@ const onFolderOkFun = async (formData: any) => {
}; };
const res: any = await dataRenameDirApi(req); const res: any = await dataRenameDirApi(req);
if (res.code === 200) { if (res.code === 200) {
refreshTreeFun(currentFolder.value.parentId); refreshTreeAfterModifyOrRemove(currentFolder.value);
folderModalVisible.value = false; folderModalVisible.value = false;
ElMessage.success(res.message); ElMessage.success(res.message);
} else {
ElMessage.error(res.message);
} }
} }
@@ -305,7 +328,7 @@ const openModalFun = () => {
visible.value = true; visible.value = true;
currentRow.value = null; currentRow.value = null;
}; };
const onOkFun = async (formData: any) => { const onConfirmFun = async (formData: any) => {
const req = { const req = {
...currentRow.value, ...currentRow.value,
templateId: formData.templateId, templateId: formData.templateId,
@@ -328,7 +351,30 @@ const onOkFun = async (formData: any) => {
if (currentRow.value && currentRow.value.id) { if (currentRow.value && currentRow.value.id) {
res = await dataUpdateFileApi(req); res = await dataUpdateFileApi(req);
} else { } else {
res = await dataUploadFilesApi(req); const req = {
sourceFiles: formData.file,
uploadTaskId: new Date().getTime(),
dirId: currentFolder.value.id,
projectId: formData.projectId,
analysisDirectionId: formData.analysisDirectionId,
templateId: formData.templateId,
templateName: formData.templateName,
remarks: formData.remarks,
type: 0,
};
res = await batchAddFileInfoApi(req);
if (res.code === 200) {
res.data.forEach((item: any, index: number) => {
emitter.emit('ADD_UPLOAD_FILE', {
file: formData.originalName[index].raw, // 文件对象
data: { // 接口返回的文件目录信息,包括配置信息
...item,
isApprove: 1, // 0否 1是
taskType: 2, // 2知识库
},
});
});
}
} }
if (res.code === 200) { if (res.code === 200) {
visible.value = false; visible.value = false;
@@ -381,8 +427,6 @@ const delFileFun = async (row: any) => {
if (res.code === 200) { if (res.code === 200) {
refreshTableFun(); refreshTableFun();
ElMessage.success(res.message); ElMessage.success(res.message);
} else {
ElMessage.error(res.message);
} }
}); });

View File

@@ -43,7 +43,7 @@ const props = withDefaults(defineProps<Props>(), {
data: {}, data: {},
}); });
const env = import.meta.env; const env = import.meta.env;
const knowledgeDetail = ref<any>(null); const knowledgeList = ref<any[]>([]);
const contents = ref<string>(''); const contents = ref<string>('');
const approveAction = ref<any>(); const approveAction = ref<any>();
const tagTypeMap:any = { const tagTypeMap:any = {
@@ -55,12 +55,11 @@ const baseTableRef = ref<any>(null);
watchEffect(() => { watchEffect(() => {
if (props.data) { if (props.data) {
const approveContents = JSON.parse(props.data?.approveContents || '{}'); const approveContents = JSON.parse(props.data?.approveContents || '{}');
knowledgeDetail.value = approveContents.afterData || approveContents.beforeData || null; knowledgeList.value = approveContents.afterData || approveContents.beforeData || null;
contents.value = approveContents.contents || ''; contents.value = approveContents.contents || '';
approveAction.value = props.data?.approveAction || ''; approveAction.value = props.data?.approveAction || '';
if (baseTableRef.value && knowledgeDetail.value) { if (baseTableRef.value && knowledgeList.value) {
// TODO 临时写法 后期支持多个 baseTableRef.value?.setDataFun(knowledgeList.value);
baseTableRef.value?.setDataFun([knowledgeDetail.value]);
} }
} }
}); });