package cn.fw.morax.server.task; import cn.fw.common.cache.locker.DistributedLocker; import cn.fw.morax.common.constant.TimeTaskConstant; import cn.fw.morax.rpc.oop.OopRpcService; import cn.fw.morax.rpc.oop.dto.GroupDTO; import cn.fw.morax.service.biz.salary.PayoffBizService; import cn.fw.morax.service.biz.salary.SalaryConfirmBizService; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.List; import java.util.concurrent.locks.Lock; /** * 通用定时器 * * @author : kurisu * @version : 1.0 * @className : PayoffTask * @description : 薪资发放定时器 * @date : 2022-05-07 16:10 */ @Component @Slf4j @ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on") public class PayoffTask { private final PayoffBizService payoffBizService; private final DistributedLocker distributedLocker; private final OopRpcService oopRpcService; private final SalaryConfirmBizService salaryConfirmBizService; @Value("${spring.cache.custom.global-prefix}:createSalarySheet") @Getter private String createSalarySheetKey; @Autowired public PayoffTask(final PayoffBizService payoffBizService, final DistributedLocker distributedLocker, final OopRpcService oopRpcService, final SalaryConfirmBizService salaryConfirmBizService) { this.payoffBizService = payoffBizService; this.distributedLocker = distributedLocker; this.oopRpcService = oopRpcService; this.salaryConfirmBizService = salaryConfirmBizService; } /** * 发放工资的准备 * [展示不对接财务] */ // @Scheduled(initialDelay = 1000L * 10, fixedRate = 1000L * 30) public void read2payoff() { // payoffBizService.read2payoff(); } /** * 发放工资 [工资单数据推送财务系统] * [暂时不对接财务] */ // @Scheduled(initialDelay = 1000L * 20, fixedRate = 1000L * 20) public void go2pay() { // payoffBizService.go2payoff(); } /** * 生成工资单[工资发放记录] * 每两个小时执行 */ @Scheduled(cron = "0 0 0/2 * * ?") public void createSalarySheet() { Lock lock = distributedLocker.lock(getCreateSalarySheetKey()); if (((RLock) lock).isLocked()) { List list = oopRpcService.allGroups(); if (!CollectionUtils.isEmpty(list)) { for (GroupDTO groupDTO : list) { payoffBizService.createSalarySheet(groupDTO.getId()); } } lock.unlock(); } } /** * 生成工资确认待办(在申述期开始时发送工资确认待办) * 每隔两小时检查一次是否有未生成确认待办的薪酬池数据 */ @Scheduled(cron = TimeTaskConstant.SALARY_CONFIRM_TODO) public void createSalaryConfirmTodo() { List list = oopRpcService.allGroups(); for (GroupDTO groupDTO : list) { salaryConfirmBizService.createSalaryConfirmTodo(groupDTO.getId()); } } /** * 每5分钟检查待办推送 */ @Scheduled(cron = "0 0/5 * * * ?") public void pushTodo() { salaryConfirmBizService.pushConfirm(); } }