weaver-hrm-salary/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java

798 lines
45 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.salary.entity.salaryBill.bo;
import com.cloudstore.dev.api.bean.MessageBean;
import com.cloudstore.dev.api.bean.MessageType;
import com.cloudstore.dev.api.util.Util_Message;
import com.engine.salary.annotation.SalaryFormulaVar;
import com.engine.salary.constant.SalaryArchiveConstant;
import com.engine.salary.constant.SalaryTemplateSalaryItemSetGroupConstant;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryBill.dto.SalaryBillSendDTO;
import com.engine.salary.entity.salaryBill.dto.SalaryBillWatermarkDTO;
import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemListDTO;
import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO;
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
import com.engine.salary.enums.salarybill.MessageChannelEnum;
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.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import weaver.common.MessageUtil;
import weaver.hrm.company.SubCompanyComInfo;
import weaver.hrm.resource.ResourceComInfo;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
public class SalaryBillBO {
private static final Logger log = LoggerFactory.getLogger(SalaryBillBO.class);
@Override
public String toString() {
return "SalaryBillBO{}";
}
//
// /**
// * 根据模板内容转为工资单模板对象
// * 注意:不要通过反序列化,可能会因为历史原因修改字段名称而无法序列化
// *
// * @param salaryTemplateContent
// * @return
// */
// public static SalaryTemplatePO buildSalaryTemplateContent(String salaryTemplateContent) {
// Map<String, Object> map = JsonUtil.parseMap(salaryTemplateContent, Object.class);
// return SalaryTemplatePO.builder()
// .id(Long.valueOf(map.getOrDefault("id", "0").toString()))
// .name(map.getOrDefault("name", "").toString())
// .salarySobId(Long.valueOf(map.getOrDefault("salarySobId", "0").toString()))
// .useType(Integer.valueOf(map.getOrDefault("useType", "0").toString()))
// .description(map.getOrDefault("description", "").toString())
// .emailStatus(Integer.valueOf(map.getOrDefault("emailStatus", "0").toString()))
// .sendEmailId(Long.valueOf(map.getOrDefault("sendEmailId", "0").toString()))
//// .msgStatus(Integer.valueOf(map.getOrDefault("msgStatus","0").toString()))
//// .imStatus(Integer.valueOf(map.getOrDefault("imStatus","0").toString()))
//// .cloudBridgeStatus(Integer.valueOf(map.getOrDefault("cloudBridgeStatus","0").toString()))
// .theme(map.getOrDefault("theme", "").toString())
// .background(map.getOrDefault("background", "").toString())
// .textContent(map.getOrDefault("textContent", "").toString())
// .textContentPosition(Integer.valueOf(map.getOrDefault("textContentPosition", "0").toString()))
// .salaryItemNullStatus(Integer.valueOf(map.getOrDefault("salaryItemNullStatus", "0").toString()))
// .salaryItemZeroStatus(Integer.valueOf(map.getOrDefault("salaryItemZeroStatus", "0").toString()))
// .salaryItemSetting(map.getOrDefault("salaryItemSetting", "").toString())
// .replenishName(map.getOrDefault("replenishName", "").toString())
//// .replTheme(map.getOrDefault("replTheme","").toString())
//// .replBackground(map.getOrDefault("replBackground","").toString())
//// .replTextContent(map.getOrDefault("replTextContent","").toString())
//// .replTextContentPosition(Integer.valueOf(map.getOrDefault("replTextContentPosition","0").toString()))
//// .replSalaryItemNullStatus(Integer.valueOf(map.getOrDefault("replSalaryItemNullStatus","0").toString()))
//// .replSalaryItemZeroStatus(Integer.valueOf(map.getOrDefault("replSalaryItemZeroStatus","0").toString()))
//// .replenishSalaryItemSetting(map.getOrDefault("replenishSalaryItemSetting","").toString())
// .build();
// }
/**
* 构建人员字段
* 与SalaryAcctResultBO.buildEmployeeFieldName()的key value对调了一下
*
* @return
*/
public static Map<String, String> buildEmployeeFieldName() {
Field[] declaredFields = SalaryFormulaEmployeeDTO.class.getDeclaredFields();
Map<String, String> employeeFieldNameMap = Maps.newHashMapWithExpectedSize(declaredFields.length);
for (Field declaredField : declaredFields) {
if (!declaredField.isAnnotationPresent(SalaryFormulaVar.class)) {
continue;
}
SalaryFormulaVar annotation = declaredField.getAnnotation(SalaryFormulaVar.class);
employeeFieldNameMap.put(SalaryI18nUtil.getI18nLabel(annotation.labelId(), annotation.defaultLabel()), declaredField.getName());
}
return employeeFieldNameMap;
}
/**
* 构建工资单中的人员信息
*
* @param simpleEmployee
*/
public static void buildEmployeeInfo(SalaryBillSendDTO salaryBillSendParam, DataCollectionEmployee simpleEmployee) {
SalaryTemplateSalaryItemSetListDTO employeeInformation = salaryBillSendParam.getEmployeeInformation();
Map<String, String> employeeField = salaryBillSendParam.getEmployeeField();
if (employeeInformation == null || simpleEmployee == null) {
return;
}
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employeeInformation.getItems())) {
//获取员工信息的字段名和中文描述的map关系
SalaryFormulaEmployeeDTO salaryFormulaEmployeeDTO = SalaryFormulaEmployeeDTO.builder().employeeId(simpleEmployee.getEmployeeId())
.taxAgentName(salaryBillSendParam.getTaxAgentName())
.departmentName(simpleEmployee.getDepartmentName())
.email(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getEmail()) ? "" : simpleEmployee.getEmail())
// .gradeName(simpleEmployee.getGrade() == null ? "" : simpleEmployee.getGrade().getName())
// .hireDate(SalaryDateUtil.getFormatLocalDate(simpleEmployee.getHiredate()))
// .sex(simpleEmployee.getSex() == null ? "" : simpleEmployee.getSex().getDescription())
.mobile(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getMobile()) ? "" : simpleEmployee.getMobile())
.jobtitleName(simpleEmployee.getJobtitleName())
// .status(StringUtils.isEmpty(simpleEmployee.getPersonnelStatus()) ? "" : simpleEmployee.getPersonnelStatus())
.telephone(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getTelephone()) ? "" : simpleEmployee.getTelephone())
.username(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getUsername()) ? "" : simpleEmployee.getUsername())
.workcode(simpleEmployee.getWorkcode())
.build();
List<SalaryTemplateSalaryItemListDTO> items = employeeInformation.getItems();
// 1.SalaryAcctResultBO.buildEmployeeFieldName()的取法
// Set<Map.Entry<String, String>> entries = employeeField.entrySet();
// for (SalaryTemplateSalaryItemListDTO e : items) {
// Optional<Map.Entry<String, String>> entry = entries.stream().filter(f -> Objects.equals(e.getName(), f.getValue())).findFirst();
// if (entry.isPresent()) {
// String key = entry.get().getKey();
// if (org.apache.commons.lang3.StringUtils.isNotBlank(key)) {
// String getter = "get" + key.substring(0, 1).toUpperCase() + key.substring(1);
// try {
// Method method = salaryFormulaEmployeeDTO.getClass().getMethod(getter);
// Object invoke = method.invoke(salaryFormulaEmployeeDTO);
// e.setSalaryItemValue((String) invoke);
// } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
// log.error("no such method", e);
// }
// }
// }
// }
// 2.SalaryBillBO.buildEmployeeFieldName()
for (SalaryTemplateSalaryItemListDTO e : items) {
String employeeFieldName = employeeField.get(e.getName());
if (!StringUtils.isEmpty(employeeFieldName)) {
String getter = "get" + employeeFieldName.substring(0, 1).toUpperCase() + employeeFieldName.substring(1);
try {
Method method = salaryFormulaEmployeeDTO.getClass().getMethod(getter);
Object invoke = method.invoke(salaryFormulaEmployeeDTO);
e.setSalaryItemValue((String) invoke);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
log.error("no such method", e);
}
}
}
}
}
/**
* 获取工资单标题
*
* @return
*/
public static String getBillTitle(String theme, Date salaryMonth, Long employeeId) {
String companyName = "";
if (theme.contains("${companyName}")) {
if (employeeId != null) {
ResourceComInfo resourceComInfo = null;
SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo();
try {
resourceComInfo = new ResourceComInfo();
subCompanyComInfo = new SubCompanyComInfo();
} catch (Exception e) {
log.error("资源异常", e);
}
companyName = subCompanyComInfo.getSubCompanyname(resourceComInfo.getSubCompanyID(employeeId + ""));
}
}
return theme
.replace("${companyName}", companyName)
.replace("${salaryMonth}", new SimpleDateFormat("yyyy年MM月").format(salaryMonth));
}
// /**
// * 构建发送消息
// *
// * @param e
// * @param allEmployeeMap
// * @param salaryBillSendParam
// * @param currentEmployeeId
// * @param currentTenantKey
// * @return
// */
// public static SendMessageEntity buildSendMessage(Map<String, Object> e, Map<String, SimpleEmployee> allEmployeeMap, SalaryBillSendDTO salaryBillSendParam, Long currentEmployeeId, String currentTenantKey) {
// // 构建用户基本信息
// SalaryBillBO.buildEmployeeInfo(salaryBillSendParam.getEmployeeInformation(), allEmployeeMap.get(e.get("employeeId").toString()), salaryBillSendParam.getEmployeeField());
// // 消息接收者
// List<UserEntity> receivers = Collections.singletonList(SalaryBillBO.buildUser(Long.valueOf(e.get("employeeId").toString()), Optional.ofNullable(e.get("email")).orElse("").toString(), currentTenantKey));
// Entity entity = SalaryBillBO.buildEntity(e.get("id").toString(), currentEmployeeId, salaryBillSendParam.getEntityName());
// EmailEntity emailInfo = new EmailEntity();
// // 邮箱打开
// if (salaryBillSendParam.isEnableEmail()) {
// String emailContent = SalaryBillBO.buildEmailContent(e, salaryBillSendParam);
// emailInfo = SalaryBillBO.buildEmailInfo(salaryBillSendParam.getText(), emailContent, salaryBillSendParam.getSalaryTemplate().getSendEmailId());
// }
// return SalaryBillBO.buildSendMessageEntity(salaryBillSendParam, receivers, entity, emailInfo);
// }
/**
* 发送Em消息
*/
public static void sendMsg(SalaryBillSendDTO salaryBillSendParam, Long id, Long employeeId) {
SalaryTemplatePO template = salaryBillSendParam.getSalaryTemplate();
String background = template.getBackground();
String billTitle = getBillTitle(template.getTheme(), salaryBillSendParam.getSalaryDate(), employeeId);
MessageType messageType = MessageType.newInstance(499); // 消息来源(见文档第四点补充 必填)
Set<String> userIdList = new HashSet<>(); // 接收人id 必填
userIdList.add(employeeId.toString());
String title = billTitle; // 标题
String context = "点击查看详情"; // 内容
// PC端链接
String linkUrl = weaver.general.GCONST.getContextPath() + "/spa/hrmSalary/static/index.html#/main/hrmSalary/mobilepayroll?id=" + id + "&recipient=" + employeeId;
// 移动端链接
String linkMobileUrl = weaver.general.GCONST.getContextPath() + "/spa/hrmSalary/static/index.html#/main/hrmSalary/mobilepayroll?type=phone&id=" + id + "&recipient=" + employeeId;
try {
MessageBean messageBean = Util_Message.createMessage(messageType, userIdList, title, context, linkUrl, linkMobileUrl);
messageBean.setCreater(Integer.parseInt(salaryBillSendParam.getSendUser().getUID() + ""));// 创建人id
messageBean.setBizState("0");// 需要修改消息为已处理等状态时传入,表示消息最初状态为待处理
messageBean.setTargetId("499|" + id); //消息来源code +“|”+业务id需要修改消息为已处理等状态时传入
if (StringUtils.isNotBlank(background)) {
messageBean.setPictureUrl(background);
} else {
messageBean.setPictureUrl("/hrm/hrm_e9/images/payroll.jpg?pictype=jpg");
}
Util_Message.store(messageBean);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void sendEmail(Map<String, Object> e, Map<String, DataCollectionEmployee> allEmployeeMap, SalaryBillSendDTO salaryBillSendParam) {
StringBuilder emailContent = new StringBuilder();
emailContent.append("<div class='container' style='position: relative; overflow: auto;'>");
// 消息接收者
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("</div>");
if (StringUtils.isNotBlank(receivers)) {
MessageUtil.sendEmail(receivers, title, emailContent.toString());
}
}
public static void sendSMS(SalaryBillSendDTO salaryBillSendParam, Long id, Long employeeId) {
// try {
// MessageUtil.sendSMS(mobile, content);
// } catch (Exception e) {
// kqLog.info("SendSMS error.resourceId:" + resourceId + ">>>>>>mobile>>>>>>" + mobile);
// log.writeLog(e);
// }
}
// /**
// * 构建发送消息
// *
// * @return
// */
// public static SendMessageEntity buildSendMessageEntity(SalaryBillSendDTO salaryBillSendParam, List<UserEntity> receivers, Entity entity, EmailEntity emailInfo) {
// SendMessageEntity smg = new SendMessageEntity();
// // 模块
// smg.setModule(MessageModule.HRSA);
// // 事件
// smg.setEvent(MessageEvent.PAYROLL);
//
// // 发送者
// smg.setSender(salaryBillSendParam.getSendUser() == null ? UserEntity.SYSTEM_USER : salaryBillSendParam.getSendUser());
// // 接收者
// smg.setReceivers(receivers);
// // 发送通道
// smg.setChannels(salaryBillSendParam.getSendChannels());
//
// // 消息内容
// smg.setText(salaryBillSendParam.getTitle());
//
// // 1.im
// smg.setEntity(entity);
// // 2.云桥
// smg.setPcUrl(entity.getPcUrl());
// smg.setAppUrl(entity.getH5Url());
// smg.setTitle(salaryBillSendParam.getTitle());
// smg.setContent(salaryBillSendParam.getTitle());
// smg.setPicUrl(salaryBillSendParam.getPicUrl());
// // 3.邮件
// smg.setEmailInfo(emailInfo);
//
// return smg;
// }
//
// /**
// * 构建用户
// *
// * @return
// */
// public static UserEntity buildUser(Long employeeId, String email, String tenantKey) {
// UserEntity user = new UserEntity(employeeId, tenantKey);
// if (!StringUtils.isEmpty(email)) {
// user.setEmail(email);
// }
// return user;
// }
/**
* 构建发送通道
*
* @param salaryTemplate
* @return
*/
public static Set<MessageChannelEnum> buildSendChannels(SalaryTemplatePO salaryTemplate) {
Set<MessageChannelEnum> channels = new HashSet<>();
if (salaryTemplate.getMsgStatus() == null || salaryTemplate.getMsgStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) {
channels.add(MessageChannelEnum.MSG);
}
if (salaryTemplate.getEmailStatus() != null && salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()) && MessageUtil.checkSendEmail()) {
channels.add(MessageChannelEnum.EMAIL);
}
if (salaryTemplate.getSmsStatus() != null && salaryTemplate.getSmsStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()) && MessageUtil.checkSendSMS()) {
channels.add(MessageChannelEnum.SMS);
}
return channels;
}
//
// /**
// * 构建实体
// *
// * @param id
// * @param currentEmployeeId
// * @param name
// * @return
// */
// public static Entity buildEntity(String id, Long currentEmployeeId, String name) {
// Entity e = new Entity();
// e.setId(String.valueOf(IdGenerator.generate()));
// e.setModule(EntityType.hrmsalary.name());
// e.setName(name);
// e.setH5Url("/mobile/salary/mySalaryBill/view/" + id);
//// e.setH5LinkeType(1);
// e.setPcUrl("/sp/salary/mySalaryBill/view/" + id);
//// e.setPcLinkeType(0);
//
// // im添加创建人创建时间、可在对应通道的模板中的内容或辅助信息标题等加上变量${creator}$和${createTime}$
// e.setCreatorId(currentEmployeeId);
// e.setCreateTime(new Date());
// return e;
// }
//
// /**
// * 构建邮件信息
// *
// * @param emailSubject 邮件主题
// * @param emailContent 邮件内容
// * @param mailUserAccountId 邮箱账号id
// * @return
// */
// public static EmailEntity buildEmailInfo(String emailSubject, String emailContent, Long mailUserAccountId) {
// EmailEntity entity = new EmailEntity();
// entity.setEmailContent(emailContent);
// entity.setEmailSubject(emailSubject);
// // 发送者邮箱
// entity.setMailUserAccountId(mailUserAccountId);
// return entity;
// }
//
// /**
// * 构建撤回消息
// *
// * @param msgId
// * @param text
// * @param title
// * @param currentEmployeeId
// * @param currentTenantKey
// * @return
// */
// public static CancleMessageEntity buildCancleMessageEntity(long msgId, String text, String title, Long currentEmployeeId, String currentTenantKey) {
// CancleMessageEntity cme = new CancleMessageEntity();
// cme.setMsgId(msgId);
// // 模块
// cme.setModule(MessageModule.HRSA);
// // 事件
// cme.setEvent(MessageEvent.PAYROLL);
//
// cme.setText(text);
//
// Entity entity = new Entity();
// entity.setId(String.valueOf(IdGenerator.generate()));
// entity.setModule(EntityType.hrmsalary.name());
// entity.setName(title);
// cme.setEntity(entity);
// UserEntity user = new UserEntity(currentEmployeeId, currentTenantKey);
// cme.setOperator(user);
// return cme;
// }
/**
* 构建邮件内容
* 注意样式只能在标签style属性中使用否则样式不生效
*
* @param e
* @param salaryBillSendParam
* @return
*/
public static void buildEmailContent(StringBuilder emailContent, Map<String, Object> e, SalaryBillSendDTO salaryBillSendParam) {
emailContent.append("<div style='display: flex;flex-direction: column;justify-content: flex-start;align-items: center;padding: 16px;'>");
// 1.标题
emailContent.append("<div style='width: 100%;min-height: 22px; line-height: 30px; font-family: PingFangSC-Medium;font-size: 22px;color: #020202;font-weight: 500;text-align: center;'>");
// emailContent.append(salaryBillSendParam.getTitle());
emailContent.append(getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())));
emailContent.append("</div>");
// 2.发送时间
emailContent.append("<div style='width: 100%;margin-top: 16px;text-align: center;height: 14px;font-family: PingFangSC-Regular;font-size: 14px;color: #999999;line-height: 14px;font-weight: 400;'>");
emailContent.append(SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now()));
emailContent.append("</div>");
// 3.背景图-base64
// if (!StringUtils.isEmpty(salaryBillSendParam.getBackgroundBase64())) {
// emailContent.append("<div style='margin-top: 32px;'><img src='data:image/jpg;base64,");
// emailContent.append(salaryBillSendParam.getBackgroundBase64());
// emailContent.append("'/></div>");
// }
// 3.背景图-url
// if (StringUtils.isNotEmpty(salaryBillSendParam.getSalaryTemplate().getBackground())) {
// emailContent.append("<div style='margin-top: 32px;'><img src='");
// emailContent.append(salaryBillSendParam.getPicUrl());
// emailContent.append("'/></div>");
// }
// 是否只有一个分组,如果是,则将文本内容放进薪资项目表格前后
boolean isOnlyOneGroup = salaryBillSendParam.getSalaryItemSetList().stream().filter(st -> CollectionUtils.isNotEmpty(st.getItems())).count() == 1;
if (isOnlyOneGroup) {
buildOnlyOneGroupMailMain(emailContent, e, salaryBillSendParam);
} else {
buildMailMain(emailContent, e, salaryBillSendParam);
}
emailContent.append("</div>");
}
/**
* 构建邮件内容主体
*
* @param emailContent
* @param e
* @param salaryBillSendParam
*/
private static void buildMailMain(StringBuilder emailContent, Map<String, Object> e, SalaryBillSendDTO salaryBillSendParam) {
// 薪资项是否显示
boolean isHideNull = salaryBillSendParam.getSalaryTemplate().getSalaryItemNullStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue());
boolean isHideZero = salaryBillSendParam.getSalaryTemplate().getSalaryItemZeroStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue());
// 3.文本内容-如果在薪资项目前
emailContent.append("<div style='width: 100%;margin-top: 16px;text-align: center;min-height: 12px;font-family: PingFangSC-Regular;font-size: 12px;color: #111111;");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContentPosition() == SalaryTemplateTextContentPositionEnum.BEFORE.getValue() ? "" : "display: none");
emailContent.append("'>");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent());
emailContent.append("</div>");
// 4.薪资项目内容
emailContent.append("<div style='margin-top: 16px;width: 100%;'>");
for (SalaryTemplateSalaryItemSetListDTO salaryItemSet : salaryBillSendParam.getSalaryItemSetList()) {
if (CollectionUtils.isEmpty(salaryItemSet.getItems())) {
continue;
}
emailContent.append("<div style='margin-bottom: 16px;'>");
if (!salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.NO_TYPE_GROUP_ID)) {
emailContent.append("<div style='padding: 0 16px;width: 100%;font-family: PingFangSC-Regular;font-size: 18px;box-sizing: border-box;'>");
// 4.1.薪资项目组名
emailContent.append(salaryItemSet.getGroupName());
emailContent.append("</div>");
}
emailContent.append("<div style='margin-top: 16px;width: 100%;display: flex;flex-direction: column;align-items: flex-start;box-sizing: border-box;'>");
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<SalaryTemplateSalaryItemListDTO> optionalEmpItem = salaryBillSendParam.getEmployeeInformation().getItems().stream().filter(f -> f.getId().equals(salaryItem.getId())).findFirst();
// 4.2.员工信息
emailContent.append("<div style='border: 1px solid #e5e5e5;border-bottom: none;width: 100%;display: flex;justify-content: flex-start;align-items: center;box-sizing: border-box;");
emailContent.append(i == (salaryItemSet.getItems().size() - 1) ? "border-bottom: 1px solid #e5e5e5;" : "");
emailContent.append("'>");
emailContent.append("<div style='min-height: 60px;padding: 0 16px;flex: 2;background: #fbfbfb;border-right: 1px solid #e5e5e5;display: flex;align-items: center;justify-content: left;' title={name}>");
emailContent.append("<span class='text'>");
emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getName() : ""));
emailContent.append("</span>");
emailContent.append("</div>");
emailContent.append("<div style='min-height: 60px;flex: 8;padding-left: 16px;background: #ffffff;display: flex;align-items: center;justify-content: left;'>");
emailContent.append((optionalEmpItem.isPresent() ? optionalEmpItem.get().getSalaryItemValue() : ""));
emailContent.append("</div>");
emailContent.append("</div>");
} 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("<div style='border: 1px solid #e5e5e5;border-bottom: none;width: 100%;display: flex;justify-content: flex-start;align-items: center;box-sizing: border-box;");
emailContent.append(i == (salaryItemSet.getItems().size() - 1) ? "border-bottom: 1px solid #e5e5e5;" : "");
emailContent.append((isHide ? "display: none" : ""));
emailContent.append("'>");
emailContent.append("<div style='min-height: 60px;padding: 0 16px;flex: 2;background: #fbfbfb;border-right: 1px solid #e5e5e5;display: flex;align-items: center;justify-content: left;' title={name}>");
emailContent.append("<span class='text'>");
emailContent.append(salaryItem.getName());
emailContent.append("</span>");
emailContent.append("</div>");
emailContent.append("<div style='min-height: 60px;flex: 8;padding-left: 16px;background: #ffffff;display: flex;align-items: center;justify-content: left;'>");
emailContent.append(e.get(keyName.toString()));
emailContent.append("</div>");
emailContent.append("</div>");
break;
}
}
}
}
emailContent.append("</div>");
emailContent.append("</div>");
}
emailContent.append("</div>");
// 5.文本内容-如果在薪资项目后
emailContent.append("<div style='width: 100%;margin-top: 16px;text-align: center;min-height: 12px;font-family: PingFangSC-Regular;font-size: 12px;color: #111111;");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContentPosition() == SalaryTemplateTextContentPositionEnum.AFTER.getValue() ? "" : "display: none");
emailContent.append("'>");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent());
emailContent.append("</div>");
}
/**
* 构建邮件内容主体
* <p>
* 只有无分类,则将文本内容放进薪资项目表格前后
*
* @param emailContent
* @param e
* @param salaryBillSendParam
*/
private static void buildOnlyOneGroupMailMain(StringBuilder emailContent, Map<String, Object> e, SalaryBillSendDTO salaryBillSendParam) {
// 薪资项是否显示
boolean isHideNull = salaryBillSendParam.getSalaryTemplate().getSalaryItemNullStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue());
boolean isHideZero = salaryBillSendParam.getSalaryTemplate().getSalaryItemZeroStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue());
// 4.薪资项目内容
emailContent.append("<div style='margin-top: 16px;width: 100%;'>");
for (SalaryTemplateSalaryItemSetListDTO salaryItemSet : salaryBillSendParam.getSalaryItemSetList()) {
if (CollectionUtils.isEmpty(salaryItemSet.getItems())) {
continue;
}
emailContent.append("<div style='margin-bottom: 16px;'>");
emailContent.append("<div style='margin-top: 16px;width: 100%;display: flex;flex-direction: column;align-items: flex-start;box-sizing: border-box;'>");
// 3.文本内容-如果在薪资项目前
emailContent.append("<div style='border: 1px solid #e5e5e5;border-bottom: none;width: 100%;display: flex;justify-content: flex-start;align-items: center;box-sizing: border-box;");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContentPosition() == SalaryTemplateTextContentPositionEnum.BEFORE.getValue() ? "" : "display: none");
emailContent.append("'>");
emailContent.append("<div style='min-height: 60px;padding: 0 16px;flex: 2;background: #fbfbfb;border-right: 1px solid #e5e5e5;display: flex;align-items: center;justify-content: left;align-self: stretch;' title={name}>");
emailContent.append("<span class='text'>");
emailContent.append(salaryBillSendParam.getRemarkI18n());
emailContent.append("</span>");
emailContent.append("</div>");
emailContent.append("<div style='min-height: 60px;flex: 8;padding-left: 16px;background: #ffffff;display: flex;align-items: center;justify-content: left;'>");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent());
emailContent.append("</div>");
emailContent.append("</div>");
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("<div style='border: 1px solid #e5e5e5;border-bottom: none;width: 100%;display: flex;justify-content: flex-start;align-items: center;box-sizing: border-box;");
emailContent.append(i == (salaryItemSet.getItems().size() - 1) && salaryBillSendParam.getSalaryTemplate().getTextContentPosition() == SalaryTemplateTextContentPositionEnum.BEFORE.getValue() ? "border-bottom: 1px solid #e5e5e5;" : "");
emailContent.append((isHide ? "display: none" : ""));
emailContent.append("'>");
emailContent.append("<div style='min-height: 60px;padding: 0 16px;flex: 2;background: #fbfbfb;border-right: 1px solid #e5e5e5;display: flex;align-items: center;justify-content: left;' title={name}>");
emailContent.append("<span class='text'>");
emailContent.append(salaryItem.getName());
emailContent.append("</span>");
emailContent.append("</div>");
emailContent.append("<div style='min-height: 60px;flex: 8;padding-left: 16px;background: #ffffff;display: flex;align-items: center;justify-content: left;'>");
emailContent.append(e.get(keyName.toString()));
emailContent.append("</div>");
emailContent.append("</div>");
break;
}
}
}
// 5.文本内容-如果在薪资项目后
emailContent.append("<div style='border: 1px solid #e5e5e5;border-bottom: none;width: 100%;display: flex;justify-content: flex-start;align-items: center;box-sizing: border-box;");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContentPosition() == SalaryTemplateTextContentPositionEnum.AFTER.getValue() ? "border-bottom: 1px solid #e5e5e5;" : "display: none");
emailContent.append("'>");
emailContent.append("<div style='min-height: 60px;padding: 0 16px;flex: 2;background: #fbfbfb;border-right: 1px solid #e5e5e5;display: flex;align-items: center;justify-content: left;align-self: stretch;' title={name}>");
emailContent.append("<span class='text'>");
emailContent.append(salaryBillSendParam.getRemarkI18n());
emailContent.append("</span>");
emailContent.append("</div>");
emailContent.append("<div style='min-height: 60px;flex: 8;padding-left: 16px;background: #ffffff;display: flex;align-items: center;justify-content: left;'>");
emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent());
emailContent.append("</div>");
emailContent.append("</div>");
emailContent.append("</div>");
emailContent.append("</div>");
}
emailContent.append("</div>");
}
public static String HRM_Name = "HRM_Name";
public static String HRM_Num = "HRM_Num";
public static String HRM_Mobile = "HRM_Mobile";
public static String HRM_Email = "HRM_Email";
public static String HRM_CurrentOperatorId = "HRM_CurrentOperatorId";
public static String HRM_Department = "HRM_Department";
public static String HRM_SecondDepartment = "HRM_SecondDepartment";
public static String HRM_CurrentDate = "HRM_CurrentDate";
public static String HRM_CurrentTime = "HRM_CurrentTime";
public static String HRM_prefix = "$";
/**
* 构建水印
*
* 当前所拥有的变量
* "HRM_Name",当前操作者姓名
* "HRM_Num",当前操作者编号
* "HRM_Mobile",当前操作者移动电话
* "HRM_Email",当前操作者电子邮件
* "HRM_CurrentOperatorId",当前操作者人员ID
* "HRM_Department",当前操作者部门
* "HRM_SecondDepartment",当前操作者分部
* "HRM_CurrentDate",当前日期
* "HRM_CurrentTime"当前时间
*
* @param emailContent
* @param e
* @param salaryBillSendParam
*/
private static void buildEmailWatermarkContent(StringBuilder emailContent, Map<String, Object> e, SalaryBillSendDTO salaryBillSendParam) {
if (Objects.isNull(salaryBillSendParam.getWatermarkSetting())) {
return;
}
String emailWmContentTemplate = salaryBillSendParam.getEmailWmContentTemplate();
List<String> wmTextFieldIds = salaryBillSendParam.getWmTextFieldIds();
// 没有变量,则直接返回
if (CollectionUtils.isEmpty(wmTextFieldIds)) {
emailContent.append(emailWmContentTemplate);
} else {
for (String wmTextFieldId : wmTextFieldIds) {
// 当前操作者姓名
if (HRM_Name.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_Name, Optional.ofNullable(e.get("username")).orElse(StringUtils.EMPTY).toString());
// 当前操作者编号
} else if (HRM_Num.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_Num, Optional.ofNullable(e.get("jobNum")).orElse(StringUtils.EMPTY).toString());
// 当前操作者移动电话
} else if (HRM_Mobile.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_Mobile, Optional.ofNullable(e.get("mobile")).orElse(StringUtils.EMPTY).toString());
// 当前操作者电子邮件
} else if (HRM_Email.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_Email, Optional.ofNullable(e.get("email")).orElse(StringUtils.EMPTY).toString());
// 当前操作者人员ID
} else if (HRM_CurrentOperatorId.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_CurrentOperatorId, Optional.ofNullable(e.get("id")).orElse(StringUtils.EMPTY).toString());
// 当前操作者分部
} else if (HRM_Department.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_Department, Optional.ofNullable(e.get("department")).orElse(StringUtils.EMPTY).toString());
} else if (HRM_SecondDepartment.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_SecondDepartment, Optional.ofNullable(e.get("subCompanyName")).orElse(StringUtils.EMPTY).toString());
// 当前日期
} else if (HRM_CurrentDate.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_CurrentDate, SalaryDateUtil.getFormatLocalDate(LocalDate.now()));
// 当前时间
} else if (HRM_CurrentTime.equals(wmTextFieldId)) {
emailWmContentTemplate = emailWmContentTemplate.replace(HRM_prefix + HRM_CurrentTime, SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now()));
}
}
emailContent.append(emailWmContentTemplate);
}
}
/**
* 获取工资单水印文本动态变量
*
* @param domain
* @param salaryBillWatermark
* @return
*/
public static List<String> getWmTextFieldIds(String domain, SalaryBillWatermarkDTO salaryBillWatermark) {
List<String> wmTextFieldIds = Collections.emptyList();
// 没有水印、关闭水印、或者系统水印,则不拼接
// if (Objects.isNull(salaryBillWatermark) || !salaryBillWatermark.getWatermarkStatus() || !SalaryTemplateWatermarkTypeEnum.CUSTOM.getValue().equals(salaryBillWatermark.getWatermarkType())) {
if (Objects.isNull(salaryBillWatermark) || !salaryBillWatermark.getWatermarkStatus() ) {
return wmTextFieldIds;
}
String wmClassify = salaryBillWatermark.getWmSetting().getOrDefault("wmClassify", StringUtils.EMPTY).toString();
if ("text".equals(wmClassify)) {
wmTextFieldIds = (List<String>) salaryBillWatermark.getWmSetting().getOrDefault("wmSelectedFieldIds", Collections.emptyList());
List<String> empFields = Arrays.asList(HRM_Name, HRM_Num, HRM_Mobile, HRM_Email, HRM_CurrentOperatorId, HRM_Department);
if (wmTextFieldIds.contains(HRM_SecondDepartment)) {
// 需要查分部
salaryBillWatermark.getWmSetting().put("needQuerySubDepart", true);
}
// 需要查人员
salaryBillWatermark.getWmSetting().put("needQueryEmp", wmTextFieldIds.stream().anyMatch(empFields::contains));
salaryBillWatermark.getWmSetting().remove("wmImg");
} else if ("image".equals(wmClassify)) {
List<Map<String, Object>> wmImgs = Collections.emptyList();
try {
wmImgs = (List<Map<String, Object>>) salaryBillWatermark.getWmSetting().getOrDefault("wmImg", Collections.emptyList());
} catch (Exception exception) {
log.error("工资单水印图片转换失败");
}
if (CollectionUtils.isNotEmpty(wmImgs)) {
Map<String, Object> map = wmImgs.get(0);
String fileid = map.getOrDefault("fileid", StringUtils.EMPTY).toString();
if (StringUtils.isNotEmpty(fileid)) {
String imgSrc = domain + String.format("/papi/file/preview?type=imgs&fileId=%s&random=123456", fileid);
salaryBillWatermark.getWmSetting().put("wmImg", imgSrc);
}
}
salaryBillWatermark.getWmSetting().remove("wmText");
salaryBillWatermark.getWmSetting().remove("wmSelectedFieldIds");
}
// 作为快照,去掉不必要的属性,节省空间
salaryBillWatermark.getWmSetting().remove("wmOriginText");
salaryBillWatermark.getWmSetting().remove("pureWmText");
return wmTextFieldIds;
}
public static String buildEmailWmContentTemplate(boolean isEnableEmail, SalaryBillWatermarkDTO watermarkSetting) {
String emailWmContentTemplate = StringUtils.EMPTY;
// 没有水印、关闭水印,则不拼接
if (!isEnableEmail || Objects.isNull(watermarkSetting) || !watermarkSetting.getWatermarkStatus() ) {
return emailWmContentTemplate;
}
String wmClassify = watermarkSetting.getWmSetting().getOrDefault("wmClassify", StringUtils.EMPTY).toString();
String variable = StringUtils.EMPTY;
if ("text".equals(wmClassify)) {
variable = watermarkSetting.getWmSetting().getOrDefault("wmText", StringUtils.EMPTY).toString();
} else if ("image".equals(wmClassify)) {
String imgSrc = watermarkSetting.getWmSetting().getOrDefault("wmImg", StringUtils.EMPTY).toString();
variable = "<img width='90%' src='" + imgSrc + "' />";
watermarkSetting.getWmSetting().put("wmImg", imgSrc);
}
if (StringUtils.isEmpty(variable)) {
return emailWmContentTemplate;
}
String wmNoTransparent = watermarkSetting.getWmSetting().getOrDefault("wmNoTransparent", "0.15").toString();
String wmRotate = watermarkSetting.getWmSetting().getOrDefault("wmRotate", 0).toString();
double deg = new Double(wmRotate) / 100.00;
StringBuilder emailWmContentTemp = new StringBuilder();
emailWmContentTemp.append("<div class='water-mark'>");
emailWmContentTemp.append("<div class='container' style='pointer-events: none; position: absolute; width: 100%; height: 100%; overflow: hidden; z-index: 9999; top: 0px; left: 0px;display: flex; flex-direction: column; justify-content: space-between; align-items: center;'>");
for (int i = 0; i < 20; i++) {
emailWmContentTemp.append("<div class='row' style='width: 100%; min-height: 180px ; overflow: hidden; display: flex;justify-content: center;justify-content: center;'>");
for (int j = 0; j < 10; j++) {
emailWmContentTemp.append("<div class='item' style='display: flex;flex-direction: column; align-items: center;justify-content: center; min-width: 280px; height: 180px;opacity: "+wmNoTransparent+"; transform: rotate(-"+deg+"deg);'>");
// 赋值
emailWmContentTemp.append(variable);
emailWmContentTemp.append("</div>");
}
emailWmContentTemp.append("</div>");
}
emailWmContentTemp.append("</div>");
emailWmContentTemp.append("</div>");
return emailWmContentTemp.toString();
}
}