diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/common/util/WordUtil.java b/pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java similarity index 66% rename from pmapi/src/main/java/com/ningdatech/pmapi/common/util/WordUtil.java rename to pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java index b6d173d..dca4042 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/common/util/WordUtil.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/common/util/FreemarkerWordUtil.java @@ -1,9 +1,14 @@ package com.ningdatech.pmapi.common.util; +import cn.hutool.core.io.IoUtil; +import com.ningdatech.basic.exception.BizException; import com.ningdatech.pmapi.meeting.entity.dto.ExpertFeeExportDTO; +import com.ningdatech.pmapi.meeting.entity.dto.ExpertInfoDTO; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.entity.ContentType; import org.springframework.core.io.ByteArrayResource; import javax.servlet.ServletOutputStream; @@ -17,19 +22,20 @@ import java.util.ArrayList; /** *
- * WordUtil + * FreemarkerWordUtil *
* * @author WendyYang * @since 2023/7/24 **/ -public class WordUtil { +@Slf4j +public class FreemarkerWordUtil { private static final Configuration CONFIGURATION = new Configuration(Configuration.VERSION_2_3_31); static { CONFIGURATION.setDefaultEncoding("UTF-8"); - CONFIGURATION.setClassForTemplateLoading(WordUtil.class, "/template"); + CONFIGURATION.setClassForTemplateLoading(FreemarkerWordUtil.class, "/template"); } /** @@ -42,30 +48,22 @@ public class WordUtil { */ public static void create(Object dataMap, String templateName, String filePath, String fileName) { try { - - - //获取模板 Template template = CONFIGURATION.getTemplate(templateName); - //输出文件 File outFile = new File(filePath + File.separator + fileName); - //如果输出目标文件夹不存在,则创建 if (!outFile.getParentFile().exists()) { boolean ignore = outFile.getParentFile().mkdirs(); } - //将模板和数据模型合并生成文件 Writer out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(outFile.toPath()), StandardCharsets.UTF_8)); - //生成文件 template.process(dataMap, out); - - //关闭流 - out.flush(); - out.close(); + IoUtil.flush(out); + IoUtil.close(out); } catch (Exception e) { - e.printStackTrace(); + log.error("根据模版生成Word文件失败:", e); + throw BizException.wrap("根据模版生成Word文件失败"); } } @@ -74,23 +72,19 @@ public class WordUtil { StringWriter out = new StringWriter(); Writer writer = new BufferedWriter(out, 4096); template.process(data, writer); - InputStream fin = new ByteArrayResource(out.toString().getBytes(StandardCharsets.UTF_8)).getInputStream(); - ServletOutputStream outputStream; response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); - response.setContentType("application/json"); + response.setContentType(ContentType.APPLICATION_JSON.getMimeType()); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8")); - outputStream = response.getOutputStream(); - // 缓冲区 - byte[] buffer = new byte[1024]; - int bytesToRead; - // 通过循环将读入的Word文件的内容输出到浏览器中 - while ((bytesToRead = fin.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesToRead); - } - if (outputStream != null) { - outputStream.close(); + 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); + } } - fin.close(); } public static void main(String[] args) { @@ -98,19 +92,19 @@ public class WordUtil { dto.setMeetingAddress("杭州市滨江区海创还能到我当时防守打法十大发放"); dto.setMeetingTime("2023-01-01 12:20"); dto.setProjectName("阿萨法舒服舒服舒服舒服送达方"); - dto.setTableData(new ArrayList<>()); - for (int i = 0; i < 100; i++) { - ExpertFeeExportDTO.ExpertInfoDTO expert = new ExpertFeeExportDTO.ExpertInfoDTO(); + dto.setExperts(new ArrayList<>()); + for (int i = 0; i < 10; i++) { + ExpertInfoDTO expert = new ExpertInfoDTO(); expert.setNo(i); expert.setBank("中国建设银行"); - expert.setMobile("17839192616"); - expert.setBankNo("121212121212121212"); - expert.setCompany("宁大科技有限公司"); + expert.setMobile("17819392616"); + expert.setBankNo("6111111172121324354"); + expert.setCompany("宁达科技有限公司"); expert.setFee(BigDecimal.valueOf(500)); - expert.setName("张三"); + expert.setName("张三丰"); expert.setSex("男"); - expert.setIdcard("121212121121"); - dto.getTableData().add(expert); + expert.setIdcard("1212121211212121"); + dto.getExperts().add(expert); } create(dto, "专家费.ftl", "/Users/wendy/Desktop/", "专家费.doc"); } 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 0ac0126..b742e40 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 @@ -29,7 +29,7 @@ public class MeetingExportController { private final ExpertExportManage expertExportManage; - @GetMapping("/feeForExpert/{meetingId}") + @GetMapping("/expertFeeTable/{meetingId}") @ApiOperation("专家费用单导出") public void exportFeeForExpert(@PathVariable Long meetingId, HttpServletResponse response) { expertExportManage.exportFeeForExpert(meetingId, response); @@ -37,8 +37,20 @@ public class MeetingExportController { @GetMapping("/expertReviewTable/{meetingId}") @ApiOperation("专家评审单导出") - public void expertReviewTable(@PathVariable Long meetingId, HttpServletResponse response) { + public void exportExpertReviewTable(@PathVariable Long meetingId, HttpServletResponse response) { expertExportManage.expertReviewTable(meetingId, response); } + @GetMapping("/laborFeeAuditTable/{meetingId}") + @ApiOperation("劳务费发放单导出") + public void exportLaborFeeAuditTable(@PathVariable Long meetingId, HttpServletResponse response) { + expertExportManage.laborFeeAuditTable(meetingId, response); + } + + @GetMapping("/expertInviteTable/{meetingId}") + @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/ExpertFeeExportDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertFeeExportDTO.java index 68b2e64..0c2effe 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertFeeExportDTO.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertFeeExportDTO.java @@ -2,8 +2,6 @@ package com.ningdatech.pmapi.meeting.entity.dto; import lombok.Data; -import java.math.BigDecimal; -import java.security.SecureRandom; import java.util.List; /** @@ -23,30 +21,7 @@ public class ExpertFeeExportDTO { private String meetingTime; - private List+ * ExpertInfoDTO + *
+ * + * @author WendyYang + * @since 2023/7/24 + **/ +@Data +public class ExpertInfoDTO { + + private Integer no; + + private String name; + + private String bank; + + private String bankNo; + + private String mobile; + + private String sex; + + private String company; + + private String job; + + private BigDecimal fee; + + private String idcard; + +} \ No newline at end of file diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertInviteTableDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertInviteTableDTO.java new file mode 100644 index 0000000..fcef7fe --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/dto/ExpertInviteTableDTO.java @@ -0,0 +1,34 @@ +package com.ningdatech.pmapi.meeting.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + *+ * ExpertInviteTableDTO + *
+ * + * @author WendyYang + * @since 2023/7/24 + **/ +@Data +public class ExpertInviteTableDTO { + + private List+ * LaborFeeAuditTableDTO + *
+ * + * @author WendyYang + * @since 2023/7/24 + **/ +@Data +public class LaborFeeAuditTableDTO { + + private String projectName; + + private String meetingTime; + + private Integer expertCount; + + private List
@@ -43,7 +44,7 @@ import java.util.concurrent.atomic.AtomicInteger;
**/
@Slf4j
@Component
-@AllArgsConstructor
+@RequiredArgsConstructor
public class ExpertExportManage {
private final IMeetingService meetingService;
@@ -53,6 +54,20 @@ public class ExpertExportManage {
private final IExpertUserFullInfoService expertUserInfoService;
private final IProjectService projectService;
+ //==================================================================================================================
+
+ static Function