案例专家:邮件告警逻辑

This commit is contained in:
liu.zixi
2025-10-09 15:24:16 +08:00
parent 26f3b0bb04
commit ecf39fe624
6 changed files with 83 additions and 16 deletions

View File

@@ -56,4 +56,9 @@ public class CaseAiProperties {
* 白名单用户列表 * 白名单用户列表
*/ */
private List<String> whiteUserCodeList; private List<String> whiteUserCodeList;
/**
* AI处理失败告警邮件收件人列表
*/
private List<String> alertEmailRecipients;
} }

View File

@@ -12,6 +12,7 @@ import com.xboe.enums.CaseDocumentLogCaseStatusEnum;
import com.xboe.enums.CaseDocumentLogOptStatusEnum; import com.xboe.enums.CaseDocumentLogOptStatusEnum;
import com.xboe.enums.CaseDocumentLogOptTypeEnum; import com.xboe.enums.CaseDocumentLogOptTypeEnum;
import com.xboe.enums.CaseDocumentLogRunStatusEnum; import com.xboe.enums.CaseDocumentLogRunStatusEnum;
import com.xboe.module.assistance.service.IEmailService;
import com.xboe.module.boecase.dao.CaseDocumentLogDao; import com.xboe.module.boecase.dao.CaseDocumentLogDao;
import com.xboe.module.boecase.dao.CasesDao; import com.xboe.module.boecase.dao.CasesDao;
import com.xboe.module.boecase.entity.CaseDocumentLog; import com.xboe.module.boecase.entity.CaseDocumentLog;
@@ -70,6 +71,9 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
@Autowired @Autowired
private IAiAccessTokenService aiAccessTokenService; private IAiAccessTokenService aiAccessTokenService;
@Autowired
private IEmailService emailService;
private static final String ACCESS_TOKEN_CACHE_KEY = "case:ai:access_token"; private static final String ACCESS_TOKEN_CACHE_KEY = "case:ai:access_token";
@Override @Override
@@ -897,26 +901,76 @@ public class CaseKnowledgeServiceImpl implements ICaseKnowledgeService {
private void saveCaseDocumentLog(String caseId, String caseTitle, String optType, private void saveCaseDocumentLog(String caseId, String caseTitle, String optType,
String requestUrl, String requestBody, String responseBody, String requestUrl, String requestBody, String responseBody,
Integer runStatus, Integer optStatus, Integer caseStatus, String taskId) { Integer runStatus, Integer optStatus, Integer caseStatus, String taskId) {
try { CaseDocumentLog caseDocumentLog = new CaseDocumentLog();
CaseDocumentLog caseDocumentLog = new CaseDocumentLog(); caseDocumentLog.setId(IDGenerator.generate());
caseDocumentLog.setId(IDGenerator.generate()); caseDocumentLog.setTaskId(taskId);
caseDocumentLog.setTaskId(taskId); caseDocumentLog.setCaseId(caseId);
caseDocumentLog.setCaseId(caseId); caseDocumentLog.setCaseTitle(caseTitle);
caseDocumentLog.setCaseTitle(caseTitle); caseDocumentLog.setOptType(optType);
caseDocumentLog.setOptType(optType); caseDocumentLog.setRequestUrl(requestUrl);
caseDocumentLog.setRequestUrl(requestUrl); caseDocumentLog.setRequestBody(requestBody);
caseDocumentLog.setRequestBody(requestBody); caseDocumentLog.setResponseBody(responseBody);
caseDocumentLog.setResponseBody(responseBody); caseDocumentLog.setOptTime(LocalDateTime.now());
caseDocumentLog.setOptTime(LocalDateTime.now()); caseDocumentLog.setRunStatus(runStatus);
caseDocumentLog.setRunStatus(runStatus); caseDocumentLog.setOptStatus(optStatus);
caseDocumentLog.setOptStatus(optStatus); caseDocumentLog.setCaseStatus(caseStatus);
caseDocumentLog.setCaseStatus(caseStatus); caseDocumentLog.setExecuteDuration(0L);
caseDocumentLog.setExecuteDuration(0L);
try {
caseDocumentLogDao.save(caseDocumentLog); caseDocumentLogDao.save(caseDocumentLog);
log.info("保存CaseDocumentLog成功logId: {}", caseDocumentLog.getId()); log.info("保存CaseDocumentLog成功logId: {}", caseDocumentLog.getId());
} catch (Exception e) { } catch (Exception e) {
log.error("保存CaseDocumentLog失败", e); log.error("保存CaseDocumentLog失败", e);
} }
// 发送告警邮件逻辑
try {
// 如果optStatus是失败2发送"接口调用失败"告警邮件
if (optStatus != null && optStatus.equals(CaseDocumentLogOptStatusEnum.FAILED.getCode())) {
String subject = "【知识处理报警】知识处理失败-操作类型:【" + CaseDocumentLogOptTypeEnum.getDescByCode(optType) + "";
StringBuilder content = new StringBuilder();
content.append("您好知识处理流程中AI接口调用经多次重试后仍失败具体信息如下<br/><br/>");
content.append("案例标题:").append(caseTitle).append("<br/>");
content.append("操作类型:").append(CaseDocumentLogOptTypeEnum.getDescByCode(optType)).append("<br/>");
content.append("调用接口:").append(requestUrl).append("<br/>");
content.append("调用时间:").append(caseDocumentLog.getOptTime()).append("<br/><br/>");
content.append("请及时排查接口可用性、文档信息有效性或AI平台状态避免影响知识处理进度。");
// 使用配置的收件人列表
List<String> recipients = caseAiProperties.getAlertEmailRecipients();
if (recipients != null && !recipients.isEmpty()) {
try {
String to = String.join(",", recipients);
emailService.sendMail(to, subject, content.toString(), null);
} catch (Exception e) {
log.error("发送接口调用失败告警邮件失败", e);
}
}
}
// 如果caseStatus是失败2发送"业务处理失败"告警邮件
if (caseStatus != null && caseStatus.equals(CaseDocumentLogCaseStatusEnum.FAILED.getCode())) {
String subject = "【知识处理报警】AI平台处理失败-操作类型:【" + CaseDocumentLogOptTypeEnum.getDescByCode(optType) + "";
StringBuilder content = new StringBuilder();
content.append("您好知识处理流程中AI平台业务处理失败具体信息如下<br/><br/>");
content.append("案例标题:").append(caseTitle).append("<br/>");
content.append("操作类型:").append(CaseDocumentLogOptTypeEnum.getDescByCode(optType)).append("<br/>");
content.append("调用时间:").append(caseDocumentLog.getOptTime()).append("<br/><br/>");
content.append("请及时核查文档处理失败原因或联系AI平台技术支持排查解析问题。");
// 使用配置的收件人列表
List<String> recipients = caseAiProperties.getAlertEmailRecipients();
if (recipients != null && !recipients.isEmpty()) {
try {
String to = String.join(",", recipients);
emailService.sendMail(to, subject, content.toString(), null);
} catch (Exception e) {
log.error("发送业务处理失败告警邮件失败", e);
}
}
}
} catch (Exception e) {
log.error("发送告警邮件失败", e);
}
} }
} }

View File

@@ -87,6 +87,8 @@ xboe:
ai-api-code: 30800 ai-api-code: 30800
case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff
file-upload-callback-url: http://192.168.0.253:9090/xboe/m/boe/caseDocumentLog/uploadCallback file-upload-callback-url: http://192.168.0.253:9090/xboe/m/boe/caseDocumentLog/uploadCallback
alert-email-recipients:
- liu.zixi@ebiz-digits.com
xxl: xxl:
job: job:
accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0 accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0

View File

@@ -119,6 +119,8 @@ xboe:
ai-api-code: 30800 ai-api-code: 30800
case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff
file-upload-callback-url: http://10.251.132.75:9090/xboe/m/boe/caseDocumentLog/uploadCallback file-upload-callback-url: http://10.251.132.75:9090/xboe/m/boe/caseDocumentLog/uploadCallback
alert-email-recipients:
- liu.zixi@ebiz-digits.com
jasypt: jasypt:
encryptor: encryptor:
algorithm: PBEWithMD5AndDES algorithm: PBEWithMD5AndDES

View File

@@ -85,6 +85,8 @@ xboe:
ai-api-code: 30800 ai-api-code: 30800
case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff case-knowledge-id: de2e006e-82fb-4ace-8813-f25c316be4ff
file-upload-callback-url: http://10.251.113.95:9090/xboe/m/boe/caseDocumentLog/uploadCallback file-upload-callback-url: http://10.251.113.95:9090/xboe/m/boe/caseDocumentLog/uploadCallback
alert-email-recipients:
- liu.zixi@ebiz-digits.com
xxl: xxl:
job: job:
accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0 accessToken: 65ddc683-22f5-83b4-de3a-3c97a0a29af0

View File

@@ -121,6 +121,8 @@ xboe:
file-upload-callback-url: http://10.251.186.27:9090/xboe/m/boe/caseDocumentLog/uploadCallback file-upload-callback-url: http://10.251.186.27:9090/xboe/m/boe/caseDocumentLog/uploadCallback
use-white-list: true use-white-list: true
white-user-code-list: 00004409 white-user-code-list: 00004409
alert-email-recipients:
- liu.zixi@ebiz-digits.com
jasypt: jasypt:
encryptor: encryptor:
algorithm: PBEWithMD5AndDES algorithm: PBEWithMD5AndDES