EvalGroupTask.java 5.57 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.bo.eval.EvalGroupCalculableBO;
import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO;
import cn.fw.morax.domain.db.eval.Eval;
import cn.fw.morax.domain.db.eval.EvalGroup;
import cn.fw.morax.domain.db.eval.EvalGroupReward;
import cn.fw.morax.domain.db.eval.EvalShopPool;
import cn.fw.morax.domain.enums.EvalScopeEnum;
import cn.fw.morax.domain.enums.EvalShopPoolStatusEnum;
import cn.fw.morax.domain.enums.SettingStatusEnum;
import cn.fw.morax.service.biz.eval.EvalGroupBizService;
import cn.fw.morax.service.biz.eval.EvalGroupDataService;
import cn.fw.morax.service.biz.eval.EvalRewardService;
import cn.fw.morax.service.data.eval.EvalGroupRewardService;
import cn.fw.morax.service.data.eval.EvalGroupService;
import cn.fw.morax.service.data.eval.EvalService;
import cn.fw.morax.service.data.eval.EvalShopPoolService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.stream.Collectors;

/**
 * @author : jiangchao
 * @className : EvalGroupStatusTask
 * @description : 考评组配置状态定时器
 * @date : 2022-04-07 15:29
 */
@Component
@Slf4j
@RequiredArgsConstructor
@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
public class EvalGroupTask {

    private final EvalShopPoolService evalShopPoolService;
    private final EvalGroupService evalGroupService;
    private final EvalService evalService;
    private final DistributedLocker distributedLocker;

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

    /**
     * 每天凌晨3点
     * 1. 将待生效数据改为生效中
     * 2. 将之前的配置设置为失效
     * 3. 处理重复数据,合并、拆分门店的考评组配置需要把其他的重复配置失效
     */
    @Scheduled(cron = TimeTaskConstant.EVAL)
    @Transactional(rollbackFor = Exception.class)
    public void processCurMonthEffectEvals() {
        Lock lock = distributedLocker.lock(getEvalGroupDistKey());
        if (! ((RLock) lock).isLocked()) {
            return;
        }
        try {
            log.info("定时任务【每月考评组配置状态改变】开始执行");
            LocalDate currentTime = LocalDate.now();
            List<Eval> evals = evalService.list(Wrappers.<Eval>lambdaQuery()
                    .eq(Eval::getStatus, SettingStatusEnum.EFFECTIVE)
                    .eq(Eval::getId, Boolean.TRUE)
            );
            if (PublicUtil.isEmpty(evals)) {
                return;
            }
            List<Long> evalIds = evals.stream().map(Eval::getId).collect(Collectors.toList());
            List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery()
                    .in(EvalGroup::getEvalId, evalIds)
                    .eq(EvalGroup::getYn, Boolean.TRUE)
            );

            //修改对应门店考评池的状态
            LocalDate yesterday = currentTime.minusDays(1);
            List<Long> inEffectiveShopEvalGroupIds = evalGroups.stream()
                    .filter(evalGroup -> EvalScopeEnum.SHOP.equals(evalGroup.getScopeType()) && evalGroup.getOverTime().equals(yesterday))
                    .map(EvalGroup::getId).collect(Collectors.toList());
            if (PublicUtil.isNotEmpty(inEffectiveShopEvalGroupIds)) {
                evalShopPoolService.update(Wrappers.<EvalShopPool>lambdaUpdate()
                        .eq(EvalShopPool::getEvalGroupId, inEffectiveShopEvalGroupIds)
                        .eq(EvalShopPool::getYn, Boolean.TRUE)
                        .set(EvalShopPool::getStatus, EvalShopPoolStatusEnum.WAIT_DIST_REWARD)
                        .set(EvalShopPool::getUpdateTime, new Date())
                );
            }

            List<Long> ineffectiveIds = new ArrayList<>();
            Map<Long, List<EvalGroup>> evalMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getEvalId));
            for (Map.Entry<Long, List<EvalGroup>> evalEntry : evalMap.entrySet()) {
                Boolean existNotEndGroup = evalEntry.getValue().stream()
                        .filter(evalGroup -> evalGroup.getOverTime().isAfter(currentTime)).findFirst().isPresent();
                if (! existNotEndGroup) {
                    ineffectiveIds.add(evalEntry.getKey());
                }
            }
            if (PublicUtil.isNotEmpty(ineffectiveIds)) {
                evalService.update(Wrappers.<Eval>lambdaUpdate()
                        .in(Eval::getId, ineffectiveIds)
                        .set(Eval::getStatus, SettingStatusEnum.INEFFECTIVE)
                        .set(Eval::getUpdateTime, new Date())
                );
            }

        } catch (Exception e){
            log.error(e.getMessage(), e);
        } finally {
            lock.unlock();
        }
    }




}