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 semanticWordQueryWrapper = new QueryWrapper<>(); semanticWordQueryWrapper.in("status", new Object[]{4,5,6,7}); List 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 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 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); }