PayoffTask.java 3.61 KB
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<GroupDTO> 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<GroupDTO> list = oopRpcService.allGroups();
        for (GroupDTO groupDTO : list) {
            salaryConfirmBizService.createSalaryConfirmTodo(groupDTO.getId());
        }
    }

    /**
     * 每5分钟检查待办推送
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void pushTodo() {
        salaryConfirmBizService.pushConfirm();
    }
}