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

798 lines
45 KiB
Java
Raw Normal View History

2023-05-08 09:27:20 +08:00
package com.engine.salary.entity.salaryBill.bo;
2023-06-06 09:51:07 +08:00
import com.cloudstore.dev.api.bean.MessageBean;
import com.cloudstore.dev.api.bean.MessageType;
import com.cloudstore.dev.api.util.Util_Message;
2023-05-08 09:27:20 +08:00
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;
2023-06-12 15:19:24 +08:00
import com.engine.salary.entity.salaryBill.dto.SalaryBillWatermarkDTO;
2023-05-08 09:27:20 +08:00
import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemListDTO;
import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO;
2023-06-05 13:35:17 +08:00
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
2023-05-08 09:27:20 +08:00
import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
2023-06-05 13:35:17 +08:00
import com.engine.salary.enums.salarybill.MessageChannelEnum;
2023-05-08 09:27:20 +08:00
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;
2023-06-06 09:51:07 +08:00
import weaver.hrm.company.SubCompanyComInfo;
import weaver.hrm.resource.ResourceComInfo;
2023-05-08 09:27:20 +08:00
2023-06-06 09:51:07 +08:00
import java.io.IOException;
2023-05-08 09:27:20 +08:00
import java.lang.reflect.Field;
2023-06-02 14:38:56 +08:00
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
2023-06-06 09:51:07 +08:00
import java.text.SimpleDateFormat;
2023-06-12 15:19:24 +08:00
import java.time.LocalDate;
2023-05-08 09:27:20 +08:00
import java.time.LocalDateTime;
import java.util.*;
public class SalaryBillBO {
private static final Logger log = LoggerFactory.getLogger(SalaryBillBO.class);
2023-06-12 15:19:24 +08:00
2023-05-08 09:27:20 +08:00
@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;
}
2023-06-02 14:38:56 +08:00
/**
* 构建工资单中的人员信息
*
* @param simpleEmployee
*/
2023-06-05 13:35:17 +08:00
public static void buildEmployeeInfo(SalaryBillSendDTO salaryBillSendParam, DataCollectionEmployee simpleEmployee) {
SalaryTemplateSalaryItemSetListDTO employeeInformation = salaryBillSendParam.getEmployeeInformation();
Map<String, String> employeeField = salaryBillSendParam.getEmployeeField();
2023-06-02 14:38:56 +08:00
if (employeeInformation == null || simpleEmployee == null) {
return;
}
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employeeInformation.getItems())) {
//获取员工信息的字段名和中文描述的map关系
SalaryFormulaEmployeeDTO salaryFormulaEmployeeDTO = SalaryFormulaEmployeeDTO.builder().employeeId(simpleEmployee.getEmployeeId())
2023-06-05 13:35:17 +08:00
.taxAgentName(salaryBillSendParam.getTaxAgentName())
2023-06-02 14:38:56 +08:00
.departmentName(simpleEmployee.getDepartmentName())
.email(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getEmail()) ? "" : simpleEmployee.getEmail())
2023-05-08 09:27:20 +08:00
// .gradeName(simpleEmployee.getGrade() == null ? "" : simpleEmployee.getGrade().getName())
// .hireDate(SalaryDateUtil.getFormatLocalDate(simpleEmployee.getHiredate()))
// .sex(simpleEmployee.getSex() == null ? "" : simpleEmployee.getSex().getDescription())
2023-06-02 14:38:56 +08:00
.mobile(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getMobile()) ? "" : simpleEmployee.getMobile())
.jobtitleName(simpleEmployee.getJobtitleName())
2023-05-08 09:27:20 +08:00
// .status(StringUtils.isEmpty(simpleEmployee.getPersonnelStatus()) ? "" : simpleEmployee.getPersonnelStatus())
2023-06-02 14:38:56 +08:00
.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();
2023-05-08 09:27:20 +08:00
// for (SalaryTemplateSalaryItemListDTO e : items) {
2023-06-02 14:38:56 +08:00
// 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);
// }
2023-05-08 09:27:20 +08:00
// }
// }
// }
2023-06-02 14:38:56 +08:00
// 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);
}
}
}
}
}
2023-05-08 09:27:20 +08:00
/**
* 获取工资单标题
*
* @return
*/
2023-06-06 09:51:07 +08:00
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 + ""));
}
}
2023-05-08 09:27:20 +08:00
return theme
2023-06-06 09:51:07 +08:00
.replace("${companyName}", companyName)
.replace("${salaryMonth}", new SimpleDateFormat("yyyy年MM月").format(salaryMonth));
2023-05-08 09:27:20 +08:00
}
// /**
// * 构建发送消息
// *
// * @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);
// }
2023-06-06 09:51:07 +08:00
/**
* 发送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();
}
}
2023-05-08 09:27:20 +08:00
public static void sendEmail(Map<String, Object> e, Map<String, DataCollectionEmployee> allEmployeeMap, SalaryBillSendDTO salaryBillSendParam) {
2023-06-12 15:19:24 +08:00
StringBuilder emailContent = new StringBuilder();
emailContent.append("<div class='container' style='position: relative; overflow: auto;'>");
2023-05-08 09:27:20 +08:00
// 消息接收者
String receivers = Optional.ofNullable(e.get("email")).orElse("").toString();
2023-06-06 09:51:07 +08:00
String title = getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString()));
2023-06-12 15:19:24 +08:00
SalaryBillBO.buildEmailContent(emailContent, e, salaryBillSendParam);
// 构建水印内容
buildEmailWatermarkContent(emailContent, e, salaryBillSendParam);
emailContent.append("</div>");
2023-06-06 09:51:07 +08:00
if (StringUtils.isNotBlank(receivers)) {
2023-06-12 15:19:24 +08:00
MessageUtil.sendEmail(receivers, title, emailContent.toString());
2023-06-06 09:51:07 +08:00
}
}
2023-06-12 15:19:24 +08:00
2023-06-06 09:51:07 +08:00
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);
// }
2023-05-08 09:27:20 +08:00
}
// /**
// * 构建发送消息
// *
// * @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;
// }
2023-06-05 13:35:17 +08:00
/**
* 构建发送通道
*
* @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;
}
2023-05-08 09:27:20 +08:00
//
// /**
// * 构建实体
// *
// * @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
*/
2023-06-12 15:19:24 +08:00
public static void buildEmailContent(StringBuilder emailContent, Map<String, Object> e, SalaryBillSendDTO salaryBillSendParam) {
2023-05-08 09:27:20 +08:00
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;'>");
2023-06-06 09:51:07 +08:00
// emailContent.append(salaryBillSendParam.getTitle());
2023-06-07 17:19:00 +08:00
emailContent.append(getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())));
2023-05-08 09:27:20 +08:00
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
2023-06-07 17:19:00 +08:00
// if (StringUtils.isNotEmpty(salaryBillSendParam.getSalaryTemplate().getBackground())) {
// emailContent.append("<div style='margin-top: 32px;'><img src='");
// emailContent.append(salaryBillSendParam.getPicUrl());
// emailContent.append("'/></div>");
// }
2023-05-08 09:27:20 +08:00
// 是否只有一个分组,如果是,则将文本内容放进薪资项目表格前后
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>");
}
2023-06-12 15:19:24 +08:00
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();
}
2023-05-08 09:27:20 +08:00
}