diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayWorkingGroupController.java b/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayWorkingGroupController.java index 2a928086..63b81a0e 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayWorkingGroupController.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayWorkingGroupController.java @@ -17,7 +17,6 @@ import com.jero.common.util.oConvertUtils; import com.jero.contract.entity.PayIncomeContract; import com.jero.contract.service.IPayIncomeContractService; import com.jero.mail.commont.constant; -import com.jero.meeting.entity.PayMeetingQuestion; import com.jero.project.common.PayProjectCommon; import com.jero.project.entity.PayWorkingGroup; import com.jero.project.entity.PayWorkingGroupSubItem; @@ -34,18 +33,14 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; - import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; - /** +/** * @Description: 工作组项目 * @Author: jeecg-boot * @Date: 2021-08-27 @@ -466,4 +461,16 @@ public class PayWorkingGroupController extends JeroController { * @param payWorkingGroupSubItem 工作组成员 */ void validAndSetDefaultValue(PayWorkingGroupSubItem payWorkingGroupSubItem); + + /** + * 全部文件导出 + * @param request + * @param response + */ + void exportAllFile(HttpServletRequest request, HttpServletResponse response); } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupServiceImpl.java index df31950e..30468a55 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupServiceImpl.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupServiceImpl.java @@ -23,6 +23,8 @@ import com.jero.contract.service.IPayIncomeContractAssociatedService; import com.jero.meeting.common.MeetingCommon; import com.jero.meeting.entity.PayMeeting; import com.jero.meeting.service.IPayMeetingService; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; import com.jero.modules.system.entity.SysUser; import com.jero.modules.system.service.ISysUserService; import com.jero.project.common.PayProjectCommon; @@ -30,6 +32,7 @@ import com.jero.project.entity.*; import com.jero.project.mapper.PayWorkingGroupMapper; import com.jero.project.mapper.PayWorkingGroupSubItemContactsMapper; import com.jero.project.service.IPayResearchProjectService; +import com.jero.project.service.IPayWorkingGroupDataFileService; import com.jero.project.service.IPayWorkingGroupService; import com.jero.project.service.IPayWorkingGroupSubItemService; import com.jero.project.vo.PayWorkingGroupVO; @@ -43,16 +46,21 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** @@ -89,6 +97,12 @@ public class PayWorkingGroupServiceImpl extends ServiceImpl queryPageList(Page page, PayWorkingGroup payWorkingGroup) { @@ -805,5 +819,214 @@ public class PayWorkingGroupServiceImpl extends ServiceImpl selectionList = Arrays.asList(selections.split(",")); + Set addedEntries = new HashSet<>(); // 用于记录已添加的条目路径 + try (ZipOutputStream zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()))) { + response.reset(); + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + // 设置压缩包的名字 + String downloadName = UUID.randomUUID().toString() + ".zip"; + String agent = request.getHeader("USER-AGENT"); + try { + if (agent.contains("MSIE") || agent.contains("Trident")) { + downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8"); + } else { + downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1"); + } + } catch (Exception e) { + e.printStackTrace(); + } + response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\""); + + // 处理工作组资料 + for (String projectId : selectionList) { + PayWorkingGroupDataFile payWorkingGroupDataFile = new PayWorkingGroupDataFile(); + payWorkingGroupDataFile.setProjectId(projectId); + payWorkingGroupDataFile.setProjectType(PayProjectCommon.PROJECT_TYPE_FILE1); + List fileList = payWorkingGroupDataFileService.queryListExport(payWorkingGroupDataFile); + PayWorkingGroup payWorkingGroup = payWorkingGroupService.getById(projectId); + if (payWorkingGroup == null) { + throw new JeroBootException("工作组不存在!"); + } + String groupName = payWorkingGroup.getWorkingGroupProject(); // 获取工作组名称 + String groupFolderPath = "工作组资料/" + groupName + "/"; + String researchProjectFolderPath = groupFolderPath + "在研项目/"; + String otherFilesFolderPath = groupFolderPath + "其他分发资料/"; + + // 创建工作组文件夹 + zipos.putNextEntry(new ZipEntry(groupFolderPath)); + zipos.closeEntry(); + // 创建在研项目文件夹 + zipos.putNextEntry(new ZipEntry(researchProjectFolderPath)); + zipos.closeEntry(); + // 创建分发资料文件夹 + zipos.putNextEntry(new ZipEntry(otherFilesFolderPath)); + zipos.closeEntry(); + + // 在研项目的文件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PayResearchProject::getWorkingGroupId, projectId); + List payResearchProjectList = payResearchProjectService.list(queryWrapper); + for (PayResearchProject payResearchProject : payResearchProjectList) { + String projectName = payResearchProject.getProjectName(); + String projectFolderPath = researchProjectFolderPath + projectName + "/"; + + // 创建在研项目名文件夹 + zipos.putNextEntry(new ZipEntry(projectFolderPath)); + zipos.closeEntry(); + + List researchProjectFileIds = new ArrayList<>(); + if (!StringUtils.isEmpty(payResearchProject.getFiles())) { + researchProjectFileIds.addAll(Arrays.asList(payResearchProject.getFiles().split(","))); + } + + // 添加在研项目的文件到在研项目名文件夹 + for (String fileId : researchProjectFileIds) { + OSSFile ossFile = iossFileService.getById(fileId.trim()); + if (ossFile == null) { + continue; + } + File file = new File(upLoadPath + File.separator + ossFile.getUrl()); + if (!file.exists()) { + continue; + } + String entryPath = projectFolderPath + ossFile.getFileName(); + // 检查是否已经添加过相同路径的条目 + if (addedEntries.contains(entryPath)) { + // 如果已经存在相同路径的条目,可以修改文件名或者跳过处理 + continue; + } + // 添加到压缩包中 + zipos.putNextEntry(new ZipEntry(entryPath)); + try (InputStream is = new FileInputStream(file)) { + byte[] b = new byte[1024]; + int length; + while ((length = is.read(b)) != -1) { + zipos.write(b, 0, length); + } + } catch (IOException e) { + e.printStackTrace(); + } + zipos.closeEntry(); // 关闭当前条目 + addedEntries.add(entryPath); // 记录已添加的条目路径 + } + } + + // 添加工作组资料文件到分发资料文件夹 + for (PayWorkingGroupDataFile dataFile : fileList) { + OSSFile ossFile = iossFileService.getById(dataFile.getFileId()); + if (ossFile == null) { + continue; + } + File file = new File(upLoadPath + File.separator + ossFile.getUrl()); + if (!file.exists()) { + continue; + } + String entryPath = otherFilesFolderPath + ossFile.getFileName(); + // 检查是否已经添加过相同路径的条目 + if (addedEntries.contains(entryPath)) { + // 如果已经存在相同路径的条目,可以修改文件名或者跳过处理 + continue; + } + // 添加到压缩包中 + zipos.putNextEntry(new ZipEntry(entryPath)); + try (InputStream is = new FileInputStream(file)) { + byte[] b = new byte[1024]; + int length; + while ((length = is.read(b)) != -1) { + zipos.write(b, 0, length); + } + } catch (IOException e) { + e.printStackTrace(); + } + zipos.closeEntry(); // 关闭当前条目 + addedEntries.add(entryPath); // 记录已添加的条目路径 + } + } + + // 处理工作组会议资料 + for (String projectId : selectionList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PayMeeting::getWorkingGroupId, projectId); + lambdaQueryWrapper.eq(PayMeeting::getMeetingType, MeetingCommon.WORKING_GROUP_MEETING_INT); + List list = payMeetingService.list(lambdaQueryWrapper); + for (PayMeeting payMeeting : list) { + String meetingName = payMeeting.getMeetingName(); + String meetingFolderPath = "会议资料/" + meetingName + "/"; + String meetingMinutesFolderPath = meetingFolderPath + "会议纪要/"; + String meetingDataFolderPath = meetingFolderPath + "上传文件/"; + + // 创建会议文件夹 + zipos.putNextEntry(new ZipEntry(meetingFolderPath)); + zipos.closeEntry(); + // 创建会议纪要文件夹 + zipos.putNextEntry(new ZipEntry(meetingMinutesFolderPath)); + zipos.closeEntry(); + // 创建上传文件文件夹 + zipos.putNextEntry(new ZipEntry(meetingDataFolderPath)); + zipos.closeEntry(); + + List fileIds = new ArrayList<>(); + if (!StringUtils.isEmpty(payMeeting.getMeetingMinute())) { + fileIds.addAll(Arrays.asList(payMeeting.getMeetingMinute().split(","))); + } + if (!StringUtils.isEmpty(payMeeting.getMeetingData())) { + fileIds.addAll(Arrays.asList(payMeeting.getMeetingData().split(","))); + } + for (String fileId : fileIds) { + OSSFile ossFile = iossFileService.getById(fileId.trim()); + if (ossFile == null) { + continue; + } + File file = new File(upLoadPath + File.separator + ossFile.getUrl()); + if (!file.exists()) { + continue; + } + // 根据文件类型,放入对应的文件夹 + String entryPath; + if (payMeeting.getMeetingMinute() != null && Arrays.asList(payMeeting.getMeetingMinute().split(",")).contains(fileId)) { + entryPath = meetingMinutesFolderPath + ossFile.getFileName(); + } else { + entryPath = meetingDataFolderPath + ossFile.getFileName(); + } + // 检查是否已经添加过相同路径的条目 + if (addedEntries.contains(entryPath)) { + // 如果已经存在相同路径的条目,可以修改文件名或者跳过处理 + continue; + } + // 添加到压缩包中 + zipos.putNextEntry(new ZipEntry(entryPath)); + try (InputStream is = new FileInputStream(file)) { + byte[] b = new byte[1024]; + int length; + while ((length = is.read(b)) != -1) { + zipos.write(b, 0, length); + } + } catch (IOException e) { + e.printStackTrace(); + } + zipos.closeEntry(); // 关闭当前条目 + addedEntries.add(entryPath); // 记录已添加的条目路径 + } + } + } + zipos.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } }