PubFollowTask.java
4.54 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
package cn.fw.valhalla.controller.task;
import cn.fw.valhalla.common.utils.StringUtils;
import cn.fw.valhalla.domain.db.pub.PubCluePool;
import cn.fw.valhalla.domain.enums.PublicClueStateEnum;
import cn.fw.valhalla.service.bus.pub.PubFollowBizService;
import cn.fw.valhalla.service.data.PubCluePoolService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 公共池线索任务
*
* @author : kurisu
* @version : 1.0
* @className : PubFollowTask
* @description : 公共池线索任务
* @date : 2023-03-21 16:11
*/
@Component
@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
@Slf4j
public class PubFollowTask {
private final StringRedisTemplate stringRedisTemplate;
private final PubFollowBizService pubFollowBizService;
private final PubCluePoolService pubCluePoolService;
@Value("${spring.cache.custom.global-prefix}:role-change-need-close:clue")
@Getter(AccessLevel.PRIVATE)
private String roleChangeNeedCloseClueKey;
@Value("${spring.cache.custom.global-prefix}:pub-clue:complete")
@Getter(AccessLevel.PRIVATE)
private String pubClueCompleteKey;
public PubFollowTask(final StringRedisTemplate stringRedisTemplate,
final PubFollowBizService pubFollowBizService,
final PubCluePoolService pubCluePoolService) {
this.stringRedisTemplate = stringRedisTemplate;
this.pubFollowBizService = pubFollowBizService;
this.pubCluePoolService = pubCluePoolService;
}
/**
* 开始任务
*/
@Scheduled(initialDelay = 1000 * 10, fixedRate = 1000 * 10)
public void startClue() {
List<PubCluePool> list = pubCluePoolService.list(Wrappers.<PubCluePool>lambdaQuery()
.eq(PubCluePool::getState, PublicClueStateEnum.ONGOING)
.eq(PubCluePool::getBegun, Boolean.FALSE)
.last("limit 0, 500")
);
if (CollectionUtils.isEmpty(list)) {
return;
}
for (PubCluePool cluePool : list) {
pubFollowBizService.startClue(cluePool);
}
}
/**
* 关闭线索
*/
@Scheduled(initialDelay = 1000 * 10, fixedRate = 1000 * 10)
public void closeClue() {
BoundListOperations<String, String> listOps = stringRedisTemplate.boundListOps(getPubClueCompleteKey());
List<String> failList = new ArrayList<>();
String idStr;
while ((idStr = listOps.leftPop()) != null) {
if (!StringUtils.isEmpty(idStr)) {
continue;
}
try {
pubFollowBizService.closeClue(idStr);
} catch (Exception e) {
if (StringUtils.isValid(idStr)) {
failList.add(idStr);
}
log.error("处理关闭公共池线索失败", e);
}
}
if (!CollectionUtils.isEmpty(failList)) {
String[] idArr = failList.toArray(new String[0]);
listOps.rightPushAll(idArr);
}
}
/**
* 处理角色变动战败公共池跟进线索
*/
@Scheduled(cron = "0/20 * * * * *")
public void roleChangeDefeatClue() {
BoundSetOperations<String, String> setOps = stringRedisTemplate.boundSetOps(getRoleChangeNeedCloseClueKey());
List<String> failList = new ArrayList<>();
String idStr;
while ((idStr = setOps.pop()) != null) {
if (!StringUtils.isNumber(idStr)) {
continue;
}
try {
pubFollowBizService.roleChangeDefeatClue(idStr);
} catch (Exception e) {
if (StringUtils.isValid(idStr)) {
failList.add(idStr);
}
log.error("处理角色变动结束公共池线索失败", e);
}
}
if (!CollectionUtils.isEmpty(failList)) {
String[] idArr = failList.toArray(new String[0]);
setOps.add(idArr);
}
}
}