package cn.fw.morax.server.task; import cn.fw.morax.common.constant.TimeTaskConstant; import cn.fw.morax.service.biz.salary.SalaryCalcService; import cn.fw.morax.service.biz.salary.SalaryReportService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDate; /** * @author : kurisu * @version : 1.0 * @className : SalaryReportTask * @description : 薪酬数据任务 * @date : 2022-04-25 16:15 */ @Component @Slf4j @ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on") public class SalaryCalcTask { private final SalaryReportService salaryReportService; private final SalaryCalcService salaryCalcService; @Autowired public SalaryCalcTask(final SalaryReportService salaryReportService, final SalaryCalcService salaryCalcService) { this.salaryReportService = salaryReportService; this.salaryCalcService = salaryCalcService; } /** * 重试额外薪资数据持久化 */ @Scheduled(initialDelay = 1000L * 10, fixedRate = 1000L * 180) @Async public void retrySaveExtra() { salaryReportService.retrySaveReward(); } /** * 需要计算薪酬的薪酬组写入缓存 每天6点 */ @Scheduled(cron = TimeTaskConstant.CACHE_CALCULATE_SALARY_GROUP) public void cacheCalculableKpiGroup() { salaryCalcService.prepareCalcSalary(LocalDate.now().minusDays(1L)); } /** * 计算用户薪资 每90秒执行一次 */ @Scheduled(initialDelay = 1000L * 30, fixedRate = 1000L * 90) @Async public void calcUserSalary() { salaryCalcService.calculateSalary(); } /** * 星级申请变更后重新计算用户工资 每300秒执行一次 */ @Scheduled(initialDelay = 1000L * 5, fixedRate = 1000L * 300) @Async public void kpiChangeRetryCalcSalary() { salaryCalcService.retryCalcSalary(); } /** * 缓存上月最后一天的薪酬组为薪资的最终计算做准备 * 每个月2号 2点执行 */ @Scheduled(cron = "0 0 2 2 * ?") public void cacheFinalCalculableKpiGroup() { salaryCalcService.prepareCalcSalary(LocalDate.now().minusDays(1L)); } }