From a93e1bf0c8b84d97c43c8c60014420081c0b39d5 Mon Sep 17 00:00:00 2001 From: wangxk Date: Fri, 28 Feb 2025 16:00:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=92=8C=E5=A4=8D=E5=88=B6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/api/datamanagement/index.ts | 16 ++ .../views/testdata/datamanagement/index.vue | 253 +++++++++++++++++- 2 files changed, 263 insertions(+), 6 deletions(-) diff --git a/web/src/api/datamanagement/index.ts b/web/src/api/datamanagement/index.ts index e718d7b..8c90d82 100644 --- a/web/src/api/datamanagement/index.ts +++ b/web/src/api/datamanagement/index.ts @@ -142,4 +142,20 @@ export function listTsFiles(params:any){ method:'get', params:params }) +} +//移动 +export function moveFileFolder(params:any){ + return request ({ + url:'/experimentalData/ts-files/moveFileFolder', + method:'post', + data:params + }) +} +//复制 +export function copyFileFolder(params:any){ + return request ({ + url:'/experimentalData/ts-files/copyFileFolder', + method:'post', + data:params + }) } \ No newline at end of file diff --git a/web/src/views/testdata/datamanagement/index.vue b/web/src/views/testdata/datamanagement/index.vue index 59384fc..4b265b1 100644 --- a/web/src/views/testdata/datamanagement/index.vue +++ b/web/src/views/testdata/datamanagement/index.vue @@ -12,7 +12,7 @@ import { ElMessageBox, ElMessage, ElMain } from "element-plus"; import Page from '@/components/Pagination/page.vue'; import AudioPlayer from '@/components/file/preview/AudioPlayer.vue'; import { batchDeleteReq } from "@/api/file-operator"; -import { tstaskList, getTsNodesTree, addTsNodes, updateTsNodes, deleteTsNodesById, tsFilesPage, addTsFiles, updateTsFiles, deleteTsFilesById, listTsFiles, deleteTsFilesByIds, compress, Decompression, compare, downloadToLocal, uploadToBackup, addTsFile, list } from "@/api/datamanagement"; +import { tstaskList, getTsNodesTree, addTsNodes, updateTsNodes, deleteTsNodesById, tsFilesPage, addTsFiles, updateTsFiles, deleteTsFilesById, listTsFiles, deleteTsFilesByIds, compress, Decompression, compare, downloadToLocal, uploadToBackup, addTsFile, list, moveFileFolder, copyFileFolder } from "@/api/datamanagement"; import ZUpload from '@/components/file/ZUpload.vue' import useFileUpload from "@/components/file/file/useFileUpload"; import useHeaderStorageList from "@/components/header/useHeaderStorageList"; @@ -745,12 +745,28 @@ const pasteing = ref(false) const copyarr = ref([]) const copytable = ref([]) const copyjudge = ref(false) +const copytype = ref('') function copyMove(type: any) { pasteing.value = true copyarr.value = JSON.parse(JSON.stringify(tableIdarr.value)) + copytype.value = type //copy move // tableIdarr.value } function paste() { + debugger + let norepeat = [] + let repeatObj: any = { + newPath: '', + oldpaths: '', + parentId: '', + newFileName: [], + rename: '', + type: '', + } + repeatObj.newPath = creatform.value.workPath ? creatform.value.workPath : '/' + repeatObj.parentId = creatform.value.parentId ? creatform.value.parentId : '00' + repeatObj.type = '0' + copytable.value.length = 0 if (tableData.value.length > 0) { tableData.value.forEach((item: any) => { @@ -758,16 +774,90 @@ function paste() { if (items.fileName == item.fileName) { copytable.value.push(items) copyjudge.value = true - } else { - //直接走覆盖方法 } }) }) } else { + //直接走覆盖方法 + copyarr.value.forEach((items: any) => { + repeatObj.oldpaths = items.workPath + repeatObj.newFileName.push(items.fileName) + }) + repeatObj.newFileName = repeatObj.newFileName.join(',') + if (copytype.value == 'move') { + moveFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('移动成功') + getdata() + pasteing.value = false + copyarr.value.length = 0 + } + }) + } else { + copyFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('复制成功') + getdata() + pasteing.value = false + copyarr.value.length = 0 + } + }) + } + + } + if (!containsAll(tableData.value, copyarr.value)) { + //直接走覆盖方法 + // 2. 更高效的Set方式(推荐) + const arr2Ids = new Set(copytable.value.map(item => item.id)); + norepeat = copyarr.value.filter(item => !arr2Ids.has(item.id)); + norepeat.forEach((items: any) => { + repeatObj.oldpaths = items.workPath + repeatObj.newFileName.push(items.fileName) + }) + repeatObj.newFileName = repeatObj.newFileName.join(',') + if (copytype.value == "move") { + moveFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + // ElMessage.success('未重复文件移动成功') + getdata() + pasteing.value = false + copyarr.value.length = 0 + } + }) + } else { + copyFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + // ElMessage.success('未重复文件复制成功') + getdata() + pasteing.value = false + copyarr.value.length = 0 + } + }) + } } } +function containsAll(array1: any, array2: any) { + debugger + // 创建一个 Set 来存储 array1 中所有对象的 name 属性 + const namesInArray1 = new Set(array1.map(item => item.fileName)); + // 遍历 array2,检查每个元素的 name 是否在 Set 中存在 + for (const item of array2) { + if (!namesInArray1.has(item.fileName)) { + return false; // 如果 array2 中的元素的 name 不在 array1 的 name Set 中,返回 false + } + } + + return true; // 如果 array2 中的所有元素的 name 都在 array1 的 name Set 中,返回 true +} +function removeItemsFromArray1(array1: any, array2: any, key: any) { + // 创建一个 Set 来存储 array2 中所有元素的 key 值 + const keysToRemove = new Set(array2.map(item => item[key])); + + // 使用 filter 方法保留 array1 中不在 keysToRemove 中的元素 + return array1.filter(item => !keysToRemove.has(item[key])); +} function copycover(row: any) { ElMessageBox.confirm( '您确定要覆盖该文件吗?', @@ -779,11 +869,119 @@ function copycover(row: any) { } ) .then(() => { + let repeatObj: any = { + newPath: '', + oldpaths: '', + parentId: '', + newFileName: [], + rename: '', + type: '', + } + repeatObj.newPath = creatform.value.workPath ? creatform.value.workPath : '/' + repeatObj.parentId = creatform.value.parentId ? creatform.value.parentId : '00' + repeatObj.type = '0' + repeatObj.oldpaths = row.workPath + repeatObj.newFileName.push(row.fileName) + repeatObj.newFileName = repeatObj.newFileName.join(',') + if (copytype.value == "move") { + moveFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('移动成功') + getdata() + pasteing.value = false + copytable.value = removeItemsFromArray1(copytable.value, [row], 'id') + } + }) + } else { + copyFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('复制成功') + getdata() + pasteing.value = false + copytable.value = removeItemsFromArray1(copytable.value, [row], 'id') + } + }) + } }) } function copyClose() { - copyjudge.value = false + if (copytable.value.length > 0) { + ElMessageBox.confirm( + '退出后待操作文件将会被清空,您确定要退出吗?', + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ) + .then(() => { + copyjudge.value = false + copyarr.value.length = 0 + pasteing.value = false + getdata() + }) + } else { + copyjudge.value = false + copyarr.value.length = 0 + pasteing.value = false + getdata() + } +} +const copyhandArr = ref([]) +function copyhand(row: any) { + copyhandArr.value = row +} +function copysomefile() { + ElMessageBox.confirm( + '您确定要覆盖这些文件吗?', + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ) + .then(() => { + let repeatObj: any = { + newPath: '', + oldpaths: '', + parentId: '', + newFileName: [], + rename: '', + type: '', + } + repeatObj.newPath = creatform.value.workPath ? creatform.value.workPath : '/' + repeatObj.parentId = creatform.value.parentId ? creatform.value.parentId : '00' + repeatObj.type = '0' + copyhandArr.value.forEach((items: any) => { + repeatObj.oldpaths = items.workPath + repeatObj.newFileName.push(items.fileName) + }) + repeatObj.newFileName = repeatObj.newFileName.join(',') + if (copytype.value == "move") { + moveFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('移动成功') + getdata() + pasteing.value = false + copytable.value = removeItemsFromArray1(copytable.value, copyhandArr.value, 'id') + } + }) + } else { + copyFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('复制成功') + getdata() + pasteing.value = false + copytable.value = removeItemsFromArray1(copytable.value, copyhandArr.value, 'id') + } + }) + } + + }) + } //粘贴/复制重命名 const rename = ref(false) @@ -794,8 +992,10 @@ const renameobj = ref({ const renameRules = ref({ fileName: [{ required: true, message: "请输入文件名称", trigger: "blur" }], }); +const rowarr: any = ref() function renames(row: any) { rename.value = true + rowarr.value = row } function RenameClose() { rename.value = false @@ -804,6 +1004,43 @@ async function submitrename(formEl: any) { if (!formEl) return await formEl.validate((valid: any, fields: any) => { if (valid) { + // + let repeatObj: any = { + newPath: '', + oldpaths: '', + parentId: '', + newFileName: [], + rename: '', + type: '', + } + repeatObj.newPath = creatform.value.workPath ? creatform.value.workPath : '/' + repeatObj.parentId = creatform.value.parentId ? creatform.value.parentId : '00' + repeatObj.type = '1' + repeatObj.oldpaths = rowarr.value.workPath + repeatObj.rename = (renameobj.value.fileName) + repeatObj.newFileName.push(rowarr.value.fileName) + repeatObj.newFileName = repeatObj.newFileName.join(',') + if (copytype.value == "move") { + moveFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('移动成功') + getdata() + pasteing.value = false + copytable.value = removeItemsFromArray1(copytable.value, [rowarr.value], 'id') + rename.value = false + } + }) + } else { + copyFileFolder(repeatObj).then((res: any) => { + if (res.code == 0) { + ElMessage.success('复制成功') + getdata() + pasteing.value = false + copytable.value = removeItemsFromArray1(copytable.value, [rowarr.value], 'id') + rename.value = false + } + }) + } } }) @@ -1281,10 +1518,14 @@ function removeSuffix(filename: any) { - 覆盖({{ copyhandArr.length + }}) + + - +