From 8228fbf21cf210998ec18b3e7994a99dbe3e74d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 8 May 2023 09:27:20 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/SalaryArchiveConstant.java | 21 + .../entity/salaryBill/bo/SalaryBillBO.java | 550 +++++++++++ .../salaryBill/bo/SalaryTemplateBO.java | 20 + .../salaryBill/dto/SalaryBillSendDTO.java | 79 ++ .../salaryBill/dto/SalarySendInfoListDTO.java | 8 + .../salaryBill/po/SalarySendInfoPO.java | 12 +- .../salaryacct/SalaryAcctRecordMapper.xml | 1 + .../salarybill/SalarySendInfoMapper.xml | 3 + .../SalaryStatisticsReportServiceImpl.java | 8 +- .../impl/SubTableExportServiceImpl.java | 2 +- .../salary/service/SalaryBillService.java | 53 + .../salary/service/SalarySendService.java | 11 + .../impl/AttendQuoteFieldServiceImpl.java | 4 +- .../AttendQuoteFieldSettingServiceImpl.java | 2 +- .../impl/SalaryArchiveExcelServiceImpl.java | 4 +- .../service/impl/SalaryBillServiceImpl.java | 927 ++++++++++++++++++ .../service/impl/SalaryItemServiceImpl.java | 2 +- .../service/impl/SalarySendServiceImpl.java | 293 ++++-- .../SalarySobDefaultEmpFieldServiceImpl.java | 2 +- .../impl/SysSalaryItemServiceImpl.java | 2 +- .../wrapper/SalaryArchiveTaxAgentWrapper.java | 2 +- .../salary/wrapper/SalaryTemplateWrapper.java | 2 +- 22 files changed, 1884 insertions(+), 124 deletions(-) create mode 100644 src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java create mode 100644 src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java create mode 100644 src/com/engine/salary/service/SalaryBillService.java create mode 100644 src/com/engine/salary/service/impl/SalaryBillServiceImpl.java diff --git a/src/com/engine/salary/constant/SalaryArchiveConstant.java b/src/com/engine/salary/constant/SalaryArchiveConstant.java index d8efc64e7..f114d1f05 100644 --- a/src/com/engine/salary/constant/SalaryArchiveConstant.java +++ b/src/com/engine/salary/constant/SalaryArchiveConstant.java @@ -12,4 +12,25 @@ public class SalaryArchiveConstant { * 包含负数、正数、小数、0、0.00000等 */ public static final String NUMBER_REGEX = "(-?[1-9]\\d*\\.?\\d+)|(-?0\\.\\d*[0-9])|(\\d+)"; + + + /** + * 列表中薪资项目动态列后缀标识 + */ + public static final String DYNAMIC_SUFFIX = "_salaryItem"; + + /** + * 调整前 + */ + public static final String ADJUST_BEFORE = "_adjustBefore"; + + /** + * 调整后 + */ + public static final String ADJUST_AFTER = "_adjustAfter"; + + /** + * 调整后 + */ + public static final String ZERO_IGNORE_REGEX = "\\.00"; } diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java new file mode 100644 index 000000000..690c7fcde --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -0,0 +1,550 @@ +package com.engine.salary.entity.salaryBill.bo; + +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.SalaryTemplateSalaryItemListDTO; +import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO; +import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO; +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 java.lang.reflect.Field; +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 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 buildEmployeeFieldName() { + Field[] declaredFields = SalaryFormulaEmployeeDTO.class.getDeclaredFields(); + Map 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 employeeInformation +// * @param simpleEmployee +// * @param employeeField +// */ +// public static void buildEmployeeInfo(SalaryTemplateSalaryItemSetListDTO employeeInformation, SimpleEmployee simpleEmployee, Map employeeField) { +// if (employeeInformation == null || simpleEmployee == null) { +// return; +// } +// if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employeeInformation.getItems())) { +// //获取员工信息的字段名和中文描述的map关系 +// SalaryFormulaEmployeeDTO salaryFormulaEmployeeDTO = SalaryFormulaEmployeeDTO.builder().employeeId(simpleEmployee.getEmployeeId()) +// .departmentName(simpleEmployee.getDepartment() == null ? "" : simpleEmployee.getDepartment().getName()) +// .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()) +// .positionName(simpleEmployee.getPosition() == null ? "" : simpleEmployee.getPosition().getName()) +// .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()) +// .jobNum(simpleEmployee.getJobNum() == null ? "" : simpleEmployee.getJobNum()) +// .build(); +// List items = employeeInformation.getItems(); +// // 1.SalaryAcctResultBO.buildEmployeeFieldName()的取法 +//// Set> entries = employeeField.entrySet(); +//// for (SalaryTemplateSalaryItemListDTO e : items) { +//// Optional> 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); +// } +// } +// } +// } +// } + + /** + * 获取工资单标题 + * + * @param theme + * @param salaryMonth + * @param tenantName + * @return + */ + public static String getBillTitle(String theme, Date salaryMonth, String tenantName) { + String yearI18n = SalaryI18nUtil.getI18nLabel(100325, "年"); + String monthI18n = SalaryI18nUtil.getI18nLabel(100326, "月"); + return theme + .replace("${companyName}", tenantName) + .replace("${salaryMonth}", salaryMonth.getYear() + yearI18n + salaryMonth.getMonth() + monthI18n); + } + +// /** +// * 构建发送消息 +// * +// * @param e +// * @param allEmployeeMap +// * @param salaryBillSendParam +// * @param currentEmployeeId +// * @param currentTenantKey +// * @return +// */ +// public static SendMessageEntity buildSendMessage(Map e, Map allEmployeeMap, SalaryBillSendDTO salaryBillSendParam, Long currentEmployeeId, String currentTenantKey) { +// // 构建用户基本信息 +// SalaryBillBO.buildEmployeeInfo(salaryBillSendParam.getEmployeeInformation(), allEmployeeMap.get(e.get("employeeId").toString()), salaryBillSendParam.getEmployeeField()); +// // 消息接收者 +// List 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); +// } + + + public static void sendEmail(Map e, Map allEmployeeMap, SalaryBillSendDTO salaryBillSendParam) { + // 消息接收者 + String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); + String emailContent = SalaryBillBO.buildEmailContent(e, salaryBillSendParam); + MessageUtil.sendEmail(receivers,salaryBillSendParam.getText(),emailContent); + } + +// /** +// * 构建发送消息 +// * +// * @return +// */ +// public static SendMessageEntity buildSendMessageEntity(SalaryBillSendDTO salaryBillSendParam, List 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 buildSendChannels(SalaryTemplatePO salaryTemplate) { +// Set channels = new HashSet<>(); +// if (salaryTemplate.getEmailStatus() != null && salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) { +// channels.add(MessageChannelEnum.EMAIL); +// } +// if (salaryTemplate.getImStatus() != null && salaryTemplate.getImStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) { +// channels.add(MessageChannelEnum.IM); +// } +// if (salaryTemplate.getCloudBridgeStatus() != null && salaryTemplate.getCloudBridgeStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) { +// channels.add(MessageChannelEnum.CLOUD_BRIDGE); +// } +// 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 String buildEmailContent(Map e, SalaryBillSendDTO salaryBillSendParam) { + StringBuilder emailContent = new StringBuilder(); + emailContent.append("
"); + // 1.标题 + emailContent.append("
"); + emailContent.append(salaryBillSendParam.getTitle()); + emailContent.append("
"); + // 2.发送时间 + emailContent.append("
"); + emailContent.append(SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now())); + emailContent.append("
"); + // 3.背景图-base64 +// if (!StringUtils.isEmpty(salaryBillSendParam.getBackgroundBase64())) { +// emailContent.append("
"); +// } + // 3.背景图-url + if (StringUtils.isNotEmpty(salaryBillSendParam.getSalaryTemplate().getBackground())) { + emailContent.append("
"); + } + + // 是否只有一个分组,如果是,则将文本内容放进薪资项目表格前后 + 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("
"); + return emailContent.toString(); + } + + /** + * 构建邮件内容主体 + * + * @param emailContent + * @param e + * @param salaryBillSendParam + */ + private static void buildMailMain(StringBuilder emailContent, Map e, SalaryBillSendDTO salaryBillSendParam) { + // 薪资项是否显示 + boolean isHideNull = salaryBillSendParam.getSalaryTemplate().getSalaryItemNullStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + boolean isHideZero = salaryBillSendParam.getSalaryTemplate().getSalaryItemZeroStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + // 3.文本内容-如果在薪资项目前 + emailContent.append("
"); + emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent()); + emailContent.append("
"); + // 4.薪资项目内容 + emailContent.append("
"); + for (SalaryTemplateSalaryItemSetListDTO salaryItemSet : salaryBillSendParam.getSalaryItemSetList()) { + if (CollectionUtils.isEmpty(salaryItemSet.getItems())) { + continue; + } + emailContent.append("
"); + if (!salaryItemSet.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.NO_TYPE_GROUP_ID)) { + 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("
"); + } + emailContent.append("
"); + // 5.文本内容-如果在薪资项目后 + emailContent.append("
"); + emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent()); + emailContent.append("
"); + } + + /** + * 构建邮件内容主体 + *

+ * 只有无分类,则将文本内容放进薪资项目表格前后 + * + * @param emailContent + * @param e + * @param salaryBillSendParam + */ + private static void buildOnlyOneGroupMailMain(StringBuilder emailContent, Map e, SalaryBillSendDTO salaryBillSendParam) { + // 薪资项是否显示 + boolean isHideNull = salaryBillSendParam.getSalaryTemplate().getSalaryItemNullStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + boolean isHideZero = salaryBillSendParam.getSalaryTemplate().getSalaryItemZeroStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + // 4.薪资项目内容 + emailContent.append("

"); + for (SalaryTemplateSalaryItemSetListDTO salaryItemSet : salaryBillSendParam.getSalaryItemSetList()) { + if (CollectionUtils.isEmpty(salaryItemSet.getItems())) { + continue; + } + emailContent.append("
"); + emailContent.append("
"); + + // 3.文本内容-如果在薪资项目前 + emailContent.append("
"); + emailContent.append("
"); + emailContent.append(""); + emailContent.append(salaryBillSendParam.getRemarkI18n()); + emailContent.append(""); + emailContent.append("
"); + emailContent.append("
"); + emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent()); + 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; + } + } + } + // 5.文本内容-如果在薪资项目后 + emailContent.append("
"); + emailContent.append("
"); + emailContent.append(""); + emailContent.append(salaryBillSendParam.getRemarkI18n()); + emailContent.append(""); + emailContent.append("
"); + + emailContent.append("
"); + emailContent.append(salaryBillSendParam.getSalaryTemplate().getTextContent()); + emailContent.append("
"); + emailContent.append("
"); + + emailContent.append("
"); + emailContent.append("
"); + } + emailContent.append("
"); + } +} diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java index 99a997fa4..a7767953a 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java @@ -10,10 +10,13 @@ import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryI18nUtil; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** * @Description: 工资单 @@ -25,6 +28,23 @@ public class SalaryTemplateBO { return "SalaryTemplateBO{}"; } + + /** + * 获取人员信息项目分类 + * + * @param salaryItemSetting + * @return + */ + public static SalaryTemplateSalaryItemSetListDTO getEmployeeInformation(List salaryItemSetting) { + Optional optionalEmployeeInformation = salaryItemSetting.stream().filter(e -> SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID.equals(e.getGroupId())).findFirst(); + SalaryTemplateSalaryItemSetListDTO employeeInformation = optionalEmployeeInformation.orElse(null); + // 排除名称为空的 + if (employeeInformation != null && org.apache.commons.collections.CollectionUtils.isNotEmpty(employeeInformation.getItems())) { + employeeInformation.setItems(employeeInformation.getItems().stream().filter(e -> StringUtils.isNotEmpty(e.getName())).collect(Collectors.toList())); + } + return employeeInformation; + } + /** * 保存参数转表数据 * @param saveParam diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java new file mode 100644 index 000000000..39403fb18 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java @@ -0,0 +1,79 @@ +package com.engine.salary.entity.salaryBill.dto; + +import com.engine.salary.entity.salaryBill.po.SalarySendPO; +import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import weaver.hrm.User; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @Description: 工资单发放信息 + * @Author: wangxiangzhong + * @Date: 2021/12/14 14:02 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("工资单发放信息") +public class SalaryBillSendDTO { + + @ApiModelProperty("消息标题") + private String title; + + @ApiModelProperty("消息内容") + private String text; + + @ApiModelProperty("工资单预览实体名") + private String entityName; + + @ApiModelProperty("发送通道") + private Set sendChannels; + + @ApiModelProperty("发送者") + private User sendUser; + + @ApiModelProperty("工资单模板") + private SalaryTemplatePO salaryTemplate; + + @ApiModelProperty("工资单背景图base64编码") + private String backgroundBase64; + + @ApiModelProperty("云桥工资单消息图") + private String picUrl; + + @ApiModelProperty("租户名") + private String tenantName; + + @ApiModelProperty("工资单模板-薪资项目设置") + private List salaryItemSetList; + + @ApiModelProperty("工资单模板-员工基本信息") + private SalaryTemplateSalaryItemSetListDTO employeeInformation; + + @ApiModelProperty("工资单模板-对应人员字段") + private Map employeeField; + + @ApiModelProperty("工资单模板-发放说明标签国际化") + private String remarkI18n; + + @ApiModelProperty("邮件是否可以发送邮件") + private boolean isEnableEmail; + + @ApiModelProperty("工资单发放") + private SalarySendPO salarySend; + + @ApiModelProperty("收入所得项目类型") + private List incomeCategorys; + + @ApiModelProperty("薪资项目收入所得类型") + private Map salaryItemIncomeCategoryMap; +} diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java index eb82e629f..6f976855a 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java @@ -30,6 +30,7 @@ public class SalarySendInfoListDTO { @TableTitle(title = "个税扣缴义务人", dataIndex = "taxAgent", key = "taxAgent") private String taxAgent; + private Long taxAgentId; @TableTitle(title = "部门", dataIndex = "department", key = "department") @@ -47,5 +48,12 @@ public class SalarySendInfoListDTO { @TableTitle(title = "发送状态", dataIndex = "sendStatus", key = "sendStatus") private String sendStatus; + private String email; + private Long salaryAcctRecordId; + /** + * 核算类型。0:正常,1:补发 + */ + private Integer salaryAcctType; + } diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java index 6dd5241b1..5efa58c05 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java @@ -8,25 +8,23 @@ import lombok.NoArgsConstructor; import java.util.Date; /** - * @Description: 工资单发放信息 - * @Author: wangxiangzhong - * @Date: 2021-12-11 11:29 + * 工资单发放信息 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor -////hrsa_salary_send_info") -//工资单发放信息表") +//hrsa_salary_send_info public class SalarySendInfoPO { - public Object get; /** * 主键id */ private Long id; -// 工资单发放id + /** + * 工资单发放id + */ private Long salarySendId; /** diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml index 404920353..4266b9277 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctRecordMapper.xml @@ -14,6 +14,7 @@ + diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml index 6fbbfd5b8..759b5e541 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml @@ -148,6 +148,9 @@ t1.id, + t1.salary_acct_record_id as salaryAcctRecordId, + t1.salary_acct_type as salaryAcctType, + t1.tax_agent_id as taxAgentId, e.lastname as username, t2.name AS tax_agent, d.departmentname AS department, diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java index 302885e35..630e6e97b 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java @@ -93,13 +93,13 @@ public class SalaryStatisticsReportServiceImpl extends Service implements Salary } // private ExtEmployeeService extEmployeeService; -// @Autowired +// // private HrmCommonEmployeeService hrmCommonEmployeeService; -// @RpcReference +// // private HrmJobCallRemoteService hrmJobCallRemoteService; -// @RpcReference +// // private RemoteUserInfoService remoteUserInfoService; -// @Autowired +// // private HrmCommonHrmStatusService hrmCommonHrmStatusService; // (name = "salaryStatReportLoggerTemplate") // private LoggerTemplate salaryStatReportLoggerTemplate; diff --git a/src/com/engine/salary/report/service/impl/SubTableExportServiceImpl.java b/src/com/engine/salary/report/service/impl/SubTableExportServiceImpl.java index d3505a5ba..18d601975 100644 --- a/src/com/engine/salary/report/service/impl/SubTableExportServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SubTableExportServiceImpl.java @@ -8,7 +8,7 @@ public class SubTableExportServiceImpl extends Service implements SubTableExport // private Logger logger = LoggerFactory.getLogger(this.getClass()); // -// @Autowired +// // private SalaryBatchService salaryBatchService; // // @Override diff --git a/src/com/engine/salary/service/SalaryBillService.java b/src/com/engine/salary/service/SalaryBillService.java new file mode 100644 index 000000000..29e4cb4d8 --- /dev/null +++ b/src/com/engine/salary/service/SalaryBillService.java @@ -0,0 +1,53 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; + +import java.util.List; + +/** + * @Description: 工资单 + * @Author: wangxiangzhong + * @Date: 2021-12-11 11:28 + */ +public interface SalaryBillService { + + /** + * 工资单发放 + * + * @param queryParam + * @param isRange + * @param rangeIds + */ + void grant(SalarySendGrantParam queryParam, boolean isRange, List rangeIds); + + /** + * 工资单撤回 + * + * @param queryParam + * @param isRange + * @param rangeIds + * @param currentEmployeeId + * @param currentTenantKey + */ +// void withdraw(SalarySendWithdrawParam queryParam, boolean isRange, List rangeIds); + + /** + * 我的工资单 + * + * @param salaryInfoId + * @param currentEmployeeId + * @param currentTenantKey + * @return + */ +// Map mySalaryBill(Long salaryInfoId); + + /** + * 我的工资单列表详情 + * + * @param page + * @param queryParam + * @param tenantKey + * @return + */ +// Page mySalaryBillListPage(Page page, SalaryBillQueryParam queryParam, String tenantKey); +} diff --git a/src/com/engine/salary/service/SalarySendService.java b/src/com/engine/salary/service/SalarySendService.java index 1a590970f..9ffc53f59 100644 --- a/src/com/engine/salary/service/SalarySendService.java +++ b/src/com/engine/salary/service/SalarySendService.java @@ -4,7 +4,9 @@ import com.engine.salary.entity.salaryBill.dto.*; import com.engine.salary.entity.salaryBill.param.*; import com.engine.salary.entity.salaryBill.po.SalarySendPO; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.util.page.PageInfo; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -120,6 +122,15 @@ public interface SalarySendService { */ List> buildDetailList(List salaryItems, List records, Long salaryAccountingId); + /** + * 构建详情列表 + * + * @param records + * @param salaryAcctResultValues + * @return + */ + List> buildDetailList(List records,List salaryAcctEmployees, List salaryAcctResultValues); + /** * 导出-工资单发放详情列表 * diff --git a/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java index b576564ca..c48b1c7e5 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java @@ -52,9 +52,9 @@ public class AttendQuoteFieldServiceImpl extends Service implements AttendQuoteF } -// @RpcReference +// // private RemoteAttendInitVacationService remoteAttendInitVacationService; -// @Autowired +// // private LoggerTemplate attendQuoteFieldLoggerTemplate; diff --git a/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java index 7ed945ff0..dd8eef639 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteFieldSettingServiceImpl.java @@ -49,7 +49,7 @@ public class AttendQuoteFieldSettingServiceImpl extends Service implements Atten // private AttendQuoteFieldSettingMapper mapper; // // private AttendQuoteFieldMapper attendQuoteFieldMapper; -// @Autowired +// // private LoggerTemplate attendQuoteFieldSettingLoggerTemplate; private AttendQuoteFieldService getAttendQuoteFieldService(User user) { return (AttendQuoteFieldService) ServiceUtil.getService(AttendQuoteFieldServiceImpl.class, user); diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index 5c3b72f25..ac5445b5c 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -96,9 +96,9 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // private SalaryArchiveSobService salaryArchiveSobService; // // private SalaryEmployeeService salaryEmployeeService; -// @Autowired +// // private HrmCommonHrmStatusService hrmCommonHrmStatusService; -// @Autowired +// // private BaseEnvInfoService baseEnvInfoService; // @Override diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java new file mode 100644 index 000000000..b4e1f8fd4 --- /dev/null +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -0,0 +1,927 @@ +package com.engine.salary.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.api.formmode.mybatis.util.SqlProxyHandle; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.salaryBill.bo.SalaryBillBO; +import com.engine.salary.entity.salaryBill.bo.SalaryTemplateBO; +import com.engine.salary.entity.salaryBill.dto.SalaryBillSendDTO; +import com.engine.salary.entity.salaryBill.dto.SalarySendInfoListDTO; +import com.engine.salary.entity.salaryBill.dto.SalaryTemplateSalaryItemSetListDTO; +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +import com.engine.salary.entity.salaryBill.param.SalarySendInfoQueryParam; +import com.engine.salary.entity.salaryBill.po.SalarySendInfoPO; +import com.engine.salary.entity.salaryBill.po.SalarySendPO; +import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; +import com.engine.salary.entity.salarysob.po.SalarySobPO; +import com.engine.salary.enums.salarybill.SalarySendStatusEnum; +import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.salarybill.SalarySendInfoMapper; +import com.engine.salary.mapper.salarybill.SalarySendMapper; +import com.engine.salary.service.*; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.google.common.collect.Lists; +import com.weaver.util.threadPool.ThreadPoolUtil; +import com.weaver.util.threadPool.constant.ModulePoolEnum; +import com.weaver.util.threadPool.entity.LocalRunnable; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.common.MessageUtil; +import weaver.hrm.User; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * @Description: 工资单发放 + * @Author: wangxiangzhong + * @Date: 2021-12-11 11:28 + */ +@Slf4j +public class SalaryBillServiceImpl extends Service implements SalaryBillService { + + + private SalarySendMapper getSalarySendMapper() { + return SqlProxyHandle.getProxy(SalarySendMapper.class); + } + + private SalarySendInfoMapper getSalarySendInfoMapper() { + return SqlProxyHandle.getProxy(SalarySendInfoMapper.class); + } + + + private SalaryTemplateService getSalaryTemplateService(User user) { + return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); + } + + private SalarySendService getSalarySendService(User user) { + return ServiceUtil.getService(SalarySendServiceImpl.class, user); + } + + private SalarySobService getSalarySobService(User user) { + return ServiceUtil.getService(SalarySobServiceImpl.class, user); + } + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); + } + + private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { + return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); + } + + private TaxAgentService getTaxAgentService(User user) { + return ServiceUtil.getService(TaxAgentServiceImpl.class, user); + } + + private SalarySendRangeService getSalarySendRangeService(User user) { + return ServiceUtil.getService(SalarySendRangeServiceImpl.class, user); + } + + private SalaryAcctRecordService getSalaryAcctRecordService(User user) { + return ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); + } + + private SalaryEmployeeService getSalaryEmployeeService(User user) { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } + + + private SalaryEmployeeService salaryEmployeeService; + + private SalarySobItemService salarySobItemService; + + +// private SalaryBillProgressService salaryBillProgressService; + + /** + * 工资单发放 start + **********************************************************************/ + @Override + public void grant(SalarySendGrantParam param, boolean isRange, List rangeIds) { + // 1.检查和获取工资单发放 + SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId()); +// // 已经冻结不能操作 +// if (salarySend.getSendStatus().equals(NumberUtils.INTEGER_ONE)) { +// return; +// } + // 获取默认模板 + SalarySobPO salarySob = getSalarySobService(user).getById(salarySend.getSalarySobId()); + List salaryTemplates = salarySob == null ? Lists.newArrayList() : getSalaryTemplateService(user).getDefaultTemplates(Arrays.asList(salarySend.getSalarySobId(), salarySob.getId())); + if (CollectionUtils.isEmpty(salaryTemplates)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送")); + } + SalaryTemplatePO salaryTemplate = salaryTemplates.get(0); + // 发送通道 +// Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); +// if (CollectionUtils.isEmpty(sendChannels)) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(149767, "工资单模板至少开启一个发送通道")); +// } +// boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySend.getSalaryAcctType()); +// if (isReplenish && StringUtils.isEmpty(salaryTemplate.getReplTheme())) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(204428, "请完善补发工资单模板设置")); +// } + // 2.检查是否正在发送中 +// SalaryBillProgressDTO salaryBillProgress = salaryBillProgressService.getProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + param.getSalarySendId()); +// if (Objects.nonNull(salaryBillProgress) && salaryBillProgress.isStatus() +// && Optional.ofNullable(salaryBillProgress.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(136104, "有其他人员正在发送中,请等待其他人员发送结束后再操作")); +// } + // 初始化进度 +// SalaryBillProgressDTO initProgress = salaryBillProgressService.buildInitProgress(SalaryI18nUtil.getI18nLabel(136097, "发送中"), 136097, NumberUtils.INTEGER_ONE, NumberUtils.INTEGER_ZERO, BigDecimal.ZERO); +// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), initProgress); +// String tenantName = TenantContext.getCurrentTenant().getTenantName(); + +// List ids = isRange ? getSalarySendRangeService(user).getSendInfoIdsBySalarySendIdAndOperateType(param.getSalarySendId(), rangeIds, SalarySendOperateTypeEnum.GRANT) : param.getIds(); + List ids = (List) param.getIds(); + // 异步执行 + LocalRunnable localRunnable = new LocalRunnable() { + @Override + public void execute() { + handleGrant(salarySend, ids, salarySob, salaryTemplate, "tenantName"); + } + }; + ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGrant", localRunnable); + } + + /** + * 处理发送 + * 注意: + * 1.IM和云桥通道是发送完成后,只需要在预览时获取核算数据,所以发送时可以忽略获取核算数据; + * 2.邮件通道需要在发送时获取,拼凑成html代码,有图片会转化为base64编码变慢,且图片越大越慢 + * + * @param salarySend + * @param ids + * @param salarySob + * @param salaryTemplate + * @param tenantName + */ + private void handleGrant(SalarySendPO salarySend, List ids, SalarySobPO salarySob, SalaryTemplatePO salaryTemplate, String tenantName) { + try { + long l = System.currentTimeMillis(); + // 开启分权或且是非薪酬模块总管理员且发送全部,谁能进来就是能看全部 + // ids = getIdsForDevolution(salarySend, ids); +// List incomeCategorys = salarySob == null || salarySob.getIncomeCategory() == null ? Lists.newArrayList() : JsonUtil.parseList(salarySob.getIncomeCategory(), String.class); + // 邮箱打开 + boolean isEnableEmail = MessageUtil.checkSendEmail() && salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + + // 1.构建发送参数 + SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, null, salarySob, tenantName, salaryTemplate, true); + + // 2.获取可发送的列表,此步最耗时,需要解密核算数据 + long l2 = System.currentTimeMillis(); + List> enableSendList = getEnableSendList(salarySend, ids, null, true); + long l3 = System.currentTimeMillis(); + // 3.发送消息:先修改数据再发消息,避免出错后无法撤回 + List successIds = sendMessage(enableSendList, salaryBillSendParam); + long l4 = System.currentTimeMillis(); + LocalDateTime sendTime = LocalDateTime.now(); + + // 4.发放 +// grantSendInfo(successIds, salarySend, sendTime, salaryTemplate); + + // 5.更新数量 +// updateSendNum(salarySend, salarySob, sendTime, SalaryI18nUtil.getI18nLabel(93215, "工资单发放")); + long l5 = System.currentTimeMillis(); + + int total = enableSendList.size(); + int successCount = successIds.size(); + String messsage = SalaryI18nUtil.getI18nLabel(139208, "发送完成") + ": " + + SalaryI18nUtil.getI18nLabel(134807, "成功条数") + "[" + (successCount) + "], " + + SalaryI18nUtil.getI18nLabel(134808, "失败条数") + "[" + (total - successCount) + "]"; + // 发送进度完成 +// salaryBillProgressService.finish(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), messsage, true); +// log.info("工资单发送组装耗时:{}毫秒;工资单发送消息中心耗时:{}毫秒;工资单数据更改总耗时:{}毫秒;工资单发送总耗时:{}毫秒;工资单云桥图片地址:{}", l3 - l2, l4 - l3, l5 - l4, System.currentTimeMillis() - l, +// salaryBillSendParam == null ? "" : salaryBillSendParam.getPicUrl()); + } catch (Exception e) { + log.info("发送出错:{}", e.getMessage(), e); + // 发送进度失败 + +// salaryBillProgressService.fail(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), SalaryI18nUtil.getI18nLabel(136118, "工资单发送出错") + ": " + e.getMessage()); + } finally { + } + } + + /** + * 构建发送参数 + * + * @param salarySend + * @param incomeCategorys + * @param salarySob + * @param tenantName + * @param salaryTemplate + * @param isEnableEmail + * @return + */ + private SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, List incomeCategorys, SalarySobPO salarySob, String tenantName, SalaryTemplatePO salaryTemplate, boolean isEnableEmail) { + String currentTenantKey = salarySend.getTenantKey(); + // 云桥发送控制 +// salaryTemplate.setCloudBridgeStatus(getSalaryTemplateService(user).isEnableEbridge(currentTenantKey) ? salaryTemplate.getCloudBridgeStatus() : SalaryTemplateWhetherEnum.FALSE.getValue()); + // 发送通道 +// Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); + // 空的发个毛线 +// if (CollectionUtils.isEmpty(sendChannels)) { +// return null; +// } +// List salarySobItems = salarySobItemService.listBySalarySobId(salarySob == null ? 0L : salarySob.getId()); +// Map salaryItemIncomeCategoryMap = SalaryEntityUtil.convert2Map(salarySobItems, +// salarySobItemPO -> salarySobItemPO.getSalaryItemId().toString(), SalarySobItemPO::getIncomeCategory); + + Date salaryMonth = salarySend.getSalaryMonth(); + + boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySend.getSalaryAcctType()); +// SalaryTemplateBO.copyShowSet(isReplenish, salaryTemplate); + + // 消息标题 + String title = SalaryBillBO.getBillTitle(salaryTemplate.getTheme(), salaryMonth, tenantName); + + // 云桥企业微信消息图 + String domain = ""; + // todo 访问本项目中的图片需要登陆才能访问,且变成空白,所以还是得改成公网,或者后续鉴权忽略 + // StringUtils.isEmpty(server) || StringUtils.isEmpty(staticPathPattern) ? "https://wx.weaver.com.cn/main/salary/cover.png" : (server+staticPathPattern).replace("**", "salary_bill.png"); + String picUrl = domain + String.format("/papi/file/preview?type=imgs&fileId=%s&random=123456", salaryTemplate.getBackground()); // "https://wx.weaver.com.cn/main/salary/cover.png"; + String backgroundBase64 = ""; +// if (StringUtils.isNotBlank(salaryTemplate.getBackground()) && isEnableEmail) { + // 2.base64码的方式,这种方式可以不管图片地址是否是内外网,缺点是内容太长 +// FileData fileByte = fileDownloadClient.getFileByte(Long.valueOf(salaryTemplate.getBackground())); +// backgroundBase64 = Base64Encoder.encode(fileByte.getData()); + // 千万不要这样做,否则存入salaryTemplate字段会变的很大: salaryTemplate.setBackground(backgroundBase64); +// } + + // 工资单预览实体名 + String entityName = SalaryI18nUtil.getI18nLabel(94626, "工资单"); + + User sendUser = null; + + // 获取人员信息项目分类 + List salaryItemSetList = JSONArray.parseArray(isReplenish ? salaryTemplate.getReplenishSalaryItemSetting() : salaryTemplate.getSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class); + // 国际化处理 +// salaryItemSetList = SalaryTemplateBO.handleI18n(salaryItemSetList); + SalaryTemplateSalaryItemSetListDTO employeeInformation = SalaryTemplateBO.getEmployeeInformation(salaryItemSetList); + + Map employeeField = SalaryBillBO.buildEmployeeFieldName(); + + String remarkI18n = SalaryI18nUtil.getI18nLabel(140036, "发放说明"); + if (StringUtils.isNotEmpty(salaryTemplate.getTextContent())) { + String yearI18n = SalaryI18nUtil.getI18nLabel(100325, "年"); + String monthI18n = SalaryI18nUtil.getI18nLabel(100326, "月"); + salaryTemplate + .setTextContent(salaryTemplate.getTextContent().replace("${salaryMonth}", salaryMonth.getYear() + yearI18n + salaryMonth.getMonth() + monthI18n)); + } + + return SalaryBillSendDTO.builder() + // 消息标题 + .title(title) + // 消息内容:目前跟title一样 + .text(title) + // 工资单预览实体名 + .entityName(entityName) + // 发送通道 +// .sendChannels(sendChannels) + // 发送者 + .sendUser(sendUser) + // 工资单模板 + .salaryTemplate(salaryTemplate) + // 工资单背景图base64编码 + .backgroundBase64(backgroundBase64) + // 云桥工资单消息图 + .picUrl(picUrl) + // 租户名 + .tenantName(tenantName) + // 工资单模板-薪资项目设置 + .salaryItemSetList(salaryItemSetList) + // 工资单模板-员工基本信息 + .employeeInformation(employeeInformation) + // 工资单模板-对应人员字段 + .employeeField(employeeField) + // 工资单模板-发放说明标签国际化 + .remarkI18n(remarkI18n) + // 邮件是否可以发送邮件 + .isEnableEmail(isEnableEmail) + // 工资单发放 + .salarySend(salarySend) + // 收入所得项目类型 +// .incomeCategorys(incomeCategorys) + //薪资项目收入所得类型 +// .salaryItemIncomeCategoryMap(salaryItemIncomeCategoryMap) + .build(); + } + + /** + * 获取可发送数据 + * + * @param salarySend + * @param ids + * @param incomeCategorys + * @param isEnableEmail + * @return + */ + private List> getEnableSendList(SalarySendPO salarySend, List ids, List incomeCategorys, boolean isEnableEmail) { + SalarySendInfoQueryParam queryParam = new SalarySendInfoQueryParam(); + queryParam.setSalarySendId(salarySend.getId()); + // 空就是所有 + queryParam.setIds(ids); + queryParam.setSendStatuss(Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue())); + // 2.获取基本数据 + List list = Lists.newArrayList(); + if (CollectionUtils.isEmpty(ids)) { + list = getSalarySendInfoMapper().list(queryParam); + } else { + List> partition = Lists.partition(ids, 500); + for (List idsPart : partition) { + queryParam.setIds(idsPart); + list.addAll(getSalarySendInfoMapper().list(queryParam)); + } + } + +// // 是否是合并计税 +// boolean isMerge = this.getSalarySendService(user).isMergeBySalarySend(salarySend); + List salaryAcctEmployeeList = this.getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()); + List acctEmployeeIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); + list = list.stream().filter(f -> acctEmployeeIds.contains(f.getEmployeeId())).collect(Collectors.toList()); + + List employeeIds = list.stream().map(SalarySendInfoListDTO::getEmployeeId).collect(Collectors.toList()); + + // 初始化进度 +// SalaryBillProgressDTO initProgress = salaryBillProgressService +// .buildInitProgress("发送中", 136097, employeeIds.size() * 2 + 1, NumberUtils.INTEGER_ZERO, BigDecimal.ZERO); +// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), initProgress); + // 3.组装详情数据 + // 获取薪资项目数据 + List salaryAcctEmployees = Lists.newArrayList(); + List salaryAcctResultValues = Lists.newArrayList(); + if (CollectionUtils.isNotEmpty(ids)) { + int partSize = 100;// 分片大小,越小进度条跑得越短平快,但是总体速度更慢 + List> partition = Lists.partition(employeeIds, partSize); + for (List part : partition) { + // 更新进度 +// salaryBillProgressService.getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), part.size()); + /** 注意只有邮件才需要加密的核算数据 */ + if (isEnableEmail) { + 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()))); + } + } + } else { + /** 注意只有邮件才需要加密的核算数据 */ + if (isEnableEmail) { + salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()); + salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctRecordIds(Collections.singletonList(salarySend.getSalaryAccountingId())); + } + } + // 外部人员 +// List extEmployeeList = extEmployeeService.listAllWithDeleted(currentTenantKey); + return getSalarySendService(user) + .buildDetailList(list, salaryAcctEmployees, salaryAcctResultValues); + } + + /** + * 发送消息 + * + * @param enableSendList + * @param salaryBillSendParam + */ + private List sendMessage(List> enableSendList, SalaryBillSendDTO salaryBillSendParam) { + + if (CollectionUtils.isEmpty(enableSendList)) { + return Collections.emptyList(); + } + if (salaryBillSendParam == null) { + return enableSendList.stream().map(e -> Long.valueOf(e.get("id").toString())).collect(Collectors.toList()); + } + + // 获取人员完整信息 + Map allEmployeeMap = this.getEmployeeWholeInfo(enableSendList); + + List sendInfoUpdateList = Lists.newArrayList(); + AtomicInteger index = new AtomicInteger(0); + AtomicInteger part = new AtomicInteger(0); + int total = enableSendList.size(); + enableSendList.forEach(e -> { + // 构建发送消息 +// SendMessageEntity message = SalaryBillBO.buildSendMessage(e, allEmployeeMap, salaryBillSendParam); + SalaryBillBO.sendEmail(e, allEmployeeMap, salaryBillSendParam); + /** 发送工资单 **********************************************************/ +// WeaResult sendResult = asyncSystemMessageRest.sendMsg(message); +// if (sendResult.isStatus()) { +// sendInfoUpdateList.add(SalarySendInfoPO.builder() +// .id(Long.valueOf(e.get("id").toString())) +// .sendMsgId(sendResult.getData()) +// .build()); +// } +// // 更新发送进度 +// index.addAndGet(1); +// part.addAndGet(1); +// if (index.get() % 100 == 0 || index.get() >= total) { +// salaryBillProgressService.getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salaryBillSendParam.getSalarySend().getId(), part.get()); +// part.set(0); +// } + }); + // 批量修改发送消息id +// if (CollectionUtils.isNotEmpty(sendInfoUpdateList)) { +// // sqlserver数据库处理,每个分片数量约=2100/插入字段数 +// int partSize = DatabaseUtil.getDatabaseId().equalsIgnoreCase("sqlserver") ? 500 : DbCrudConstant.DEF_PART_SIZE; +// List> partition = Lists.partition(sendInfoUpdateList, partSize); +// partition.forEach(updatePart -> getSalarySendInfoMapper().batchUpdateMsgId(updatePart)); +// } + return sendInfoUpdateList.stream().map(SalarySendInfoPO::getId).collect(Collectors.toList()); + } + + /** + * 获取人员完整信息 + * + * @param enableSendList + * @return + */ + private Map getEmployeeWholeInfo(List> enableSendList) { + // 获取所有人员信息 + List simpleEmployees = getSalaryEmployeeService(user).listAll(); + return SalaryEntityUtil.convert2Map(simpleEmployees, e -> e.getEmployeeId() + ""); + } +// /** 工资单发放 end **********************************************************************/ + + /** + * 检查和获取工资单发放信息 + * + * @param salarySendId + * @return + */ + private SalarySendPO checkAndGetSalarySend(Long salarySendId) { + if (salarySendId == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传")); + } + + SalarySendPO salarySend = this.getSalarySendService(user).getById(salarySendId); + if (salarySend == null) { + throw new SalaryRunTimeException(String.format(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在") + "[id:%s]", salarySendId)); + } + return salarySend; + } + +// /** +// * 分权处理 +// * +// * @param salarySend +// * @param ids +// * @param currentEmployeeId +// * @param currentTenantKey +// * @return +// */ +// private List getIdsForDevolution(SalarySendPO salarySend, List ids) { +// // 开启分权或且是非薪酬模块总管理员且发送全部 +// if (getTaxAgentService(user).isOpenDevolution(currentTenantKey) && !getTaxAgentService(user).isChief(currentEmployeeId) && CollectionUtils.isEmpty(ids)) { +// List salaryAcctEmployees = getSalaryAcctEmployeeService(user) +// .listByRecordIds(Collections.singletonList(salarySend.getSalaryAccountingId())); +// +// List taxAgentIdsAsAdmin = getTaxAgentService(user).listAllTaxAgentsAsAdmin(currentEmployeeId).stream().map(TaxAgentPO::getId) +// .collect(Collectors.toList()); +// List taxAgentEmployees = getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId).stream() +// .filter(t -> !taxAgentIdsAsAdmin.contains(t.getTaxAgentId())).collect(Collectors.toList()); +// Map> taxAgentEmployeesMap = SalaryEntityUtil.convert2Map(taxAgentEmployees, TaxAgentManageRangeEmployeeDTO::getTaxAgentId, +// v -> v.getEmployeeList().stream().map(TaxAgentManageRangeEmployeeDTO.TaxAgentEmployee::getEmployeeId).collect(Collectors.toList())); +// +// List extEmployeeList = extEmployeeService.listCanUse(currentEmployeeId); +// // 工资单发放信息过滤 +// List salarySendInfos = new LambdaQueryChainWrapper<>(getSalarySendInfoMapper()) +// /** 注意:需要啥就加载啥,避免加载大字段salaryTemplate */ +// .select(SalarySendInfoPO::getId, SalarySendInfoPO::getEmployeeId, SalarySendInfoPO::getCreator) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()) +// .list(); +// +// List acctEmployeeIds = salaryAcctEmployees.stream().filter(f -> +// // 作为管理员 +// taxAgentIdsAsAdmin.contains(f.getTaxAgentId()) +// // 作为分管理员 +// || TaxAgentBO.checkTaxAgentAndEmployee(taxAgentEmployeesMap, f.getTaxAgentId(), f.getEmployeeId()) +// // 外部人员 +// || extEmployeeList.stream().anyMatch(t -> t.getTaxAgentId().equals(f.getTaxAgentId()) && t.getId().equals(f.getEmployeeId())) +// ).map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); +// +// ids = salarySendInfos.stream().filter(f -> acctEmployeeIds.contains(f.getEmployeeId()) || currentEmployeeId.equals(f.getCreator())).map(SalarySendInfoPO::getId) +// .distinct().collect(Collectors.toList()); +// } +// return ids; +// } +// +// /** +// * 发放工资单更新信息 +// * +// * @param ids +// * @param salarySend +// * @param sendTime +// * @param salaryTemplate +// * @param currentTenantKey +// */ +// private void grantSendInfo(List ids, SalarySendPO salarySend, LocalDateTime sendTime, SalaryTemplatePO salaryTemplate) { +// List> partition = Lists.partition(ids, DbCrudConstant.DEF_PART_SIZE); +// partition.forEach(part -> new LambdaUpdateChainWrapper<>(getSalarySendInfoMapper()) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()) +// .in(SalarySendInfoPO::getSendStatus, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue())) +// .in(SalarySendInfoPO::getId, part) +// .set(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) +// .set(SalarySendInfoPO::getSendTime, sendTime) +// .set(SalarySendInfoPO::getSalaryTemplate, JsonUtil.toJsonString(salaryTemplate)) +// .update()); +// } +// +// /** +// * 撤回工资单更新信息 +// * +// * @param ids +// * @param salarySend +// * @param currentTenantKey +// */ +// private void withdrawSendInfo(List ids, SalarySendPO salarySend) { +// List> partition = Lists.partition(ids, DbCrudConstant.DEF_PART_SIZE); +// partition.forEach(part -> new LambdaUpdateChainWrapper<>(getSalarySendInfoMapper()) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()) +// .eq(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) +// .in(SalarySendInfoPO::getId, part) +// .set(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.WITHDRAW.getValue()) +// .update()); +// } +// +// /** +// * 更新发送数量 +// * +// * @param salarySend +// * @param salarySob +// * @param lastSendTime +// * @param operateTypeName +// * @param currentTenantKey +// */ +// private void updateSendNum(SalarySendPO salarySend, SalarySobPO salarySob, LocalDateTime lastSendTime, String operateTypeName) { +// List list = new LambdaQueryChainWrapper<>(getSalarySendInfoMapper()) +// /** 注意:需要啥就加载啥,避免加载大字段salaryTemplate */ +// .select(SalarySendInfoPO::getId, SalarySendInfoPO::getSendStatus) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()).list(); +// int sendNum = (int) list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).count(); +// int sendTotal = list.size(); +// SalarySendPO salarySendNew = new SalarySendPO(); +// BeanUtils.copyProperties(salarySend, salarySendNew); +// salarySendNew.setSendNum(sendNum); +// salarySendNew.setSendTotal(sendTotal); +// if (lastSendTime != null) { +// salarySendNew.setLastSendTime(lastSendTime); +// } +// getSalarySendMapper().updateById(salarySendNew); +// // 记录日志 +// SalaryLoggerUtil.recordUpdateSingleLog(salarySendLoggerTemplate, +// salarySend.getId(), +// salarySend.getSalaryMonth() + "-" + (salarySob == null ? "" : salarySob.getName()), +// operateTypeName, +// operateTypeName, +// salarySend, +// salarySendNew); +// } +// +// /** +// * 工资单撤回 start +// **********************************************************************/ +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void withdraw(SalarySendWithdrawParam param, boolean isRange, List rangeIds) { +// // 1.检查和获取工资单发放 +// SalarySendPO salarySend = checkAngGetSalarySend(param.getSalarySendId()); +//// // 已经冻结不能操作 +//// if (salarySend.getSendStatus().equals(NumberUtils.INTEGER_ONE)) { +//// return; +//// } +// +// // 检查是否正在撤回中 +// SalaryBillProgressDTO salaryBillProgress = salaryBillProgressService +// .getProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId()); +// if (Objects.nonNull(salaryBillProgress) && salaryBillProgress.isStatus() +// && Optional.ofNullable(salaryBillProgress.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(136105, "有其他人员正在撤回中,请等待其他人员撤回结束后再操作")); +// } +// +// // 初始化进度 +// SalaryBillProgressDTO initProgress = salaryBillProgressService +// .buildInitProgress("撤回中", 136106, NumberUtils.INTEGER_ONE, NumberUtils.INTEGER_ZERO, BigDecimal.ZERO); +// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), initProgress); +// +// List ids = isRange ? getSalarySendRangeService(user).getSendInfoIdsBySalarySendIdAndOperateType(salarySend.getId(), rangeIds, SalarySendOperateTypeEnum.WITHDRAW) : param.getIds(); +// // 异步执行撤回 +// LocalRunnable localRunnable = new LocalRunnable() { +// @Override +// public void execute() { +// handleWithdraw(salarySend, ids); +// } +// }; +// ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillWithdraw", localRunnable); +// } +// +// /** +// * 处理撤回 +// * +// * @param salarySend +// * @param ids +// * @param currentEmployeeId +// * @param currentTenantKey +// */ +// private void handleWithdraw(SalarySendPO salarySend, List ids) { +// try { +// DSTenantKeyThreadVar.tenantKey.set(currentTenantKey); +// +// // 开启分权或且是非薪酬模块总管理员且发送全部,谁能进来就是能看全部 +// // ids = getIdsForDevolution(salarySend, ids); +// +// // 获取可撤回的工资单 +// List enableWithdrawList = Lists.newArrayList(); +// if (CollectionUtils.isEmpty(ids)) { +// List salaryAcctEmployees = this.getSalarySendService(user).getSalaryAcctEmployees(salarySend.getSalaryAccountingId(), null); +// List acctEmployeeIds = salaryAcctEmployees.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); +// List> partition = Lists.partition(acctEmployeeIds, DbCrudConstant.DEF_PART_SIZE); +// for (List part : partition) { +// enableWithdrawList.addAll(new LambdaQueryChainWrapper<>(getSalarySendInfoMapper()) +// /** 注意:需要啥就加载啥,避免加载大字段salaryTemplate */ +// .select(SalarySendInfoPO::getId, SalarySendInfoPO::getSendMsgId) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()) +// .eq(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) +// .in(SalarySendInfoPO::getEmployeeId, part) +// .list()); +// } +// } else { +// List> partition = Lists.partition(ids, DbCrudConstant.DEF_PART_SIZE); +// for (List part : partition) { +// enableWithdrawList.addAll(new LambdaQueryChainWrapper<>(getSalarySendInfoMapper()) +// /** 注意:需要啥就加载啥,避免加载大字段salaryTemplate */ +// .select(SalarySendInfoPO::getId, SalarySendInfoPO::getSendMsgId) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()) +// .eq(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) +// .in(SalarySendInfoPO::getId, part) +// .list()); +// } +// } +// +// // 初始化进度 +// SalaryBillProgressDTO initProgress = salaryBillProgressService +// .buildInitProgress("撤回中", 136106, enableWithdrawList.size() * 2 + 1, enableWithdrawList.size(), new BigDecimal("0.5")); +// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), initProgress); +// +// // 1.撤回消息:先修改数据再发消息,避免出错后无法撤回 +// String text = SalaryI18nUtil.getI18nLabel(184533, "此工资单已被撤回,如有问题,请联系管理员"); +// String title = SalaryI18nUtil.getI18nLabel(94626, "工资单"); +// List sendInfoUpdateIds = Lists.newArrayList(); +// +// AtomicInteger index = new AtomicInteger(0); +// AtomicInteger part = new AtomicInteger(0); +// int total = enableWithdrawList.size(); +// enableWithdrawList.forEach(e -> { +// if (!e.getSendMsgId().equals(0L)) { +// CancleMessageEntity cme = SalaryBillBO.buildCancleMessageEntity(e.getSendMsgId(), text, title); +// /** 撤回工资单 **********************************************************/ +// WeaResult cancelResult = asyncSystemMessageRest.cancleMsg(cme); +// if (cancelResult.isStatus()) { +// sendInfoUpdateIds.add(e.getId()); +// } +// } else { +// sendInfoUpdateIds.add(e.getId()); +// } +// // 更新撤回进度 +// index.addAndGet(1); +// part.addAndGet(1); +// if (index.get() % 100 == 0 || index.get() >= total) { +// salaryBillProgressService.getAndAddCalculatedQty(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), part.get()); +// part.set(0); +// } +// }); +// if (CollectionUtils.isNotEmpty(sendInfoUpdateIds)) { +// List> partition = Lists.partition(sendInfoUpdateIds, DbCrudConstant.DEF_PART_SIZE); +// partition.forEach(idsPart -> new LambdaUpdateChainWrapper<>(getSalarySendInfoMapper()) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .in(SalarySendInfoPO::getId, idsPart) +// .set(SalarySendInfoPO::getSendMsgId, 0) +// .update()); +// } +// // 2.撤回 +// withdrawSendInfo(sendInfoUpdateIds, salarySend); +// // 3.更新数量 +// updateSendNum(salarySend, getSalarySobService(user).getById(salarySend.getSalarySobId()), null, +// SalaryI18nUtil.getI18nLabel(100521, "撤回工资单发放")); +// +// int successCount = sendInfoUpdateIds.size(); +// String messsage = SalaryI18nUtil.getI18nLabel(139211, "撤回完成") + ": " +// + SalaryI18nUtil.getI18nLabel(134807, "成功条数") + "[" + (successCount) + "], " +// + SalaryI18nUtil.getI18nLabel(134808, "失败条数") + "[" + (total - successCount) + "]"; +// // 撤回进度完成 +// salaryBillProgressService.finish(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), messsage, true); +// } catch (Exception e) { +// log.info("撤回出错:{}", e.getMessage(), e); +// // 发送进度失败 +// salaryBillProgressService +// .fail(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), SalaryI18nUtil.getI18nLabel(136142, "工资单撤回出错") + ": " + e.getMessage()); +// } finally { +// DSTenantKeyThreadVar.tenantKey.remove(); +// } +// } +// /** 工资单撤回 end **********************************************************************/ +// +// /** +// * 我的工资单 start +// **********************************************************************/ +// @Override +// public Map mySalaryBill(Long salaryInfoId) { +// // 企业微信端示例数据 +// if (salaryInfoId.equals(1234567890L)) { +// return handle4WeChartDemo(salaryInfoId); +// } +// +// SalarySendInfoPO salarySendInfo = new LambdaQueryChainWrapper<>(getSalarySendInfoMapper()) +// .eq(SalarySendInfoPO::getDeleteType, 0) +// .eq(SalarySendInfoPO::getTenantKey) +// .eq(SalarySendInfoPO::getId, salaryInfoId).one(); +// if (salarySendInfo == null) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100511, "工资单信息不存在")); +// } +// // 获取模板 +// String salaryTemplateContent = salarySendInfo.getSalaryTemplate(); +// if (StringUtils.isBlank(salaryTemplateContent)) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100513, "没有默认模板,无法查看")); +// } +// SalaryTemplatePO salaryTemplate = SalaryBillBO.buildSalaryTemplateContent(salaryTemplateContent); +// +// // 判断是否是补发 +// boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySendInfo.getSalaryAcctType()); +// SalaryTemplateBO.copyShowSet(isReplenish, salaryTemplate); +// +// // 获取人员信息项目分类 +// List listDTOS = JSONArray.parseArray(isReplenish ? salaryTemplate.getReplenishSalaryItemSetting() : salaryTemplate.getSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class); +// // 国际化处理 +// listDTOS = SalaryTemplateBO.handleI18n(listDTOS); +// // 获取人员信息项目分类 +// SalaryTemplateSalaryItemSetListDTO employeeInformation = SalaryTemplateBO.getEmployeeInformation(listDTOS); +// // 1.薪资项目赋值 +// List itemSetListDTOS = listDTOS.stream() +// .filter(e -> !SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID.equals(e.getGroupId())).collect(Collectors.toList()); +// // 获取薪资核算数据 +// List salaryAcctEmployees = getSalaryAcctEmployeeService(user) +// .listByRecordIdAndEmployeeIds(salarySendInfo.getSalaryAcctRecordId(), Collections.singletonList(salarySendInfo.getEmployeeId())); +// Set salaryAcctEmployeeIds = SalaryEntityUtil.properties(salaryAcctEmployees, SalaryAcctEmployeePO::getId); +// List salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); +//// List salaryAcctResultList = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndEmployeeIds(Collections.singletonList(salarySendInfo.getSalaryAcctRecordId()), Collections.singletonList(currentEmployeeId)); +// if (CollectionUtils.isNotEmpty(salaryAcctResultValues)) { +// SalaryAcctRecordPO salaryAcctRecord = getSalaryAcctRecordService(user).getById(salarySendInfo.getSalaryAcctRecordId()); +// // 当前查询核算记录是回算,但是发放不是回算的,那么就取源头核算结果 +// boolean isOrigin = salaryAcctRecord != null && !isReplenish && salaryAcctRecord.getBackCalcStatus().equals(NumberUtils.INTEGER_ONE); +// Map map = Maps.newHashMap(); +// if (salarySendInfo.getTaxAgentId().equals(0L)) { +// for (SalaryAcctResultValuePO salaryAcctResultValue : salaryAcctResultValues) { +// if (isOrigin) { +// if (salaryAcctResultValue.getOriginResultValue() != null && !salaryAcctResultValue.getOriginResultValue().isEmpty()) { +// map.putAll(salaryAcctResultValue.getOriginResultValue()); +// } +// } else { +// map.putAll(salaryAcctResultValue.getResultValue()); +// } +// } +// } else { +// Map salaryAcctEmployeeMap = SalaryEntityUtil +// .convert2Map(salaryAcctEmployees, salaryAcctEmployee -> salaryAcctEmployee.getEmployeeId() + "-" + salaryAcctEmployee.getTaxAgentId()); +// Map singleEmpAcctMap = SalaryEntityUtil.convert2Map(salaryAcctResultValues, SalaryAcctResultValuePO::getSalaryAcctEmployeeId); +// SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(salarySendInfo.getEmployeeId() + "-" + salarySendInfo.getTaxAgentId()); +// if (salaryAcctEmployee != null && singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) { +// SalaryAcctResultValuePO salaryAcctResultValue = singleEmpAcctMap.get(salaryAcctEmployee.getId()); +// if (Objects.nonNull(salaryAcctResultValue)) { +// if (isOrigin) { +// if (salaryAcctResultValue.getOriginResultValue() != null && !salaryAcctResultValue.getOriginResultValue().isEmpty()) { +// map.putAll(salaryAcctResultValue.getOriginResultValue()); +// } +// } else { +// map.putAll(salaryAcctResultValue.getResultValue()); +// } +// } +// } +// } +// org.apache.commons.collections4.CollectionUtils.emptyIfNull(itemSetListDTOS) +// .forEach(item -> item.getItems().forEach(e -> e.setSalaryItemValue(Optional.ofNullable(map.get("" + e.getId())).orElse("")))); +// } else { +// org.apache.commons.collections4.CollectionUtils.emptyIfNull(itemSetListDTOS) +// .forEach(item -> item.getItems().forEach(e -> e.setSalaryItemValue(""))); +// } +// // 2.人员信息赋值 +// if (employeeInformation != null && CollectionUtils.isNotEmpty(employeeInformation.getItems())) { +// // 如果是外部人员 +// if (salarySendInfo.getEmployeeType().equals(SalarySendEmployeeTypeEnum.EXT_EMPLOYEE.getValue())) { +// ExtEmployeePO extEmployeePO = extEmployeeService.getByIdWithDeleted(salarySendInfo.getEmployeeId()); +// if (extEmployeePO != null) { +// SimpleEmployee simpleEmployee = new SimpleEmployee(); +// simpleEmployee.setId(extEmployeePO.getId()); +// simpleEmployee.setUsername(extEmployeePO.getUsername()); +// simpleEmployee.setMobile(extEmployeePO.getUsername()); +// SalaryBillBO.buildEmployeeInfo(employeeInformation, simpleEmployee, SalaryBillBO.buildEmployeeFieldName()); +// } +// } else { +// SimpleEmployee simpleEmployee = hrmCommonEmployeeService.getEmployeeById(salarySendInfo.getEmployeeId()); +// if (simpleEmployee != null) { +// // 查询人员状态 +// HrmStatus hrmStatusDb = hrmCommonHrmStatusService.getHrmStatusByCodeId(simpleEmployee.getPersonnelStatus()); +// simpleEmployee.setPersonnelStatus(hrmStatusDb == null ? "" : hrmStatusDb.getName()); +// } +// SalaryBillBO.buildEmployeeInfo(employeeInformation, simpleEmployee, SalaryBillBO.buildEmployeeFieldName()); +// } +// } +// // 主题设置 +// salaryTemplate.setTheme(SalaryBillBO +// .getBillTitle(salaryTemplate.getTheme(), salarySendInfo.getSalaryMonth(), TenantContext.getCurrentTenant().getTenantName())); +// // 背景图 +// if (StringUtils.isNotBlank(salaryTemplate.getBackground())) { +// salaryTemplate.setBackground(String.format("/papi/file/preview?type=imgs&fileId=%s&random=123456", salaryTemplate.getBackground())); +// } +// +// Map resultMap = new LinkedHashMap<>(); +// resultMap.put("tenantName", TenantContext.getCurrentTenant().getTenantName()); +// resultMap.put("sendTime", SalaryDateUtil.getFormatLocalDateTime(salarySendInfo.getSendTime())); +// resultMap.put("employeeInformation", employeeInformation); +// resultMap.put("salaryGroups", itemSetListDTOS); +// resultMap.put("salaryTemplate", salaryTemplate); +// return resultMap; +// } +// +// /** +// * 企业微信端示例数据 +// * +// * @param salaryInfoId +// * @return +// */ +// private Map handle4WeChartDemo(Long salaryInfoId) { +// Map resultMap = new LinkedHashMap<>(); +// if (salaryInfoId.equals(1234567890L)) { +// List itemSetListDTOS = Lists.newArrayList(); +// List items = Lists.newArrayList(); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338782").salaryItemValue("5000.00").name(SalaryI18nUtil.getI18nLabel(184508, "基本工资")).sortedIndex(0).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338783").salaryItemValue("2000.00").name(SalaryI18nUtil.getI18nLabel(184537, "岗位工资")).sortedIndex(1).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739465941241856001").salaryItemValue("100.00").name(SalaryI18nUtil.getI18nLabel(184538, "其他补贴")).sortedIndex(2).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739466138709688320").salaryItemValue("3.00").name(SalaryI18nUtil.getI18nLabel(184539, "绩效分值")).sortedIndex(3).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739505579468095489").salaryItemValue("600.00").name(SalaryI18nUtil.getI18nLabel(184540, "工时奖金")).sortedIndex(4).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739505652314767360").salaryItemValue("500.00").name(SalaryI18nUtil.getI18nLabel(184544, "成果奖金")).sortedIndex(5).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739506094797062145").salaryItemValue("200.00").name(SalaryI18nUtil.getI18nLabel(184545, "考勤扣款")).sortedIndex(6).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739506691648290816").salaryItemValue("800.00").name(SalaryI18nUtil.getI18nLabel(184546, "餐补")).sortedIndex(7).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739516333975699456").salaryItemValue("1").name(SalaryI18nUtil.getI18nLabel(184547, "当月缺勤")).sortedIndex(8).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("739516913670455296").salaryItemValue("200.00").name(SalaryI18nUtil.getI18nLabel(184549, "缺勤扣款")).sortedIndex(9).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338798").salaryItemValue("200.00").name(SalaryI18nUtil.getI18nLabel(184550, "社保代扣")).sortedIndex(10).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338799").salaryItemValue("200.00").name(SalaryI18nUtil.getI18nLabel(184551, "公积金代扣")).sortedIndex(11).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("741652500368097281").salaryItemValue("8800.00").name(SalaryI18nUtil.getI18nLabel(184553, "当月计税收入")).sortedIndex(12).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338770").salaryItemValue("0").name(SalaryI18nUtil.getI18nLabel(184555, "当前累计专项附加扣除合计")).sortedIndex(13).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338780").salaryItemValue("1000.00").name(SalaryI18nUtil.getI18nLabel(184556, "当月预扣个税")).sortedIndex(14).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338800").salaryItemValue("8700.00").name(SalaryI18nUtil.getI18nLabel(184557, "当月实发现金")).sortedIndex(15).build()); +// items.add(SalaryTemplateSalaryItemListDTO.builder().id("735706397435338802").salaryItemValue("").name(SalaryI18nUtil.getI18nLabel(84961, "备注")).sortedIndex(16).build()); +// itemSetListDTOS.add(SalaryTemplateSalaryItemSetListDTO.builder() +// .groupId("custom_144") +// .groupName(SalaryI18nUtil.getI18nLabel(184561, "工资薪金项目")) +// .sortedIndex(0) +// .items(items) +// .build()); +// SalaryTemplatePO salaryTemplate = SalaryTemplatePO.builder() +// .id(759519856313417728L) +// .name(SalaryI18nUtil.getI18nLabel(184563, "测试模板")) +// .description("") +// .theme(SalaryI18nUtil.getI18nLabel(184565, "(示例)工资单明细")) +// .background("") +// .textContent(SalaryI18nUtil.getI18nLabel(184590, "(示例)本数据仅为您收入预发金额,考勤、绩效及各类专项奖励的差异值将根据实际数据后续在下次发薪时统一予以调整,如有异议,请联系****。")) +// .textContentPosition(2) +// .salaryItemNullStatus(0) +// .salaryItemZeroStatus(0) +// .salaryItemSetting(JSON.toJSONString(itemSetListDTOS)) +// .build(); +// resultMap.put("tenantName", TenantContext.getCurrentTenant().getTenantName()); +// resultMap.put("sendTime", SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now())); +// resultMap.put("employeeInformation", null); +// resultMap.put("salaryGroups", itemSetListDTOS); +// resultMap.put("salaryTemplate", salaryTemplate); +// } +// return resultMap; +// } +// +// @Override +// public Page mySalaryBillListPage(Page page, SalaryBillQueryParam queryParam, String tenantKey) { +// getSalarySendInfoMapper().mySalaryBillList(page, queryParam, tenantKey); +// return page; +// } + /** 我的工资单 end **********************************************************************/ +} diff --git a/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java b/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java index 658f364d0..9cd1ede32 100644 --- a/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java @@ -71,7 +71,7 @@ public class SalaryItemServiceImpl extends Service implements SalaryItemService private SysSalaryItemBiz sysSalaryItemBiz = new SysSalaryItemBiz(); -// @Autowired +// // private LoggerTemplate salaryItemLoggerTemplate; @Override diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 01bfb5162..1e0d54976 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -9,6 +9,7 @@ import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SalarySendBiz; import com.engine.salary.biz.SalarySendInfoBiz; +import com.engine.salary.constant.SalaryArchiveConstant; import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.constant.SalaryTemplateSalaryItemSetGroupConstant; import com.engine.salary.encrypt.EncryptUtil; @@ -60,6 +61,7 @@ import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import weaver.common.MessageUtil; import weaver.hrm.User; import weaver.hrm.company.SubCompanyComInfo; import weaver.hrm.resource.ResourceComInfo; @@ -149,29 +151,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); } + private SalaryBillService getSalaryBillService(User user) { + return ServiceUtil.getService(SalaryBillServiceImpl.class, user); + } -// @RpcReference -// private FileDownloadClient fileDownloadClient; -// /** -// * 同步用RpcReference -// */ -// @RpcReference -// private SystemMessageRest systemMessageRest; -// /** -// * 异步用Autowired -// */ -// @Autowired -// private AsyncSystemMessageRest asyncSystemMessageRest; -// @RpcReference -// private MailBaseService mailBaseService; -// -// private SalaryBatchService salaryBatchService; -// @Autowired -// private LoggerTemplate salarySendLoggerTemplate; -// @Autowired -// private HrmCommonEmployeeService hrmCommonEmployeeService; -// @Autowired -// private ExecutorService taskExecutor; @Override public SalarySendPO getById(Long salarySendId) { @@ -772,6 +755,97 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return listMaps; } + /** + * 组装详情数据 + * + * @param list + * @param salaryAcctResultValues + * @return + */ + @Override + public List> buildDetailList(List list, + List salaryAcctEmployees, List salaryAcctResultValues) { + List> listMaps = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + return listMaps; + } + // 所有个税扣缴义务人 + Map taxAgentMap = SalaryEntityUtil.convert2Map(getTaxAgentService(user).listAll(), TaxAgentPO::getId, TaxAgentPO::getName); + // 按人员分组核算数据 + Map> relationSalaryAcctEmployeeMap = SalaryEntityUtil.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getEmployeeId); + Map salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployees, salaryAcctEmployee -> salaryAcctEmployee.getEmployeeId() + "-" + salaryAcctEmployee.getTaxAgentId()); + Map> singleEmpAcctMap = SalaryEntityUtil.group2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId); + List employeeIds = list.stream().map(SalarySendInfoListDTO::getEmployeeId).distinct().collect(Collectors.toList()); + // 查询分部 查询部门 + List comInfos = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds); + Map empComMap = SalaryEntityUtil.convert2Map(comInfos, DataCollectionEmployee::getEmployeeId); + + // 当前查询核算记录是回算,但是发放不是回算的,那么就取源头核算结果 + boolean isOrigin = false; + SalaryAcctRecordPO salaryAcctRecord = CollectionUtils.isEmpty(list) ? null : getSalaryAcctRecordService(user).getById(list.get(0).getSalaryAcctRecordId()); + if (Objects.nonNull(salaryAcctRecord) && Objects.nonNull(salaryAcctRecord.getBackCalcStatus())) { + isOrigin = !NumberUtils.INTEGER_ONE.equals(list.get(0).getSalaryAcctType()) && salaryAcctRecord.getBackCalcStatus().equals(NumberUtils.INTEGER_ONE); + } + + // 动态列 + long l = System.currentTimeMillis(); + Map finalEmpSubComMap = empComMap; + boolean finalIsOrigin = isOrigin; + list.forEach(e -> { + Map map = new LinkedHashMap<>(); + map.put("id", e.getId() + ""); + DataCollectionEmployee hrmDepartmentComInfo = finalEmpSubComMap.get(e.getEmployeeId()); + if (hrmDepartmentComInfo != null) { + map.put("subCompanyName", hrmDepartmentComInfo.getSubcompanyName()); + } else { + map.put("subCompanyName", ""); + } + if (hrmDepartmentComInfo != null) { + map.put("department", e.getDepartment()); + } + map.put("employeeId", e.getEmployeeId() + ""); + map.put("username", e.getUsername()); + map.put("mobile", e.getMobile()); + map.put("jobNum", e.getJobNum()); + map.put("email", e.getEmail()); +// map.put("employeeType", SalarySendEmployeeTypeEnum.getNameByValue(e.getEmployeeType())); + // 单个人的核算数据 + List resultValues = Lists.newArrayList(); + // 个税扣缴义务人 +// if (incomeCategorys.size() > 1) { +// List acctEmployees = relationSalaryAcctEmployeeMap.getOrDefault(e.getEmployeeId(), Collections.emptyList()); +// for (SalaryAcctEmployeePO salaryAcctEmployee : acctEmployees) { +// if (singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) { +// resultValues.add(singleEmpAcctMap.get(salaryAcctEmployee.getId())); +// } +// } +// } else { +// SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(e.getEmployeeId() + "-" + e.getTaxAgent()); +// if (salaryAcctEmployee != null && singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) { +// resultValues.add(singleEmpAcctMap.get(salaryAcctEmployee.getId())); +// } +// } + + SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(e.getEmployeeId() + "-" + e.getTaxAgentId()); + if (salaryAcctEmployee != null && singleEmpAcctMap.containsKey(salaryAcctEmployee.getId())) { + resultValues.addAll(singleEmpAcctMap.get(salaryAcctEmployee.getId())); + } + // 薪资项目 +// singleEmpAcctResultList.forEach(i-> map.put(i.getSalaryItemId() + SalaryArchiveConstant.DYNAMIC_SUFFIX, i.getResultValue())); + for (SalaryAcctResultPO salaryAcctResultValue : resultValues) { + if (finalIsOrigin) { + map.put(salaryAcctResultValue.getSalaryItemId() + SalaryArchiveConstant.DYNAMIC_SUFFIX, salaryAcctResultValue.getResultValue()); + } else { + map.put(salaryAcctResultValue.getSalaryItemId() + SalaryArchiveConstant.DYNAMIC_SUFFIX, salaryAcctResultValue.getResultValue()); + } + } + + listMaps.add(map); + }); + log.info("工资单详情构建总耗时:{}毫秒", System.currentTimeMillis() - l); + return listMaps; + } + /** * 通过薪资账套获取模板的薪资项目 * @@ -806,86 +880,88 @@ public class SalarySendServiceImpl extends Service implements SalarySendService @Override public Map grant(SalarySendGrantParam param) { - if (param.getSalarySendId() == null) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传")); - } + getSalaryBillService(user).grant(param, false, new ArrayList<>()); +// if (param.getSalarySendId() == null) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传")); +// } +// +// Long salarySendId = param.getSalarySendId(); +// Collection ids = param.getIds(); +// +// if (param.getSalarySendRangeIds() != null) { +// //如果传了范围id,则使用范围id发放 +// ids = getSalarySendRangeService(user) +// .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); +// if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 +// throw new SalaryRunTimeException("工资发放范围内没有匹配员工"); +// } +// } +// +// SalarySendPO salarySend = mapper.getById(salarySendId); +// if (salarySend == null) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); +// } +// // 已经冻结不能操作 +// if (Objects.equals(salarySend.getSendStatus(), NumberUtils.INTEGER_ONE)) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结")); +// } +// // 获取默认模板 +// List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); +// if (CollectionUtils.isEmpty(salaryTemplates)) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送")); +// } +// SalaryTemplatePO templatePO = salaryTemplates.get(0); +// Date sendTime = new Date(); +// // 获取可发送的列表 +// List> enableSendList = getEnableSendList(salarySend, ids, templatePO); +// // 1.发放 +// +// SalarySendInfoPO po = new SalarySendInfoPO(); +// po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); +// po.setSendTime(sendTime); +// po.setSalaryTemplate(JsonUtil.toJsonString(templatePO)); +// salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); +// +// +// List list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build()); +// //需要发送工资的人 +// +// List sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList()); +// int sendNum = sendList.size(); +// int sendTotal = list.size(); +// SalarySendPO salarySendNew = new SalarySendPO(); +// try { +// BeanUtils.copyProperties(salarySendNew, salarySend); +// } catch (IllegalAccessException e) { +// e.printStackTrace(); +// } catch (InvocationTargetException e) { +// e.printStackTrace(); +// } +// salarySendNew.setSendNum(sendNum); +// salarySendNew.setSendTotal(sendTotal); +// salarySendNew.setLastSendTime(sendTime); +// +// mapper.updateById(salarySendNew); +// +// List needSendList = Lists.newArrayList(); +// enableSendList.forEach(map -> { +// sendList.forEach(item -> { +// if (item.getId() == Long.valueOf(map.get("id").toString()).longValue()) { +// needSendList.add(item); +// } +// }); +// }); +// +// // 发送消息 +// param.setTemplate(templatePO); +// sendMessage(true, needSendList, param, salarySend); +// +// Map map = new HashMap<>(2); +// map.put("sendNum", sendNum); +// map.put("sendTotal", sendTotal); - Long salarySendId = param.getSalarySendId(); - Collection ids = param.getIds(); - - if (param.getSalarySendRangeIds() != null) { - //如果传了范围id,则使用范围id发放 - ids = getSalarySendRangeService(user) - .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); - if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 - throw new SalaryRunTimeException("工资发放范围内没有匹配员工"); - } - } - - SalarySendPO salarySend = mapper.getById(salarySendId); - if (salarySend == null) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); - } - // 已经冻结不能操作 - if (Objects.equals(salarySend.getSendStatus(), NumberUtils.INTEGER_ONE)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结")); - } - // 获取默认模板 - List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); - if (CollectionUtils.isEmpty(salaryTemplates)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送")); - } - SalaryTemplatePO templatePO = salaryTemplates.get(0); - Date sendTime = new Date(); - // 获取可发送的列表 - List> enableSendList = getEnableSendList(salarySend, ids, templatePO); - // 1.发放 - - SalarySendInfoPO po = new SalarySendInfoPO(); - po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); - po.setSendTime(sendTime); - po.setSalaryTemplate(JsonUtil.toJsonString(templatePO)); - salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); - - - List list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build()); - //需要发送工资的人 - - List sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList()); - int sendNum = sendList.size(); - int sendTotal = list.size(); - SalarySendPO salarySendNew = new SalarySendPO(); - try { - BeanUtils.copyProperties(salarySendNew, salarySend); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - salarySendNew.setSendNum(sendNum); - salarySendNew.setSendTotal(sendTotal); - salarySendNew.setLastSendTime(sendTime); - - mapper.updateById(salarySendNew); - - List needSendList = Lists.newArrayList(); - enableSendList.forEach(map -> { - sendList.forEach(item -> { - if (item.getId() == Long.valueOf(map.get("id").toString()).longValue()) { - needSendList.add(item); - } - }); - }); - - // 发送消息 - param.setTemplate(templatePO); - sendMessage(true, needSendList, param, salarySend); - - Map map = new HashMap<>(2); - map.put("sendNum", sendNum); - map.put("sendTotal", sendTotal); - - return map; +// return map; + return null; } /** @@ -919,6 +995,19 @@ public class SalarySendServiceImpl extends Service implements SalarySendService * 发送Em消息 */ private void sendPayRollEMMessage(SalarySendInfoPO po, SalaryTemplatePO template, Long employeeId) { + + + boolean canSendSms = MessageUtil.checkSendSMS(); + boolean canSendEmail = MessageUtil.checkSendEmail(); + +// try { +// MessageUtil.sendSMS(mobile, content); +// } catch (Exception e) { +// kqLog.info("SendSMS error.resourceId:" + resourceId + ">>>>>>mobile>>>>>>" + mobile); +// log.writeLog(e); +// } + + Long id = po.getId(); String background = template.getBackground(); String billTitle = getBillTitle(template.getTheme(), po.getSalaryMonth(), employeeId); @@ -1304,7 +1393,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService Long salarySendId = queryParam.getSalarySendId(); // 获取薪资核算ID SalarySendPO salarySendPO = getById(salarySendId); - if(Objects.isNull(salarySendPO)){ + if (Objects.isNull(salarySendPO)) { throw new SalaryRunTimeException("工资发放记录不存在或已被删除"); } return getSalaryAcctResultService(user).sumRow(SalaryAcctResultQueryParam.builder().salaryAcctRecordId(salarySendPO.getSalaryAccountingId()).build()); diff --git a/src/com/engine/salary/service/impl/SalarySobDefaultEmpFieldServiceImpl.java b/src/com/engine/salary/service/impl/SalarySobDefaultEmpFieldServiceImpl.java index 2355e2b87..aa63617a8 100644 --- a/src/com/engine/salary/service/impl/SalarySobDefaultEmpFieldServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySobDefaultEmpFieldServiceImpl.java @@ -12,7 +12,7 @@ import com.engine.salary.service.SalarySobDefaultEmpFieldService; **/ public class SalarySobDefaultEmpFieldServiceImpl implements SalarySobDefaultEmpFieldService { -// @Autowired +// // private SalarySobDefaultEmpFieldMapper salarySobDefaultEmpFieldMapper; // // @Override diff --git a/src/com/engine/salary/service/impl/SysSalaryItemServiceImpl.java b/src/com/engine/salary/service/impl/SysSalaryItemServiceImpl.java index 068b06a52..0a2d9b792 100644 --- a/src/com/engine/salary/service/impl/SysSalaryItemServiceImpl.java +++ b/src/com/engine/salary/service/impl/SysSalaryItemServiceImpl.java @@ -37,7 +37,7 @@ public class SysSalaryItemServiceImpl extends Service implements SysSalaryItemSe private SysSalaryItemMapper getSysSalaryItemMapper() { return MapperProxyFactory.getProxy(SysSalaryItemMapper.class); } -// @Autowired +// // private LoggerTemplate salaryItemLoggerTemplate; @Override diff --git a/src/com/engine/salary/wrapper/SalaryArchiveTaxAgentWrapper.java b/src/com/engine/salary/wrapper/SalaryArchiveTaxAgentWrapper.java index 69b7a509f..44146d169 100644 --- a/src/com/engine/salary/wrapper/SalaryArchiveTaxAgentWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryArchiveTaxAgentWrapper.java @@ -47,7 +47,7 @@ public class SalaryArchiveTaxAgentWrapper extends Service { // // private SalaryBatchService salaryBatchService; -// @Autowired +// // private ExecutorService taskExecutor; /** diff --git a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java index 45f0f1cea..02d5d4412 100644 --- a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java @@ -40,7 +40,7 @@ public class SalaryTemplateWrapper extends Service { private SalaryTemplateService getSalaryTemplateService(User user) { return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); } -// @RpcReference +// // private MailBaseService mailBaseService; private SalarySobService getSalarySobService(User user) { From 0da2bfa55a676a4f74b6a8115ac0745ee4aed021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Fri, 2 Jun 2023 14:38:56 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/salaryBill/bo/SalaryBillBO.java | 109 +++++++++--------- .../service/impl/SalaryBillServiceImpl.java | 6 +- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index 690c7fcde..d71419ae8 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -20,6 +20,8 @@ import org.slf4j.LoggerFactory; import weaver.common.MessageUtil; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.time.LocalDateTime; import java.util.*; @@ -89,67 +91,68 @@ public class SalaryBillBO { return employeeFieldNameMap; } -// /** -// * 构建工资单中的人员信息 -// * -// * @param employeeInformation -// * @param simpleEmployee -// * @param employeeField -// */ -// public static void buildEmployeeInfo(SalaryTemplateSalaryItemSetListDTO employeeInformation, SimpleEmployee simpleEmployee, Map employeeField) { -// if (employeeInformation == null || simpleEmployee == null) { -// return; -// } -// if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employeeInformation.getItems())) { -// //获取员工信息的字段名和中文描述的map关系 -// SalaryFormulaEmployeeDTO salaryFormulaEmployeeDTO = SalaryFormulaEmployeeDTO.builder().employeeId(simpleEmployee.getEmployeeId()) -// .departmentName(simpleEmployee.getDepartment() == null ? "" : simpleEmployee.getDepartment().getName()) -// .email(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getEmail()) ? "" : simpleEmployee.getEmail()) + /** + * 构建工资单中的人员信息 + * + * @param employeeInformation + * @param simpleEmployee + * @param employeeField + */ + public static void buildEmployeeInfo(SalaryTemplateSalaryItemSetListDTO employeeInformation, DataCollectionEmployee simpleEmployee, Map employeeField) { + if (employeeInformation == null || simpleEmployee == null) { + return; + } + if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employeeInformation.getItems())) { + //获取员工信息的字段名和中文描述的map关系 + SalaryFormulaEmployeeDTO salaryFormulaEmployeeDTO = SalaryFormulaEmployeeDTO.builder().employeeId(simpleEmployee.getEmployeeId()) + .taxAgentName("axx") + .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()) -// .positionName(simpleEmployee.getPosition() == null ? "" : simpleEmployee.getPosition().getName()) + .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()) -// .jobNum(simpleEmployee.getJobNum() == null ? "" : simpleEmployee.getJobNum()) -// .build(); -// List items = employeeInformation.getItems(); -// // 1.SalaryAcctResultBO.buildEmployeeFieldName()的取法 -//// Set> entries = employeeField.entrySet(); -//// for (SalaryTemplateSalaryItemListDTO e : items) { -//// Optional> 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() + .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 items = employeeInformation.getItems(); + // 1.SalaryAcctResultBO.buildEmployeeFieldName()的取法 +// Set> entries = employeeField.entrySet(); // 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); +// Optional> 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); + } + } + } + } + } /** * 获取工资单标题 diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index b4e1f8fd4..cfce8e6a3 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -411,6 +411,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService enableSendList.forEach(e -> { // 构建发送消息 // SendMessageEntity message = SalaryBillBO.buildSendMessage(e, allEmployeeMap, salaryBillSendParam); + SalaryBillBO.buildEmployeeInfo(salaryBillSendParam.getEmployeeInformation(), allEmployeeMap.get(e.get("employeeId").toString()), salaryBillSendParam.getEmployeeField()); SalaryBillBO.sendEmail(e, allEmployeeMap, salaryBillSendParam); /** 发送工资单 **********************************************************/ // WeaResult sendResult = asyncSystemMessageRest.sendMsg(message); @@ -445,8 +446,11 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * @return */ private Map getEmployeeWholeInfo(List> enableSendList) { + + List ids = enableSendList.stream().map(e -> Long.valueOf(e.get("employeeId").toString())).collect(Collectors.toList()); + // 获取所有人员信息 - List simpleEmployees = getSalaryEmployeeService(user).listAll(); + List simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(ids); return SalaryEntityUtil.convert2Map(simpleEmployees, e -> e.getEmployeeId() + ""); } // /** 工资单发放 end **********************************************************************/ From 91e3b335dda815fda992c3b42b1139360c20ccdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 5 Jun 2023 13:35:17 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=8D=95=E9=80=9A?= =?UTF-8?q?=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/CustomSalarySend.java | 32 +++++++ .../entity/salaryBill/bo/SalaryBillBO.java | 54 ++++++------ .../salaryBill/dto/SalaryBillSendDTO.java | 7 +- .../salaryBill/po/SalaryTemplatePO.java | 13 ++- .../enums/salarybill/MessageChannelEnum.java | 73 ++++++++++++++++ .../salarybill/SalaryTemplateMapper.xml | 18 ++++ .../service/impl/SalaryBillServiceImpl.java | 87 ++++++++----------- .../service/impl/SalarySendServiceImpl.java | 68 +++------------ .../salary/wrapper/SalarySendWrapper.java | 3 +- .../wrapper/proxy/SalarySendWrapperProxy.java | 34 ++++++++ 10 files changed, 251 insertions(+), 138 deletions(-) create mode 100644 src/com/customization/salary/CustomSalarySend.java create mode 100644 src/com/engine/salary/enums/salarybill/MessageChannelEnum.java create mode 100644 src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java diff --git a/src/com/customization/salary/CustomSalarySend.java b/src/com/customization/salary/CustomSalarySend.java new file mode 100644 index 000000000..4570f5d9c --- /dev/null +++ b/src/com/customization/salary/CustomSalarySend.java @@ -0,0 +1,32 @@ +package com.customization.salary; + +import com.engine.core.cfg.annotation.ServiceDynamicProxy; +import com.engine.core.impl.aop.AbstractServiceProxy; +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +import com.engine.salary.entity.salaryBill.param.SalarySendWithdrawParam; +import com.engine.salary.wrapper.SalarySendWrapper; +import com.engine.salary.wrapper.proxy.SalarySendWrapperProxy; +import weaver.general.BaseBean; + +import java.util.Map; + +@ServiceDynamicProxy(target = SalarySendWrapper.class, desc = "薪资核算") +public class CustomSalarySend extends AbstractServiceProxy implements SalarySendWrapperProxy { + @Override + public Map grant(SalarySendGrantParam queryParam) { + BaseBean baseBean = new BaseBean(); + baseBean.writeLog("拦截工资单发送方法..."); + + //todo do some thing + + Object o = executeMethod(queryParam); + + //todo do some thing + return (Map)o; + } + + @Override + public Map withdraw(SalarySendWithdrawParam queryParam) { + return null; + } +} diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index d71419ae8..553f67d16 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -7,7 +7,9 @@ import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryBill.dto.SalaryBillSendDTO; 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; @@ -94,18 +96,20 @@ public class SalaryBillBO { /** * 构建工资单中的人员信息 * - * @param employeeInformation * @param simpleEmployee - * @param employeeField */ - public static void buildEmployeeInfo(SalaryTemplateSalaryItemSetListDTO employeeInformation, DataCollectionEmployee simpleEmployee, Map employeeField) { + public static void buildEmployeeInfo(SalaryBillSendDTO salaryBillSendParam, DataCollectionEmployee simpleEmployee) { + + SalaryTemplateSalaryItemSetListDTO employeeInformation = salaryBillSendParam.getEmployeeInformation(); + Map 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("axx") + .taxAgentName(salaryBillSendParam.getTaxAgentName()) .departmentName(simpleEmployee.getDepartmentName()) .email(org.apache.commons.lang3.StringUtils.isEmpty(simpleEmployee.getEmail()) ? "" : simpleEmployee.getEmail()) // .gradeName(simpleEmployee.getGrade() == null ? "" : simpleEmployee.getGrade().getName()) @@ -200,7 +204,7 @@ public class SalaryBillBO { // 消息接收者 String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); String emailContent = SalaryBillBO.buildEmailContent(e, salaryBillSendParam); - MessageUtil.sendEmail(receivers,salaryBillSendParam.getText(),emailContent); + MessageUtil.sendEmail(receivers, salaryBillSendParam.getText(), emailContent); } // /** @@ -251,26 +255,26 @@ public class SalaryBillBO { // } // return user; // } -// -// /** -// * 构建发送通道 -// * -// * @param salaryTemplate -// * @return -// */ -// public static Set buildSendChannels(SalaryTemplatePO salaryTemplate) { -// Set channels = new HashSet<>(); -// if (salaryTemplate.getEmailStatus() != null && salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) { -// channels.add(MessageChannelEnum.EMAIL); -// } -// if (salaryTemplate.getImStatus() != null && salaryTemplate.getImStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) { -// channels.add(MessageChannelEnum.IM); -// } -// if (salaryTemplate.getCloudBridgeStatus() != null && salaryTemplate.getCloudBridgeStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())) { -// channels.add(MessageChannelEnum.CLOUD_BRIDGE); -// } -// return channels; -// } + + /** + * 构建发送通道 + * + * @param salaryTemplate + * @return + */ + public static Set buildSendChannels(SalaryTemplatePO salaryTemplate) { + Set 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; + } // // /** // * 构建实体 diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java index 39403fb18..6e246f13d 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java @@ -2,6 +2,7 @@ package com.engine.salary.entity.salaryBill.dto; import com.engine.salary.entity.salaryBill.po.SalarySendPO; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.enums.salarybill.MessageChannelEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -36,7 +37,7 @@ public class SalaryBillSendDTO { private String entityName; @ApiModelProperty("发送通道") - private Set sendChannels; + private Set sendChannels; @ApiModelProperty("发送者") private User sendUser; @@ -50,8 +51,8 @@ public class SalaryBillSendDTO { @ApiModelProperty("云桥工资单消息图") private String picUrl; - @ApiModelProperty("租户名") - private String tenantName; + @ApiModelProperty("扣缴义务人名称") + private String taxAgentName; @ApiModelProperty("工资单模板-薪资项目设置") private List salaryItemSetList; diff --git a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java index de19e6af6..2cfa80624 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java @@ -47,19 +47,26 @@ public class SalaryTemplatePO { private String description; /** - * 邮箱开启状态。0:关、1:开 + * 消息中心开启状态。0:关、1:开 ,默认开启 + */ + private Integer msgStatus; + + /** + * 邮箱开启状态。0:关、1:开,默认关闭 */ private Integer emailStatus; + /** * 发送地址:公共邮箱账号id */ private Long sendEmailId; + /** - * 消息中心开启状态。0:关、1:开 + * 短信开启状态。0:关、1:开,默认关闭 */ - private Integer msgStatus; + private Integer smsStatus; /** * 主题 diff --git a/src/com/engine/salary/enums/salarybill/MessageChannelEnum.java b/src/com/engine/salary/enums/salarybill/MessageChannelEnum.java new file mode 100644 index 000000000..164d0e168 --- /dev/null +++ b/src/com/engine/salary/enums/salarybill/MessageChannelEnum.java @@ -0,0 +1,73 @@ +package com.engine.salary.enums.salarybill; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Arrays; + +/** + * 消息通道 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public enum MessageChannelEnum implements BaseEnum { + + MSG(0, "系统消息", 93212), + EMAIL(1, "邮件", 93286), + SMS(2, "短信", 93287); + + private int value; + + private String defaultLabel; + + private int labelId; + + MessageChannelEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + public static String getDefaultLabelByValue(Integer value) { + if (value == null) { + return ""; + } + MessageChannelEnum[] enumAry = MessageChannelEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (Integer.valueOf(enumAry[i].getValue()).equals(value)) { + return enumAry[i].getDefaultLabel(); + } + } + return ""; + } + + public static String getNameByValue(Integer value) { + if (value == null) { + return ""; + } + MessageChannelEnum[] enumAry = MessageChannelEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (Integer.valueOf(enumAry[i].getValue()).equals(value)) { + return enumAry[i].name(); + } + } + return ""; + } +} diff --git a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml index 0c103ca79..580cdc5b8 100644 --- a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml @@ -9,6 +9,7 @@ + @@ -37,6 +38,7 @@ , t.use_type , t.description , t.email_status + , t.sms_status , t.send_email_id , t.msg_status , t.theme @@ -61,6 +63,7 @@ use_type, description, email_status, + sms_status, send_email_id, msg_status, theme, @@ -352,6 +355,9 @@ email_status=#{emailStatus}, + + sms_status=#{smsStatus}, + send_email_id=#{sendEmailId}, @@ -433,6 +439,9 @@ msg_status, + + sms_status, + theme, @@ -504,6 +513,9 @@ #{msgStatus}, + + #{smsStatus}, + #{theme}, @@ -585,6 +597,9 @@ msg_status, + + sms_status, + theme, @@ -656,6 +671,9 @@ #{msgStatus}, + + #{smsStatus}, + #{theme}, diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index cfce8e6a3..f87cef9e8 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -18,8 +18,9 @@ import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.salarybill.MessageChannelEnum; import com.engine.salary.enums.salarybill.SalarySendStatusEnum; -import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salarybill.SalarySendInfoMapper; import com.engine.salary.mapper.salarybill.SalarySendMapper; @@ -34,7 +35,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; -import weaver.common.MessageUtil; import weaver.hrm.User; import java.time.LocalDateTime; @@ -122,15 +122,16 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送")); } SalaryTemplatePO salaryTemplate = salaryTemplates.get(0); + // 发送通道 -// Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); -// if (CollectionUtils.isEmpty(sendChannels)) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(149767, "工资单模板至少开启一个发送通道")); -// } -// boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySend.getSalaryAcctType()); -// if (isReplenish && StringUtils.isEmpty(salaryTemplate.getReplTheme())) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(204428, "请完善补发工资单模板设置")); -// } + Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); + if (CollectionUtils.isEmpty(sendChannels)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(149767, "工资单模板至少开启一个发送通道")); + } + boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySend.getSalaryAcctType()); + if (isReplenish && StringUtils.isEmpty(salaryTemplate.getReplenishName())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(204428, "请完善补发工资单模板设置")); + } // 2.检查是否正在发送中 // SalaryBillProgressDTO salaryBillProgress = salaryBillProgressService.getProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + param.getSalarySendId()); // if (Objects.nonNull(salaryBillProgress) && salaryBillProgress.isStatus() @@ -148,7 +149,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService LocalRunnable localRunnable = new LocalRunnable() { @Override public void execute() { - handleGrant(salarySend, ids, salarySob, salaryTemplate, "tenantName"); + handleGrant(salarySend, ids, salarySob, salaryTemplate); } }; ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGrant", localRunnable); @@ -164,27 +165,21 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * @param ids * @param salarySob * @param salaryTemplate - * @param tenantName */ - private void handleGrant(SalarySendPO salarySend, List ids, SalarySobPO salarySob, SalaryTemplatePO salaryTemplate, String tenantName) { + private void handleGrant(SalarySendPO salarySend, List ids, SalarySobPO salarySob, SalaryTemplatePO salaryTemplate) { try { - long l = System.currentTimeMillis(); - // 开启分权或且是非薪酬模块总管理员且发送全部,谁能进来就是能看全部 - // ids = getIdsForDevolution(salarySend, ids); -// List incomeCategorys = salarySob == null || salarySob.getIncomeCategory() == null ? Lists.newArrayList() : JsonUtil.parseList(salarySob.getIncomeCategory(), String.class); - // 邮箱打开 - boolean isEnableEmail = MessageUtil.checkSendEmail() && salaryTemplate.getEmailStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue()); + + TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySob.getTaxAgentId()); // 1.构建发送参数 - SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, null, salarySob, tenantName, salaryTemplate, true); + SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, null, salarySob, taxAgentPO.getName(), salaryTemplate, true); // 2.获取可发送的列表,此步最耗时,需要解密核算数据 - long l2 = System.currentTimeMillis(); List> enableSendList = getEnableSendList(salarySend, ids, null, true); - long l3 = System.currentTimeMillis(); + // 3.发送消息:先修改数据再发消息,避免出错后无法撤回 List successIds = sendMessage(enableSendList, salaryBillSendParam); - long l4 = System.currentTimeMillis(); + LocalDateTime sendTime = LocalDateTime.now(); // 4.发放 @@ -192,7 +187,6 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 5.更新数量 // updateSendNum(salarySend, salarySob, sendTime, SalaryI18nUtil.getI18nLabel(93215, "工资单发放")); - long l5 = System.currentTimeMillis(); int total = enableSendList.size(); int successCount = successIds.size(); @@ -218,32 +212,24 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * @param salarySend * @param incomeCategorys * @param salarySob - * @param tenantName + * @param taxAgentName * @param salaryTemplate * @param isEnableEmail * @return */ - private SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, List incomeCategorys, SalarySobPO salarySob, String tenantName, SalaryTemplatePO salaryTemplate, boolean isEnableEmail) { - String currentTenantKey = salarySend.getTenantKey(); - // 云桥发送控制 -// salaryTemplate.setCloudBridgeStatus(getSalaryTemplateService(user).isEnableEbridge(currentTenantKey) ? salaryTemplate.getCloudBridgeStatus() : SalaryTemplateWhetherEnum.FALSE.getValue()); + private SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, List incomeCategorys, SalarySobPO salarySob, String taxAgentName, SalaryTemplatePO salaryTemplate, boolean isEnableEmail) { // 发送通道 -// Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); - // 空的发个毛线 -// if (CollectionUtils.isEmpty(sendChannels)) { -// return null; -// } -// List salarySobItems = salarySobItemService.listBySalarySobId(salarySob == null ? 0L : salarySob.getId()); -// Map salaryItemIncomeCategoryMap = SalaryEntityUtil.convert2Map(salarySobItems, -// salarySobItemPO -> salarySobItemPO.getSalaryItemId().toString(), SalarySobItemPO::getIncomeCategory); - + Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); + if (CollectionUtils.isEmpty(sendChannels)) { + return null; + } Date salaryMonth = salarySend.getSalaryMonth(); boolean isReplenish = NumberUtils.INTEGER_ONE.equals(salarySend.getSalaryAcctType()); // SalaryTemplateBO.copyShowSet(isReplenish, salaryTemplate); // 消息标题 - String title = SalaryBillBO.getBillTitle(salaryTemplate.getTheme(), salaryMonth, tenantName); + String title = SalaryBillBO.getBillTitle(salaryTemplate.getTheme(), salaryMonth, taxAgentName); // 云桥企业微信消息图 String domain = ""; @@ -261,8 +247,6 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 工资单预览实体名 String entityName = SalaryI18nUtil.getI18nLabel(94626, "工资单"); - User sendUser = null; - // 获取人员信息项目分类 List salaryItemSetList = JSONArray.parseArray(isReplenish ? salaryTemplate.getReplenishSalaryItemSetting() : salaryTemplate.getSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class); // 国际化处理 @@ -287,17 +271,17 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 工资单预览实体名 .entityName(entityName) // 发送通道 -// .sendChannels(sendChannels) + .sendChannels(sendChannels) // 发送者 - .sendUser(sendUser) + .sendUser(user) // 工资单模板 .salaryTemplate(salaryTemplate) // 工资单背景图base64编码 .backgroundBase64(backgroundBase64) // 云桥工资单消息图 .picUrl(picUrl) - // 租户名 - .tenantName(tenantName) + // 扣缴义务人名称 + .taxAgentName(taxAgentName) // 工资单模板-薪资项目设置 .salaryItemSetList(salaryItemSetList) // 工资单模板-员工基本信息 @@ -401,6 +385,8 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService return enableSendList.stream().map(e -> Long.valueOf(e.get("id").toString())).collect(Collectors.toList()); } + Set sendChannels = salaryBillSendParam.getSendChannels(); + // 获取人员完整信息 Map allEmployeeMap = this.getEmployeeWholeInfo(enableSendList); @@ -409,10 +395,13 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService AtomicInteger part = new AtomicInteger(0); int total = enableSendList.size(); enableSendList.forEach(e -> { - // 构建发送消息 -// SendMessageEntity message = SalaryBillBO.buildSendMessage(e, allEmployeeMap, salaryBillSendParam); - SalaryBillBO.buildEmployeeInfo(salaryBillSendParam.getEmployeeInformation(), allEmployeeMap.get(e.get("employeeId").toString()), salaryBillSendParam.getEmployeeField()); - SalaryBillBO.sendEmail(e, allEmployeeMap, salaryBillSendParam); + + if(!sendChannels.contains(MessageChannelEnum.EMAIL)){ + // 构建发送消息 + SalaryBillBO.buildEmployeeInfo(salaryBillSendParam, allEmployeeMap.get(e.get("employeeId").toString())); + SalaryBillBO.sendEmail(e, allEmployeeMap, salaryBillSendParam); + } + /** 发送工资单 **********************************************************/ // WeaResult sendResult = asyncSystemMessageRest.sendMsg(message); // if (sendResult.isStatus()) { diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 82c9148f4..142dd839b 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -65,7 +65,6 @@ import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import weaver.common.MessageUtil; import weaver.hrm.User; import weaver.hrm.company.SubCompanyComInfo; import weaver.hrm.resource.ResourceComInfo; @@ -494,11 +493,11 @@ public class SalarySendServiceImpl extends Service implements SalarySendService encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salarySendInfo.getSalaryAcctRecordId()); - if(salaryAcctRecordPO == null){ + if (salaryAcctRecordPO == null) { throw new SalaryRunTimeException("薪资核算记录不存在!"); } - List> salaryAcctResultS =null; - if(Objects.equals(salaryAcctRecordPO.getBackCalcStatus(),NumberUtils.INTEGER_ONE) && !isReplenish){ + List> salaryAcctResultS = null; + if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE) && !isReplenish) { // 该记录回算过,并且获取的不是回算后的工资单 salaryAcctResultS = salaryAcctResultPOS.stream().map(m -> { Map map = new LinkedHashMap<>(); @@ -506,7 +505,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService map.put("resultValue", m.getOriginResultValue()); return map; }).collect(Collectors.toList()); - }else{ + } else { salaryAcctResultS = salaryAcctResultPOS.stream().map(m -> { Map map = new LinkedHashMap<>(); map.put("salaryItemId", m.getSalaryItemId()); @@ -1027,10 +1026,6 @@ public class SalarySendServiceImpl extends Service implements SalarySendService */ private void sendPayRollEMMessage(SalarySendInfoPO po, SalaryTemplatePO template, Long employeeId) { - - boolean canSendSms = MessageUtil.checkSendSMS(); - boolean canSendEmail = MessageUtil.checkSendEmail(); - // try { // MessageUtil.sendSMS(mobile, content); // } catch (Exception e) { @@ -1172,6 +1167,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService Long salarySendId = param.getSalarySendId(); Collection ids = param.getIds(); + // 获取可撤回的工资单 if (param.getSalarySendRangeIds() != null) { //如果传了范围id,则使用范围id撤回 ids = getSalarySendRangeService(user) @@ -1185,33 +1181,14 @@ public class SalarySendServiceImpl extends Service implements SalarySendService if (salarySend == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); } -// // 获取可撤回的工资单 -// List enableWithdrawList = new LambdaQueryChainWrapper<>(salarySendInfoMapper) -// .eq(SalarySendInfoPO::getDeleteType, 0) -// .eq(SalarySendInfoPO::getTenantKey, currentTenantKey) -// .eq(SalarySendInfoPO::getSalarySendId, salarySendId) -// .eq(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) -// .in(CollectionUtils.isNotEmpty(ids), SalarySendInfoPO::getId, ids) -// .list(); + // 撤回 -// new LambdaUpdateChainWrapper<>(salarySendInfoMapper) -// .eq(SalarySendInfoPO::getDeleteType, 0) -// .eq(SalarySendInfoPO::getSalarySendId, salarySendId) -// .eq(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) -// .in(CollectionUtils.isNotEmpty(ids), SalarySendInfoPO::getId, ids) -// .set(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.WITHDRAW.getValue()) -// .update(); SalarySendInfoPO po = new SalarySendInfoPO(); po.setSendStatus(SalarySendStatusEnum.WITHDRAW.getValue()); - List statusList = new ArrayList<>(); statusList.add(SalarySendStatusEnum.ALREADYSEND.getValue()); salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, statusList, ids); -// List list = new LambdaQueryChainWrapper<>(salarySendInfoMapper) -// .eq(SalarySendInfoPO::getDeleteType, 0) -// .eq(SalarySendInfoPO::getTenantKey, currentTenantKey) -// .eq(SalarySendInfoPO::getSalarySendId, salarySendId).list(); po = new SalarySendInfoPO(); po.setDeleteType(0); @@ -1231,11 +1208,6 @@ public class SalarySendServiceImpl extends Service implements SalarySendService salarySendNew.setSendTotal(sendTotal); mapper.updateById(salarySendNew); -// List salarySobs = new LambdaQueryChainWrapper<>(salarySobMapper) -// .eq(SalarySobPO::getTenantKey, TenantContext.getCurrentTenantKey()) -// .eq(SalarySobPO::getDeleteType, 0) -// .eq(SalarySobPO::getId, salarySend.getSalarySobId()) -// .list(); // 记录日志 // SalaryLoggerUtil.recordUpdateSingleLog(salarySendLoggerTemplate, // salarySend.getId(), @@ -1247,28 +1219,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService SalarySendGrantParam grantParam = SalarySendGrantParam.builder().ids(param.getIds()).salarySendId(param.getSalarySendId()).build(); - // 撤回消息 + + // 异步发送消息:先修改数据再发消息,避免出错后无法撤回撤回消息 sendMessage(false, list, grantParam, salarySend); -// // 3.异步发送消息:先修改数据再发消息,避免出错后无法撤回 -// taskExecutor.execute(() -> { -// try { -// DSTenantKeyThreadVar.tenantKey.set(currentTenantKey); -// -// String text = "工资单撤回测试消息文案,不好意思,弄错了"; -// String title = SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 94626, "工资单"); -// enableWithdrawList.forEach(e->{ -// CancleMessageEntity cme = SalarySendBO.buildCancleMessageEntity(e.getEmployeeId(), -// e.getMsgId(), -// text, -// title, -// currentEmployeeId, -// currentTenantKey); -// log.info("撤回结果===:{}", JsonUtil.toJsonString(asyncSystemMessageRest.cancleMsg(cme))); -// }); -// } finally { -// DSTenantKeyThreadVar.tenantKey.remove(); -// } -// }); + Map map = new HashMap<>(2); map.put("sendNum", sendNum); @@ -1447,7 +1401,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService // 查询薪资核算所用薪资账套的薪资项目 List salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); - if(Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE)){ + if (Objects.equals(salaryAcctRecordPO.getBackCalcStatus(), NumberUtils.INTEGER_ONE)) { // 是回算,获取回算项 List salarySobBackItemPOS = getSalarySobBackItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); salaryItemIds.addAll(salarySobBackItemPOS.stream().map(SalarySobBackItemPO::getSalaryItemId).collect(Collectors.toList())); @@ -1479,7 +1433,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService @Override public void deleteBySalaryAcctRecordIds(Collection ids) { - if(CollectionUtils.isNotEmpty(ids)){ + if (CollectionUtils.isNotEmpty(ids)) { getSalarySendMapper().deleteBySalaryAcctRecordIds(ids); getSalarySendInfoMapper().deleteBySalaryAcctRecordIds(ids); } diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 37896c483..2f4a79838 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -31,6 +31,7 @@ import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; +import com.engine.salary.wrapper.proxy.SalarySendWrapperProxy; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; @@ -49,7 +50,7 @@ import java.util.stream.Collectors; * @Author: wangxiangzhong * @Date: 2022/3/16 13:57 */ -public class SalarySendWrapper extends Service { +public class SalarySendWrapper extends Service implements SalarySendWrapperProxy { private TaxAgentService getTaxAgentService(User user) { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } diff --git a/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java b/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java new file mode 100644 index 000000000..df063f4cd --- /dev/null +++ b/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java @@ -0,0 +1,34 @@ +package com.engine.salary.wrapper.proxy; + +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +import com.engine.salary.entity.salaryBill.param.SalarySendWithdrawParam; + +import java.util.Map; + +/** + * 工资单发放代理 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public interface SalarySendWrapperProxy { + + /** + * 工资单发放 + * + * @param queryParam + * @return + */ + Map grant(SalarySendGrantParam queryParam); + + /** + * 工资单撤回 + * + * @param queryParam + * @return + */ + Map withdraw(SalarySendWithdrawParam queryParam); + +} From 4582ab1e51611b818de24ede15d46e074ad8c8c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Jun 2023 09:51:07 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/salaryBill/bo/SalaryBillBO.java | 85 +++++++- .../salaryBill/dto/SalaryBillSendDTO.java | 55 ++--- .../param/SalarySendGrantParam.java | 3 +- .../param/SalarySendWithdrawParam.java | 28 +-- .../salary/service/SalaryBillService.java | 6 +- .../service/impl/SalaryBillServiceImpl.java | 190 +++++++++--------- .../service/impl/SalarySendServiceImpl.java | 7 +- 7 files changed, 218 insertions(+), 156 deletions(-) diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index 553f67d16..c2b3a6c58 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -1,5 +1,8 @@ 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; @@ -20,10 +23,14 @@ 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.LocalDateTime; import java.util.*; @@ -161,17 +168,28 @@ public class SalaryBillBO { /** * 获取工资单标题 * - * @param theme - * @param salaryMonth - * @param tenantName * @return */ - public static String getBillTitle(String theme, Date salaryMonth, String tenantName) { - String yearI18n = SalaryI18nUtil.getI18nLabel(100325, "年"); - String monthI18n = SalaryI18nUtil.getI18nLabel(100326, "月"); + 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}", tenantName) - .replace("${salaryMonth}", salaryMonth.getYear() + yearI18n + salaryMonth.getMonth() + monthI18n); + .replace("${companyName}", companyName) + .replace("${salaryMonth}", new SimpleDateFormat("yyyy年MM月").format(salaryMonth)); } // /** @@ -199,12 +217,58 @@ public class SalaryBillBO { // 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 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 e, Map allEmployeeMap, SalaryBillSendDTO salaryBillSendParam) { // 消息接收者 String receivers = Optional.ofNullable(e.get("email")).orElse("").toString(); + String title = getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString())); String emailContent = SalaryBillBO.buildEmailContent(e, salaryBillSendParam); - MessageUtil.sendEmail(receivers, salaryBillSendParam.getText(), emailContent); + if (StringUtils.isNotBlank(receivers)) { + MessageUtil.sendEmail(receivers, title, emailContent); + } + } + + + 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); +// } } // /** @@ -360,7 +424,8 @@ public class SalaryBillBO { emailContent.append("
"); // 1.标题 emailContent.append("
"); - emailContent.append(salaryBillSendParam.getTitle()); +// emailContent.append(salaryBillSendParam.getTitle()); + emailContent.append(getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), (Long) e.get("employeeId"))); emailContent.append("
"); // 2.发送时间 emailContent.append("
"); diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java index 6e246f13d..bbfb6d5b7 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillSendDTO.java @@ -3,78 +3,85 @@ package com.engine.salary.entity.salaryBill.dto; import com.engine.salary.entity.salaryBill.po.SalarySendPO; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; import com.engine.salary.enums.salarybill.MessageChannelEnum; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import weaver.hrm.User; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; /** - * @Description: 工资单发放信息 - * @Author: wangxiangzhong - * @Date: 2021/12/14 14:02 - */ + * 工资单发放信息 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ @Data @Builder @NoArgsConstructor @AllArgsConstructor -@ApiModel("工资单发放信息") +//工资单发放信息 public class SalaryBillSendDTO { - @ApiModelProperty("消息标题") + /** + * 薪资所属月 + */ + private Date salaryDate; + + //消息标题 private String title; - @ApiModelProperty("消息内容") + //消息内容 private String text; - @ApiModelProperty("工资单预览实体名") + //工资单预览实体名 private String entityName; - @ApiModelProperty("发送通道") + //发送通道 private Set sendChannels; - @ApiModelProperty("发送者") + //发送者 private User sendUser; - @ApiModelProperty("工资单模板") + //工资单模板 private SalaryTemplatePO salaryTemplate; - @ApiModelProperty("工资单背景图base64编码") + //工资单背景图base64编码 private String backgroundBase64; - @ApiModelProperty("云桥工资单消息图") + //云桥工资单消息图 private String picUrl; - @ApiModelProperty("扣缴义务人名称") + //扣缴义务人名称 private String taxAgentName; - @ApiModelProperty("工资单模板-薪资项目设置") + //工资单模板-薪资项目设置 private List salaryItemSetList; - @ApiModelProperty("工资单模板-员工基本信息") + //工资单模板-员工基本信息 private SalaryTemplateSalaryItemSetListDTO employeeInformation; - @ApiModelProperty("工资单模板-对应人员字段") + //工资单模板-对应人员字段 private Map employeeField; - @ApiModelProperty("工资单模板-发放说明标签国际化") + //工资单模板-发放说明标签国际化 private String remarkI18n; - @ApiModelProperty("邮件是否可以发送邮件") + //邮件是否可以发送邮件 private boolean isEnableEmail; - @ApiModelProperty("工资单发放") + //工资单发放 private SalarySendPO salarySend; - @ApiModelProperty("收入所得项目类型") + //收入所得项目类型 private List incomeCategorys; - @ApiModelProperty("薪资项目收入所得类型") + //薪资项目收入所得类型 private Map salaryItemIncomeCategoryMap; } diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java index 3e6b4c7dd..dfabe74d5 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java @@ -7,7 +7,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Collection; import java.util.List; /** @@ -23,7 +22,7 @@ import java.util.List; public class SalarySendGrantParam { // 主键id - private Collection ids; + private List ids; // 工资单发放Id private Long salarySendId; diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java index af1fcedd9..e9b4caabd 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java @@ -1,39 +1,33 @@ package com.engine.salary.entity.salaryBill.param; -import com.engine.salary.exception.SalaryRunTimeException; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Collection; import java.util.List; /** - * @Description: 工资单撤回参数 - * @Author: wangxiangzhong - * @Date: 2021/12/13 16:18 - */ + * 工资单发送参数 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ @Data @Builder @NoArgsConstructor @AllArgsConstructor -////"工资单撤回参数") public class SalarySendWithdrawParam { -// 主键id") - private Collection ids; + // 主键id") + private List ids; -// 工资单发放Id") + // 工资单发放Id") private Long salarySendId; + //发送范围 private List salarySendRangeIds; - public static String checkParam(SalarySendWithdrawParam param, Long employeeId, String tenantKey) { - if (param.getSalarySendId() == null) { - throw new SalaryRunTimeException("工资单发放Id必传"); - } - - return ""; - } } diff --git a/src/com/engine/salary/service/SalaryBillService.java b/src/com/engine/salary/service/SalaryBillService.java index 29e4cb4d8..00caeb1ee 100644 --- a/src/com/engine/salary/service/SalaryBillService.java +++ b/src/com/engine/salary/service/SalaryBillService.java @@ -2,8 +2,6 @@ package com.engine.salary.service; import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; -import java.util.List; - /** * @Description: 工资单 * @Author: wangxiangzhong @@ -15,10 +13,8 @@ public interface SalaryBillService { * 工资单发放 * * @param queryParam - * @param isRange - * @param rangeIds */ - void grant(SalarySendGrantParam queryParam, boolean isRange, List rangeIds); + void grant(SalarySendGrantParam queryParam); /** * 工资单撤回 diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index f87cef9e8..2bcd09c4d 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONArray; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.biz.SalarySendBiz; +import com.engine.salary.biz.SalarySendInfoBiz; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryBill.bo.SalaryBillBO; import com.engine.salary.entity.salaryBill.bo.SalaryTemplateBO; @@ -21,10 +23,12 @@ import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.salarybill.MessageChannelEnum; import com.engine.salary.enums.salarybill.SalarySendStatusEnum; +import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; 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.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.google.common.collect.Lists; @@ -32,12 +36,13 @@ import com.weaver.util.threadPool.ThreadPoolUtil; import com.weaver.util.threadPool.constant.ModulePoolEnum; import com.weaver.util.threadPool.entity.LocalRunnable; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; -import java.time.LocalDateTime; +import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -96,6 +101,8 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } + private SalarySendInfoBiz salarySendInfoMapper = new SalarySendInfoBiz(); + private SalarySendBiz mapper = new SalarySendBiz(); private SalaryEmployeeService salaryEmployeeService; @@ -108,7 +115,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * 工资单发放 start **********************************************************************/ @Override - public void grant(SalarySendGrantParam param, boolean isRange, List rangeIds) { + public void grant(SalarySendGrantParam param) { // 1.检查和获取工资单发放 SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId()); // // 已经冻结不能操作 @@ -143,18 +150,28 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), initProgress); // String tenantName = TenantContext.getCurrentTenant().getTenantName(); -// List ids = isRange ? getSalarySendRangeService(user).getSendInfoIdsBySalarySendIdAndOperateType(param.getSalarySendId(), rangeIds, SalarySendOperateTypeEnum.GRANT) : param.getIds(); - List ids = (List) param.getIds(); + List ids = param.getIds(); + + if (param.getSalarySendRangeIds() != null) { + //如果传了范围id,则使用范围id发放 + ids = getSalarySendRangeService(user) + .getSendInfoIdsBySendId(salarySend.getId(), param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); + if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 + throw new SalaryRunTimeException("工资发放范围内没有匹配员工"); + } + } // 异步执行 + List finalIds = ids; LocalRunnable localRunnable = new LocalRunnable() { @Override public void execute() { - handleGrant(salarySend, ids, salarySob, salaryTemplate); + handleGrant(salarySend, finalIds, salarySob, salaryTemplate); } }; ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGrant", localRunnable); } + /** * 处理发送 * 注意: @@ -172,21 +189,19 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySob.getTaxAgentId()); // 1.构建发送参数 - SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, null, salarySob, taxAgentPO.getName(), salaryTemplate, true); + SalaryBillSendDTO salaryBillSendParam = buildSendParams(salarySend, taxAgentPO.getName(), salaryTemplate); // 2.获取可发送的列表,此步最耗时,需要解密核算数据 - List> enableSendList = getEnableSendList(salarySend, ids, null, true); + List> enableSendList = getEnableSendList(salarySend, ids, salaryBillSendParam); // 3.发送消息:先修改数据再发消息,避免出错后无法撤回 List successIds = sendMessage(enableSendList, salaryBillSendParam); - LocalDateTime sendTime = LocalDateTime.now(); - // 4.发放 -// grantSendInfo(successIds, salarySend, sendTime, salaryTemplate); + grantSendInfo(successIds, salarySend, salaryTemplate); // 5.更新数量 -// updateSendNum(salarySend, salarySob, sendTime, SalaryI18nUtil.getI18nLabel(93215, "工资单发放")); + updateSendNum(salarySend, salarySob); int total = enableSendList.size(); int successCount = successIds.size(); @@ -210,14 +225,11 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * 构建发送参数 * * @param salarySend - * @param incomeCategorys - * @param salarySob * @param taxAgentName * @param salaryTemplate - * @param isEnableEmail * @return */ - private SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, List incomeCategorys, SalarySobPO salarySob, String taxAgentName, SalaryTemplatePO salaryTemplate, boolean isEnableEmail) { + private SalaryBillSendDTO buildSendParams(SalarySendPO salarySend, String taxAgentName, SalaryTemplatePO salaryTemplate) { // 发送通道 Set sendChannels = SalaryBillBO.buildSendChannels(salaryTemplate); if (CollectionUtils.isEmpty(sendChannels)) { @@ -229,7 +241,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // SalaryTemplateBO.copyShowSet(isReplenish, salaryTemplate); // 消息标题 - String title = SalaryBillBO.getBillTitle(salaryTemplate.getTheme(), salaryMonth, taxAgentName); +// String title = SalaryBillBO.getBillTitle(salaryTemplate.getTheme(), salaryMonth, 0L); // 云桥企业微信消息图 String domain = ""; @@ -264,10 +276,11 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService } return SalaryBillSendDTO.builder() + .salaryDate(salaryMonth) // 消息标题 - .title(title) +// .title(title) // 消息内容:目前跟title一样 - .text(title) +// .text(title) // 工资单预览实体名 .entityName(entityName) // 发送通道 @@ -291,7 +304,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 工资单模板-发放说明标签国际化 .remarkI18n(remarkI18n) // 邮件是否可以发送邮件 - .isEnableEmail(isEnableEmail) +// .isEnableEmail(isEnableEmail) // 工资单发放 .salarySend(salarySend) // 收入所得项目类型 @@ -306,11 +319,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * * @param salarySend * @param ids - * @param incomeCategorys - * @param isEnableEmail * @return */ - private List> getEnableSendList(SalarySendPO salarySend, List ids, List incomeCategorys, boolean isEnableEmail) { + private List> getEnableSendList(SalarySendPO salarySend, List ids, SalaryBillSendDTO salaryBillSendParam) { SalarySendInfoQueryParam queryParam = new SalarySendInfoQueryParam(); queryParam.setSalarySendId(salarySend.getId()); // 空就是所有 @@ -344,6 +355,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // 获取薪资项目数据 List salaryAcctEmployees = Lists.newArrayList(); List salaryAcctResultValues = Lists.newArrayList(); + + //是否需要发送邮件 + Boolean isEnableEmail = salaryBillSendParam.getSendChannels().contains(MessageChannelEnum.EMAIL); if (CollectionUtils.isNotEmpty(ids)) { int partSize = 100;// 分片大小,越小进度条跑得越短平快,但是总体速度更慢 List> partition = Lists.partition(employeeIds, partSize); @@ -396,21 +410,22 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService int total = enableSendList.size(); enableSendList.forEach(e -> { - if(!sendChannels.contains(MessageChannelEnum.EMAIL)){ + if (sendChannels.contains(MessageChannelEnum.MSG)) { + SalaryBillBO.sendMsg(salaryBillSendParam, Long.valueOf(e.get("id").toString()) , Long.valueOf( e.get("employeeId").toString())); + } + + if (sendChannels.contains(MessageChannelEnum.EMAIL)) { // 构建发送消息 SalaryBillBO.buildEmployeeInfo(salaryBillSendParam, allEmployeeMap.get(e.get("employeeId").toString())); SalaryBillBO.sendEmail(e, allEmployeeMap, salaryBillSendParam); } + /** 发送工资单 **********************************************************/ -// WeaResult sendResult = asyncSystemMessageRest.sendMsg(message); -// if (sendResult.isStatus()) { -// sendInfoUpdateList.add(SalarySendInfoPO.builder() -// .id(Long.valueOf(e.get("id").toString())) -// .sendMsgId(sendResult.getData()) -// .build()); -// } -// // 更新发送进度 + sendInfoUpdateList.add(SalarySendInfoPO.builder() + .id(Long.valueOf(e.get("id").toString())) + .build()); + // 更新发送进度 // index.addAndGet(1); // part.addAndGet(1); // if (index.get() % 100 == 0 || index.get() >= total) { @@ -419,12 +434,11 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // } }); // 批量修改发送消息id -// if (CollectionUtils.isNotEmpty(sendInfoUpdateList)) { -// // sqlserver数据库处理,每个分片数量约=2100/插入字段数 -// int partSize = DatabaseUtil.getDatabaseId().equalsIgnoreCase("sqlserver") ? 500 : DbCrudConstant.DEF_PART_SIZE; -// List> partition = Lists.partition(sendInfoUpdateList, partSize); + if (CollectionUtils.isNotEmpty(sendInfoUpdateList)) { + // sqlserver数据库处理,每个分片数量约=2100/插入字段数 + List> partition = Lists.partition(sendInfoUpdateList, 500); // partition.forEach(updatePart -> getSalarySendInfoMapper().batchUpdateMsgId(updatePart)); -// } + } return sendInfoUpdateList.stream().map(SalarySendInfoPO::getId).collect(Collectors.toList()); } @@ -508,30 +522,23 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // } // return ids; // } -// -// /** -// * 发放工资单更新信息 -// * -// * @param ids -// * @param salarySend -// * @param sendTime -// * @param salaryTemplate -// * @param currentTenantKey -// */ -// private void grantSendInfo(List ids, SalarySendPO salarySend, LocalDateTime sendTime, SalaryTemplatePO salaryTemplate) { -// List> partition = Lists.partition(ids, DbCrudConstant.DEF_PART_SIZE); -// partition.forEach(part -> new LambdaUpdateChainWrapper<>(getSalarySendInfoMapper()) -// .eq(SalarySendInfoPO::getDeleteType, 0) -// .eq(SalarySendInfoPO::getTenantKey) -// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()) -// .in(SalarySendInfoPO::getSendStatus, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue())) -// .in(SalarySendInfoPO::getId, part) -// .set(SalarySendInfoPO::getSendStatus, SalarySendStatusEnum.ALREADYSEND.getValue()) -// .set(SalarySendInfoPO::getSendTime, sendTime) -// .set(SalarySendInfoPO::getSalaryTemplate, JsonUtil.toJsonString(salaryTemplate)) -// .update()); -// } -// + + /** + * 发放工资单更新信息 + * + * @param ids + * @param salarySend + * @param salaryTemplate + */ + private void grantSendInfo(List ids, SalarySendPO salarySend, SalaryTemplatePO salaryTemplate) { + Date sendTime = new Date(); + SalarySendInfoPO po = new SalarySendInfoPO(); + po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); + po.setSendTime(sendTime); + po.setSalaryTemplate(JsonUtil.toJsonString(salaryTemplate)); + salarySendInfoMapper.updateGrantWithdraw(po, salarySend.getId(), Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); + } + // /** // * 撤回工资单更新信息 // * @@ -551,42 +558,33 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // .update()); // } // -// /** -// * 更新发送数量 -// * -// * @param salarySend -// * @param salarySob -// * @param lastSendTime -// * @param operateTypeName -// * @param currentTenantKey -// */ -// private void updateSendNum(SalarySendPO salarySend, SalarySobPO salarySob, LocalDateTime lastSendTime, String operateTypeName) { -// List list = new LambdaQueryChainWrapper<>(getSalarySendInfoMapper()) -// /** 注意:需要啥就加载啥,避免加载大字段salaryTemplate */ -// .select(SalarySendInfoPO::getId, SalarySendInfoPO::getSendStatus) -// .eq(SalarySendInfoPO::getDeleteType, 0) -// .eq(SalarySendInfoPO::getTenantKey) -// .eq(SalarySendInfoPO::getSalarySendId, salarySend.getId()).list(); -// int sendNum = (int) list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).count(); -// int sendTotal = list.size(); -// SalarySendPO salarySendNew = new SalarySendPO(); -// BeanUtils.copyProperties(salarySend, salarySendNew); -// salarySendNew.setSendNum(sendNum); -// salarySendNew.setSendTotal(sendTotal); -// if (lastSendTime != null) { -// salarySendNew.setLastSendTime(lastSendTime); -// } -// getSalarySendMapper().updateById(salarySendNew); -// // 记录日志 -// SalaryLoggerUtil.recordUpdateSingleLog(salarySendLoggerTemplate, -// salarySend.getId(), -// salarySend.getSalaryMonth() + "-" + (salarySob == null ? "" : salarySob.getName()), -// operateTypeName, -// operateTypeName, -// salarySend, -// salarySendNew); -// } -// + + /** + * 更新发送数量 + * + * @param salarySend + * @param salarySob + */ + private void updateSendNum(SalarySendPO salarySend, SalarySobPO salarySob) { + List list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySend.getId()).build()); + List sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList()); + int sendNum = sendList.size(); + int sendTotal = list.size(); + SalarySendPO salarySendNew = new SalarySendPO(); + try { + BeanUtils.copyProperties(salarySendNew, salarySend); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + salarySendNew.setSendNum(sendNum); + salarySendNew.setSendTotal(sendTotal); + salarySendNew.setLastSendTime(new Date()); + + mapper.updateById(salarySendNew); + } + // /** // * 工资单撤回 start // **********************************************************************/ diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 142dd839b..9d6672c10 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -910,7 +910,8 @@ public class SalarySendServiceImpl extends Service implements SalarySendService @Override public Map grant(SalarySendGrantParam param) { - getSalaryBillService(user).grant(param, false, new ArrayList<>()); + getSalaryBillService(user).grant(param); + // if (param.getSalarySendId() == null) { // throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传")); // } @@ -986,10 +987,12 @@ public class SalarySendServiceImpl extends Service implements SalarySendService // param.setTemplate(templatePO); // sendMessage(true, needSendList, param, salarySend); // +// +// // Map map = new HashMap<>(2); // map.put("sendNum", sendNum); // map.put("sendTotal", sendTotal); - +// // return map; return null; } From 993db67601f123d144cb2cdcb31ed2c2fc6917ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Jun 2023 10:30:49 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E5=85=AC=E5=85=B1=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E6=9D=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 16 +-- .../ProgressDTO.java} | 17 +-- .../dto/SalaryAccResultListDTO.java | 39 ------ .../entity/salaryacct/dto/SalaryAcctDTO.java | 24 ---- .../salaryacct/SalaryAcctManager.java | 12 +- ...gressService.java => ProgressService.java} | 19 ++- .../service/impl/ProgressServiceImpl.java | 128 ++++++++++++++++++ .../impl/SalaryAcctCalculateServiceImpl.java | 4 +- .../impl/SalaryAcctProgressServiceImpl.java | 128 ------------------ .../impl/SalaryAcctResultServiceImpl.java | 8 +- .../salary/web/SalaryProgressController.java | 12 +- .../wrapper/SalaryAcctResultWrapper.java | 10 +- 12 files changed, 180 insertions(+), 237 deletions(-) rename src/com/engine/salary/entity/{salaryacct/dto/SalaryAcctProgressDTO.java => progress/ProgressDTO.java} (79%) delete mode 100644 src/com/engine/salary/entity/salaryacct/dto/SalaryAccResultListDTO.java delete mode 100644 src/com/engine/salary/entity/salaryacct/dto/SalaryAcctDTO.java rename src/com/engine/salary/service/{SalaryAcctProgressService.java => ProgressService.java} (75%) create mode 100644 src/com/engine/salary/service/impl/ProgressServiceImpl.java delete mode 100644 src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index a7dd4ed4c..6914f1b2c 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -10,7 +10,7 @@ import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; +import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.dto.SIAccountUtilDTO; import com.engine.salary.entity.siaccount.param.*; @@ -28,10 +28,10 @@ import com.engine.salary.mapper.siarchives.InsuranceBaseInfoMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.mapper.sischeme.InsuranceSchemeDetailMapper; import com.engine.salary.mapper.taxagent.TaxAgentMapper; -import com.engine.salary.service.SalaryAcctProgressService; +import com.engine.salary.service.ProgressService; import com.engine.salary.service.SalaryEmployeeService; import com.engine.salary.service.TaxAgentService; -import com.engine.salary.service.impl.SalaryAcctProgressServiceImpl; +import com.engine.salary.service.impl.ProgressServiceImpl; import com.engine.salary.service.impl.SalaryEmployeeServiceImpl; import com.engine.salary.service.impl.TaxAgentServiceImpl; import com.engine.salary.sys.entity.vo.OrderRuleVO; @@ -113,8 +113,8 @@ public class SIAccountBiz extends Service { return MapperProxyFactory.getProxy(InsuranceCompensationMapper.class); } - private SalaryAcctProgressService getSalaryAcctProgressService(User user) { - return (SalaryAcctProgressService) ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + private ProgressService getSalaryAcctProgressService(User user) { + return (ProgressService) ServiceUtil.getService(ProgressServiceImpl.class, user); } private SIAccountDetailTempMapper getSIAccountDetailTempMapper() { @@ -251,13 +251,13 @@ public class SIAccountBiz extends Service { public void accounting(AccountParam param, Long employeeId, String tenantKey, String currentUserName) { //薪资核算进度暂未实现 - SalaryAcctProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth()); + ProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth()); if (salaryAcctProgressDTO != null && salaryAcctProgressDTO.getProgress().compareTo(BigDecimal.ONE) < 0) { return; } // 初始化进度 - SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO() + ProgressDTO initProgress = new ProgressDTO() .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) .setTitleLabelId(97515L) .setTotalQuantity(NumberUtils.INTEGER_ONE) @@ -341,7 +341,7 @@ public class SIAccountBiz extends Service { //salaryAcctProgressService.initProgress(tenantKey + param.getBillMonth(), salaryAcctProgressDTO, employeeId, tenantKey); // 初始化进度 - SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO() + ProgressDTO initProgress = new ProgressDTO() .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) .setTitleLabelId(97515L) .setTotalQuantity(ids.size()) diff --git a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctProgressDTO.java b/src/com/engine/salary/entity/progress/ProgressDTO.java similarity index 79% rename from src/com/engine/salary/entity/salaryacct/dto/SalaryAcctProgressDTO.java rename to src/com/engine/salary/entity/progress/ProgressDTO.java index 7258b40a4..1401eaaef 100644 --- a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctProgressDTO.java +++ b/src/com/engine/salary/entity/progress/ProgressDTO.java @@ -1,4 +1,4 @@ -package com.engine.salary.entity.salaryacct.dto; +package com.engine.salary.entity.progress; import lombok.AllArgsConstructor; import lombok.Builder; @@ -10,18 +10,19 @@ import java.io.Serializable; import java.math.BigDecimal; /** - * @description: 核算进度 - * @author: xiajun - * @modified By: xiajun - * @date: Created in 12/13/21 1:34 PM - * @version:v1.0 - */ + * 进度 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ @Data @Builder @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor -public class SalaryAcctProgressDTO implements Serializable { +public class ProgressDTO implements Serializable { /** * 当前步骤名称 diff --git a/src/com/engine/salary/entity/salaryacct/dto/SalaryAccResultListDTO.java b/src/com/engine/salary/entity/salaryacct/dto/SalaryAccResultListDTO.java deleted file mode 100644 index f294ed26c..000000000 --- a/src/com/engine/salary/entity/salaryacct/dto/SalaryAccResultListDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -//package com.engine.salary.entity.salaryacct.dto; -// -//import com.fasterxml.jackson.databind.annotation.JsonSerialize; -//import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -//import com.weaver.hrm.salary.common.WeaTableColumnWapper; -//import io.swagger.annotations.ApiModel; -//import io.swagger.annotations.ApiModelProperty; -//import lombok.AllArgsConstructor; -//import lombok.Builder; -//import lombok.Data; -//import lombok.NoArgsConstructor; -// -//import java.util.List; -//import java.util.Map; -// -///** -// * @description: 核算结果列表 -// * @author: xiajun -// * @modified By: xiajun -// * @date: Created in 12/6/21 6:53 PM -// * @version:v1.0 -// */ -//@Data -//@Builder -//@NoArgsConstructor -//@AllArgsConstructor -////"核算结果列表") -//public class SalaryAccResultListDTO { -// -// //动态表头") -// private List columns; -// -// //列表数据") -// private List> data; -// -// @JsonSerialize(using = ToStringSerializer.class) -// //列表总数") -// private Long total; -//} diff --git a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctDTO.java b/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctDTO.java deleted file mode 100644 index 03db18e83..000000000 --- a/src/com/engine/salary/entity/salaryacct/dto/SalaryAcctDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -//package com.engine.salary.entity.salaryacct.dto; -// -//import io.swagger.annotations.ApiModelProperty; -//import lombok.AllArgsConstructor; -//import lombok.Builder; -//import lombok.Data; -//import lombok.NoArgsConstructor; -// -///** -// * @description: 薪资核算 -// * @author: xiajun -// * @modified By: xiajun -// * @date: Created in 12/16/21 8:40 PM -// * @version:v1.0 -// */ -//@Data -//@Builder -//@NoArgsConstructor -//@AllArgsConstructor -//public class SalaryAcctDTO { -// -// //是否正在核算") -// private boolean acctInProgress; -//} diff --git a/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java b/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java index 1c786c73d..200da6442 100644 --- a/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java +++ b/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java @@ -6,7 +6,7 @@ import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AttendQuoteFieldListDTO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculateBO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctCalculatePriorityBO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; +import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; @@ -109,8 +109,8 @@ public class SalaryAcctManager extends Service { return ServiceUtil.getService(SalaryAcctCalculateServiceImpl.class, user); } - private SalaryAcctProgressService getSalaryAcctProgressService(User user) { - return ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + private ProgressService getSalaryAcctProgressService(User user) { + return ServiceUtil.getService(ProgressServiceImpl.class, user); } private DataSourceTransactionManager dataSourceTransactionManager; @@ -202,12 +202,12 @@ public class SalaryAcctManager extends Service { simpleEmployee.setEmployeeId((long) user.getUID()); // 检查是否正在核算中 - SalaryAcctProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId); + ProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId); if (Objects.nonNull(salaryAcctProgressDTO) && salaryAcctProgressDTO.isStatus() && Optional.ofNullable(salaryAcctProgressDTO.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { return; } // 初始化进度 - SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO() + ProgressDTO initProgress = new ProgressDTO() .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) .setTitleLabelId(97515L) .setTotalQuantity(NumberUtils.INTEGER_ONE) @@ -297,7 +297,7 @@ public class SalaryAcctManager extends Service { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(103378, "薪资核算人员不能为空")); } // 11.1、初始化进度 - SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY); + ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY); getSalaryAcctProgressService(user).initProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, initProgress); // 12、对薪资核算人员进行拆分 List> partition = Lists.partition(salaryAcctEmployeePOS, 5000); diff --git a/src/com/engine/salary/service/SalaryAcctProgressService.java b/src/com/engine/salary/service/ProgressService.java similarity index 75% rename from src/com/engine/salary/service/SalaryAcctProgressService.java rename to src/com/engine/salary/service/ProgressService.java index 1dab7e710..5a741c918 100644 --- a/src/com/engine/salary/service/SalaryAcctProgressService.java +++ b/src/com/engine/salary/service/ProgressService.java @@ -1,18 +1,18 @@ package com.engine.salary.service; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; +import com.engine.salary.entity.progress.ProgressDTO; import java.math.BigDecimal; /** - * 核算进度 + * 进度条 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ -public interface SalaryAcctProgressService { +public interface ProgressService { /** * 初始化核算进度条 @@ -20,7 +20,7 @@ public interface SalaryAcctProgressService { * @param salaryAcctProgress * @return */ - void initProgress(String cacheKey, SalaryAcctProgressDTO salaryAcctProgress); + void initProgress(String cacheKey, ProgressDTO salaryAcctProgress); /** * 更新进度条 @@ -31,7 +31,12 @@ public interface SalaryAcctProgressService { void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity); - // + /** + * 更新进度条 + * @param cacheKey + * @param calculatedQuantity + * @param message + */ void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity, String message); /** @@ -61,7 +66,7 @@ public interface SalaryAcctProgressService { * 获取进度条 * @return */ - SalaryAcctProgressDTO getProgress(String cacheKey); + ProgressDTO getProgress(String cacheKey); /** * 删除redis中的缓存 @@ -69,5 +74,5 @@ public interface SalaryAcctProgressService { * @param cacheKey * @return */ - SalaryAcctProgressDTO del(String cacheKey); + ProgressDTO del(String cacheKey); } diff --git a/src/com/engine/salary/service/impl/ProgressServiceImpl.java b/src/com/engine/salary/service/impl/ProgressServiceImpl.java new file mode 100644 index 000000000..80f1e8d5a --- /dev/null +++ b/src/com/engine/salary/service/impl/ProgressServiceImpl.java @@ -0,0 +1,128 @@ +package com.engine.salary.service.impl; + +import com.cloudstore.dev.api.util.Util_DataCache; +import com.engine.core.impl.Service; +import com.engine.salary.entity.progress.ProgressDTO; +import com.engine.salary.service.ProgressService; +import com.engine.salary.util.JsonUtil; +import org.apache.commons.lang3.StringUtils; +import weaver.wechat.util.Utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 进度条 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public class ProgressServiceImpl extends Service implements ProgressService { + + + @Override + public void initProgress(String cacheKey, ProgressDTO progressDTO) { + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + + @Override + public synchronized void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isNotEmpty(resultStr)) { + ProgressDTO progressDTO = JsonUtil.parseObject(resultStr, ProgressDTO.class); + if (progressDTO == null || !progressDTO.isStatus()) { + return; + } + Integer currentCalculatedQuantity = progressDTO.getCalculatedQuantity() + calculatedQuantity; + progressDTO.setCalculatedQuantity( + currentCalculatedQuantity > progressDTO.getTotalQuantity() ? progressDTO.getTotalQuantity() : currentCalculatedQuantity); + BigDecimal progress = BigDecimal.valueOf(progressDTO.getCalculatedQuantity()) + .divide(BigDecimal.valueOf(progressDTO.getTotalQuantity()), 4, RoundingMode.HALF_DOWN); + progressDTO.setProgress(progress.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : progress); + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + } + + @Override + public synchronized void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity, String message) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isNotEmpty(resultStr)) { + ProgressDTO progressDTO = JsonUtil.parseObject(resultStr, ProgressDTO.class); + if (progressDTO == null || !progressDTO.isStatus()) { + return; + } + Integer currentCalculatedQuantity = progressDTO.getCalculatedQuantity() + calculatedQuantity; + progressDTO.setCalculatedQuantity( + currentCalculatedQuantity > progressDTO.getTotalQuantity() ? progressDTO.getTotalQuantity() : currentCalculatedQuantity); + BigDecimal progress = BigDecimal.valueOf(progressDTO.getCalculatedQuantity()) + .divide(BigDecimal.valueOf(progressDTO.getTotalQuantity()), 4, RoundingMode.HALF_DOWN); + progressDTO.setProgress(progress.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : progress); + + if (StringUtils.isNotBlank(message)) { + progressDTO.setMessage(Utils.null2String(progressDTO.getMessage()) + message); + } + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + } + + @Override + public void fail(String cacheKey, String message) { + ProgressDTO progressDTO = new ProgressDTO(); + progressDTO.setStatus(false); + progressDTO.setMessage(message); + progressDTO.setCheckStatus(true); + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + + @Override + public void finish(String cacheKey, boolean checkStatus) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isNotEmpty(resultStr)) { + ProgressDTO progressDTO = JsonUtil.parseObject(resultStr, ProgressDTO.class); + if (progressDTO == null || !progressDTO.isStatus()) { + return; + } + progressDTO.setTitle("操作完成"); + progressDTO.setCalculatedQuantity(progressDTO.getTotalQuantity()); + progressDTO.setProgress(BigDecimal.ONE); + progressDTO.setCheckStatus(checkStatus); + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + } + + @Override + public void updateProgress(String cacheKey, BigDecimal progress, boolean checkStatus) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isNotEmpty(resultStr)) { + ProgressDTO progressDTO = JsonUtil.parseObject(resultStr, ProgressDTO.class); + if (progressDTO == null || !progressDTO.isStatus()) { + return; + } + progressDTO.setTitle("处理中"); + progressDTO.setCalculatedQuantity(progressDTO.getTotalQuantity()); + progressDTO.setProgress(progress); + progressDTO.setCheckStatus(checkStatus); + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + } + + @Override + public ProgressDTO getProgress(String cacheKey) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isEmpty(resultStr)) { + return null; + } + return JsonUtil.parseObject(resultStr, ProgressDTO.class); + } + + @Override + public ProgressDTO del(String cacheKey) { + Util_DataCache.clearVal(cacheKey); + ProgressDTO salaryAcctProgressDTO = new ProgressDTO(); + salaryAcctProgressDTO.setMessage("操作失败"); + salaryAcctProgressDTO.setStatus(false); + return salaryAcctProgressDTO; + } +} diff --git a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java index 768975e43..69eb5b02e 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java @@ -97,8 +97,8 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc return (SalaryAcctResultTempService) ServiceUtil.getService(SalaryAcctResultTempServiceImpl.class, user); } - private SalaryAcctProgressService getSalaryAcctProgressService(User user) { - return (SalaryAcctProgressService) ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + private ProgressService getSalaryAcctProgressService(User user) { + return (ProgressService) ServiceUtil.getService(ProgressServiceImpl.class, user); } private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { diff --git a/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java deleted file mode 100644 index 0cb90e377..000000000 --- a/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.engine.salary.service.impl; - -import com.cloudstore.dev.api.util.Util_DataCache; -import com.engine.core.impl.Service; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; -import com.engine.salary.service.SalaryAcctProgressService; -import com.engine.salary.util.JsonUtil; -import org.apache.commons.lang3.StringUtils; -import weaver.wechat.util.Utils; - -import java.math.BigDecimal; -import java.math.RoundingMode; - -/** - * 核算进度条 - *

Copyright: Copyright (c) 2022

- *

Company: 泛微软件

- * - * @author qiantao - * @version 1.0 - **/ -public class SalaryAcctProgressServiceImpl extends Service implements SalaryAcctProgressService { - - - @Override - public void initProgress(String cacheKey, SalaryAcctProgressDTO salaryAcctProgress) { - Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); - } - - @Override - public synchronized void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity) { - String resultStr = (String) Util_DataCache.getObjVal(cacheKey); - if (StringUtils.isNotEmpty(resultStr)) { - SalaryAcctProgressDTO salaryAcctProgress = JsonUtil.parseObject(resultStr, SalaryAcctProgressDTO.class); - if (salaryAcctProgress == null || !salaryAcctProgress.isStatus()) { - return; - } - Integer currentCalculatedQuantity = salaryAcctProgress.getCalculatedQuantity() + calculatedQuantity; - salaryAcctProgress.setCalculatedQuantity( - currentCalculatedQuantity > salaryAcctProgress.getTotalQuantity() ? salaryAcctProgress.getTotalQuantity() : currentCalculatedQuantity); - BigDecimal progress = BigDecimal.valueOf(salaryAcctProgress.getCalculatedQuantity()) - .divide(BigDecimal.valueOf(salaryAcctProgress.getTotalQuantity()), 4, RoundingMode.HALF_DOWN); - salaryAcctProgress.setProgress(progress.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : progress); - Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); - } - } - - @Override - public synchronized void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity, String message) { - String resultStr = (String) Util_DataCache.getObjVal(cacheKey); - if (StringUtils.isNotEmpty(resultStr)) { - SalaryAcctProgressDTO salaryAcctProgress = JsonUtil.parseObject(resultStr, SalaryAcctProgressDTO.class); - if (salaryAcctProgress == null || !salaryAcctProgress.isStatus()) { - return; - } - Integer currentCalculatedQuantity = salaryAcctProgress.getCalculatedQuantity() + calculatedQuantity; - salaryAcctProgress.setCalculatedQuantity( - currentCalculatedQuantity > salaryAcctProgress.getTotalQuantity() ? salaryAcctProgress.getTotalQuantity() : currentCalculatedQuantity); - BigDecimal progress = BigDecimal.valueOf(salaryAcctProgress.getCalculatedQuantity()) - .divide(BigDecimal.valueOf(salaryAcctProgress.getTotalQuantity()), 4, RoundingMode.HALF_DOWN); - salaryAcctProgress.setProgress(progress.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : progress); - - if (StringUtils.isNotBlank(message)) { - salaryAcctProgress.setMessage(Utils.null2String(salaryAcctProgress.getMessage()) + message); - } - Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); - } - } - - @Override - public void fail(String cacheKey, String message) { - SalaryAcctProgressDTO salaryAcctProgress = new SalaryAcctProgressDTO(); - salaryAcctProgress.setStatus(false); - salaryAcctProgress.setMessage(message); - salaryAcctProgress.setCheckStatus(true); - Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); - } - - @Override - public void finish(String cacheKey, boolean checkStatus) { - String resultStr = (String) Util_DataCache.getObjVal(cacheKey); - if (StringUtils.isNotEmpty(resultStr)) { - SalaryAcctProgressDTO salaryAcctProgress = JsonUtil.parseObject(resultStr, SalaryAcctProgressDTO.class); - if (salaryAcctProgress == null || !salaryAcctProgress.isStatus()) { - return; - } - salaryAcctProgress.setTitle("核算完成"); - salaryAcctProgress.setCalculatedQuantity(salaryAcctProgress.getTotalQuantity()); - salaryAcctProgress.setProgress(BigDecimal.ONE); - salaryAcctProgress.setCheckStatus(checkStatus); - Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); - } - } - - @Override - public void updateProgress(String cacheKey, BigDecimal progress, boolean checkStatus) { - String resultStr = (String) Util_DataCache.getObjVal(cacheKey); - if (StringUtils.isNotEmpty(resultStr)) { - SalaryAcctProgressDTO salaryAcctProgress = JsonUtil.parseObject(resultStr, SalaryAcctProgressDTO.class); - if (salaryAcctProgress == null || !salaryAcctProgress.isStatus()) { - return; - } - salaryAcctProgress.setTitle("核算中"); - salaryAcctProgress.setCalculatedQuantity(salaryAcctProgress.getTotalQuantity()); - salaryAcctProgress.setProgress(progress); - salaryAcctProgress.setCheckStatus(checkStatus); - Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); - } - } - - @Override - public SalaryAcctProgressDTO getProgress(String cacheKey) { - String resultStr = (String) Util_DataCache.getObjVal(cacheKey); - if (StringUtils.isEmpty(resultStr)) { - return null; - } - return JsonUtil.parseObject(resultStr, SalaryAcctProgressDTO.class); - } - - @Override - public SalaryAcctProgressDTO del(String cacheKey) { - Util_DataCache.clearVal(cacheKey); - SalaryAcctProgressDTO salaryAcctProgressDTO = new SalaryAcctProgressDTO(); - salaryAcctProgressDTO.setMessage("核算失败"); - salaryAcctProgressDTO.setStatus(false); - return salaryAcctProgressDTO; - } -} diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index bcab4e6db..bcc1d8b20 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -11,7 +11,7 @@ import com.engine.salary.entity.report.bo.SalaryAcctResultReportBO; import com.engine.salary.entity.report.po.SalaryAcctResultReportPO; import com.engine.salary.entity.salaryacct.bo.*; import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; +import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; import com.engine.salary.entity.salaryacct.param.*; @@ -120,8 +120,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe return ServiceUtil.getService(SalaryAcctCalculateServiceImpl.class, user); } - private SalaryAcctProgressService getSalaryAcctProgressService(User user) { - return ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + private ProgressService getSalaryAcctProgressService(User user) { + return ServiceUtil.getService(ProgressServiceImpl.class, user); } private DataSourceTransactionManager dataSourceTransactionManager; @@ -720,7 +720,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(103378, "薪资核算人员不能为空")); } // 11.1、初始化进度 - SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY); + ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY); getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), initProgress); // 12、对薪资核算人员进行拆分 List> partition = Lists.partition(salaryAcctEmployeePOS, 5000); diff --git a/src/com/engine/salary/web/SalaryProgressController.java b/src/com/engine/salary/web/SalaryProgressController.java index d497021e6..5219240a0 100644 --- a/src/com/engine/salary/web/SalaryProgressController.java +++ b/src/com/engine/salary/web/SalaryProgressController.java @@ -1,9 +1,9 @@ package com.engine.salary.web; import com.engine.common.util.ServiceUtil; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; -import com.engine.salary.service.SalaryAcctProgressService; -import com.engine.salary.service.impl.SalaryAcctProgressServiceImpl; +import com.engine.salary.entity.progress.ProgressDTO; +import com.engine.salary.service.ProgressService; +import com.engine.salary.service.impl.ProgressServiceImpl; import com.engine.salary.util.ResponseResult; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; @@ -27,8 +27,8 @@ import javax.ws.rs.core.MediaType; **/ public class SalaryProgressController { - private SalaryAcctProgressService getSalaryAcctProgressService(User user) { - return (SalaryAcctProgressService) ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + private ProgressService getSalaryAcctProgressService(User user) { + return (ProgressService) ServiceUtil.getService(ProgressServiceImpl.class, user); } //获取进度条 @@ -37,7 +37,7 @@ public class SalaryProgressController { @Produces(MediaType.APPLICATION_JSON) public String getRate(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "cacheKey") String cacheKey) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult(user).run(getSalaryAcctProgressService(user)::getProgress, cacheKey); + return new ResponseResult(user).run(getSalaryAcctProgressService(user)::getProgress, cacheKey); } // @ApiOperation("获取进度条") diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 4ddaf69b5..856d6698e 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -6,7 +6,7 @@ import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; +import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; import com.engine.salary.entity.salaryacct.param.SalaryAcctCalculateParam; @@ -62,8 +62,8 @@ public class SalaryAcctResultWrapper extends Service { return ServiceUtil.getService(SalaryAcctEmployeeWrapper.class, user); } - private SalaryAcctProgressService getSalaryAcctProgressService(User user) { - return ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + private ProgressService getSalaryAcctProgressService(User user) { + return ServiceUtil.getService(ProgressServiceImpl.class, user); } // private SalaryCheckResultService salaryCheckResultService; @@ -225,12 +225,12 @@ public class SalaryAcctResultWrapper extends Service { // 检查薪资核算人员的个税扣缴义务人 getSalaryAcctEmployeeWrapper(user).checkTaxAgent(calculateParam.getSalaryAcctRecordId()); // 检查是否正在核算中 - SalaryAcctProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId()); + ProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId()); if (Objects.nonNull(salaryAcctProgressDTO) && salaryAcctProgressDTO.isStatus() && Optional.ofNullable(salaryAcctProgressDTO.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { return; } // 初始化进度 - SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO() + ProgressDTO initProgress = new ProgressDTO() .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) .setTitleLabelId(97515L) .setTotalQuantity(NumberUtils.INTEGER_ONE) From 0e5eb1b11ea8a9c926711bce1acb4228e5e79cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Jun 2023 11:48:19 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=8D=95=E5=8F=91?= =?UTF-8?q?=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/CustomSalarySend.java | 3 +- .../salary/service/ProgressService.java | 8 + .../service/impl/ProgressServiceImpl.java | 17 ++ .../service/impl/SalaryBillServiceImpl.java | 93 ++++++---- .../service/impl/SalarySendServiceImpl.java | 163 +++++++++--------- .../salary/web/SalaryBillController.java | 4 +- .../salary/wrapper/SalarySendWrapper.java | 19 +- .../wrapper/proxy/SalarySendWrapperProxy.java | 2 +- 8 files changed, 178 insertions(+), 131 deletions(-) diff --git a/src/com/customization/salary/CustomSalarySend.java b/src/com/customization/salary/CustomSalarySend.java index 4570f5d9c..d9ec73ad7 100644 --- a/src/com/customization/salary/CustomSalarySend.java +++ b/src/com/customization/salary/CustomSalarySend.java @@ -13,7 +13,7 @@ import java.util.Map; @ServiceDynamicProxy(target = SalarySendWrapper.class, desc = "薪资核算") public class CustomSalarySend extends AbstractServiceProxy implements SalarySendWrapperProxy { @Override - public Map grant(SalarySendGrantParam queryParam) { + public void grant(SalarySendGrantParam queryParam) { BaseBean baseBean = new BaseBean(); baseBean.writeLog("拦截工资单发送方法..."); @@ -22,7 +22,6 @@ public class CustomSalarySend extends AbstractServiceProxy implements SalarySend Object o = executeMethod(queryParam); //todo do some thing - return (Map)o; } @Override diff --git a/src/com/engine/salary/service/ProgressService.java b/src/com/engine/salary/service/ProgressService.java index 5a741c918..210ec62dd 100644 --- a/src/com/engine/salary/service/ProgressService.java +++ b/src/com/engine/salary/service/ProgressService.java @@ -55,6 +55,14 @@ public interface ProgressService { */ void finish(String cacheKey, boolean checkStatus); + /** + * 完成 + * @param cacheKey + * @param checkStatus + * @param message + */ + void finish(String cacheKey, boolean checkStatus,String message); + /** * 更新进度条 * diff --git a/src/com/engine/salary/service/impl/ProgressServiceImpl.java b/src/com/engine/salary/service/impl/ProgressServiceImpl.java index 80f1e8d5a..f855c50be 100644 --- a/src/com/engine/salary/service/impl/ProgressServiceImpl.java +++ b/src/com/engine/salary/service/impl/ProgressServiceImpl.java @@ -92,6 +92,23 @@ public class ProgressServiceImpl extends Service implements ProgressService { } } + @Override + public void finish(String cacheKey, boolean checkStatus, String message) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isNotEmpty(resultStr)) { + ProgressDTO progressDTO = JsonUtil.parseObject(resultStr, ProgressDTO.class); + if (progressDTO == null || !progressDTO.isStatus()) { + return; + } + progressDTO.setTitle("操作完成"); + progressDTO.setCalculatedQuantity(progressDTO.getTotalQuantity()); + progressDTO.setProgress(BigDecimal.ONE); + progressDTO.setCheckStatus(checkStatus); + progressDTO.setMessage(message); + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(progressDTO)); + } + } + @Override public void updateProgress(String cacheKey, BigDecimal progress, boolean checkStatus) { String resultStr = (String) Util_DataCache.getObjVal(cacheKey); diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index 2bcd09c4d..a21cfad46 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -6,7 +6,9 @@ import com.engine.common.util.ServiceUtil; 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.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.progress.ProgressDTO; import com.engine.salary.entity.salaryBill.bo.SalaryBillBO; import com.engine.salary.entity.salaryBill.bo.SalaryTemplateBO; import com.engine.salary.entity.salaryBill.dto.SalaryBillSendDTO; @@ -43,15 +45,19 @@ import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** - * @Description: 工资单发放 - * @Author: wangxiangzhong - * @Date: 2021-12-11 11:28 - */ + * 工资单发放 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ @Slf4j public class SalaryBillServiceImpl extends Service implements SalaryBillService { @@ -109,7 +115,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService private SalarySobItemService salarySobItemService; -// private SalaryBillProgressService salaryBillProgressService; + private ProgressService getProgressService(User user) { + return ServiceUtil.getService(ProgressServiceImpl.class, user); + } /** * 工资单发放 start @@ -140,15 +148,21 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(204428, "请完善补发工资单模板设置")); } // 2.检查是否正在发送中 -// SalaryBillProgressDTO salaryBillProgress = salaryBillProgressService.getProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + param.getSalarySendId()); -// if (Objects.nonNull(salaryBillProgress) && salaryBillProgress.isStatus() -// && Optional.ofNullable(salaryBillProgress.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(136104, "有其他人员正在发送中,请等待其他人员发送结束后再操作")); -// } + ProgressDTO salaryBillProgress = getProgressService(user).getProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + param.getSalarySendId()); + if (Objects.nonNull(salaryBillProgress) && salaryBillProgress.isStatus() + && Optional.ofNullable(salaryBillProgress.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(136104, "有其他人员正在发送中,请等待其他人员发送结束后再操作")); + } // 初始化进度 -// SalaryBillProgressDTO initProgress = salaryBillProgressService.buildInitProgress(SalaryI18nUtil.getI18nLabel(136097, "发送中"), 136097, NumberUtils.INTEGER_ONE, NumberUtils.INTEGER_ZERO, BigDecimal.ZERO); -// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), initProgress); -// String tenantName = TenantContext.getCurrentTenant().getTenantName(); + ProgressDTO initProgress = ProgressDTO.builder() + .title(SalaryI18nUtil.getI18nLabel(136097, "发送中")) + .totalQuantity(NumberUtils.INTEGER_ZERO) + .calculatedQuantity(NumberUtils.INTEGER_ZERO) + .progress(BigDecimal.ZERO) + .status(true) + .message("") + .build(); + getProgressService(user).initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), initProgress); List ids = param.getIds(); @@ -209,14 +223,13 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService + SalaryI18nUtil.getI18nLabel(134807, "成功条数") + "[" + (successCount) + "], " + SalaryI18nUtil.getI18nLabel(134808, "失败条数") + "[" + (total - successCount) + "]"; // 发送进度完成 -// salaryBillProgressService.finish(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), messsage, true); + 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); // 发送进度失败 - -// salaryBillProgressService.fail(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), SalaryI18nUtil.getI18nLabel(136118, "工资单发送出错") + ": " + e.getMessage()); + getProgressService(user).fail(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), SalaryI18nUtil.getI18nLabel(136118, "工资单发送出错") + ": " + e.getMessage()); } finally { } } @@ -348,9 +361,14 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService List employeeIds = list.stream().map(SalarySendInfoListDTO::getEmployeeId).collect(Collectors.toList()); // 初始化进度 -// SalaryBillProgressDTO initProgress = salaryBillProgressService -// .buildInitProgress("发送中", 136097, employeeIds.size() * 2 + 1, NumberUtils.INTEGER_ZERO, BigDecimal.ZERO); -// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), initProgress); + ProgressDTO initProgress = ProgressDTO.builder() + .title("发送中") + .totalQuantity(employeeIds.size() * 2 + 1) + .calculatedQuantity(NumberUtils.INTEGER_ZERO) + .progress(BigDecimal.ZERO) + .message("") + .build(); + getProgressService(user).initProgress(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), initProgress); // 3.组装详情数据 // 获取薪资项目数据 List salaryAcctEmployees = Lists.newArrayList(); @@ -363,7 +381,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService List> partition = Lists.partition(employeeIds, partSize); for (List part : partition) { // 更新进度 -// salaryBillProgressService.getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salarySend.getId(), part.size()); + getProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salarySend.getId(), part.size()); /** 注意只有邮件才需要加密的核算数据 */ if (isEnableEmail) { List acctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIdsAndEmployeeIds(Collections.singletonList(salarySend.getSalaryAccountingId()), part); @@ -411,7 +429,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService enableSendList.forEach(e -> { if (sendChannels.contains(MessageChannelEnum.MSG)) { - SalaryBillBO.sendMsg(salaryBillSendParam, Long.valueOf(e.get("id").toString()) , Long.valueOf( e.get("employeeId").toString())); + SalaryBillBO.sendMsg(salaryBillSendParam, Long.valueOf(e.get("id").toString()), Long.valueOf(e.get("employeeId").toString())); } if (sendChannels.contains(MessageChannelEnum.EMAIL)) { @@ -426,12 +444,12 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService .id(Long.valueOf(e.get("id").toString())) .build()); // 更新发送进度 -// index.addAndGet(1); -// part.addAndGet(1); -// if (index.get() % 100 == 0 || index.get() >= total) { -// salaryBillProgressService.getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS, "" + salaryBillSendParam.getSalarySend().getId(), part.get()); -// part.set(0); -// } + index.addAndGet(1); + part.addAndGet(1); + if (index.get() % 100 == 0 || index.get() >= total) { + getProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.SALARY_GRANT_PROGRESS + "_" + salaryBillSendParam.getSalarySend().getId(), part.get()); + part.set(0); + } }); // 批量修改发送消息id if (CollectionUtils.isNotEmpty(sendInfoUpdateList)) { @@ -531,12 +549,15 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * @param salaryTemplate */ private void grantSendInfo(List ids, SalarySendPO salarySend, SalaryTemplatePO salaryTemplate) { + List> partition = Lists.partition(ids, 500); Date sendTime = new Date(); SalarySendInfoPO po = new SalarySendInfoPO(); po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); po.setSendTime(sendTime); po.setSalaryTemplate(JsonUtil.toJsonString(salaryTemplate)); - salarySendInfoMapper.updateGrantWithdraw(po, salarySend.getId(), Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); + partition.forEach(idsp -> { + salarySendInfoMapper.updateGrantWithdraw(po, salarySend.getId(), Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), idsp); + }); } // /** @@ -599,7 +620,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService //// } // // // 检查是否正在撤回中 -// SalaryBillProgressDTO salaryBillProgress = salaryBillProgressService +// SalaryBillProgressDTO salaryBillProgress = getProgressService(user) // .getProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId()); // if (Objects.nonNull(salaryBillProgress) && salaryBillProgress.isStatus() // && Optional.ofNullable(salaryBillProgress.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { @@ -607,9 +628,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // } // // // 初始化进度 -// SalaryBillProgressDTO initProgress = salaryBillProgressService +// SalaryBillProgressDTO initProgress = getProgressService(user) // .buildInitProgress("撤回中", 136106, NumberUtils.INTEGER_ONE, NumberUtils.INTEGER_ZERO, BigDecimal.ZERO); -// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), initProgress); +// getProgressService(user).initProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), initProgress); // // List ids = isRange ? getSalarySendRangeService(user).getSendInfoIdsBySalarySendIdAndOperateType(salarySend.getId(), rangeIds, SalarySendOperateTypeEnum.WITHDRAW) : param.getIds(); // // 异步执行撤回 @@ -670,9 +691,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // } // // // 初始化进度 -// SalaryBillProgressDTO initProgress = salaryBillProgressService +// SalaryBillProgressDTO initProgress = getProgressService(user) // .buildInitProgress("撤回中", 136106, enableWithdrawList.size() * 2 + 1, enableWithdrawList.size(), new BigDecimal("0.5")); -// salaryBillProgressService.initProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), initProgress); +// getProgressService(user).initProgress(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), initProgress); // // // 1.撤回消息:先修改数据再发消息,避免出错后无法撤回 // String text = SalaryI18nUtil.getI18nLabel(184533, "此工资单已被撤回,如有问题,请联系管理员"); @@ -697,7 +718,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // index.addAndGet(1); // part.addAndGet(1); // if (index.get() % 100 == 0 || index.get() >= total) { -// salaryBillProgressService.getAndAddCalculatedQty(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), part.get()); +// getProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), part.get()); // part.set(0); // } // }); @@ -721,11 +742,11 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService // + SalaryI18nUtil.getI18nLabel(134807, "成功条数") + "[" + (successCount) + "], " // + SalaryI18nUtil.getI18nLabel(134808, "失败条数") + "[" + (total - successCount) + "]"; // // 撤回进度完成 -// salaryBillProgressService.finish(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), messsage, true); +// getProgressService(user).finish(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), messsage, true); // } catch (Exception e) { // log.info("撤回出错:{}", e.getMessage(), e); // // 发送进度失败 -// salaryBillProgressService +// getProgressService(user) // .fail(SalaryCacheKey.SALARY_WITHDRAW_PROGRESS, "" + salarySend.getId(), SalaryI18nUtil.getI18nLabel(136142, "工资单撤回出错") + ": " + e.getMessage()); // } finally { // DSTenantKeyThreadVar.tenantKey.remove(); diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 9d6672c10..a4e6d24fe 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -910,91 +910,86 @@ public class SalarySendServiceImpl extends Service implements SalarySendService @Override public Map grant(SalarySendGrantParam param) { - getSalaryBillService(user).grant(param); + if (param.getSalarySendId() == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传")); + } -// if (param.getSalarySendId() == null) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100327, "工资单发放Id必传")); -// } -// -// Long salarySendId = param.getSalarySendId(); -// Collection ids = param.getIds(); -// -// if (param.getSalarySendRangeIds() != null) { -// //如果传了范围id,则使用范围id发放 -// ids = getSalarySendRangeService(user) -// .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); -// if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 -// throw new SalaryRunTimeException("工资发放范围内没有匹配员工"); -// } -// } -// -// SalarySendPO salarySend = mapper.getById(salarySendId); -// if (salarySend == null) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); -// } -// // 已经冻结不能操作 -// if (Objects.equals(salarySend.getSendStatus(), NumberUtils.INTEGER_ONE)) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结")); -// } -// // 获取默认模板 -// List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); -// if (CollectionUtils.isEmpty(salaryTemplates)) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送")); -// } -// SalaryTemplatePO templatePO = salaryTemplates.get(0); -// Date sendTime = new Date(); -// // 获取可发送的列表 -// List> enableSendList = getEnableSendList(salarySend, ids, templatePO); -// // 1.发放 -// -// SalarySendInfoPO po = new SalarySendInfoPO(); -// po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); -// po.setSendTime(sendTime); -// po.setSalaryTemplate(JsonUtil.toJsonString(templatePO)); -// salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); -// -// -// List list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build()); -// //需要发送工资的人 -// -// List sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList()); -// int sendNum = sendList.size(); -// int sendTotal = list.size(); -// SalarySendPO salarySendNew = new SalarySendPO(); -// try { -// BeanUtils.copyProperties(salarySendNew, salarySend); -// } catch (IllegalAccessException e) { -// e.printStackTrace(); -// } catch (InvocationTargetException e) { -// e.printStackTrace(); -// } -// salarySendNew.setSendNum(sendNum); -// salarySendNew.setSendTotal(sendTotal); -// salarySendNew.setLastSendTime(sendTime); -// -// mapper.updateById(salarySendNew); -// -// List needSendList = Lists.newArrayList(); -// enableSendList.forEach(map -> { -// sendList.forEach(item -> { -// if (item.getId() == Long.valueOf(map.get("id").toString()).longValue()) { -// needSendList.add(item); -// } -// }); -// }); -// -// // 发送消息 -// param.setTemplate(templatePO); -// sendMessage(true, needSendList, param, salarySend); -// -// -// -// Map map = new HashMap<>(2); -// map.put("sendNum", sendNum); -// map.put("sendTotal", sendTotal); -// -// return map; - return null; + Long salarySendId = param.getSalarySendId(); + Collection ids = param.getIds(); + + if (param.getSalarySendRangeIds() != null) { + //如果传了范围id,则使用范围id发放 + ids = getSalarySendRangeService(user) + .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); + if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 + throw new SalaryRunTimeException("工资发放范围内没有匹配员工"); + } + } + + SalarySendPO salarySend = mapper.getById(salarySendId); + if (salarySend == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); + } + // 已经冻结不能操作 + if (Objects.equals(salarySend.getSendStatus(), NumberUtils.INTEGER_ONE)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "工资单已冻结")); + } + // 获取默认模板 + List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); + if (CollectionUtils.isEmpty(salaryTemplates)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送")); + } + SalaryTemplatePO templatePO = salaryTemplates.get(0); + Date sendTime = new Date(); + // 获取可发送的列表 + List> enableSendList = getEnableSendList(salarySend, ids, templatePO); + // 1.发放 + + SalarySendInfoPO po = new SalarySendInfoPO(); + po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); + po.setSendTime(sendTime); + po.setSalaryTemplate(JsonUtil.toJsonString(templatePO)); + salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); + + + List list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build()); + //需要发送工资的人 + + List sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList()); + int sendNum = sendList.size(); + int sendTotal = list.size(); + SalarySendPO salarySendNew = new SalarySendPO(); + try { + BeanUtils.copyProperties(salarySendNew, salarySend); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + salarySendNew.setSendNum(sendNum); + salarySendNew.setSendTotal(sendTotal); + salarySendNew.setLastSendTime(sendTime); + + mapper.updateById(salarySendNew); + + List needSendList = Lists.newArrayList(); + enableSendList.forEach(map -> { + sendList.forEach(item -> { + if (item.getId() == Long.valueOf(map.get("id").toString()).longValue()) { + needSendList.add(item); + } + }); + }); + + // 发送消息 + param.setTemplate(templatePO); + sendMessage(true, needSendList, param, salarySend); + + Map map = new HashMap<>(2); + map.put("sendNum", sendNum); + map.put("sendTotal", sendTotal); + + return map; } /** diff --git a/src/com/engine/salary/web/SalaryBillController.java b/src/com/engine/salary/web/SalaryBillController.java index 15b9311b0..33678fb49 100644 --- a/src/com/engine/salary/web/SalaryBillController.java +++ b/src/com/engine/salary/web/SalaryBillController.java @@ -535,9 +535,9 @@ public class SalaryBillController { log.info("salary recipient: {} em_auth_userid: {}", recipient, em_auth_userid); if (StringUtils.isNotBlank(recipient) && NumberUtils.isCreatable(recipient)) { user = new User(Integer.parseInt(recipient)); - } else if(StringUtils.isNotBlank(em_auth_userid) && NumberUtils.isCreatable(em_auth_userid)){ + } else if (StringUtils.isNotBlank(em_auth_userid) && NumberUtils.isCreatable(em_auth_userid)) { user = new User(Integer.parseInt(em_auth_userid)); - }else { + } else { user = HrmUserVarify.getUser(request, response); } return new ResponseResult>(user).run(getSalarySendWrapper(user)::mySalaryBill, salaryInfoId); diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 2f4a79838..19c3869e5 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -46,10 +46,13 @@ import java.util.*; import java.util.stream.Collectors; /** - * @Description: 工资单发放 - * @Author: wangxiangzhong - * @Date: 2022/3/16 13:57 - */ + * 工资单发放 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy { private TaxAgentService getTaxAgentService(User user) { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); @@ -59,6 +62,10 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy return ServiceUtil.getService(SalarySendServiceImpl.class, user); } + private SalaryBillService getSalaryBillService(User user) { + return ServiceUtil.getService(SalaryBillServiceImpl.class, user); + } + private SalaryTemplateService getSalaryTemplateService(User user) { return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); } @@ -348,8 +355,8 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy * @param queryParam * @return */ - public Map grant(SalarySendGrantParam queryParam) { - return getSalarySendService(user).grant(queryParam); + public void grant(SalarySendGrantParam queryParam) { + getSalaryBillService(user).grant(queryParam); } /** diff --git a/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java b/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java index df063f4cd..b7bf6016c 100644 --- a/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java +++ b/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java @@ -21,7 +21,7 @@ public interface SalarySendWrapperProxy { * @param queryParam * @return */ - Map grant(SalarySendGrantParam queryParam); + void grant(SalarySendGrantParam queryParam); /** * 工资单撤回 From a308ee8d1fa0d5217c7af969ca0fa3da3b8dfeed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Jun 2023 14:21:35 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/CustomSalaryAcctRecordWrapper.java | 58 +++++++++++++++++++ .../salary/CustomSalarySend.java | 31 ---------- .../salary/CustomSalarySendWrapper.java | 45 ++++++++++++++ .../salary/service/SalaryBillService.java | 22 +++++-- .../service/impl/SalaryBillServiceImpl.java | 48 +++++++++++++++ .../service/impl/SalarySendServiceImpl.java | 4 +- 6 files changed, 171 insertions(+), 37 deletions(-) create mode 100644 src/com/customization/salary/CustomSalaryAcctRecordWrapper.java delete mode 100644 src/com/customization/salary/CustomSalarySend.java create mode 100644 src/com/customization/salary/CustomSalarySendWrapper.java diff --git a/src/com/customization/salary/CustomSalaryAcctRecordWrapper.java b/src/com/customization/salary/CustomSalaryAcctRecordWrapper.java new file mode 100644 index 000000000..1def59641 --- /dev/null +++ b/src/com/customization/salary/CustomSalaryAcctRecordWrapper.java @@ -0,0 +1,58 @@ +package com.customization.salary; + + +import com.engine.core.cfg.annotation.ServiceDynamicProxy; +import com.engine.core.cfg.annotation.ServiceMethodDynamicProxy; +import com.engine.core.impl.aop.AbstractServiceProxy; +import com.engine.salary.entity.salaryacct.dto.SalaryAcctRecordListDTO; +import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordQueryParam; +import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordSaveParam; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.wrapper.SalaryAcctRecordWrapper; +import com.engine.salary.wrapper.proxy.SalaryAcctRecordWrapperProxy; +import weaver.general.BaseBean; + +import java.util.Collection; +import java.util.Map; + + +@ServiceDynamicProxy(target = SalaryAcctRecordWrapper.class, desc = "薪资核算") +public class CustomSalaryAcctRecordWrapper extends AbstractServiceProxy implements SalaryAcctRecordWrapperProxy { + + @Override + public PageInfo listPage(SalaryAcctRecordQueryParam queryParam) { + return null; + } + + @Override + public Map getForm(Long id) { + return null; + } + + @Override + public Long save(SalaryAcctRecordSaveParam saveParam) { + return null; + } + + @Override + public void delete(Collection ids) { + } + + @Override + public void file(Long id) { + } + + @Override + @ServiceMethodDynamicProxy(desc = "重新核算前,验证....") + public void reCalculate(Long id) { + + BaseBean baseBean = new BaseBean(); + baseBean.writeLog("拦截薪酬重新核算方法..."); + + //todo do some thing + + executeMethod(id); + + //todo do some thing + } +} \ No newline at end of file diff --git a/src/com/customization/salary/CustomSalarySend.java b/src/com/customization/salary/CustomSalarySend.java deleted file mode 100644 index d9ec73ad7..000000000 --- a/src/com/customization/salary/CustomSalarySend.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.customization.salary; - -import com.engine.core.cfg.annotation.ServiceDynamicProxy; -import com.engine.core.impl.aop.AbstractServiceProxy; -import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; -import com.engine.salary.entity.salaryBill.param.SalarySendWithdrawParam; -import com.engine.salary.wrapper.SalarySendWrapper; -import com.engine.salary.wrapper.proxy.SalarySendWrapperProxy; -import weaver.general.BaseBean; - -import java.util.Map; - -@ServiceDynamicProxy(target = SalarySendWrapper.class, desc = "薪资核算") -public class CustomSalarySend extends AbstractServiceProxy implements SalarySendWrapperProxy { - @Override - public void grant(SalarySendGrantParam queryParam) { - BaseBean baseBean = new BaseBean(); - baseBean.writeLog("拦截工资单发送方法..."); - - //todo do some thing - - Object o = executeMethod(queryParam); - - //todo do some thing - } - - @Override - public Map withdraw(SalarySendWithdrawParam queryParam) { - return null; - } -} diff --git a/src/com/customization/salary/CustomSalarySendWrapper.java b/src/com/customization/salary/CustomSalarySendWrapper.java new file mode 100644 index 000000000..0f35ad8e1 --- /dev/null +++ b/src/com/customization/salary/CustomSalarySendWrapper.java @@ -0,0 +1,45 @@ +package com.customization.salary; + +import com.engine.common.util.ServiceUtil; +import com.engine.core.cfg.annotation.ServiceDynamicProxy; +import com.engine.core.cfg.annotation.ServiceMethodDynamicProxy; +import com.engine.core.impl.aop.AbstractServiceProxy; +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +import com.engine.salary.entity.salaryBill.param.SalarySendWithdrawParam; +import com.engine.salary.service.SalaryBillService; +import com.engine.salary.service.impl.SalaryBillServiceImpl; +import com.engine.salary.wrapper.SalarySendWrapper; +import com.engine.salary.wrapper.proxy.SalarySendWrapperProxy; +import weaver.hrm.User; + +import java.util.List; +import java.util.Map; + +@ServiceDynamicProxy(target = SalarySendWrapper.class, desc = "工资单发送") +public class CustomSalarySendWrapper extends AbstractServiceProxy implements SalarySendWrapperProxy { + + private SalaryBillService getSalaryBillService(User user) { + return ServiceUtil.getService(SalaryBillServiceImpl.class, user); + } + + @Override + @ServiceMethodDynamicProxy(desc = "拦截工资单发送方法") + public void grant(SalarySendGrantParam queryParam) { + Long salarySendId = queryParam.getSalarySendId(); + List ids = queryParam.getIds(); + List> sendInfoList = getSalaryBillService(new User()).getSendInfoList(salarySendId, ids); + //解析sendInfoList,拼接短信内容 + System.out.println("发送短信"); + + //todo do some thing + + executeMethod(queryParam); + + //todo do some thing + } + + @Override + public Map withdraw(SalarySendWithdrawParam queryParam) { + return null; + } +} diff --git a/src/com/engine/salary/service/SalaryBillService.java b/src/com/engine/salary/service/SalaryBillService.java index 00caeb1ee..a39bbd53d 100644 --- a/src/com/engine/salary/service/SalaryBillService.java +++ b/src/com/engine/salary/service/SalaryBillService.java @@ -2,11 +2,17 @@ package com.engine.salary.service; import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +import java.util.List; +import java.util.Map; + /** - * @Description: 工资单 - * @Author: wangxiangzhong - * @Date: 2021-12-11 11:28 - */ + * 工资单 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ public interface SalaryBillService { /** @@ -16,6 +22,14 @@ public interface SalaryBillService { */ void grant(SalarySendGrantParam queryParam); + /** + * 获取内容 + * @param sendId + * @param ids + * @return + */ + List> getSendInfoList(Long sendId, List ids); + /** * 工资单撤回 * diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index a21cfad46..9d5ceaef2 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -402,6 +402,54 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService .buildDetailList(list, salaryAcctEmployees, salaryAcctResultValues); } + public List> getSendInfoList(Long sendId, List ids) { + + SalarySendPO salarySend = getSalarySendMapper().getById(sendId); + SalarySendInfoQueryParam queryParam = new SalarySendInfoQueryParam(); + queryParam.setSalarySendId(salarySend.getId()); +// // 空就是所有 +// queryParam.setIds(ids); + queryParam.setSendStatuss(Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue())); + // 2.获取基本数据 + List list = Lists.newArrayList(); + if (CollectionUtils.isEmpty(ids)) { + list = getSalarySendInfoMapper().list(queryParam); + } else { + List> partition = Lists.partition(ids, 500); + for (List idsPart : partition) { + queryParam.setIds(idsPart); + list.addAll(getSalarySendInfoMapper().list(queryParam)); + } + } + List salaryAcctEmployeeList = this.getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()); + List acctEmployeeIds = salaryAcctEmployeeList.stream().map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()); + list = list.stream().filter(f -> acctEmployeeIds.contains(f.getEmployeeId())).collect(Collectors.toList()); + + List employeeIds = list.stream().map(SalarySendInfoListDTO::getEmployeeId).collect(Collectors.toList()); + + // 3.组装详情数据 + // 获取薪资项目数据 + List salaryAcctEmployees = Lists.newArrayList(); + List salaryAcctResultValues = Lists.newArrayList(); + + //是否需要发送邮件 + if (CollectionUtils.isNotEmpty(ids)) { + int partSize = 100;// 分片大小,越小进度条跑得越短平快,但是总体速度更慢 + List> partition = Lists.partition(employeeIds, partSize); + for (List part : partition) { + // 更新进度 + 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()))); + } + } else { + salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salarySend.getSalaryAccountingId()); + salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctRecordIds(Collections.singletonList(salarySend.getSalaryAccountingId())); + } + return getSalarySendService(user) + .buildDetailList(list, salaryAcctEmployees, salaryAcctResultValues); + } + /** * 发送消息 * diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index a4e6d24fe..46c7cdd0b 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -800,9 +800,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return listMaps; } // 所有个税扣缴义务人 - Map taxAgentMap = SalaryEntityUtil.convert2Map(getTaxAgentService(user).listAll(), TaxAgentPO::getId, TaxAgentPO::getName); +// Map taxAgentMap = SalaryEntityUtil.convert2Map(getTaxAgentService(user).listAll(), TaxAgentPO::getId, TaxAgentPO::getName); // 按人员分组核算数据 - Map> relationSalaryAcctEmployeeMap = SalaryEntityUtil.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getEmployeeId); +// Map> relationSalaryAcctEmployeeMap = SalaryEntityUtil.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getEmployeeId); Map salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployees, salaryAcctEmployee -> salaryAcctEmployee.getEmployeeId() + "-" + salaryAcctEmployee.getTaxAgentId()); Map> singleEmpAcctMap = SalaryEntityUtil.group2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId); List employeeIds = list.stream().map(SalarySendInfoListDTO::getEmployeeId).distinct().collect(Collectors.toList()); From f15475369896cb5e1ed196350763081654f8688b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Jun 2023 15:02:53 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E6=8B=A6=E6=88=AA=E7=9F=AD=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/customization/salary/CustomSalarySendWrapper.java | 6 ++++-- src/com/engine/salary/service/SalaryBillService.java | 2 +- .../engine/salary/service/impl/SalaryBillServiceImpl.java | 4 +++- src/com/engine/salary/wrapper/SalarySendWrapper.java | 4 ++-- .../engine/salary/wrapper/proxy/SalarySendWrapperProxy.java | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/com/customization/salary/CustomSalarySendWrapper.java b/src/com/customization/salary/CustomSalarySendWrapper.java index 0f35ad8e1..815b9b611 100644 --- a/src/com/customization/salary/CustomSalarySendWrapper.java +++ b/src/com/customization/salary/CustomSalarySendWrapper.java @@ -24,7 +24,7 @@ public class CustomSalarySendWrapper extends AbstractServiceProxy implements Sal @Override @ServiceMethodDynamicProxy(desc = "拦截工资单发送方法") - public void grant(SalarySendGrantParam queryParam) { + public Map grant(SalarySendGrantParam queryParam) { Long salarySendId = queryParam.getSalarySendId(); List ids = queryParam.getIds(); List> sendInfoList = getSalaryBillService(new User()).getSendInfoList(salarySendId, ids); @@ -33,9 +33,11 @@ public class CustomSalarySendWrapper extends AbstractServiceProxy implements Sal //todo do some thing - executeMethod(queryParam); + Map result = (Map) executeMethod(queryParam); //todo do some thing + + return result; } @Override diff --git a/src/com/engine/salary/service/SalaryBillService.java b/src/com/engine/salary/service/SalaryBillService.java index a39bbd53d..9a37671a0 100644 --- a/src/com/engine/salary/service/SalaryBillService.java +++ b/src/com/engine/salary/service/SalaryBillService.java @@ -20,7 +20,7 @@ public interface SalaryBillService { * * @param queryParam */ - void grant(SalarySendGrantParam queryParam); + Map grant(SalarySendGrantParam queryParam); /** * 获取内容 diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index 9d5ceaef2..bf3bbf903 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -123,7 +123,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService * 工资单发放 start **********************************************************************/ @Override - public void grant(SalarySendGrantParam param) { + public Map grant(SalarySendGrantParam param) { // 1.检查和获取工资单发放 SalarySendPO salarySend = checkAndGetSalarySend(param.getSalarySendId()); // // 已经冻结不能操作 @@ -183,6 +183,8 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService } }; ThreadPoolUtil.fixedPoolExecute(ModulePoolEnum.OTHER, "salaryBillGrant", localRunnable); + + return new HashMap<>(); } diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 19c3869e5..e37266402 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -355,8 +355,8 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy * @param queryParam * @return */ - public void grant(SalarySendGrantParam queryParam) { - getSalaryBillService(user).grant(queryParam); + public Map grant(SalarySendGrantParam queryParam) { + return getSalarySendService(user).grant(queryParam); } /** diff --git a/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java b/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java index b7bf6016c..df063f4cd 100644 --- a/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java +++ b/src/com/engine/salary/wrapper/proxy/SalarySendWrapperProxy.java @@ -21,7 +21,7 @@ public interface SalarySendWrapperProxy { * @param queryParam * @return */ - void grant(SalarySendGrantParam queryParam); + Map grant(SalarySendGrantParam queryParam); /** * 工资单撤回 From 4a258aa45b26552e3ede1a3d1a2f6816ddea1868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Jun 2023 16:40:09 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/CustomSalaryAcctRecordWrapper.java | 58 ------------------- .../salary/CustomSalarySendWrapper.java | 47 --------------- .../salary/wrapper/SalarySendWrapper.java | 2 +- 3 files changed, 1 insertion(+), 106 deletions(-) delete mode 100644 src/com/customization/salary/CustomSalaryAcctRecordWrapper.java delete mode 100644 src/com/customization/salary/CustomSalarySendWrapper.java diff --git a/src/com/customization/salary/CustomSalaryAcctRecordWrapper.java b/src/com/customization/salary/CustomSalaryAcctRecordWrapper.java deleted file mode 100644 index 1def59641..000000000 --- a/src/com/customization/salary/CustomSalaryAcctRecordWrapper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.customization.salary; - - -import com.engine.core.cfg.annotation.ServiceDynamicProxy; -import com.engine.core.cfg.annotation.ServiceMethodDynamicProxy; -import com.engine.core.impl.aop.AbstractServiceProxy; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctRecordListDTO; -import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordQueryParam; -import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordSaveParam; -import com.engine.salary.util.page.PageInfo; -import com.engine.salary.wrapper.SalaryAcctRecordWrapper; -import com.engine.salary.wrapper.proxy.SalaryAcctRecordWrapperProxy; -import weaver.general.BaseBean; - -import java.util.Collection; -import java.util.Map; - - -@ServiceDynamicProxy(target = SalaryAcctRecordWrapper.class, desc = "薪资核算") -public class CustomSalaryAcctRecordWrapper extends AbstractServiceProxy implements SalaryAcctRecordWrapperProxy { - - @Override - public PageInfo listPage(SalaryAcctRecordQueryParam queryParam) { - return null; - } - - @Override - public Map getForm(Long id) { - return null; - } - - @Override - public Long save(SalaryAcctRecordSaveParam saveParam) { - return null; - } - - @Override - public void delete(Collection ids) { - } - - @Override - public void file(Long id) { - } - - @Override - @ServiceMethodDynamicProxy(desc = "重新核算前,验证....") - public void reCalculate(Long id) { - - BaseBean baseBean = new BaseBean(); - baseBean.writeLog("拦截薪酬重新核算方法..."); - - //todo do some thing - - executeMethod(id); - - //todo do some thing - } -} \ No newline at end of file diff --git a/src/com/customization/salary/CustomSalarySendWrapper.java b/src/com/customization/salary/CustomSalarySendWrapper.java deleted file mode 100644 index 815b9b611..000000000 --- a/src/com/customization/salary/CustomSalarySendWrapper.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.customization.salary; - -import com.engine.common.util.ServiceUtil; -import com.engine.core.cfg.annotation.ServiceDynamicProxy; -import com.engine.core.cfg.annotation.ServiceMethodDynamicProxy; -import com.engine.core.impl.aop.AbstractServiceProxy; -import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; -import com.engine.salary.entity.salaryBill.param.SalarySendWithdrawParam; -import com.engine.salary.service.SalaryBillService; -import com.engine.salary.service.impl.SalaryBillServiceImpl; -import com.engine.salary.wrapper.SalarySendWrapper; -import com.engine.salary.wrapper.proxy.SalarySendWrapperProxy; -import weaver.hrm.User; - -import java.util.List; -import java.util.Map; - -@ServiceDynamicProxy(target = SalarySendWrapper.class, desc = "工资单发送") -public class CustomSalarySendWrapper extends AbstractServiceProxy implements SalarySendWrapperProxy { - - private SalaryBillService getSalaryBillService(User user) { - return ServiceUtil.getService(SalaryBillServiceImpl.class, user); - } - - @Override - @ServiceMethodDynamicProxy(desc = "拦截工资单发送方法") - public Map grant(SalarySendGrantParam queryParam) { - Long salarySendId = queryParam.getSalarySendId(); - List ids = queryParam.getIds(); - List> sendInfoList = getSalaryBillService(new User()).getSendInfoList(salarySendId, ids); - //解析sendInfoList,拼接短信内容 - System.out.println("发送短信"); - - //todo do some thing - - Map result = (Map) executeMethod(queryParam); - - //todo do some thing - - return result; - } - - @Override - public Map withdraw(SalarySendWithdrawParam queryParam) { - return null; - } -} diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index e37266402..5697495f4 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -356,7 +356,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy * @return */ public Map grant(SalarySendGrantParam queryParam) { - return getSalarySendService(user).grant(queryParam); + return getSalaryBillService(user).grant(queryParam); } /** From d4c8a66fcfd69704a71a1fad14665621eaf25839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Jun 2023 09:31:46 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../param/SalaryTemplateSaveParam.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java index 2295dfefc..66d55f5b1 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java @@ -20,101 +20,101 @@ import java.util.List; @Builder @NoArgsConstructor @AllArgsConstructor -////"工资单模板保存参数") +//"工资单模板保存参数 public class SalaryTemplateSaveParam { -// 主键") + // 主键 private Long id; -// 模板名称") + // 模板名称 private String name; -// 薪资账套表的主键id") + // 薪资账套表的主键id private Long salarySobId; -// 备注") + // 备注 private String description; -// 邮箱开启状态。false:关、true:开") + // 邮箱开启状态。false:关、true:开 private Boolean emailStatus; -// 发送地址") + // 发送地址 private Long sendEmail; -// 消息中心开启状态。false:关、true:开") + // 消息中心开启状态。false:关、true:开 private Boolean msgStatus; -// 主题") + // 主题 private String theme; -// 背景图") + // 背景图 private String background; -// 文本内容") + // 文本内容 private String textContent; -// 文本内容位置。1:薪资项目前、2:薪资项目后") + // 文本内容位置。1:薪资项目前、2:薪资项目后 private Integer textContentPosition; -// 薪资项为空时不显示开启状态。false:关、true:开") + // 薪资项为空时不显示开启状态。false:关、true:开 private Boolean salaryItemNullStatus; -// 薪资项为0时不显示开启状态。false:关、true:开") + // 薪资项为0时不显示开启状态。false:关、true:开 private Boolean salaryItemZeroStatus; -// 薪资项目设置") + // 薪资项目设置 private List salaryItemSetting; -// 补发工资单模板名称") + // 补发工资单模板名称 private String replenishName; -// 补发工资单名单生成规则") + // 补发工资单名单生成规则 private String replenishRule; -// 补发薪资项目设置") + // 补发薪资项目设置 private List replenishSalaryItemSetting; public static void checkParam(SalaryTemplateSaveParam saveParam) { if (saveParam.getSalarySobId() == null) { - throw new SalaryRunTimeException("薪资账套表的主键id必传"); + throw new SalaryRunTimeException("薪资账套表的主键id必传;"); } if (StringUtils.isEmpty(saveParam.getName())) { - throw new SalaryRunTimeException("工资单模板名称必填"); + throw new SalaryRunTimeException("工资单模板名称必填;"); } if (StringUtils.isEmpty(saveParam.getTheme())) { - throw new SalaryRunTimeException("工资单主题必填"); + throw new SalaryRunTimeException("工资单主题必填;"); } if (StringUtils.isEmpty(saveParam.getReplenishName())) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 139737, "补发工资单模板名称必填")); + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(139737, "补发工资单模板名称必填")); } if (saveParam.getName().equals(saveParam.getReplenishName())) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 140557, "工资单模板名称和补发工资单模板名称不可相同")); + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140557, "工资单模板名称和补发工资单模板名称不可相同")); } if (StringUtils.isEmpty(saveParam.getReplenishRule())) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 139738, "补发工资单名单生成规则必填")); + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(139738, "补发工资单名单生成规则必填")); } - + if (saveParam.getEmailStatus() && saveParam.getSendEmail() == null) { - throw new SalaryRunTimeException("开启邮箱后,发送地址必选"); + throw new SalaryRunTimeException("开启邮箱后,发送地址必选;"); } if (StringUtils.isNotEmpty(saveParam.getTextContent()) && saveParam.getTextContentPosition() == null) { - throw new SalaryRunTimeException("文本内容不为空时,文本内容位置必选"); + throw new SalaryRunTimeException("文本内容不为空时,文本内容位置必选;"); } - if (saveParam.getTextContentPosition() !=null && saveParam.getTextContentPosition().equals(SalaryTemplateTextContentPositionEnum.BEFORE.getValue()) && saveParam.getTextContentPosition().equals(SalaryTemplateTextContentPositionEnum.AFTER.getValue())) { - throw new SalaryRunTimeException("文本内容位置参数不对"); + if (saveParam.getTextContentPosition() != null && saveParam.getTextContentPosition().equals(SalaryTemplateTextContentPositionEnum.BEFORE.getValue()) && saveParam.getTextContentPosition().equals(SalaryTemplateTextContentPositionEnum.AFTER.getValue())) { + throw new SalaryRunTimeException("文本内容位置参数不对;"); } if (CollectionUtils.isEmpty(saveParam.getReplenishSalaryItemSetting())) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 140509, "补发工资单模板的薪资项目设置不能为空")); + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "补发工资单模板的薪资项目设置不能为空")); } } } From 37d9c04a3090b309b8b7a3d2d88449c75d2f288d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Jun 2023 09:43:54 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E5=8F=91=E6=94=BE?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=AD=E6=96=87=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/wrapper/SalarySendWrapper.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 5697495f4..19dc48f78 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -308,13 +308,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy } PageInfo pageInfo = getSalarySendService(user).salarySendInfoListPage(queryParam); - List list = pageInfo.getList(); - list.forEach(e -> { - // 发放状态 - int sendStatus = Integer.parseInt(e.getSendStatus()); - e.setSendStatus(SalarySendStatusEnum.getDefaultLabelByValue(sendStatus)); -// e.setOperation(SalarySendStatusEnum.getNameByValue(sendStatus)); - }); + return pageInfo; } From 3498005a1103f9b250fb65a49177eac6b6c019a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Jun 2023 14:21:47 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E5=8D=95=E5=8F=91?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/service/impl/ProgressServiceImpl.java | 2 +- src/com/engine/salary/service/impl/SalaryBillServiceImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/impl/ProgressServiceImpl.java b/src/com/engine/salary/service/impl/ProgressServiceImpl.java index f855c50be..6935d5883 100644 --- a/src/com/engine/salary/service/impl/ProgressServiceImpl.java +++ b/src/com/engine/salary/service/impl/ProgressServiceImpl.java @@ -50,7 +50,7 @@ public class ProgressServiceImpl extends Service implements ProgressService { String resultStr = (String) Util_DataCache.getObjVal(cacheKey); if (StringUtils.isNotEmpty(resultStr)) { ProgressDTO progressDTO = JsonUtil.parseObject(resultStr, ProgressDTO.class); - if (progressDTO == null || !progressDTO.isStatus()) { + if (progressDTO == null || (progressDTO.isStatus())) { return; } Integer currentCalculatedQuantity = progressDTO.getCalculatedQuantity() + calculatedQuantity; diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index bf3bbf903..b3b0b26fe 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -366,6 +366,7 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService ProgressDTO initProgress = ProgressDTO.builder() .title("发送中") .totalQuantity(employeeIds.size() * 2 + 1) + .status(true) .calculatedQuantity(NumberUtils.INTEGER_ZERO) .progress(BigDecimal.ZERO) .message("") From 7701420430e751e1d3e9d7347d90b5444a4decd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Jun 2023 17:19:00 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/entity/salaryBill/bo/SalaryBillBO.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java index c2b3a6c58..8b062d538 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryBillBO.java @@ -425,7 +425,7 @@ public class SalaryBillBO { // 1.标题 emailContent.append("
"); // emailContent.append(salaryBillSendParam.getTitle()); - emailContent.append(getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), (Long) e.get("employeeId"))); + emailContent.append(getBillTitle(salaryBillSendParam.getSalaryTemplate().getTheme(), salaryBillSendParam.getSalaryDate(), Long.valueOf(e.get("employeeId").toString()))); emailContent.append("
"); // 2.发送时间 emailContent.append("
"); @@ -438,11 +438,11 @@ public class SalaryBillBO { // emailContent.append("'/>
"); // } // 3.背景图-url - if (StringUtils.isNotEmpty(salaryBillSendParam.getSalaryTemplate().getBackground())) { - emailContent.append("
"); - } +// if (StringUtils.isNotEmpty(salaryBillSendParam.getSalaryTemplate().getBackground())) { +// emailContent.append("
"); +// } // 是否只有一个分组,如果是,则将文本内容放进薪资项目表格前后 boolean isOnlyOneGroup = salaryBillSendParam.getSalaryItemSetList().stream().filter(st -> CollectionUtils.isNotEmpty(st.getItems())).count() == 1;