EvalGroupTask.java
5.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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();
}
}
}