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']) }}
@@ -294,6 +309,7 @@