agent-foundation/src/main/java/com/company/agentfoundation/semantic/handler/FrequentAbsenceWarningPushIntentHandler.java
2026-07-28 16:24:50 +08:00

61 lines
3.1 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.company.agentfoundation.semantic.handler;
import com.company.agentfoundation.semantic.SemanticDateRangeResolver;
import com.company.agentfoundation.semantic.SemanticIntentHandler;
import com.company.agentfoundation.semantic.SemanticRecognition;
import com.company.agentfoundation.semantic.SemanticRequestContext;
import com.company.agentfoundation.teaching.report.LowHoursWarningPushService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ResponseStatusException;
@Component
public class FrequentAbsenceWarningPushIntentHandler implements SemanticIntentHandler {
private static final Logger log = LoggerFactory.getLogger(FrequentAbsenceWarningPushIntentHandler.class);
private final LowHoursWarningPushService service;
private final SemanticDateRangeResolver dateRangeResolver;
public FrequentAbsenceWarningPushIntentHandler(
LowHoursWarningPushService service,
SemanticDateRangeResolver dateRangeResolver
) {
this.service = service;
this.dateRangeResolver = dateRangeResolver;
}
@Override public String intent() { return "PUSH_FREQUENT_ABSENCE_WARNING"; }
@Override public String description() { return "生成排课3次以上且缺勤2次以上的高频缺勤名单,并推送给场馆馆长"; }
@Override public String example() { return "推送本月高频缺勤名单"; }
@Override
public String handle(SemanticRequestContext context, SemanticRecognition recognition) {
SemanticDateRangeResolver.DateRange range = dateRangeResolver.resolve(context, recognition);
try {
LowHoursWarningPushService.PushSummary result = service.push(
context.wecomUserId(), range.startDate(), range.endDate(), false, true);
String reply = "### ✅ 高频缺勤名单推送完成\n"
+ "> 日期:**" + range.startDate()
+ (range.startDate().equals(range.endDate()) ? "" : " 至 " + range.endDate()) + "**\n"
+ "> 范围:**" + result.scopeLabel() + "**\n\n"
+ "高频缺勤:<font color=\"warning\">" + result.frequentAbsenceStudentCount() + "人</font>"
+ " | 匹配馆长:" + result.managerCount() + "人"
+ " | 成功消息:" + result.sentMessageCount() + "条"
+ "\n\n未匹配馆长的学员:" + result.unmatchedStudentCount() + "人"
+ " | 发送失败馆长:" + result.failedManagerCount() + "人";
result.deferredAttachments().forEach(attachment ->
context.deferExcel(attachment.fileName(), attachment.content()));
return reply;
} catch (ResponseStatusException exception) {
if (exception.getStatusCode().value() == 403) {
return exception.getReason() == null ? "无权限执行高频缺勤名单推送" : exception.getReason();
}
throw exception;
} catch (Exception exception) {
log.error("frequent absence warning push failed wecomUserId={} err={}",
context.wecomUserId(), exception.getMessage(), exception);
return "高频缺勤名单推送失败,请稍后重试。";
}
}
}