1、修复切换不同项目后还显示上个项目信息的问题

This commit is contained in:
2026-06-12 19:23:33 +08:00
parent 55a23e672d
commit bcf0a381d6
3 changed files with 151 additions and 109 deletions

View File

@@ -1,11 +1,8 @@
import { ref } from 'vue';
import { getTableConfig } from './tableCommon';
const navigationItems = ref([]);
// 初始化导航项
export function initNavigationItems() {
navigationItems.value = Array.from({ length: 11 }, (_, index) => {
export function createNavigationItems() {
return Array.from({ length: 11 }, (_, index) => {
const config = getTableConfig(index);
return {
number: getChineseNumber(index + 1),
@@ -29,8 +26,6 @@ export function initNavigationItems() {
rows: 8
};
});
return navigationItems;
}
// 获取中文数字
@@ -39,10 +34,6 @@ function getChineseNumber(num) {
return chineseNumbers[num - 1] || num;
}
// 导出初始化的导航项
export default function useNavigationItems() {
if (navigationItems.value.length === 0) {
initNavigationItems();
}
return navigationItems;
return ref(createNavigationItems());
}

View File

@@ -543,7 +543,7 @@
import EvidenceModal from '@/views/pwl/pwlProject/components/components/EvidenceModal.vue';
import EditModal from './EditModal.vue';
import useNavigationItems from './data/navigationItems';
import useNavigationItems, { createNavigationItems } from './data/navigationItems';
import {
tableConfigs,
getTableConfig,
@@ -739,6 +739,111 @@
});
const { resetFields } = useForm(form);
let initVersion = 0;
const resetNavigationState = () => {
navigationItems.value = createNavigationItems();
currentSection.value = 0;
currentSectionIndex.value = 0;
};
const clearProjectState = () => {
resetFields();
combinedKbIds.value = '';
currentCompanyId.value = undefined;
evidenceModalVisible.value = false;
showHistory.value = false;
currentInterfaceName.value = '';
resetNavigationState();
Object.keys(tableData).forEach((key) => {
delete tableData[key];
});
Object.keys(tableGenerationData).forEach((key) => {
delete tableGenerationData[key];
});
Object.keys(selectedRowsMap).forEach((key) => {
delete selectedRowsMap[key as any];
});
Object.keys(selectedRowKeysMap).forEach((key) => {
delete selectedRowKeysMap[key as any];
});
Object.keys(generatingEvidenceStates).forEach((key) => {
delete generatingEvidenceStates[key as any];
});
Object.keys(exportStates).forEach((key) => {
delete exportStates[key as any];
});
Object.keys(savingStates).forEach((key) => {
delete savingStates[key as any];
});
Object.keys(tableFileSelectionMap).forEach((key) => {
delete tableFileSelectionMap[key];
});
tripleOneData.value = null;
stateAssetsData.value = null;
currentFileSelectionKey.value = '';
selectedDocList.value = [];
selectedFileList.value = [];
selectedFileKeys.value = [];
checkedDirKeys.value = [];
evidenceSelectedRows.value = [];
evidenceBaseInfo.caseIndex = '';
evidenceBaseInfo.projectName = '';
evidenceBaseInfo.auditedTarget = '';
evidenceBaseInfo.auditMatter = '';
evidenceBaseInfo.auditMatterType = '';
};
const initializeProjectData = async (projectData: PwlProject) => {
const version = ++initVersion;
clearProjectState();
loading.value = true;
assignObject(form, projectData);
if (projectData.libraryIds && projectData.libraryIds?.length > 0) {
try {
const result = await getPwlProjectLibraryByIds(projectData.libraryIds);
if (version !== initVersion) return;
const kbIds = result.map((lib) => lib.kbId).filter((kbId) => kbId);
if (form.kbId) {
kbIds.unshift(form.kbId);
}
combinedKbIds.value = kbIds.join(',');
} catch (error) {
console.error('获取知识库失败:', error);
if (version !== initVersion) return;
combinedKbIds.value = form.kbId || '';
}
} else {
combinedKbIds.value = form.kbId || '';
}
currentCompanyId.value = projectData.companyId;
for (let i = 0; i < navigationItems.value.length; i++) {
const section: any = navigationItems.value[i];
if (section.tableOptions.length > 0) {
const tableOption = section.tableOptions[section.currentTableIndex];
if (typeof tableOption.columns === 'function') {
try {
const module = await tableOption.columns();
if (version !== initVersion) return;
section.columns = module.default || module;
} catch (error) {
console.error(`加载表格${i}列配置失败:`, error);
section.columns = [];
}
} else {
section.columns = tableOption.columns;
}
}
}
if (version !== initVersion) return;
loading.value = false;
};
// ========== 计算属性 ==========
const hasTripleOneData = computed(() => {
@@ -2155,97 +2260,29 @@
// ========== 观察者 ==========
watch(
() => props.visible,
async (visible) => {
if (visible) {
if (props.data) {
loading.value = true;
assignObject(form, props.data);
() => [props.visible, props.data?.id] as const,
async ([visible, projectId], oldValue) => {
const [prevVisible, prevProjectId] = oldValue ?? [];
// 获取知识库并拼接 kbIds
if (props.data.libraryIds && props.data.libraryIds?.length > 0) {
try {
const result = await getPwlProjectLibraryByIds(
props.data.libraryIds
);
const kbIds = result
.map((lib) => lib.kbId)
.filter((kbId) => kbId);
if (form.kbId) {
kbIds.unshift(form.kbId);
}
combinedKbIds.value = kbIds.join(',');
} catch (error) {
console.error('获取知识库失败:', error);
combinedKbIds.value = form.kbId || '';
}
} else {
combinedKbIds.value = form.kbId || '';
}
// 设置当前公司ID用于文档管理
currentCompanyId.value = props.data.companyId;
// 初始化所有表格的列配置
for (let i = 0; i < navigationItems.value.length; i++) {
const section: any = navigationItems.value[i];
if (section.tableOptions.length > 0) {
const tableOption =
section.tableOptions[section.currentTableIndex];
if (typeof tableOption.columns === 'function') {
try {
const module = await tableOption.columns();
section.columns = module.default || module;
} catch (error) {
console.error(`加载表格${i}列配置失败:`, error);
section.columns = [];
}
} else {
section.columns = tableOption.columns;
}
}
}
// 重置到第一个章节
currentSection.value = 0;
loading.value = false;
}
} else {
resetFields();
combinedKbIds.value = '';
evidenceModalVisible.value = false;
// 清空表格数据
Object.keys(tableData).forEach((key) => {
delete tableData[key];
});
// 清空表格生成数据
Object.keys(tableGenerationData).forEach((key) => {
delete tableGenerationData[key];
});
// 清空特殊数据
tripleOneData.value = null;
stateAssetsData.value = null;
// 清空选中行
Object.keys(selectedRowsMap).forEach((key) => {
delete selectedRowsMap[key as any];
});
Object.keys(selectedRowKeysMap).forEach((key) => {
delete selectedRowKeysMap[key as any];
});
// 清空生成取证单状态
Object.keys(generatingEvidenceStates).forEach((key) => {
delete generatingEvidenceStates[key as any];
});
Object.keys(tableFileSelectionMap).forEach((key) => {
delete tableFileSelectionMap[key];
});
currentFileSelectionKey.value = '';
selectedDocList.value = [];
selectedFileList.value = [];
selectedFileKeys.value = [];
checkedDirKeys.value = [];
if (!visible) {
initVersion++;
loading.value = false;
clearProjectState();
return;
}
}
if (!props.data) {
initVersion++;
loading.value = false;
clearProjectState();
return;
}
if (!prevVisible || projectId !== prevProjectId) {
await initializeProjectData(props.data);
}
},
{ immediate: true }
);
const handleFilePreview = (fileItem: any) => {

View File

@@ -135,22 +135,35 @@
</a-card>
<!-- 编辑弹窗 -->
<Edit v-model:visible="showEdit" :data="current" @done="reload" />
<Edit
v-if="showEdit"
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
<!-- 生成报告 -->
<Report v-model:visible="showReport" :data="current" @done="reload" />
<Report
v-if="showReport"
v-model:visible="showReport"
:data="current"
@done="reload"
/>
<ReportContent
v-if="showReportContent"
v-model:visible="showReportContent"
:data="current"
@done="reload"
/>
<!-- 审计报告查看 -->
<ReportView
v-if="showReportView"
v-model:visible="showReportView"
:data="current"
@done="reload"
/>
<!-- 审计核查弹窗 -->
<AuditCheck
v-if="showAuditCheck"
v-model:visible="showAuditCheck"
:data="current"
@done="reload"
@@ -158,6 +171,7 @@
<!-- 文档管理弹窗 -->
<a-modal
v-if="showDocManage"
v-model:visible="showDocManage"
:title="`文档管理 - ${currentKbName}`"
width="80%"
@@ -272,7 +286,8 @@
:href="getDocFileUrl(record)"
target="_blank"
rel="noreferrer"
>{{ renderDocText(record, ['fileName', 'name']) }}</a>
>{{ renderDocText(record, ['fileName', 'name']) }}</a
>
</template>
<template v-if="column.key === 'action'">
<a-space>
@@ -294,6 +309,7 @@
<!-- 导入弹窗 -->
<Import2
v-if="showImport"
v-model:visible="showImport"
@done="loadCloudFiles"
:doc="selectedDoc"
@@ -301,6 +317,7 @@
<!-- 新增/编辑目录弹窗 -->
<a-modal
v-if="showDirModal"
v-model:visible="showDirModal"
:title="dirModalTitle"
width="400px"
@@ -362,10 +379,7 @@
updateAiCloudDoc,
removeAiCloudDoc
} from '@/api/ai/aiCloudDoc';
import {
pageAiCloudFile,
removeAiCloudFile
} from '@/api/ai/aiCloudFile';
import { pageAiCloudFile, removeAiCloudFile } from '@/api/ai/aiCloudFile';
import type { AiCloudDoc } from '@/api/ai/aiCloudDoc/model';
import type { AiCloudFile } from '@/api/ai/aiCloudFile/model';