From 7b3f7b2e39c390208a83785e1d31c9c10932d075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 18 Sep 2023 10:25:43 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/salaryBill/bo/SalaryBillBO.java | 76 +++++++++++-------- .../service/impl/SalaryBillServiceImpl.java | 2 +- src/com/engine/salary/util/pdf/HtmlToPdf.java | 66 ++++++++++++++++ 3 files changed, 110 insertions(+), 34 deletions(-) create mode 100644 src/com/engine/salary/util/pdf/HtmlToPdf.java diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index c298b33fd..6b3a30fbb 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salaryBill.bo; +import cn.hutool.core.io.FileUtil; import com.cloudstore.dev.api.bean.MessageBean; import com.cloudstore.dev.api.bean.MessageType; import com.cloudstore.dev.api.util.Util_Message; @@ -19,6 +20,7 @@ import com.engine.salary.enums.salarybill.SalaryTemplateTextContentPositionEnum; import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.pdf.HtmlToPdf; import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -29,6 +31,7 @@ import weaver.email.EmailWorkRunnable; import weaver.hrm.company.SubCompanyComInfo; import weaver.hrm.resource.ResourceComInfo; +import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -255,24 +258,36 @@ public class SalaryBillBO { } } - public static void sendEmail(Map e, Map allEmployeeMap, SalaryBillSendDTO salaryBillSendParam) { + public static void sendEmail(Map e, SalaryBillSendDTO salaryBillSendParam) { StringBuilder emailContent = new StringBuilder(); + emailContent.append(""); emailContent.append("
"); - // 消息接收者 - String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); - String title = getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())); SalaryBillBO.buildEmailContent(emailContent, e, salaryBillSendParam); // 构建水印内容 buildEmailWatermarkContent(emailContent, e, salaryBillSendParam); emailContent.append("
"); + + + // 消息接收者 + String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); + String title = getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())); + + + //生成html + Object id = e.getOrDefault("id", 1L); + String htmlPath = "D:\\" + id + ".html"; + File touch = FileUtil.touch(htmlPath); + FileUtil.appendUtf8String(emailContent.toString(), touch); + + String pdfPath = "D:\\" + id + ".pdf"; + HtmlToPdf.convert(htmlPath,pdfPath); + if (StringUtils.isNotBlank(receivers)) { -// MessageUtil.sendEmail(receivers, title, emailContent.toString()); EmailWorkRunnable.threadModeReminder(receivers, title, emailContent.toString()); } } - public static void sendSMS(SalaryBillSendDTO salaryBillSendParam, Long id, Long employeeId) { // try { @@ -462,7 +477,10 @@ public class SalaryBillBO { } else { buildMailMain(emailContent, e, salaryBillSendParam); } - + //签章 + emailContent.append("
\n" + + " \n" + + "
"); emailContent.append(""); } @@ -491,27 +509,25 @@ public class SalaryBillBO { } emailContent.append("
"); if (!salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.NO_TYPE_GROUP_ID)) { - emailContent.append("
"); + emailContent.append("
"); // 4.1.薪资项目组名 emailContent.append(salaryItemSet.getGroupName()); emailContent.append("
"); } - emailContent.append("
"); + emailContent.append("
"); for (int i = 0; i < salaryItemSet.getItems().size(); i++) { SalaryTemplateSalaryItemListDTO salaryItem = salaryItemSet.getItems().get(i); // 员工基本信息 if (salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID) && salaryBillSendParam.getEmployeeInformation() != null) { Optional optionalEmpItem = salaryBillSendParam.getEmployeeInformation().getItems().stream().filter(f -> f.getId().equals(salaryItem.getId())).findFirst(); // 4.2.员工信息 - emailContent.append("
"); - emailContent.append("
"); + emailContent.append("
"); + emailContent.append("
"); emailContent.append(""); emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getName() : "")); emailContent.append(""); emailContent.append("
"); - emailContent.append("
"); + emailContent.append("
"); emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getSalaryItemValue() : "")); emailContent.append("
"); emailContent.append("
"); @@ -520,16 +536,13 @@ public class SalaryBillBO { if ((salaryItem.getId() + SalaryArchiveConstant.DYNAMIC_SUFFIX).equals(keyName.toString())) { boolean isHide = (isHideNull && e.get(keyName.toString()) != null) || (isHideZero && "0.00".equals(e.get(keyName.toString()))); // 4.2.薪资项目 - emailContent.append("
"); - emailContent.append("
"); + emailContent.append("
"); + emailContent.append("
"); emailContent.append(""); emailContent.append(salaryItem.getName()); emailContent.append(""); emailContent.append("
"); - emailContent.append("
"); + emailContent.append("
"); emailContent.append(e.get(keyName.toString())); emailContent.append("
"); emailContent.append("
"); @@ -592,16 +605,13 @@ public class SalaryBillBO { if ((salaryItem.getId() + SalaryArchiveConstant.DYNAMIC_SUFFIX).equals(keyName.toString())) { boolean isHide = (isHideNull && e.get(keyName.toString()) != null) || (isHideZero && "0.00".equals(e.get(keyName.toString()))); // 4.2.薪资项目 - emailContent.append("
"); - emailContent.append("
"); + emailContent.append("
"); + emailContent.append("
"); emailContent.append(""); emailContent.append(salaryItem.getName()); emailContent.append(""); emailContent.append("
"); - emailContent.append("
"); + emailContent.append("
"); emailContent.append(e.get(keyName.toString())); emailContent.append("
"); emailContent.append("
"); @@ -644,7 +654,7 @@ public class SalaryBillBO { /** * 构建水印 - * + *

* 当前所拥有的变量 * "HRM_Name",当前操作者姓名 * "HRM_Num",当前操作者编号 @@ -715,7 +725,7 @@ public class SalaryBillBO { List wmTextFieldIds = Collections.emptyList(); // 没有水印、关闭水印、或者系统水印,则不拼接 // if (Objects.isNull(salaryBillWatermark) || !salaryBillWatermark.getWatermarkStatus() || !SalaryTemplateWatermarkTypeEnum.CUSTOM.getValue().equals(salaryBillWatermark.getWatermarkType())) { - if (Objects.isNull(salaryBillWatermark) || !salaryBillWatermark.getWatermarkStatus() ) { + if (Objects.isNull(salaryBillWatermark) || !salaryBillWatermark.getWatermarkStatus()) { return wmTextFieldIds; } String wmClassify = salaryBillWatermark.getWmSetting().getOrDefault("wmClassify", StringUtils.EMPTY).toString(); @@ -762,7 +772,7 @@ public class SalaryBillBO { public static String buildEmailWmContentTemplate(boolean isEnableEmail, SalaryBillWatermarkDTO watermarkSetting) { String emailWmContentTemplate = StringUtils.EMPTY; // 没有水印、关闭水印,则不拼接 - if (!isEnableEmail || Objects.isNull(watermarkSetting) || !watermarkSetting.getWatermarkStatus() ) { + if (!isEnableEmail || Objects.isNull(watermarkSetting) || !watermarkSetting.getWatermarkStatus()) { return emailWmContentTemplate; } String wmClassify = watermarkSetting.getWmSetting().getOrDefault("wmClassify", StringUtils.EMPTY).toString(); @@ -789,7 +799,7 @@ public class SalaryBillBO { for (int i = 0; i < 20; i++) { emailWmContentTemp.append("

"); for (int j = 0; j < 8; j++) { - emailWmContentTemp.append("
"); + emailWmContentTemp.append("
"); // 赋值 emailWmContentTemp.append(variable); emailWmContentTemp.append("
"); @@ -801,7 +811,7 @@ public class SalaryBillBO { return emailWmContentTemp.toString(); } - public static String handleWmText(String wmText, List wmTextFieldIds, DataCollectionEmployee simpleEmployee){ + public static String handleWmText(String wmText, List wmTextFieldIds, DataCollectionEmployee simpleEmployee) { for (String wmTextFieldId : wmTextFieldIds) { // 当前操作者姓名 if (SalaryBillConstant.HRM_Name.equals(wmTextFieldId)) { @@ -820,10 +830,10 @@ public class SalaryBillBO { wmText = wmText.replace(SalaryBillConstant.HRM_prefix + SalaryBillConstant.HRM_CurrentOperatorId, Objects.isNull(simpleEmployee) ? StringUtils.EMPTY : simpleEmployee.getEmployeeId().toString()); // 当前操作者部门 } else if (SalaryBillConstant.HRM_Department.equals(wmTextFieldId)) { - wmText = wmText.replace(SalaryBillConstant.HRM_prefix + SalaryBillConstant.HRM_Department, Objects.isNull(simpleEmployee) || Objects.isNull(simpleEmployee.getDepartmentName()) ? StringUtils.EMPTY : simpleEmployee.getDepartmentName()); + wmText = wmText.replace(SalaryBillConstant.HRM_prefix + SalaryBillConstant.HRM_Department, Objects.isNull(simpleEmployee) || Objects.isNull(simpleEmployee.getDepartmentName()) ? StringUtils.EMPTY : simpleEmployee.getDepartmentName()); // 当前操作者分部 } else if (SalaryBillConstant.HRM_SecondDepartment.equals(wmTextFieldId)) { - wmText = wmText.replace(SalaryBillConstant.HRM_prefix + SalaryBillConstant.HRM_SecondDepartment, Objects.isNull(simpleEmployee) || Objects.isNull(simpleEmployee.getSubcompanyName()) ? StringUtils.EMPTY : simpleEmployee.getSubcompanyName()); + wmText = wmText.replace(SalaryBillConstant.HRM_prefix + SalaryBillConstant.HRM_SecondDepartment, Objects.isNull(simpleEmployee) || Objects.isNull(simpleEmployee.getSubcompanyName()) ? StringUtils.EMPTY : simpleEmployee.getSubcompanyName()); // 当前日期 } else if (SalaryBillConstant.HRM_CurrentDate.equals(wmTextFieldId)) { wmText = wmText.replace(SalaryBillConstant.HRM_prefix + SalaryBillConstant.HRM_CurrentDate, SalaryDateUtil.getFormatLocalDate(LocalDate.now())); diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index 6b438b564..e2af35851 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -528,7 +528,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService if (sendChannels.contains(MessageChannelEnum.EMAIL)) { // 构建发送消息 SalaryBillBO.buildEmployeeInfo(salaryBillSendParam, allEmployeeMap.get(e.get("employeeId").toString())); - SalaryBillBO.sendEmail(e, allEmployeeMap, salaryBillSendParam); + SalaryBillBO.sendEmail(e, salaryBillSendParam); } diff --git a/src/com/engine/salary/util/pdf/HtmlToPdf.java b/src/com/engine/salary/util/pdf/HtmlToPdf.java new file mode 100644 index 000000000..8603e7b1c --- /dev/null +++ b/src/com/engine/salary/util/pdf/HtmlToPdf.java @@ -0,0 +1,66 @@ +package com.engine.salary.util.pdf; + +import com.engine.workflow.biz.requestForm.HtmlToPdfInterceptor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; + +@Slf4j +public class HtmlToPdf { + + // wkhtmltopdf在系统中的路径 + private static final String toPdfTool = "H:\\tools\\wkhtmltox\\bin\\wkhtmltopdf.exe"; + + /** + * html转pdf + * + * @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径 + * @param destPath pdf保存路径 + * @return 转换成功返回true + */ + public static boolean convert(String srcPath, String destPath) { + File file = new File(destPath); + File parent = file.getParentFile(); + //如果pdf保存路径不存在,则创建路径 + if (!parent.exists()) { + parent.mkdirs(); + } + StringBuilder cmd = new StringBuilder(); + cmd.append(toPdfTool); + cmd.append(" "); + cmd.append(" --header-line");//页眉下面的线 + cmd.append(" --margin-top 3cm ");//设置页面上边距 (default 10mm) + // cmd.append(" --header-html file:///"+WebUtil.getServletContext().getRealPath("")+FileUtil.convertSystemFilePath("\\style\\pdf\\head.html"));// (添加一个HTML页眉,后面是网址) + cmd.append(" --header-spacing 5 --orientation Portrait ");// (设置页眉和内容的距离,默认0) + //cmd.append(" --footer-center (设置在中心位置的页脚内容)");//设置在中心位置的页脚内容 + //cmd.append(" --footer-html file:///"+WebUtil.getServletContext().getRealPath("")+FileUtil.convertSystemFilePath("\\style\\pdf\\foter.html"));// (添加一个HTML页脚,后面是网址) + cmd.append(" --footer-line");//* 显示一条线在页脚内容上) + cmd.append(" --footer-spacing 5 ");// (设置页脚和内容的距离) + //--orientation Portrait --footer-center [page]/[topage] --footer-line + cmd.append(srcPath); + cmd.append(" "); + cmd.append(destPath); + boolean result = true; + try { + Process proc = Runtime.getRuntime().exec(cmd.toString()); + HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream()); + HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream()); + error.start(); + output.start(); + proc.waitFor(); + } catch (Exception e) { + result = false; + e.printStackTrace(); + } + + return result; + } + + public static void main(String[] args) { + String sourcePath = "C:\\Users\\钱涛\\Desktop\\1(1).html"; + HtmlToPdf.convert(sourcePath, "C:\\Users\\钱涛\\Desktop\\1.pdf"); + System.out.println("0000"); + } + + +} From 12480f8306421276b52075cf536ccd360b076cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 18 Sep 2023 18:45:59 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=B7=A5=E8=B5=84?= =?UTF-8?q?=E5=8D=95pdf=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/prop/hrmSalaryPayroll.properties | 4 + .../entity/salaryBill/bo/SalaryBillBO.java | 217 +++++++++++------- src/com/engine/salary/util/pdf/HtmlToPdf.java | 13 +- 3 files changed, 145 insertions(+), 89 deletions(-) create mode 100644 resource/WEB-INF/prop/hrmSalaryPayroll.properties diff --git a/resource/WEB-INF/prop/hrmSalaryPayroll.properties b/resource/WEB-INF/prop/hrmSalaryPayroll.properties new file mode 100644 index 000000000..ac20aedaa --- /dev/null +++ b/resource/WEB-INF/prop/hrmSalaryPayroll.properties @@ -0,0 +1,4 @@ +genPdf=1 +hasSign=1 +toPdfToolPath=H:\\tools\\wkhtmltox\\bin\\wkhtmltopdf.exe +genPath=D:\\ diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index 6b3a30fbb..c321cab31 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -21,18 +21,26 @@ import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.pdf.HtmlToPdf; +import com.fapiao.neon.util.Base64Utils; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import weaver.common.MessageUtil; +import weaver.conn.RecordSet; import weaver.email.EmailWorkRunnable; +import weaver.file.ImageFileManager; +import weaver.general.BaseBean; import weaver.hrm.company.SubCompanyComInfo; import weaver.hrm.resource.ResourceComInfo; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -259,6 +267,36 @@ public class SalaryBillBO { } public static void sendEmail(Map e, SalaryBillSendDTO salaryBillSendParam) { + String content = genPayrollHtmlContent(e, salaryBillSendParam); + genPdf(e, salaryBillSendParam); + // 消息接收者 + String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); + String title = getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())); + + if (StringUtils.isNotBlank(receivers)) { + EmailWorkRunnable.threadModeReminder(receivers, title, content); + } + } + + public static void genPdf(Map e, SalaryBillSendDTO salaryBillSendParam) { + String content = genPayrollHtmlContent(e, salaryBillSendParam); + BaseBean baseBean = new BaseBean(); + boolean genPdf = "1".equals(baseBean.getPropValue("hrmSalaryPayroll", "genPdf")); + boolean hasSign = "1".equals(baseBean.getPropValue("hrmSalaryPayroll", "hasSign")); + String genPath = baseBean.getPropValue("hrmSalaryPayroll", "genPath"); + String toPdfTool = new BaseBean().getPropValue("hrmSalaryPayroll", "toPdfToolPath"); + //生成html + Object id = e.getOrDefault("id", 1L); + String htmlPath = genPath + id + ".html"; + File touch = FileUtil.touch(htmlPath); + FileUtil.appendUtf8String(content, touch); + String pdfPath = genPath + id + ".pdf"; + HtmlToPdf.convert(toPdfTool, htmlPath, pdfPath); + } + + + @NotNull + private static String genPayrollHtmlContent(Map e, SalaryBillSendDTO salaryBillSendParam) { StringBuilder emailContent = new StringBuilder(); emailContent.append(""); emailContent.append("
"); @@ -266,28 +304,30 @@ public class SalaryBillBO { // 构建水印内容 buildEmailWatermarkContent(emailContent, e, salaryBillSendParam); emailContent.append("
"); - - - // 消息接收者 - String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); - String title = getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())); - - - //生成html - Object id = e.getOrDefault("id", 1L); - String htmlPath = "D:\\" + id + ".html"; - File touch = FileUtil.touch(htmlPath); - FileUtil.appendUtf8String(emailContent.toString(), touch); - - String pdfPath = "D:\\" + id + ".pdf"; - HtmlToPdf.convert(htmlPath,pdfPath); - - if (StringUtils.isNotBlank(receivers)) { - EmailWorkRunnable.threadModeReminder(receivers, title, emailContent.toString()); - } + return emailContent.toString(); } + public static byte[] readInputStream(InputStream is) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length = 0; + try { + while ((length = is.read(buffer)) != -1) { + baos.write(buffer, 0, length); + } + baos.flush(); + } catch (IOException e) { + } + byte[] data = baos.toByteArray(); + try { + is.close(); + baos.close(); + } catch (IOException e) { + } + return data; + } + public static void sendSMS(SalaryBillSendDTO salaryBillSendParam, Long id, Long employeeId) { // try { @@ -447,7 +487,7 @@ public class SalaryBillBO { * @return */ public static void buildEmailContent(StringBuilder emailContent, Map e, SalaryBillSendDTO salaryBillSendParam) { - emailContent.append("
"); + emailContent.append("
"); // 1.标题 emailContent.append("
"); // emailContent.append(salaryBillSendParam.getTitle()); @@ -478,9 +518,18 @@ public class SalaryBillBO { buildMailMain(emailContent, e, salaryBillSendParam); } //签章 - emailContent.append("
\n" + - " \n" + - "
"); + RecordSet rs = new RecordSet(); + rs.execute("select * from DocSignature where hrmresid=" + e.getOrDefault("employeeId", "1") + " order by markid"); + if (rs.next()) { + int imagefileid = rs.getInt("imagefileid"); + InputStream imageInputStream = ImageFileManager.getInputStreamById(imagefileid); + byte[] data = readInputStream(imageInputStream); + String imageBase64 = "data:image/jpeg;base64," + Base64Utils.encodeToString(data); + emailContent.append("
\n" + + " " + + "
"); + } + emailContent.append("
"); } @@ -507,51 +556,53 @@ public class SalaryBillBO { if (CollectionUtils.isEmpty(salaryItemSet.getItems())) { continue; } - emailContent.append("
"); + emailContent.append("
"); if (!salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.NO_TYPE_GROUP_ID)) { - emailContent.append("
"); + emailContent.append("
"); // 4.1.薪资项目组名 emailContent.append(salaryItemSet.getGroupName()); emailContent.append("
"); } - emailContent.append("
"); - for (int i = 0; i < salaryItemSet.getItems().size(); i++) { - SalaryTemplateSalaryItemListDTO salaryItem = salaryItemSet.getItems().get(i); - // 员工基本信息 - if (salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID) && salaryBillSendParam.getEmployeeInformation() != null) { - Optional optionalEmpItem = salaryBillSendParam.getEmployeeInformation().getItems().stream().filter(f -> f.getId().equals(salaryItem.getId())).findFirst(); - // 4.2.员工信息 - emailContent.append("
"); - emailContent.append("
"); - emailContent.append(""); - emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getName() : "")); - emailContent.append(""); - emailContent.append("
"); - emailContent.append("
"); - emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getSalaryItemValue() : "")); - emailContent.append("
"); - emailContent.append("
"); - } else { - for (Object keyName : e.keySet()) { - if ((salaryItem.getId() + SalaryArchiveConstant.DYNAMIC_SUFFIX).equals(keyName.toString())) { - boolean isHide = (isHideNull && e.get(keyName.toString()) != null) || (isHideZero && "0.00".equals(e.get(keyName.toString()))); - // 4.2.薪资项目 - emailContent.append("
"); - emailContent.append("
"); - emailContent.append(""); - emailContent.append(salaryItem.getName()); - emailContent.append(""); - emailContent.append("
"); - emailContent.append("
"); - emailContent.append(e.get(keyName.toString())); - emailContent.append("
"); - emailContent.append("
"); - break; + emailContent.append(""); + emailContent.append(""); + List items = salaryItemSet.getItems(); + List> itemsPartition = Lists.partition(items, 3); + itemsPartition.forEach(itemPartition -> { + emailContent.append(""); + for (int i = 0; i < itemPartition.size(); i++) { + SalaryTemplateSalaryItemListDTO salaryItem = itemPartition.get(i); + // 员工基本信息 + if (salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID) && salaryBillSendParam.getEmployeeInformation() != null) { + Optional optionalEmpItem = salaryBillSendParam.getEmployeeInformation().getItems().stream().filter(f -> f.getId().equals(salaryItem.getId())).findFirst(); + // 4.2.员工信息 + emailContent.append(""); + + emailContent.append(""); + } else { + for (Object keyName : e.keySet()) { + if ((salaryItem.getId() + SalaryArchiveConstant.DYNAMIC_SUFFIX).equals(keyName.toString())) { + boolean isHide = (isHideNull && e.get(keyName.toString()) != null) || (isHideZero && "0.00".equals(e.get(keyName.toString()))); + // 4.2.薪资项目 + emailContent.append(""); + + emailContent.append(""); + break; + } } } } - } - emailContent.append(""); + emailContent.append(""); + }); + emailContent.append(""); + emailContent.append("
"); + emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getName() : "")); + emailContent.append(""); + emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getSalaryItemValue() : "")); + emailContent.append(""); + emailContent.append(salaryItem.getName()); + emailContent.append(""); + emailContent.append(e.get(keyName.toString())); + emailContent.append("
"); emailContent.append("
"); } emailContent.append("
"); @@ -599,26 +650,36 @@ public class SalaryBillBO { emailContent.append("
"); emailContent.append("
"); - for (int i = 0; i < salaryItemSet.getItems().size(); i++) { - SalaryTemplateSalaryItemListDTO salaryItem = salaryItemSet.getItems().get(i); - for (Object keyName : e.keySet()) { - if ((salaryItem.getId() + SalaryArchiveConstant.DYNAMIC_SUFFIX).equals(keyName.toString())) { - boolean isHide = (isHideNull && e.get(keyName.toString()) != null) || (isHideZero && "0.00".equals(e.get(keyName.toString()))); - // 4.2.薪资项目 - emailContent.append("
"); - emailContent.append("
"); - emailContent.append(""); - emailContent.append(salaryItem.getName()); - emailContent.append(""); - emailContent.append("
"); - emailContent.append("
"); - emailContent.append(e.get(keyName.toString())); - emailContent.append("
"); - emailContent.append("
"); - break; + emailContent.append(""); + emailContent.append(""); + List items = salaryItemSet.getItems(); + List> itemsPartition = Lists.partition(items, 3); + itemsPartition.forEach(itemPartition -> { + emailContent.append(""); + for (int i = 0; i < itemPartition.size(); i++) { + SalaryTemplateSalaryItemListDTO salaryItem = itemPartition.get(i); + for (Object keyName : e.keySet()) { + if ((salaryItem.getId() + SalaryArchiveConstant.DYNAMIC_SUFFIX).equals(keyName.toString())) { + boolean isHide = (isHideNull && e.get(keyName.toString()) != null) || (isHideZero && "0.00".equals(e.get(keyName.toString()))); + // 4.2.薪资项目 + emailContent.append(""); + + emailContent.append(""); + break; + } } } - } + emailContent.append(""); + }); + + + emailContent.append(""); + emailContent.append("
"); + emailContent.append(salaryItem.getName()); + emailContent.append(""); + emailContent.append(e.get(keyName.toString())); + emailContent.append("
"); + // 5.文本内容-如果在薪资项目后 emailContent.append("
\n" + - " " + - "
"); - } + //签章 + boolean hasSign = "1".equals(HrmSalaryPayrollConf.HAS_SIGN); + if (hasSign) { + RecordSet rs = new RecordSet(); + rs.execute("select * from DocSignature where hrmresid=" + e.getOrDefault("employeeId", "1") + " order by markid"); + if (rs.next()) { + int imagefileid = rs.getInt("imagefileid"); + InputStream imageInputStream = ImageFileManager.getInputStreamById(imagefileid); + byte[] data = readInputStream(imageInputStream); + String imageBase64 = "data:image/jpeg;base64," + Base64Utils.encodeToString(data); + emailContent.append("
\n" + + " " + + "
"); + } + } emailContent.append("
"); } diff --git a/src/com/engine/salary/entity/salaryBill/param/SalaryExportPdfParam.java b/src/com/engine/salary/entity/salaryBill/param/SalaryExportPdfParam.java new file mode 100644 index 000000000..a7085efad --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/param/SalaryExportPdfParam.java @@ -0,0 +1,26 @@ +package com.engine.salary.entity.salaryBill.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 工资单导出pdf参数 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryExportPdfParam { + + /** + * 工资单发放Id + */ + private Long salarySendId; + + /** + * 主键id + */ + private Long id; +} diff --git a/src/com/engine/salary/service/SalaryBillService.java b/src/com/engine/salary/service/SalaryBillService.java index 0f8b9030a..394b2994d 100644 --- a/src/com/engine/salary/service/SalaryBillService.java +++ b/src/com/engine/salary/service/SalaryBillService.java @@ -1,5 +1,6 @@ package com.engine.salary.service; +import com.engine.salary.entity.salaryBill.param.SalaryExportPdfParam; import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; import java.util.List; @@ -42,6 +43,9 @@ public interface SalaryBillService { */ void feedBackSalaryBill(Long salaryInfoId); + + String exportPdf(SalaryExportPdfParam param); + /** * 工资单撤回 * diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index e2af35851..821bec203 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -7,6 +7,7 @@ import com.engine.core.impl.Service; import com.engine.salary.biz.SalarySendBiz; import com.engine.salary.biz.SalarySendInfoBiz; import com.engine.salary.cache.SalaryCacheKey; +import com.engine.salary.constant.HrmSalaryPayrollConf; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.salaryBill.bo.SalaryBillBO; @@ -15,6 +16,7 @@ import com.engine.salary.entity.salaryBill.dto.SalaryBillSendDTO; import com.engine.salary.entity.salaryBill.dto.SalaryBillWatermarkDTO; import com.engine.salary.entity.salaryBill.dto.SalarySendInfoListDTO; import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO; +import com.engine.salary.entity.salaryBill.param.SalaryExportPdfParam; import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; import com.engine.salary.entity.salaryBill.param.SalarySendInfoQueryParam; import com.engine.salary.entity.salaryBill.po.SalarySendInfoPO; @@ -31,6 +33,7 @@ import com.engine.salary.mapper.salarybill.SalarySendInfoMapper; import com.engine.salary.mapper.salarybill.SalarySendMapper; import com.engine.salary.service.*; import com.engine.salary.util.JsonUtil; +import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.google.common.collect.Lists; @@ -45,6 +48,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; +import java.io.File; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.util.*; @@ -129,7 +133,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * 工资单发放 start **********************************************************************/ @Override - public Map grant(SalarySendGrantParam param) { + public Map grant(SalarySendGrantParam param) { // 1.检查和获取工资单发放 SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId()); // // 已经冻结不能操作 @@ -219,6 +223,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 3.发送消息:先修改数据再发消息,避免出错后无法撤回 List successIds = sendMessage(enableSendList, salaryBillSendParam); + //生成pdf + genPdf(salaryBillSendParam, enableSendList); + // 4.发放 grantSendInfo(successIds, salarySend, salaryTemplate, salaryBillSendParam); @@ -232,8 +239,6 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService + SalaryI18nUtil.getI18nLabel(134808, "失败条数") + "[" + (total - successCount) + "]"; // 发送进度完成 getProgressService(user).finish(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), true, messsage); -// log.info("工资单发送组装耗时:{}毫秒;工资单发送消息中心耗时:{}毫秒;工资单数据更改总耗时:{}毫秒;工资单发送总耗时:{}毫秒;工资单云桥图片地址:{}", l3 - l2, l4 - l3, l5 - l4, System.currentTimeMillis() - l, -// salaryBillSendParam == null ? "" : salaryBillSendParam.getPicUrl()); } catch (Exception e) { log.info("发送出错:{}", e.getMessage(), e); // 发送进度失败 @@ -242,6 +247,32 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService } } + private void genPdf(SalaryBillSendDTO salaryBillSendParam, List> enableSendList) { + boolean genPdf = "1".equals(HrmSalaryPayrollConf.GEN_PDF); + if (genPdf) { + LocalRunnable localRunnable = new LocalRunnable() { + @Override + public void execute() { + //生成工资单pdf + enableSendList.forEach(e -> { + SalaryBillBO.genPdf(e, salaryBillSendParam); + }); + + //合并工资单pdf + //1、先获取所有工资单 + Long id = salaryBillSendParam.getSalarySend().getId(); + List salarySendInfos = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(id).sendStatus(1).build()); + //2、工资单pdf转为路径 + String yyyyMM = SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate()); + List filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + po.getId() + ".pdf").collect(Collectors.toList()); + String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + ".pdf"; + SalaryBillBO.mergePdf(pdfPath, filesToMerge); + } + }; + ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGenPdf", localRunnable); + } + } + /** * 构建发送参数 * @@ -301,7 +332,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 工资单水印文本动态变量 List wmTextFieldIds = SalaryBillBO.getWmTextFieldIds(domain, salaryBillWatermark); // 邮件水印模板 - boolean isEnableEmail = salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + boolean isEnableEmail = salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); String emailWmContentTemplate = SalaryBillBO.buildEmailWmContentTemplate(isEnableEmail, salaryBillWatermark); return SalaryBillSendDTO.builder() @@ -428,7 +459,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService @Override public void confirmSalaryBill(Long salaryInfoId) { SalarySendInfoPO sendInfoPO = getSalarySendInfoMapper().getById(salaryInfoId); - if(ObjectUtils.isEmpty(sendInfoPO)){ + if (ObjectUtils.isEmpty(sendInfoPO)) { throw new SalaryRunTimeException("工资单不存在或已被删除!"); } sendInfoPO.setBillConfirmStatus(BillConfimStatusEnum.CONFIRMED.getValue()); @@ -439,7 +470,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService @Override public void feedBackSalaryBill(Long salaryInfoId) { SalarySendInfoPO sendInfoPO = getSalarySendInfoMapper().getById(salaryInfoId); - if(ObjectUtils.isEmpty(sendInfoPO)){ + if (ObjectUtils.isEmpty(sendInfoPO)) { throw new SalaryRunTimeException("工资单不存在或已被删除!"); } sendInfoPO.setBillConfirmStatus(BillConfimStatusEnum.FEEDBACK.getValue()); @@ -447,6 +478,20 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService getSalarySendInfoMapper().updateIgnoreNull(sendInfoPO); } + @Override + public String exportPdf(SalaryExportPdfParam param) { + SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId()); + String yearMonth = SalaryDateUtil.getFormatYearMonth(salarySend.getSalaryMonth()); + String path = HrmSalaryPayrollConf.GEN_PATH + File.separator + yearMonth + File.separator + "%s" + ".pdf"; + Long id = param.getId(); + if (id == null) { + path = String.format(path, param.getSalarySendId()); + } else { + path = String.format(path, id); + } + return path; + } + public List> getSendInfoList(Long sendId, List ids) { SalarySendPO salarySend = getSalarySendMapper().getById(sendId); diff --git a/src/com/engine/salary/web/SalaryBillController.java b/src/com/engine/salary/web/SalaryBillController.java index f8a7ce21d..1fe1403c4 100644 --- a/src/com/engine/salary/web/SalaryBillController.java +++ b/src/com/engine/salary/web/SalaryBillController.java @@ -29,8 +29,11 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Paths; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -521,6 +524,47 @@ public class SalaryBillController { return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); } +// @GET +// @Path("/exportPdf") +// @Produces({"application/pdf"}) +// public Response getPDF(@Context HttpServletRequest request, @Context HttpServletResponse response) { +// +// File f = new File("D:\\gzd\\2023-02\\1695104948592.pdf"); +// return Response.ok(f, "application/pdf").build(); +// +// } + + @GET + @Path("/exportPdf") + public Response downloadPdfFile(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + SalaryExportPdfParam salaryExportPdfParam = new SalaryExportPdfParam(); + String id = request.getParameter("id"); + if(StringUtils.isNotBlank(id)){ + salaryExportPdfParam.setId(Long.valueOf(id)); + } + String salarySendId = request.getParameter("salarySendId"); + if(StringUtils.isNotBlank(salarySendId)){ + salaryExportPdfParam.setSalarySendId(Long.valueOf(salarySendId)); + } + + StreamingOutput fileStream = new StreamingOutput() { + @Override + public void write(java.io.OutputStream output) throws IOException, WebApplicationException + { + String pdfPath = getSalarySendWrapper(user).exportPdf(salaryExportPdfParam); + java.nio.file.Path path = Paths.get(pdfPath); + byte[] data = Files.readAllBytes(path); + output.write(data); + output.flush(); + } + }; + return Response + .ok(fileStream, MediaType.APPLICATION_OCTET_STREAM) + .header("content-disposition","attachment; filename = myfile.pdf") + .build(); + } + /** * 我的工资单列表 * diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 1d890905a..c1f84e730 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -14,7 +14,6 @@ import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.constant.SalaryItemConstant; -import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryBill.dto.*; import com.engine.salary.entity.salaryBill.param.*; import com.engine.salary.entity.salaryBill.po.SalarySendPO; @@ -698,4 +697,8 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy } getSalaryBillService(user).feedBackSalaryBill(salaryInfoId); } + + public String exportPdf(SalaryExportPdfParam param) { + return getSalaryBillService(user).exportPdf(param); + } } From 1de83a57c24548a005858199e2697cc278a97573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 26 Sep 2023 10:00:00 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=8D=95pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/constant/HrmSalaryPayrollConf.java | 4 ++-- .../salary/entity/salaryBill/bo/SalaryBillBO.java | 5 +++-- .../salary/service/impl/SalaryBillServiceImpl.java | 11 ++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/com/engine/salary/constant/HrmSalaryPayrollConf.java b/src/com/engine/salary/constant/HrmSalaryPayrollConf.java index 0b0139420..e8bc9e341 100644 --- a/src/com/engine/salary/constant/HrmSalaryPayrollConf.java +++ b/src/com/engine/salary/constant/HrmSalaryPayrollConf.java @@ -6,8 +6,8 @@ public class HrmSalaryPayrollConf { public static final BaseBean baseBean = new BaseBean(); - public static final String GEN_PDF = baseBean.getPropValue("hrmSalaryPayroll", "genPdf"); - public static final String HAS_SIGN = baseBean.getPropValue("hrmSalaryPayroll", "hasSign"); + public static final boolean GEN_PDF = "1".equals(baseBean.getPropValue("hrmSalaryPayroll", "genPdf")); + public static final boolean HAS_SIGN = "1".equals(baseBean.getPropValue("hrmSalaryPayroll", "hasSign")); public static final String TO_PDF_TOOL_PATH = baseBean.getPropValue("hrmSalaryPayroll", "toPdfToolPath"); public static final String GEN_PATH = baseBean.getPropValue("hrmSalaryPayroll", "genPath"); diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index cef9101a2..71344e181 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -47,6 +47,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import static com.engine.salary.constant.HrmSalaryPayrollConf.HAS_SIGN; + public class SalaryBillBO { private static final Logger log = LoggerFactory.getLogger(SalaryBillBO.class); @@ -550,8 +552,7 @@ public class SalaryBillBO { } //签章 - boolean hasSign = "1".equals(HrmSalaryPayrollConf.HAS_SIGN); - if (hasSign) { + if (HAS_SIGN) { RecordSet rs = new RecordSet(); rs.execute("select * from DocSignature where hrmresid=" + e.getOrDefault("employeeId", "1") + " order by markid"); if (rs.next()) { diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index 821bec203..1d30061d3 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -55,6 +55,8 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import static com.engine.salary.constant.HrmSalaryPayrollConf.GEN_PDF; + /** * 工资单发放 *

Copyright: Copyright (c) 2022

@@ -248,8 +250,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService } private void genPdf(SalaryBillSendDTO salaryBillSendParam, List> enableSendList) { - boolean genPdf = "1".equals(HrmSalaryPayrollConf.GEN_PDF); - if (genPdf) { + if (GEN_PDF) { LocalRunnable localRunnable = new LocalRunnable() { @Override public void execute() { @@ -437,7 +438,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 更新进度 getProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), part.size()); /** 注意只有邮件才需要加密的核算数据 */ - if (isEnableEmail) { + if (isEnableEmail || GEN_PDF) { List acctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(Collections.singletonList(salarySend.getSalaryAccountingId()), part); salaryAcctEmployees.addAll(acctEmployees); salaryAcctResultValues.addAll(getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(SalaryEntityUtil.properties(acctEmployees, SalaryAcctEmployeePO::getId, Collectors.toList()))); @@ -445,7 +446,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService } } else { /** 注意只有邮件才需要加密的核算数据 */ - if (isEnableEmail) { + if (isEnableEmail || GEN_PDF) { salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()); salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctRecordIds(Collections.singletonList(salarySend.getSalaryAccountingId())); } @@ -570,7 +571,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService SalaryBillBO.sendMsg(salaryBillSendParam, Long.valueOf(e.get("id").toString()), Long.valueOf(e.get("employeeId").toString())); } - if (sendChannels.contains(MessageChannelEnum.EMAIL)) { + if (sendChannels.contains(MessageChannelEnum.EMAIL) || GEN_PDF) { // 构建发送消息 SalaryBillBO.buildEmployeeInfo(salaryBillSendParam, allEmployeeMap.get(e.get("employeeId").toString())); SalaryBillBO.sendEmail(e, salaryBillSendParam); From e37922c52fd09f1af4504a329b7d9274d41cf131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 26 Sep 2023 10:26:12 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=8D=95pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java | 5 +++-- .../engine/salary/service/impl/SalaryBillServiceImpl.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index 71344e181..13d873527 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -281,14 +281,15 @@ public class SalaryBillBO { String content = genPayrollHtmlContent(e, salaryBillSendParam); String yyyyMM = SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate()); + Long sendId = salaryBillSendParam.getSalarySend().getId(); Object id = e.getOrDefault("id", 1L); - String htmlPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + ".html"; + String htmlPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + sendId + File.separator + id + ".html"; FileUtil.del(htmlPath); File touch = FileUtil.touch(htmlPath); FileUtil.appendUtf8String(content, touch); - String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + ".pdf"; + String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator+ sendId + File.separator + id + ".pdf"; FileUtil.del(pdfPath); HtmlToPdf.convert(HrmSalaryPayrollConf.TO_PDF_TOOL_PATH, htmlPath, pdfPath); } diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index 1d30061d3..ce6f2eced 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -265,8 +265,8 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService List salarySendInfos = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(id).sendStatus(1).build()); //2、工资单pdf转为路径 String yyyyMM = SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate()); - List filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + po.getId() + ".pdf").collect(Collectors.toList()); - String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + ".pdf"; + List filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id+ File.separator + po.getId() + ".pdf").collect(Collectors.toList()); + String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id+ File.separator + id + ".pdf"; SalaryBillBO.mergePdf(pdfPath, filesToMerge); } }; From 763393983c6e948a36457bbbf40ec861fc033f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 26 Sep 2023 17:52:46 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=8D=95pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SalaryBillServiceImpl.java | 6 ++--- .../salary/web/SalaryBillController.java | 25 ++++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index ce6f2eced..ca8b344e7 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -265,8 +265,8 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService List salarySendInfos = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(id).sendStatus(1).build()); //2、工资单pdf转为路径 String yyyyMM = SalaryDateUtil.getFormatYearMonth(salaryBillSendParam.getSalaryDate()); - List filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id+ File.separator + po.getId() + ".pdf").collect(Collectors.toList()); - String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id+ File.separator + id + ".pdf"; + List filesToMerge = salarySendInfos.stream().map(po -> HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + File.separator + po.getId() + ".pdf").collect(Collectors.toList()); + String pdfPath = HrmSalaryPayrollConf.GEN_PATH + yyyyMM + File.separator + id + File.separator + id + ".pdf"; SalaryBillBO.mergePdf(pdfPath, filesToMerge); } }; @@ -483,7 +483,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService public String exportPdf(SalaryExportPdfParam param) { SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId()); String yearMonth = SalaryDateUtil.getFormatYearMonth(salarySend.getSalaryMonth()); - String path = HrmSalaryPayrollConf.GEN_PATH + File.separator + yearMonth + File.separator + "%s" + ".pdf"; + String path = HrmSalaryPayrollConf.GEN_PATH + File.separator + yearMonth + File.separator + salarySend.getId() + File.separator + "%s" + ".pdf"; Long id = param.getId(); if (id == null) { path = String.format(path, param.getSalarySendId()); diff --git a/src/com/engine/salary/web/SalaryBillController.java b/src/com/engine/salary/web/SalaryBillController.java index 1fe1403c4..382f93636 100644 --- a/src/com/engine/salary/web/SalaryBillController.java +++ b/src/com/engine/salary/web/SalaryBillController.java @@ -540,18 +540,17 @@ public class SalaryBillController { User user = HrmUserVarify.getUser(request, response); SalaryExportPdfParam salaryExportPdfParam = new SalaryExportPdfParam(); String id = request.getParameter("id"); - if(StringUtils.isNotBlank(id)){ + if (StringUtils.isNotBlank(id)) { salaryExportPdfParam.setId(Long.valueOf(id)); } String salarySendId = request.getParameter("salarySendId"); - if(StringUtils.isNotBlank(salarySendId)){ + if (StringUtils.isNotBlank(salarySendId)) { salaryExportPdfParam.setSalarySendId(Long.valueOf(salarySendId)); } - StreamingOutput fileStream = new StreamingOutput() { + StreamingOutput fileStream = new StreamingOutput() { @Override - public void write(java.io.OutputStream output) throws IOException, WebApplicationException - { + public void write(java.io.OutputStream output) throws IOException, WebApplicationException { String pdfPath = getSalarySendWrapper(user).exportPdf(salaryExportPdfParam); java.nio.file.Path path = Paths.get(pdfPath); byte[] data = Files.readAllBytes(path); @@ -559,9 +558,16 @@ public class SalaryBillController { output.flush(); } }; + + String fileName = "工资单"; + try { + fileName = URLEncoder.encode(fileName + ".pdf", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } return Response .ok(fileStream, MediaType.APPLICATION_OCTET_STREAM) - .header("content-disposition","attachment; filename = myfile.pdf") + .header("content-disposition", "attachment; filename =" + fileName) .build(); } @@ -681,6 +687,7 @@ public class SalaryBillController { /** * 校验验证码 + * * @param request * @param response * @param param @@ -705,7 +712,7 @@ public class SalaryBillController { @Path("/baseSet/getForm") @Produces(MediaType.APPLICATION_JSON) // @ApiOperation("获取工资单基础设置表单") - public String getBaseSetForm( @Context HttpServletRequest request, @Context HttpServletResponse response ) { + public String getBaseSetForm(@Context HttpServletRequest request, @Context HttpServletResponse response) { User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getSalaryBillBaseSetWrapper(user)::getBaseSetForm); } @@ -718,7 +725,7 @@ public class SalaryBillController { @POST @Path("/baseSet/previewWaterMark") @Produces(MediaType.APPLICATION_JSON) - public String getBaseSetForm( @Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryBaseSetSaveParam saveParam ) { + public String getBaseSetForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryBaseSetSaveParam saveParam) { User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getSalaryBillBaseSetWrapper(user)::previewWaterMark, saveParam); } @@ -733,7 +740,7 @@ public class SalaryBillController { @Path("/baseSet/save") @Produces(MediaType.APPLICATION_JSON) // @ApiOperation("保存工资单基础设置") - public String saveBaseSet( @Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryBaseSetSaveParam saveParam) { + public String saveBaseSet(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryBaseSetSaveParam saveParam) { User user = HrmUserVarify.getUser(request, response); return new ResponseResult(user).run(getSalaryBillBaseSetWrapper(user)::saveBaseSet, saveParam); }