-
Notifications
You must be signed in to change notification settings - Fork 42
/
Timer.java
133 lines (117 loc) · 4.46 KB
/
Timer.java
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
133
package com.softeng.dingtalk.component;
import com.softeng.dingtalk.api.MessageApi;
import com.softeng.dingtalk.entity.ExternalPaper;
import com.softeng.dingtalk.entity.Paper;
import com.softeng.dingtalk.entity.Vote;
import com.softeng.dingtalk.repository.ExternalPaperRepository;
import com.softeng.dingtalk.repository.InternalPaperRepository;
import com.softeng.dingtalk.repository.VoteRepository;
import com.softeng.dingtalk.service.InitService;
import com.softeng.dingtalk.service.VoteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.transaction.Transactional;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author zhanyeye
* @description 定时器
* @create 2/9/2020 12:30 PM
*/
@Slf4j
@Component
@Transactional
public class Timer {
@Autowired
VoteRepository voteRepository;
@Autowired
VoteService voteService;
@Autowired
InternalPaperRepository internalPaperRepository;
@Autowired
InitService initService;
@Autowired
ExternalPaperRepository externalPaperRepository;
@Autowired
MessageApi messageApi;
/**
* 每分钟扫描一次,看是否有待启动的投票
*/
@Scheduled(cron = "0/20 * * * * ?")
public void checkVote() {
LocalDateTime now = LocalDateTime.now();
// (针对外部评审投票) 检查是否有投票需要开始
List<Vote> upcomingVotes = voteService.listUpcomingVote(now);
upcomingVotes.forEach(v -> {
// 标注该投票已经开始
v.setStarted(true);
voteRepository.save(v);
ExternalPaper externalPaper = externalPaperRepository.findByVid(v.getId());
if (externalPaper != null) {
// 发送投票开始的消息
String markdown = startVoteInfo(externalPaper.getTitle(), v.getEndTime());
String url = generateVoteDetailUrl(true, externalPaper.getId());
messageApi.sendActionCard("外部评审投票", markdown, "前往投票", url);
}
});
}
/**
* 每分钟扫描一次,看是否有待结束的投票
*/
@Scheduled(cron = "0/20 * * * * ?")
public void checkVote2() {
// 检查是否有需要被结束的投票
LocalDateTime now = LocalDateTime.now();
List<Vote> votes = voteService.listUnderwayVote(now);
votes.forEach(v -> {
// 更新汇总投票结果
v = voteService.updateVote(v);
Paper paper = v.isExternal() ? externalPaperRepository.findByVid(v.getId()) : internalPaperRepository.findByVid(v.getId());
String url = generateVoteDetailUrl(paper.isExternal(), paper.getId());
String markdown = voteResultInfo(paper.getTitle(), v.getResult(), v.getAccept(), v.getTotal());
messageApi.sendActionCard("投票结果", markdown, "查看详情", url);
});
}
/**
* 每月1日3点执行 initDcDummary 方法
*/
@Scheduled(cron = "0 0 3 1 * ?")
public void initMonthlyDcSummary() {
initService.initDcSummary();
}
/**
* 投票消息卡片跳转的 url
* @param isExternal
* @param pid
* @return
*/
private String generateVoteDetailUrl(boolean isExternal, int pid) {
return (isExternal ? "/paper/ex-detail/" : "/paper/in-detail/") + pid + "/vote";
}
/**
* 确认投票结果的消息模板
* @param title
* @param result
* @param acceptCnt
* @param totalCnt
* @return
*/
private String voteResultInfo(String title, boolean result, int acceptCnt, int totalCnt) {
return new StringBuilder().append(" #### 投票结果 \n ##### 论文: ").append(title)
.append(" \n 最终结果: ").append(result ? "Accept" : "reject")
.append(" \n Accept: ").append(acceptCnt).append(" 票 \n ")
.append("Reject: ").append(totalCnt - acceptCnt).append(" 票 \n ")
.append("已参与人数: ").append(totalCnt).append("人 \n ").toString();
}
/**
* 发起投票的消息模板
* @param title
* @param dateTime
* @return
*/
private String startVoteInfo(String title, LocalDateTime dateTime) {
return " #### 投票 \n ##### 论文: " + title + " \n 截止时间: " + dateTime.toLocalTime().toString();
}
}