From daac89e6e37fb9d53e147dcf8b9e5b5f7f9e0aed Mon Sep 17 00:00:00 2001 From: luogw <3132758203@qq.com> Date: Tue, 10 Mar 2026 11:21:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A4=E7=89=8C=E6=A1=B6=E9=99=90=E6=B5=81-?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E7=AE=97=E6=B3=95=E7=94=9F=E9=A2=98=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/interaction/utils/NotifyUtil.java | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/project/interaction/utils/NotifyUtil.java b/src/main/java/com/project/interaction/utils/NotifyUtil.java index c607de4..93a6111 100644 --- a/src/main/java/com/project/interaction/utils/NotifyUtil.java +++ b/src/main/java/com/project/interaction/utils/NotifyUtil.java @@ -6,10 +6,13 @@ import com.github.tingyugetc520.ali.dingtalk.bean.message.DtCorpConversationMsgS import com.github.tingyugetc520.ali.dingtalk.bean.message.DtMessage; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; @Slf4j @Component @@ -17,10 +20,32 @@ public class NotifyUtil { @Autowired private DtService dtService; + @Autowired + private RedissonClient redissonClient; + + // 钉钉通知相关配置 + private static final List WARN_USER_LIST = Lists.newArrayList( + "283712335120874575", + "01231011386731976125", + "5902043009320002110" + ); + // 防重复缓存key前缀 + private static final String WARN_LOCK_KEY_PREFIX = "question:gen:warn:lock:"; + // 重复发送间隔:1小时(3600秒) + private static final long WARN_LOCK_EXPIRE_SECONDS = 3600L; + public void notify(Long taskId,Long clusterId) { -// "283712335120874575", "01231011386731976125", - ArrayList userIDList = Lists.newArrayList( "283712335120874575", "01231011386731976125","590204300932000212"); + + // 构建Redis缓存key(按taskId唯一) + String cacheKey = WARN_LOCK_KEY_PREFIX + taskId; + + // 核心逻辑:检查Redis缓存,存在则直接返回(1小时内已发送过) + boolean isCached = redissonClient.getBucket(cacheKey).isExists(); + if (isCached) { + return; + } + try { String markdown = String.format("### 【告警】算法生题API调用失败通知 \n\n") + @@ -32,7 +57,7 @@ public class NotifyUtil { String.format("- 算法服务是否正常运行\n"); DtCorpConversationMessage corpConversationMessage = DtCorpConversationMessage.builder() .agentId(dtService.getDtConfigStorage().getAgentId()) - .userIds(Lists.newArrayList(userIDList)) + .userIds(WARN_USER_LIST) .msg(DtMessage.MARKDOWN() .content("算法生题API调用失败通知") .text(markdown) @@ -41,6 +66,7 @@ public class NotifyUtil { DtCorpConversationMsgSendResult result = dtService.getCorpConversationMsgService().send(corpConversationMessage); if (result.getErrCode() == 0) { log.info(">>> [算法生题API调用失败通知] 成功发送通知 ,考试任务ID:{} ,知识点簇ID:{}", taskId, clusterId); + redissonClient.getBucket(cacheKey).set("SEND_SUCCESS", WARN_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); } else { log.error(">>> [算法生题API调用失败通知] 发送失败.考试任务ID:{} ,知识点簇ID:{}, 错误码: {}, 错误信息: {}", taskId, clusterId, result.getErrCode(), result.getErrMsg());