diff --git a/src/views/pwl/pwlProject/components/data/navigationItems.ts b/src/views/pwl/pwlProject/components/data/navigationItems.ts index bd8a076..bc19ea9 100644 --- a/src/views/pwl/pwlProject/components/data/navigationItems.ts +++ b/src/views/pwl/pwlProject/components/data/navigationItems.ts @@ -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()); } diff --git a/src/views/pwl/pwlProject/components/reportContent.vue b/src/views/pwl/pwlProject/components/reportContent.vue index 2aeeb81..3bb968e 100644 --- a/src/views/pwl/pwlProject/components/reportContent.vue +++ b/src/views/pwl/pwlProject/components/reportContent.vue @@ -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) => { diff --git a/src/views/pwl/pwlProject/index.vue b/src/views/pwl/pwlProject/index.vue index 691973a..20c5851 100644 --- a/src/views/pwl/pwlProject/index.vue +++ b/src/views/pwl/pwlProject/index.vue @@ -135,22 +135,35 @@ - + - + {{ renderDocText(record, ['fileName', 'name']) }} + >{{ renderDocText(record, ['fileName', 'name']) }}