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("