From 26407509d1908d48a2782725d6492045bd793ab8 Mon Sep 17 00:00:00 2001 From: WendyYang Date: Tue, 1 Aug 2023 16:17:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=93=E5=AE=B6=E8=AF=84=E5=AE=A1=E8=A1=A8?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=A4=9A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/model/FreemarkerBatchExportDTO.java | 22 +++++++ .../pmapi/common/util/FreemarkerWordUtil.java | 53 ++++++++++++---- .../pmapi/expert/manage/ExpertReviewManage.java | 7 +++ .../controller/MeetingExportController.java | 2 +- .../meeting/entity/dto/ExpertReviewTableDTO.java | 6 +- .../pmapi/meeting/manage/ExpertExportManage.java | 70 ++++++++++++++++++---- 6 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/common/model/FreemarkerBatchExportDTO.java diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/common/model/FreemarkerBatchExportDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/common/model/FreemarkerBatchExportDTO.java new file mode 100644 index 0000000..7221f81 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/common/model/FreemarkerBatchExportDTO.java @@ -0,0 +1,22 @@ +package com.ningdatech.pmapi.common.model; + +import lombok.Data; + +/** + *

+ * FreemarkerBatchExportDTO + *

+ * + * @author WendyYang + * @since 2023/8/1 + **/ +@Data +public class FreemarkerBatchExportDTO { + + private String fileName; + + private String template; + + private Object data; + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java b/pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java index 8fa62f0..e9042a6 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java @@ -2,6 +2,7 @@ package com.ningdatech.pmapi.common.util; import cn.hutool.core.io.IoUtil; import com.ningdatech.basic.exception.BizException; +import com.ningdatech.pmapi.common.model.FreemarkerBatchExportDTO; import com.ningdatech.pmapi.meeting.entity.dto.ExpertFeeExportDTO; import com.ningdatech.pmapi.meeting.entity.dto.ExpertInfoDTO; import freemarker.template.Configuration; @@ -19,6 +20,9 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** *

@@ -69,22 +73,49 @@ public class FreemarkerWordUtil { public static void export(String fileName, Object data, HttpServletResponse response, String templateName) throws TemplateException, IOException { Template template = CONFIGURATION.getTemplate(templateName); - StringWriter out = new StringWriter(); - Writer writer = new BufferedWriter(out, 4096); - template.process(data, writer); response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); response.setContentType(ContentType.APPLICATION_JSON.getMimeType()); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8")); - try (InputStream is = new ByteArrayResource(out.toString().getBytes(StandardCharsets.UTF_8)).getInputStream(); - ServletOutputStream outputStream = response.getOutputStream()) { - // 缓冲区 - byte[] buffer = new byte[1024]; - int bytesToRead; - // 通过循环将读入的Word文件的内容输出到浏览器中 - while ((bytesToRead = is.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesToRead); + try (StringWriter out = new StringWriter(); + Writer writer = new BufferedWriter(out, 4096)) { + template.process(data, writer); + try (InputStream is = new ByteArrayResource(out.toString().getBytes(StandardCharsets.UTF_8)).getInputStream(); + ServletOutputStream outputStream = response.getOutputStream()) { + // 缓冲区 + byte[] buffer = new byte[1024]; + int bytesToRead; + // 通过循环将读入的Word文件的内容输出到浏览器中 + while ((bytesToRead = is.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesToRead); + } } } + + + } + + public static void exportBatch(HttpServletResponse response, List fbeList, String fileName) throws IOException, TemplateException { + response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); + response.setContentType("application/zip"); + String encode = URLEncoder.encode(fileName, "UTF-8"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encode); + + try (ServletOutputStream os = response.getOutputStream(); + ZipOutputStream zos = new ZipOutputStream(os)) { + for (FreemarkerBatchExportDTO param : fbeList) { + Template template = CONFIGURATION.getTemplate(param.getTemplate()); + StringWriter out = new StringWriter(); + try (Writer writer = new BufferedWriter(out, 4096)) { + template.process(param.getData(), writer); + } + ZipEntry zipEntry = new ZipEntry(param.getFileName()); + zos.putNextEntry(zipEntry); + zos.write(out.toString().getBytes(StandardCharsets.UTF_8)); + zos.closeEntry(); + } + } finally { + response.flushBuffer(); + } } public static void main(String[] args) { diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/expert/manage/ExpertReviewManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/expert/manage/ExpertReviewManage.java index d77a4e8..6272b20 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/expert/manage/ExpertReviewManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/expert/manage/ExpertReviewManage.java @@ -199,4 +199,11 @@ public class ExpertReviewManage { return detail; } + public List listFinalExpertReviews(Long meetingId) { + LambdaQueryWrapper query = Wrappers.lambdaQuery(ExpertReview.class) + .eq(ExpertReview::getIsFinal, Boolean.TRUE) + .eq(ExpertReview::getMeetingId, meetingId); + return expertReviewService.list(query); + } + } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/controller/MeetingExportController.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/controller/MeetingExportController.java index b742e40..9829397 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/controller/MeetingExportController.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/controller/MeetingExportController.java @@ -48,7 +48,7 @@ public class MeetingExportController { } @GetMapping("/expertInviteTable/{meetingId}") - @ApiOperation("专家评审单导出") + @ApiOperation("专家抽取表导出") public void exportExpertInviteTable(@PathVariable Long meetingId, HttpServletResponse response) { expertExportManage.expertInviteTable(meetingId, response); } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertReviewTableDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertReviewTableDTO.java index e5c10d7..3eed40c 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertReviewTableDTO.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertReviewTableDTO.java @@ -2,6 +2,8 @@ package com.ningdatech.pmapi.meeting.entity.dto; import lombok.Data; +import java.io.Serializable; + /** *

* ExpertReviewTableDTO @@ -11,7 +13,9 @@ import lombok.Data; * @since 2023/7/24 **/ @Data -public class ExpertReviewTableDTO { +public class ExpertReviewTableDTO implements Serializable { + + private static final long serialVersionUID = 3383159744182234397L; private String projectName; diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/ExpertExportManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/ExpertExportManage.java index 8455cfe..e158d21 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/ExpertExportManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/manage/ExpertExportManage.java @@ -3,16 +3,20 @@ package com.ningdatech.pmapi.meeting.manage; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ningdatech.basic.exception.BizException; import com.ningdatech.basic.util.CollUtils; +import com.ningdatech.pmapi.common.model.FreemarkerBatchExportDTO; import com.ningdatech.pmapi.common.util.FreemarkerWordUtil; import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; +import com.ningdatech.pmapi.expert.manage.ExpertReviewManage; import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; import com.ningdatech.pmapi.meeting.entity.domain.Meeting; import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; import com.ningdatech.pmapi.meeting.entity.domain.MeetingInnerProject; import com.ningdatech.pmapi.meeting.entity.domain.MeetingOuterProject; import com.ningdatech.pmapi.meeting.entity.dto.*; +import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum; import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; import com.ningdatech.pmapi.meeting.service.IMeetingInnerProjectService; import com.ningdatech.pmapi.meeting.service.IMeetingOuterProjectService; @@ -29,11 +33,13 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.function.Supplier; +import java.util.stream.Collectors; /** *

@@ -54,6 +60,7 @@ public class ExpertExportManage { private final IMeetingOuterProjectService meetingOuterProjectService; private final IExpertUserFullInfoService expertUserInfoService; private final IProjectService projectService; + private final ExpertReviewManage expertReviewManage; //================================================================================================================== @@ -78,6 +85,16 @@ public class ExpertExportManage { static Supplier wordName = () -> UUID.randomUUID().toString(true) + ".doc"; + private List listExpertsByAgreeOrLeave(Long meetingId) { + Page page = Page.of(1, 20); + meetingExpertService.pageExpertByStatusAndMeetingId(page, meetingId, null, null); + if (page.getTotal() == 0) { + return Collections.emptyList(); + } + page.getRecords().removeIf(w -> !(ExpertAttendStatusEnum.AGREED.eq(w.getStatus()) || ExpertAttendStatusEnum.ON_LEAVE.eq(w.getStatus()))); + return page.getRecords(); + } + //================================================================================================================== public void exportFeeForExpert(Long meetingId, HttpServletResponse response) { @@ -130,22 +147,41 @@ public class ExpertExportManage { public void expertReviewTable(Long meetingId, HttpServletResponse response) { try { Meeting meeting = meetingService.getById(meetingId); - ExpertReviewTableDTO data = new ExpertReviewTableDTO(); - data.setMeetingTime(DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy年M月d日")); - data.setMeetingAddress(meeting.getMeetingAddress()); - data.setHoldOrg(meeting.getHoldOrg()); - List projectNames = new ArrayList<>(); + String startTime = DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy年M月d日"); + List fbeList; if (meeting.getIsInnerProject()) { List inners = meetingInnerProjectService.listByMeetingId(meetingId); List projectIds = CollUtils.fieldList(inners, MeetingInnerProject::getProjectId); List projects = projectService.listByIds(projectIds); - projects.forEach(w -> projectNames.add(w.getProjectName())); + fbeList = projects.stream().map(w -> { + FreemarkerBatchExportDTO fbe = new FreemarkerBatchExportDTO(); + ExpertReviewTableDTO currData = new ExpertReviewTableDTO(); + currData.setHoldOrg(meeting.getHoldOrg()); + currData.setMeetingTime(startTime); + currData.setMeetingAddress(meeting.getMeetingAddress()); + currData.setProjectName(w.getProjectName()); + fbe.setData(currData); + fbe.setTemplate(EXPERT_REVIEW); + fbe.setFileName(w.getProjectName() + ".doc"); + return fbe; + }).collect(Collectors.toList()); } else { List inners = meetingOuterProjectService.listByMeetingId(meetingId); - inners.forEach(w -> projectNames.add(w.getProjectName())); + fbeList = inners.stream().map(w -> { + FreemarkerBatchExportDTO fbe = new FreemarkerBatchExportDTO(); + ExpertReviewTableDTO currData = new ExpertReviewTableDTO(); + currData.setHoldOrg(meeting.getHoldOrg()); + currData.setMeetingTime(startTime); + currData.setMeetingAddress(meeting.getMeetingAddress()); + currData.setProjectName(w.getProjectName()); + fbe.setData(currData); + fbe.setTemplate(EXPERT_REVIEW); + fbe.setFileName(w.getProjectName() + ".doc"); + return fbe; + }).collect(Collectors.toList()); } - data.setProjectName(StrUtil.join("、", projectNames)); - FreemarkerWordUtil.export(wordName.get(), data, response, EXPERT_REVIEW); + String exportFileName = meeting.getName() + "专家评审表.zip"; + FreemarkerWordUtil.exportBatch(response, fbeList, exportFileName); } catch (TemplateException | IOException e) { log.error("专家评审单导出异常:{}", meetingId, e); throw BizException.wrap("专家评审单导出失败"); @@ -171,13 +207,17 @@ public class ExpertExportManage { data.setProjectName(StrUtil.join("、", projectNames)); data.setExperts(new ArrayList<>()); // 设置专家信息 - List experts = meetingExpertService.listAgreedExperts(meetingId); + List experts = listExpertsByAgreeOrLeave(meetingId); List expertIds = CollUtils.fieldList(experts, MeetingExpert::getExpertId); List expertInfos = expertUserInfoService.listByUserId(expertIds); Map expertMap = CollUtils.listToMap(expertInfos, ExpertUserFullInfo::getUserId); experts.forEach(w -> { ExpertInfoDTO expert = new ExpertInfoDTO(); - expert.setName(w.getExpertName()); + if (ExpertAttendStatusEnum.ON_LEAVE.eq(w.getStatus())) { + expert.setBank(w.getExpertName() + "(请假)"); + } else { + expert.setName(w.getExpertName()); + } ExpertUserFullInfo expertUser = expertMap.get(w.getExpertId()); if (expertUser != null) { expert.setCompany(expertUser.getCompany()); @@ -217,7 +257,7 @@ public class ExpertExportManage { } data.setExperts(new ArrayList<>()); // 设置专家信息 - List experts = meetingExpertService.listAgreedExperts(meetingId); + List experts = listExpertsByAgreeOrLeave(meetingId); List expertIds = CollUtils.fieldList(experts, MeetingExpert::getExpertId); List expertInfos = expertUserInfoService.listByUserId(expertIds); Map expertMap = CollUtils.listToMap(expertInfos, ExpertUserFullInfo::getUserId); @@ -225,7 +265,11 @@ public class ExpertExportManage { experts.forEach(w -> { ExpertInfoDTO expert = new ExpertInfoDTO(); expert.setNo(integer.incrementAndGet()); - expert.setName(w.getExpertName()); + if (ExpertAttendStatusEnum.ON_LEAVE.eq(w.getStatus())) { + expert.setBank(w.getExpertName() + "(请假)"); + } else { + expert.setName(w.getExpertName()); + } expert.setMobile(w.getMobile()); ExpertUserFullInfo expertUser = expertMap.get(w.getExpertId()); if (expertUser != null) {