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();
};