EvalGroupUserTask.java 4.9 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.common.utils.PublicUtil;
import cn.fw.morax.domain.db.eval.EvalGroup;
import cn.fw.morax.domain.db.eval.EvalGroupUser;
import cn.fw.morax.service.biz.eval.EvalGroupBizService;
import cn.fw.morax.service.biz.eval.EvalGroupUserBizService;
import cn.fw.morax.service.data.eval.EvalGroupUserService;
import cn.hutool.core.date.StopWatch;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
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.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.stream.Collectors;

/**
 * @author : jiangchao
 * @className : KpiGroupStatusTask
 * @description : 考评组人员定时器
 * @date : 2022-04-07 15:29
 */
@Component
@Slf4j
@RequiredArgsConstructor
@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
public class EvalGroupUserTask {

    private final EvalGroupUserBizService evalGroupUserBizService;
    private final EvalGroupUserService evalGroupUserService;
    private final DistributedLocker distributedLocker;

    @Value("${spring.cache.custom.global-prefix}:eval:group:user")
    @Getter
    private String evalGroupUserDistKey;

    /**
     * 每天凌晨30分执行(人事角色、岗位调整在5点执行)
     * 1. 将待生效数据改为生效中
     * 2. 将之前的配置设置为失效
     * 3. 处理重复数据,合并、拆分门店的考评组配置需要把其他的重复配置失效
     */
    @Scheduled(cron = TimeTaskConstant.EVAL_GROUP_USER)
    @Transactional(rollbackFor = Exception.class)
    public void processEvalUser() {
        Lock lock = distributedLocker.lock(getEvalGroupUserDistKey());
        if (((RLock) lock).isLocked()) {
            try {
                log.info("定时任务【考评组人员更新】开始执行");
                StopWatch stopWatch = new StopWatch();
                stopWatch.start("考评组人员更新,查询人事系统人员状态");
                //查询员工
                LocalDate yesterday = LocalDate.now().minusDays(1);
                List<EvalGroupUser> evalGroupUsersForSave = this.queryKpiStaff(yesterday);
                stopWatch.stop();
                if (PublicUtil.isEmpty(evalGroupUsersForSave)) {
                    log.info(stopWatch.prettyPrint());
                    return;
                }
                stopWatch.start("考评组人员保存,保存条数:"+ evalGroupUsersForSave.size());
                //逻辑删除今天已保存人员,保存人员
                Set<Long> kpiGroupIds = evalGroupUsersForSave.stream().map(EvalGroupUser::getEvalGroupId).collect(Collectors.toSet());
                evalGroupUserService.update(Wrappers.<EvalGroupUser>lambdaUpdate()
                        .in(EvalGroupUser::getEvalGroupId, kpiGroupIds)
                        .eq(EvalGroupUser::getDataDate, yesterday)
                        .eq(EvalGroupUser::getYn, Boolean.TRUE)
                        .set(EvalGroupUser::getYn, Boolean.FALSE)
                );
                evalGroupUserService.saveBatch(evalGroupUsersForSave);
                stopWatch.stop();
                log.info(stopWatch.prettyPrint(TimeUnit.SECONDS));
            } catch (Exception e){
                log.error(e.getMessage(), e);
            } finally {
                lock.unlock();
            }
        }
    }

    /**
     * 查询考评员工
     * @return
     */
    private List<EvalGroupUser> queryKpiStaff(LocalDate yesterday) {
        Map<Long, List<EvalGroup>> postKpis = evalGroupUserBizService.postEffectEvalGroups();
        if (! postKpis.isEmpty()) {
            log.info("需要生成考评组人员的考评组:{}", postKpis);
        }
        Long postId = null;
        List<EvalGroup> evalGroups = null;
        List<EvalGroupUser> evalGroupUsers = null;
        List<EvalGroupUser> evalGroupUsersForSave = Lists.newArrayListWithCapacity(300);
        for (Map.Entry<Long, List<EvalGroup>> entry : postKpis.entrySet()) {
            postId = entry.getKey();
            evalGroups = entry.getValue();
            evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday).stream()
                    .collect(Collectors.toList());
            evalGroupUsersForSave.addAll(evalGroupUsers);
        }
        return evalGroupUsersForSave;
    }

}