chengf
2026-01-29 abefef70ee144169527e878513636578742f40bc
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package org.jeecg.modules.demo.contract.controller;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.config.firewall.SqlInjection.impl.RobinJdbcConfig;
import org.jeecg.modules.demo.contract.entity.Contract;
import org.jeecg.modules.demo.contract.entity.SemanticWord;
import org.jeecg.modules.demo.contract.service.IContractService;
import org.jeecg.modules.demo.contract.service.ISemanticWordService;
import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
 
/**
 * JEECG-Boot 定时发送邮件任务
 */
@Tag(name="邮件")
@RestController
@RequestMapping("/email")
@Slf4j
public class EmailScheduledTask {
 
    @Autowired
    @Qualifier("robinJdbcTemplate") // 指定特定的JdbcTemplate
    private JdbcTemplate jdbcTemplate;
 
    @Autowired
    private EmailSendMsgHandle emailSendMsgHandle;
 
    @Autowired
    private ISemanticWordService semanticWordService;
 
    @Autowired
    private IContractService contractService;
 
//    @Scheduled(initialDelay = 6000, fixedRate = 1800000)
    public void sendTimedEmail() {
 
        QueryWrapper<SemanticWord> semanticWordQueryWrapper = new QueryWrapper<>();
        semanticWordQueryWrapper.in("status", new Object[]{4,5,6,7});
        List<SemanticWord> list = semanticWordService.list(semanticWordQueryWrapper);
 
        for (SemanticWord semanticWord : list) {
            Contract byId = contractService.getById(semanticWord.getContractId());
            if (byId == null) {
                return;
            } else {
                String contractId = byId.getContractCode();
                String sql = "select count(1) from d_event_list where contract_name = '" + contractId + "' and (keyword_name like concat('%','" + semanticWord.getWord() + "','%'))";
                Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql);
                if (stringObjectMap != null) {
                    if (stringObjectMap.get("count(1)") != null && !stringObjectMap.get("count(1)").toString().equals("0")) {
                        // 1. 定义预编译SQL模板(用?占位符代替变量)
                        String sqlV2 = "SELECT\n" +
                                "    IFNULL(t2.highlight_count / t1.total_count, 0) AS ratio,\n" +
                                "    t1.total_count,\n" +
                                "    t2.highlight_count\n" +
                                "FROM\n" +
                                "    (SELECT COUNT(*) AS total_count\n" +
                                "     FROM d_keyword_list kl\n" +
                                "     WHERE kl.is_active = 1\n" +
                                "       AND kl.sType = 'rank'\n" +
                                "       AND kl.ContractId = ?\n" +  // 占位符1:contractId
                                "       AND kl.sDomain <> 'HC_audit'\n" +
                                "       AND kl.sBookMarkName LIKE CONCAT('%', ?, '%')\n" +  // 占位符2:semanticWord
                                "       AND EXISTS (\n" +
                                "           SELECT 1\n" +
                                "           FROM d_event_list el\n" +
                                "           WHERE el.contract_name = ?\n" +  // 占位符3:contractId
                                "             AND el.keyword_name LIKE CONCAT('%', ?, '%')\n" +  // 占位符4:semanticWord
                                "       )) AS t1,\n" +
                                "    (" +
                                "SELECT COUNT(DISTINCT el.keyword_name) AS highlight_count\n" +
                                "FROM d_event_list el\n" +
                                "INNER JOIN d_keyword_list kl \n" +
                                "    ON el.keyword_name = kl.sBookMarkName\n" +
                                "WHERE el.contract_name = ?\n" +
                                "  AND el.keyword_name LIKE CONCAT('%', ? ,'%')\n" +
                                "  AND kl.is_active = 1\n" +
                                "  AND kl.ContractId = ?\n" +
                                "  AND kl.sDomain <> 'HC_audit'\n" +
                                "  AND (el.keyword_name, el.event_time) IN (\n" +
                                "    SELECT keyword_name, MAX(event_time)\n" +
                                "    FROM d_event_list\n" +
                                "    WHERE contract_name = ?\n" +
                                "      AND keyword_name LIKE CONCAT('%', ? ,'%')\n" +
                                "    GROUP BY keyword_name\n" +
                                "  )\n" +
                                "  AND el.type_info = 'appear') as t2";
                        Map<String, Object> semMap = jdbcTemplate.queryForMap(
                                sqlV2,
                                // 按占位符顺序传入参数(注意顺序和?一一对应)
                                contractId,
                                semanticWord.getWord(),
                                contractId,
                                semanticWord.getWord(),
                                contractId,
                                semanticWord.getWord(),
                                contractId,
                                contractId,
                                semanticWord.getWord()
 
                        );
                        String[] es_receiver = new String[]{"2156125618@qq.com"};
//                        String[] es_receiver = new String[]{"182004222@qq.com","lospace@163.com","2156125618@qq.com","coldspring@163.com"};
                        BigDecimal acceptindicator = new BigDecimal(semMap.get("ratio").toString());
                        if (semanticWord.getCount() == null || semanticWord.getCount().equals("")){
                            if (semanticWord.getAcceptindicator()/100 <= acceptindicator.doubleValue()){//上词
                                semanticWord.setCount(acceptindicator.toString());
                                String es_title = semanticWord.getOutWord() + "首次上词提醒邮件";
                                String es_content = "语义词:" + semanticWord.getWord() + ";漏出词:" + semanticWord.getOutWord() +
                                        ",排名要求:" + (semanticWord.getRanking() < 4 ? "小于大于" + semanticWord.getRanking() + "名。" : "保展现不保排名。") +
                                        "达标率要求:" + semanticWord.getAcceptindicator() +
                                        "%,当前达标率:" + acceptindicator.doubleValue() * 100 + "%";
                                for (String s_receiver : es_receiver) {
                                    emailSendMsgHandle.sendMsg(s_receiver ,es_title ,es_content);
                                }
                                semanticWord.setStatus("5");
                                semanticWordService.updateById(semanticWord);
                            }else {//掉词
                                semanticWord.setCount(acceptindicator.toString());
                                String es_title = semanticWord.getOutWord() + "掉词提醒邮件";
                                String es_content = "语义词:" + semanticWord.getWord() + ";漏出词:" + semanticWord.getOutWord() +
                                        ",排名要求:" + (semanticWord.getRanking() < 4 ? "小于等于" + semanticWord.getRanking() + "名。" : "保展现不保排名。") +
                                        "达标率要求:" + semanticWord.getAcceptindicator() +
                                        "%,当前达标率:" + acceptindicator.doubleValue() * 100 + "%";
                                for (String s_receiver : es_receiver) {
                                    emailSendMsgHandle.sendMsg(s_receiver ,es_title ,es_content);
                                }
                                semanticWord.setStatus("6");
                                semanticWordService.updateById(semanticWord);
                            }
 
                        }//掉词时上词了
                        else if (semanticWord.getStatus().equals("6") && semanticWord.getAcceptindicator() <= acceptindicator.doubleValue() * 100){
                            semanticWord.setCount(acceptindicator.toString());
                            String es_title = semanticWord.getOutWord() + "再次上词提醒邮件";
                            String es_content = "语义词:" + semanticWord.getWord() + ";漏出词:" + semanticWord.getOutWord() +
                                    ",排名要求:" + (semanticWord.getRanking() < 4 ? "小于等于" + semanticWord.getRanking() + "名。" : "保展现不保排名。") +
                                    "达标率要求:" + semanticWord.getAcceptindicator() +
                                    "%,当前达标率:" + acceptindicator.doubleValue() * 100 + "%";
                            for (String s_receiver : es_receiver) {
                                emailSendMsgHandle.sendMsg(s_receiver ,es_title ,es_content);
                            }
                            semanticWord.setStatus("5");
                            semanticWordService.updateById(semanticWord);
                        }//上词后掉词
                        else if (semanticWord.getStatus().equals("5") && semanticWord.getAcceptindicator() > acceptindicator.doubleValue() * 100){
                            semanticWord.setCount(acceptindicator.toString());
                            String es_title = semanticWord.getOutWord() + "掉词提醒邮件";
                            String es_content = "语义词:" + semanticWord.getWord() + ";漏出词:" + semanticWord.getOutWord() +
                                    ",排名要求:" + (semanticWord.getRanking() < 4 ? "小于等于" + semanticWord.getRanking() + "名。" : "保展现不保排名。") +
                                    "达标率要求:" + semanticWord.getAcceptindicator() + "%,当前达标率:" + acceptindicator.doubleValue() * 100 + "%";
                            for (String s_receiver : es_receiver) {
                                emailSendMsgHandle.sendMsg(s_receiver ,es_title ,es_content);
                            }
                            semanticWord.setStatus("6");
                            semanticWordService.updateById(semanticWord);
                        }
 
                    }
                }
            }
        }
        int i = 1;
 
//        String es_receiver = "2156125618@qq.com";
//        String es_title = "jeecg测试邮件";
//        String es_content = "测试内容";
//        emailSendMsgHandle.sendMsg(es_receiver ,es_title ,es_content );
    }
//
//    //                            String[] es_receiver = new String[]{"182004222@qq.com","lospace@163.com","2156125618@qq.com"};
//    String es_title = semMap.get("target_name") + (Integer.parseInt(semMap.get("iResultRank").toString()) <= semanticWord.getRanking()? (stringObjectMap.get("count(1)").toString().equals("1")?"首次上词提醒邮件" : "再次上词提醒邮件") : "掉词提醒邮件");
//    String es_content = "语义词:" + semMap.get("keyword_name").toString() + ";漏出词:" + semMap.get("target_name") + (Integer.parseInt(semMap.get("iResultRank").toString()) <= semanticWord.getRanking()? (stringObjectMap.get("count(1)").toString().equals("1")?"首次上词" : "再次上词") : "掉词了") +",当前排名:" + semMap.get("iResultRank") + "。";
//                        for (String s_receiver : es_receiver) {
//        emailSendMsgHandle.sendMsg(s_receiver ,es_title ,es_content);
//    }
//
//                        semanticWord.setNowNo(semMap.get("iResultRank").toString());
//                        semanticWord.setStatus(Integer.parseInt(semMap.get("iResultRank").toString()) <= semanticWord.getRanking()?"5" : "6");
//
//                        semanticWordService.updateById(semanticWord);
 
}