diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java index 4dfacb3f9..a72575661 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java @@ -74,6 +74,9 @@ public class SalaryTemplateBO { .replenishName(saveParam.getReplenishName()) .replenishRule(saveParam.getReplenishRule()) .replenishSalaryItemSetting((saveParam.getSalaryItemSetting() != null ? JsonUtil.toJsonString(saveParam.getReplenishSalaryItemSetting()) : "")) + .autoSendStatus(saveParam.getAutoSendStatus()?1:0) + .autoSendDayOfMonth(saveParam.getAutoSendDayOfMonth()) + .autoSendTimeOfDay(saveParam.getAutoSendTimeOfDay()) .createTime(new Date()) .updateTime(new Date()) .creator(employeeId) diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java index 0ad55269b..b09f269b0 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java @@ -54,4 +54,16 @@ public class SalaryTemplateBaseSetDTO { //消息中心") private Boolean msgStatus; + + // 是否启用工资单定时发送 + private Boolean autoSendStatus; + + // 自动发送工资单周期1:本月、2:上月 + private Integer autoSendCycleType; + + // 每月几号自动发送工资单 + private String autoSendDayOfMonth; + + // 发送时间 + private String autoSendTimeOfDay; } diff --git a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java index e13b654e6..2dc7643d2 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java @@ -12,6 +12,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; +import java.util.Objects; /** * @Description: 工资单模板 @@ -62,6 +63,18 @@ public class SalaryTemplateSaveParam { // 薪资项为0时不显示开启状态。false:关、true:开 private Boolean salaryItemZeroStatus; + // 是否启用工资单定时发送。0:未启用、1:已启用 + private Boolean autoSendStatus; + + // 自动发送工资单周期1:本月、2:上月 + private Integer autoSendCycleType; + + // 每月几号自动发送工资单 + private String autoSendDayOfMonth; + + // 自动发放时间 + private String autoSendTimeOfDay; + // 薪资项目设置 private List salaryItemSetting; @@ -116,5 +129,18 @@ public class SalaryTemplateSaveParam { if (CollectionUtils.isEmpty(saveParam.getReplenishSalaryItemSetting())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "补发工资单模板的薪资项目设置不能为空")); } + + if (Objects.isNull(saveParam.getAutoSendStatus())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "是否启用自动发放不能为空")); + } + + if (saveParam.getAutoSendStatus() == Boolean.TRUE) { + if(StringUtils.isBlank(saveParam.getAutoSendDayOfMonth())) + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "自动发放日期不能为空")); + if(Objects.isNull(saveParam.getAutoSendCycleType())) + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "自动发放周期不能为空")); + if(StringUtils.isBlank(saveParam.getAutoSendTimeOfDay())) + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "自动发放时间不能为空")); + } } } diff --git a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java index 1ffbc0622..f5c416305 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java @@ -124,6 +124,27 @@ public class SalaryTemplatePO { */ private String replenishSalaryItemSetting; + + /** + * 是否启用工资单定时发送。0:未启用、1:已启用 + */ + private Integer autoSendStatus; + + /** + * 自动发送工资单周期1:本月、2:上月 + */ + private Integer autoSendCycleType; + + /** + * 每月几号自动发送工资单 + */ + private String autoSendDayOfMonth; + + /** + * 自动发放时间 + */ + private String autoSendTimeOfDay; + /** * 创建时间 */ diff --git a/src/com/engine/salary/enums/salarysend/SalaryAutoSendCycleTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalaryAutoSendCycleTypeEnum.java new file mode 100644 index 000000000..dfe02a0be --- /dev/null +++ b/src/com/engine/salary/enums/salarysend/SalaryAutoSendCycleTypeEnum.java @@ -0,0 +1,54 @@ +package com.engine.salary.enums.salarysend; + + +import com.engine.salary.enums.BaseEnum; + +import java.util.Objects; + +/** + * @ClassName SalaryAutoSendCycleTypeEnum + * @author Harryxzy + * @date 2023/7/4 17:30 + * @description 自动发送工资单周期 + */ +public enum SalaryAutoSendCycleTypeEnum implements BaseEnum { + + THIS_MONTH(1, "本月", 86072), + NEXT_MONTH(2, "下月", 86073); + + private int value; + + private String defaultLabel; + + private int labelId; + + SalaryAutoSendCycleTypeEnum(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 SalaryAutoSendCycleTypeEnum parseByValue(int value) { + for (SalaryAutoSendCycleTypeEnum salaryCycleTypeEnum : SalaryAutoSendCycleTypeEnum.values()) { + if (Objects.equals(salaryCycleTypeEnum.getValue(), value)) { + return salaryCycleTypeEnum; + } + } + return null; + } +} diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java index ab67d35c0..140c47376 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java @@ -99,4 +99,6 @@ public interface SalarySendInfoMapper { void updateIgnoreNull(SalarySendInfoPO po); void deleteBySalaryAcctRecordIds(@Param("salaryAcctRecordId") Collection ids); + + List getNeedSendInfoList(@Param("salarySendIds") List salarySendIds); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml index 95a44fd54..0b96d4c22 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml @@ -684,6 +684,19 @@ ORDER BY id DESC + diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java index d0da230f7..ef1e6f6cb 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java @@ -63,4 +63,6 @@ public interface SalarySendMapper { void batchHandleSalaryAcctTypeHistory(); void deleteBySalaryAcctRecordIds(@Param("salaryAcctRecordId") Collection ids); + + List getNeedSendListBySalarySobIds(@Param("salarySobIds")List salarySobIds); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml index 040f23831..5b87e3774 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml @@ -236,6 +236,22 @@ ORDER BY id DESC + diff --git a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml index 253861502..56cd60808 100644 --- a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml @@ -51,6 +51,10 @@ , replenish_name , replenish_rule , replenish_salary_item_setting + , auto_send_status + , auto_send_cycle_type + , auto_send_day_of_month + , auto_send_time_of_day , t.create_time , t.update_time , t.creator @@ -76,6 +80,10 @@ replenish_name, replenish_rule, replenish_salary_item_setting, + auto_send_status, + auto_send_cycle_type, + auto_send_day_of_month, + auto_send_time_of_day, create_time, update_time, creator, @@ -310,6 +318,9 @@ AND delete_type = #{deleteType} + + AND auto_send_status = #{autoSendStatus} + AND salary_sob_id IN @@ -490,6 +501,18 @@ replenish_salary_item_setting=#{replenishSalaryItemSetting}, + + auto_send_status=#{autoSendStatus}, + + + auto_send_cycle_type=#{autoSendCycleType}, + + + auto_send_day_of_month=#{autoSendDayOfMonth}, + + + auto_send_time_of_day=#{autoSendTimeOfDay}, + create_time=#{createTime}, @@ -568,6 +591,18 @@ replenish_salary_item_setting, + + auto_send_status, + + + auto_send_cycle_type, + + + auto_send_day_of_month, + + + auto_send_time_of_day, + create_time, @@ -642,6 +677,18 @@ #{replenishSalaryItemSetting}, + + #{autoSendStatus}, + + + #{autoSendCycleType}, + + + #{autoSendDayOfMonth}, + + + #{autoSendTimeOfDay}, + #{createTime}, @@ -726,6 +773,18 @@ replenish_salary_item_setting, + + auto_send_status, + + + auto_send_cycle_type, + + + auto_send_day_of_month, + + + auto_send_time_of_day, + create_time, @@ -800,6 +859,18 @@ #{replenishSalaryItemSetting}, + + #{autoSendStatus}, + + + #{autoSendCycleType}, + + + #{autoSendDayOfMonth}, + + + #{autoSendTimeOfDay}, + #{createTime}, diff --git a/src/com/engine/salary/service/SalarySendService.java b/src/com/engine/salary/service/SalarySendService.java index 36864da21..d2b90fed3 100644 --- a/src/com/engine/salary/service/SalarySendService.java +++ b/src/com/engine/salary/service/SalarySendService.java @@ -2,6 +2,7 @@ package com.engine.salary.service; import com.engine.salary.entity.salaryBill.dto.*; import com.engine.salary.entity.salaryBill.param.*; +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; @@ -187,4 +188,17 @@ public interface SalarySendService { * @param param */ Boolean checkMobileCode(SMSCodeCheckParam param); + + /** + * 获取工资单id下需要发放的工资单明细 + * @return + */ + List getNeedSendInfoList(List salarySendIds); + + /** + * 获取这些模板下未发放完的工资单 + * @param salarySobIds + * @return + */ + List getNeedSendListBySalarySobIds(List salarySobIds); } diff --git a/src/com/engine/salary/service/SalaryTemplateService.java b/src/com/engine/salary/service/SalaryTemplateService.java index 6042da567..0b855e351 100644 --- a/src/com/engine/salary/service/SalaryTemplateService.java +++ b/src/com/engine/salary/service/SalaryTemplateService.java @@ -112,4 +112,9 @@ public interface SalaryTemplateService { * @return */ PageInfo listPage(SalaryTemplateQueryParam queryParam); + + /** + * 获取所有设置了定时发送的默认工资单模板 + */ + List getAutoSendTemplate(); } diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 64253642f..4c5645fdc 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -1557,4 +1557,20 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return true; } + + @Override + public List getNeedSendInfoList(List salarySendIds) { + if(CollectionUtils.isEmpty(salarySendIds)){ + return Collections.emptyList(); + } + return getSalarySendInfoMapper().getNeedSendInfoList(salarySendIds); + } + + @Override + public List getNeedSendListBySalarySobIds(List salarySobIds) { + if(CollectionUtils.isEmpty(salarySobIds)){ + return Collections.emptyList(); + } + return getSalarySendMapper().getNeedSendListBySalarySobIds(salarySobIds); + } } diff --git a/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java index e736d4404..de2df06e1 100644 --- a/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java @@ -132,6 +132,7 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate salaryTemplate.setTextContentPosition(saveParam.getTextContentPosition()); salaryTemplate.setSalaryItemNullStatus(saveParam.getSalaryItemNullStatus()?1:0); salaryTemplate.setSalaryItemZeroStatus(saveParam.getSalaryItemZeroStatus()?1:0); + salaryTemplate.setAutoSendCycleType(saveParam.getAutoSendCycleType()); mapper.insert(salaryTemplate); // 记录日志 // SalaryLoggerUtil.recordAddSingleLog(salaryTemplateLoggerTemplate, @@ -190,6 +191,8 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate salaryTemplateNew.setTextContentPosition(saveParam.getTextContentPosition()); salaryTemplateNew.setSalaryItemNullStatus(saveParam.getSalaryItemNullStatus()?1:0); salaryTemplateNew.setSalaryItemZeroStatus(saveParam.getSalaryItemZeroStatus()?1:0); + salaryTemplateNew.setAutoSendStatus(saveParam.getAutoSendStatus()?1:0); + salaryTemplateNew.setAutoSendCycleType(saveParam.getAutoSendCycleType()); // todo 薪资项目设置检查校验 salaryTemplateNew.setSalaryItemSetting(saveParam.getSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getSalaryItemSetting()) : ""); salaryTemplateNew.setReplenishSalaryItemSetting(saveParam.getReplenishSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getReplenishSalaryItemSetting()) : ""); @@ -315,4 +318,9 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryTemplateDTOList, SalaryTemplateListDTO.class); return page; } + + @Override + public List getAutoSendTemplate() { + return mapper.listSome(SalaryTemplatePO.builder().autoSendStatus(NumberUtils.INTEGER_ONE).useType(NumberUtils.INTEGER_ONE).deleteType(NumberUtils.INTEGER_ZERO).build()); + } } diff --git a/src/com/engine/salary/timer/AutoSendSalaryJob.java b/src/com/engine/salary/timer/AutoSendSalaryJob.java new file mode 100644 index 000000000..30777f606 --- /dev/null +++ b/src/com/engine/salary/timer/AutoSendSalaryJob.java @@ -0,0 +1,101 @@ +package com.engine.salary.timer; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +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.service.SalaryBillService; +import com.engine.salary.service.SalarySendService; +import com.engine.salary.service.SalaryTemplateService; +import com.engine.salary.service.impl.SalaryBillServiceImpl; +import com.engine.salary.service.impl.SalarySendServiceImpl; +import com.engine.salary.service.impl.SalaryTemplateServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Harryxzy + * @ClassName AutoSendSalaryJob + * @date 2023/07/03 10:39 + * @description 自动发送工资单 + */ +public class AutoSendSalaryJob extends BaseCronJob { + + private SalarySendService getSalarySendService(User user) { + return ServiceUtil.getService(SalarySendServiceImpl.class, user); + } + + private SalaryTemplateService getSalaryTemplateService(User user) { + return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); + } + + private SalaryBillService getSalaryBillService(User user) { + return ServiceUtil.getService(SalaryBillServiceImpl.class, user); + } + + @Override + public void execute() { + User tempUser = new User(); + tempUser.setUid(1); + tempUser.setLoginid("sysadmin"); + // 获取所有设置了定时发送的默认工资单模板 + List autoSendTemplate = getSalaryTemplateService(tempUser).getAutoSendTemplate(); + Map autoSendTypeMap = SalaryEntityUtil.convert2Map(autoSendTemplate, SalaryTemplatePO::getSalarySobId); + List salarySobIds = autoSendTemplate.stream().map(SalaryTemplatePO::getSalarySobId).collect(Collectors.toList()); + // 获取这些模板下未发放完的正常(非补发、非冻结)工资单 + List salarySendList = getSalarySendService(tempUser).getNeedSendListBySalarySobIds(salarySobIds); + + LocalDateTime nowLocalDateTime = SalaryDateUtil.dateToLocalDateTime(new Date()); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); + List needSendIds = salarySendList.stream().filter(sendPO -> { + SalaryTemplatePO templatePO = autoSendTypeMap.get(sendPO.getSalarySobId()); + if (templatePO == null) { + return false; + } + LocalDate autoSendDate = null; + if (templatePO.getAutoSendCycleType() == 1) { + // 薪资所属月当月 + autoSendDate = SalaryDateUtil.dateToLocalDate(sendPO.getSalaryMonth()); + } else { + // 薪资所属月下月 + autoSendDate = SalaryDateUtil.dateToLocalDate(sendPO.getSalaryMonth()).plusMonths(1); + } + int maxDays = autoSendDate.lengthOfMonth(); + Integer sendDays = Integer.valueOf(templatePO.getAutoSendDayOfMonth()); + if (sendDays.intValue() > maxDays) { + sendDays = maxDays; + } + autoSendDate = autoSendDate.withDayOfMonth(sendDays); + LocalDateTime autoSendDateTime = null; + try { + // 加上时间 + autoSendDateTime = autoSendDate.atTime(SalaryDateUtil.dateToLocalDateTime(timeFormat.parse(templatePO.getAutoSendTimeOfDay())).toLocalTime()); + } catch (ParseException e) { + throw new RuntimeException(e); + } + if (!autoSendDateTime.isAfter(nowLocalDateTime)) { + // 自动发放时间早于或等于现在的发放记录 + return true; + } + return false; + }).map(SalarySendPO::getId).collect(Collectors.toList()); + + // 获取工资单发放记录下需要发放的工资单明细 + List needSendInfoList = getSalarySendService(tempUser).getNeedSendInfoList(needSendIds); + Map> sendMap = SalaryEntityUtil.group2Map(needSendInfoList, SalarySendInfoPO::getSalarySendId, SalarySendInfoPO::getId); + for(Map.Entry> entry : sendMap.entrySet()){ + // 发放 + getSalaryBillService(tempUser).grant(SalarySendGrantParam.builder().salarySendId(entry.getKey()).ids(new ArrayList(entry.getValue())).build()); + } + } +} diff --git a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java index 7639f4e13..bb2bc96e9 100644 --- a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java @@ -153,6 +153,7 @@ public class SalaryTemplateWrapper extends Service { salaryTemplateBaseSetDTO.setMsgStatus(po.getMsgStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())); salaryTemplateBaseSetDTO.setSalarySob(po.getSalarySobId()); salaryTemplateBaseSetDTO.setSendEmail(po.getSendEmailId()); + salaryTemplateBaseSetDTO.setAutoSendStatus(po.getAutoSendStatus() == null ? false : po.getAutoSendStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())); // 规则赋值 如果为ALL传“” 如果为byRule传薪资项目ID salaryTemplateBaseSetDTO.setReplenishRule(SalaryTemplateReplenishRuleEnum.ALL.getValue().equals(po.getReplenishRule()) ? "" : po.getReplenishRule()); // 规则设置赋值