From f7fdc1b55a8249d4435cec55b637dd0cba0744dd Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Wed, 13 May 2026 12:50:36 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=88=87=E6=8D=A2=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=90=8E=EF=BC=8C=E8=87=AA=E5=8A=A8=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=B7=B2=E9=80=89=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/components/FileModal.vue | 94 +++++++++++++------ 1 file changed, 64 insertions(+), 30 deletions(-) diff --git a/src/views/pwl/pwlProject/components/components/FileModal.vue b/src/views/pwl/pwlProject/components/components/FileModal.vue index 5ece9e5..d21f5af 100644 --- a/src/views/pwl/pwlProject/components/components/FileModal.vue +++ b/src/views/pwl/pwlProject/components/components/FileModal.vue @@ -44,7 +44,7 @@
已选择 {{ checkedDirKeys.length }} 个目录, - {{ selectedFileKeys.length }} 个文件 清空选择 @@ -113,6 +113,8 @@ (e: 'confirm', data: { dirKeys: (string | number)[], fileKeys: (string | number)[] }): void; }>(); + type DirFileSelectionMap = Record; + // 树形结构相关 const expandedKeys = ref<(string | number)[]>([]); const selectedKeys = ref<(string | number)[]>([]); @@ -175,7 +177,7 @@ string, { dirKeys: (string | number)[]; - fileKeys: (string | number)[]; + dirFileSelections: DirFileSelectionMap; } > >({}); @@ -185,23 +187,56 @@ const selectedFileKeys = ref<(string | number)[]>([]); const checkedDirKeys = ref<(string | number)[]>([]); // 新增:勾选的目录keys const dirFileKeyCache = ref>({}); + const dirFileSelections = ref({}); const getSelectionStorageKey = () => props.selectionKey || '__default__'; + const getDirSelectionKey = (dirKey?: string | number) => { + if (dirKey === undefined || dirKey === null) return ''; + return String(dirKey); + }; + + const getCurrentDirKey = () => getDirSelectionKey(selectedKeys.value[0]); + + const getAllSelectedFileKeys = () => { + return Array.from( + new Set( + Object.values(dirFileSelections.value) + .flat() + .filter((key) => key !== undefined && key !== null) + ) + ); + }; + + const syncSelectedFileState = () => { + const allSelectedFileKeys = getAllSelectedFileKeys(); + const currentDirKey = getCurrentDirKey(); + selectedFileKeys.value = [...(dirFileSelections.value[currentDirKey] || [])]; + selectedFileList.value = allSelectedFileKeys.map((key) => key.toString()); + }; + const saveSelectionState = () => { selectionStateMap.value[getSelectionStorageKey()] = { dirKeys: [...checkedDirKeys.value], - fileKeys: [...selectedFileKeys.value] + dirFileSelections: Object.fromEntries( + Object.entries(dirFileSelections.value).map(([key, value]) => [ + key, + [...value] + ]) + ) }; }; const restoreSelectionState = () => { const state = selectionStateMap.value[getSelectionStorageKey()]; checkedDirKeys.value = [...(state?.dirKeys || [])]; - selectedFileKeys.value = [...(state?.fileKeys || [])]; selectedDocList.value = checkedDirKeys.value.map((key) => key.toString()); - selectedFileList.value = selectedFileKeys.value.map((key) => - key.toString() + dirFileSelections.value = Object.fromEntries( + Object.entries(state?.dirFileSelections || {}).map(([key, value]) => [ + key, + [...value] + ]) ); + syncSelectedFileState(); }; const handleDocSelectCancel = () => { @@ -215,11 +250,11 @@ // 传递选择的数据给父组件 emit('confirm', { dirKeys: [...checkedDirKeys.value], - fileKeys: [...selectedFileKeys.value] + fileKeys: getAllSelectedFileKeys() }); message.success( - `已选择 ${checkedDirKeys.value.length} 个目录和 ${selectedFileKeys.value.length} 个文件` + `已选择 ${checkedDirKeys.value.length} 个目录和 ${getAllSelectedFileKeys().length} 个文件` ); showDocSelect.value = false; }; @@ -243,6 +278,7 @@ selectedKeys.value = [rootDirs[0].id!]; } + syncSelectedFileState(); loadCloudFiles(); } } @@ -261,6 +297,7 @@ const onSelect = (keys: (string | number)[]) => { selectedKeys.value = keys; pagination.value.current = 1; + syncSelectedFileState(); loadCloudFiles(); }; @@ -278,10 +315,11 @@ return dirFileKeyCache.value[cacheKey]; } - const files = await listAiCloudFile({ + const result: any = await listAiCloudFile({ docId: Number(dirKey) }); - const fileKeys = (files || []) + const files = Array.isArray(result) ? result : result?.records || []; + const fileKeys = files .map((item) => item.id) .filter((id) => id !== undefined && id !== null) as (string | number)[]; @@ -312,18 +350,13 @@ const addedFileGroups = await Promise.all( addedKeys.map((key) => getDirFileKeys(key)) ); - const removedFileGroups = await Promise.all( - removedKeys.map((key) => getDirFileKeys(key)) - ); - - const nextFileKeySet = new Set<(string | number)>(selectedFileKeys.value); - addedFileGroups.flat().forEach((key) => nextFileKeySet.add(key)); - removedFileGroups.flat().forEach((key) => nextFileKeySet.delete(key)); - - selectedFileKeys.value = Array.from(nextFileKeySet); - selectedFileList.value = selectedFileKeys.value.map((key) => - key.toString() - ); + addedKeys.forEach((key, index) => { + dirFileSelections.value[String(key)] = [...addedFileGroups[index]]; + }); + removedKeys.forEach((key) => { + delete dirFileSelections.value[String(key)]; + }); + syncSelectedFileState(); } catch (error) { message.error('目录文件联动选择失败'); console.error('目录文件联动选择失败:', error); @@ -361,8 +394,14 @@ selectedRowKeys: (string | number)[], selectedRows: AiCloudFile[] ) => { + const currentDirKey = getCurrentDirKey(); + if (!currentDirKey) return; + + dirFileSelections.value[currentDirKey] = [...selectedRowKeys]; selectedFileKeys.value = selectedRowKeys; - selectedFileList.value = selectedRowKeys.map((key) => key.toString()); + selectedFileList.value = getAllSelectedFileKeys().map((key) => + key.toString() + ); saveSelectionState(); }; @@ -371,13 +410,8 @@ selectedDocList.value = []; selectedFileList.value = []; selectedFileKeys.value = []; - checkedDirKeys.value = []; // 新增:清空勾选的目录 - - // 重新选择当前目录 - if (selectedKeys.value.length > 0) { - selectedDocList.value = [selectedKeys.value[0].toString()]; - checkedDirKeys.value = [selectedKeys.value[0]]; // 新增:重新勾选当前目录 - } + checkedDirKeys.value = []; + dirFileSelections.value = {}; saveSelectionState(); };