weaver-hrm-salary/src/com/engine/salary/timer/AutoSendSalaryJob.java

102 lines
4.7 KiB
Java
Raw Normal View History

2023-07-03 17:46:11 +08:00
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;
2023-07-03 17:46:11 +08:00
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<SalaryTemplatePO> autoSendTemplate = getSalaryTemplateService(tempUser).getAutoSendTemplate();
Map<Long, SalaryTemplatePO> autoSendTypeMap = SalaryEntityUtil.convert2Map(autoSendTemplate, SalaryTemplatePO::getSalarySobId);
List<Long> salarySobIds = autoSendTemplate.stream().map(SalaryTemplatePO::getSalarySobId).collect(Collectors.toList());
// 获取这些模板下未发放完的正常(非补发、非冻结)工资单
List<SalarySendPO> salarySendList = getSalarySendService(tempUser).getNeedSendListBySalarySobIds(salarySobIds);
2023-07-03 17:46:11 +08:00
LocalDateTime nowLocalDateTime = SalaryDateUtil.dateToLocalDateTime(new Date());
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
List<Long> 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);
}
2023-07-03 17:46:11 +08:00
int maxDays = autoSendDate.lengthOfMonth();
Integer sendDays = Integer.valueOf(templatePO.getAutoSendDayOfMonth());
2023-07-03 17:46:11 +08:00
if (sendDays.intValue() > maxDays) {
sendDays = maxDays;
}
autoSendDate = autoSendDate.withDayOfMonth(sendDays);
2023-07-03 17:46:11 +08:00
LocalDateTime autoSendDateTime = null;
try {
// 加上时间
autoSendDateTime = autoSendDate.atTime(SalaryDateUtil.dateToLocalDateTime(timeFormat.parse(templatePO.getAutoSendTimeOfDay())).toLocalTime());
2023-07-03 17:46:11 +08:00
} catch (ParseException e) {
throw new RuntimeException(e);
}
if (!autoSendDateTime.isAfter(nowLocalDateTime)) {
// 自动发放时间早于或等于现在的发放记录
2023-07-03 17:46:11 +08:00
return true;
}
return false;
}).map(SalarySendPO::getId).collect(Collectors.toList());
// 获取工资单发放记录下需要发放的工资单明细
List<SalarySendInfoPO> needSendInfoList = getSalarySendService(tempUser).getNeedSendInfoList(needSendIds);
Map<Long, Set<Long>> sendMap = SalaryEntityUtil.group2Map(needSendInfoList, SalarySendInfoPO::getSalarySendId, SalarySendInfoPO::getId);
2023-07-03 17:46:11 +08:00
for(Map.Entry<Long, Set<Long>> entry : sendMap.entrySet()){
// 发放
2023-07-03 17:46:11 +08:00
getSalaryBillService(tempUser).grant(SalarySendGrantParam.builder().salarySendId(entry.getKey()).ids(new ArrayList<Long>(entry.getValue())).build());
}
}
}