diff --git a/src/views/personnelEfficiencyManagement/performanceManagement/dataReporting.vue b/src/views/personnelEfficiencyManagement/performanceManagement/dataReporting.vue index 766975fd..997549e2 100644 --- a/src/views/personnelEfficiencyManagement/performanceManagement/dataReporting.vue +++ b/src/views/personnelEfficiencyManagement/performanceManagement/dataReporting.vue @@ -126,6 +126,8 @@ import { downloadBsEfficiencyTaskTemplate, } from '@/api/performanceManagement/dataReporting'; import { downloadXls, downloadFile, downloadFileBlob } from '@/utils/util'; +import { saveAs } from 'file-saver'; +import JSZip from 'jszip'; export default { components: { reportingPerf, prefDetail, batchAddContent }, data() { @@ -334,35 +336,63 @@ export default { this.currentRow = row; this.showExamine = true; }, - // 任务行下载模板 + // 任务行下载模板 → 打包ZIP async downloadTask(row) { + const zip = new JSZip(); + const promises = []; // 存储下载Promise if (row.parentId == 0) { if (!row.subTasks || row.subTasks.length === 0) { this.$message.warning('暂无可下载文件!'); return; } + // 只下载状态为2(已完成)的任务 const completedTasks = row.subTasks.filter(task => task.status === 2); if (completedTasks.length === 0) { this.$message.warning('暂无可下载文件!'); return; } - // 调用模板下载接口 - downloadBsEfficiencyTaskTemplate() - .then(res => { - downloadXls(res.data, `${row.yearMonth}绩效填报模板.xlsx`); - // 只下载状态为2(已完成)的任务文件 - const completedTasks = row.subTasks.filter(task => task.status === 2); - completedTasks.forEach(task => { - if (task.attachLink) { - downloadFileBlob(task.attachLink, task.taskName + '.xlsx'); - } - }); - }) - .catch(error => { - console.error('下载模板失败:', error); - this.$message.error('下载失败,请检查网络或稍后重试'); + try { + // 1. 下载模板文件并加入压缩包 + const templateRes = await downloadBsEfficiencyTaskTemplate(); + zip.file(`${row.yearMonth}绩效填报模板.xlsx`, templateRes.data); + // 2. 下载所有已完成的子任务附件 + completedTasks.forEach(task => { + if (task.attachLink) { + const promise = fetch(task.attachLink) + .then(res => res.blob()) + .then(blob => { + zip.file(`${task.taskName}.xlsx`, blob); + }); + promises.push(promise); + } }); + // 等待所有文件下载完成 → 生成zip并下载 + await Promise.all(promises); + const content = await zip.generateAsync({ type: 'blob' }); + saveAs(content, `${row.yearMonth}绩效填报文件包.zip`); + this.$message.success('打包下载成功'); + } catch (error) { + console.error('打包下载失败:', error); + this.$message.error('打包下载失败,请稍后重试'); + } } else { + // 子任务 → 单文件打包成zip + // if (!row.attachLink) { + // this.$message.warning('暂无可下载文件!'); + // return; + // } + // try { + // const res = await fetch(row.attachLink); + // const blob = await res.blob(); + // zip.file(`${row.taskName}.xlsx`, blob); + + // const content = await zip.generateAsync({ type: 'blob' }); + // saveAs(content, `${row.taskName}.zip`); + // this.$message.success('打包下载成功'); + // } catch (error) { + // console.error('下载失败:', error); + // this.$message.error('文件下载失败'); + // } if (row.attachLink == '') { this.$message.warning('暂无可下载文件!'); return; @@ -477,13 +507,13 @@ export default { .then(res => { if (res.data.code === 200) { // 为子任务添加父级状态 - const processTasks = (tasks) => { + const processTasks = tasks => { return tasks.map(task => { if (task.subTasks && task.subTasks.length > 0) { // 为每个子任务添加父级状态 task.subTasks = task.subTasks.map(subTask => ({ ...subTask, - parentStatus: task.status // 添加父级状态 + parentStatus: task.status, // 添加父级状态 })); // 递归处理子任务的子任务 processTasks(task.subTasks);