From 92e80b2d09f8d80358b42113df5e243861dad525 Mon Sep 17 00:00:00 2001
From: tanglong <842690096@qq.com>
Date: Wed, 22 Jul 2026 13:06:13 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E9=80=81=E5=90=8D=E5=8D=95=E4=BC=98?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/WecomCallbackController.java | 6 ++
.../LowHoursWarningPushIntentHandler.java | 5 +-
.../report/LowHoursWarningPushService.java | 37 ++++++--
...entTeachingAttendanceReportController.java | 7 +-
.../report/TeachingAlertPushService.java | 90 ++++++++++++++-----
.../report/TeachingWarningPushRequest.java | 11 ++-
.../LowHoursWarningPushIntentHandlerTest.java | 38 ++++++++
.../report/TeachingAlertPushServiceTest.java | 28 ++++++
8 files changed, 193 insertions(+), 29 deletions(-)
create mode 100644 src/test/java/com/company/agentfoundation/semantic/handler/LowHoursWarningPushIntentHandlerTest.java
diff --git a/src/main/java/com/company/agentfoundation/integration/wecom/controller/WecomCallbackController.java b/src/main/java/com/company/agentfoundation/integration/wecom/controller/WecomCallbackController.java
index 0f0b0ec..c625f25 100644
--- a/src/main/java/com/company/agentfoundation/integration/wecom/controller/WecomCallbackController.java
+++ b/src/main/java/com/company/agentfoundation/integration/wecom/controller/WecomCallbackController.java
@@ -232,6 +232,12 @@ public class WecomCallbackController {
}
private String startedMessage(String reportLabel) {
+ if ("学员运营预警数据".equals(reportLabel)) {
+ return "### 📤 正在准备推送\n"
+ + "> **" + reportLabel + "**\n"
+ + "> 正在获取预警名单并匹配对应馆长,请稍候……\n\n"
+ + "名单准备完成后将立即发送,请勿重复提交推送指令。";
+ }
return "### ⏳ 正在查询\n"
+ "> **" + reportLabel + "**\n"
+ "> 正在获取最新数据,请稍候……\n\n"
diff --git a/src/main/java/com/company/agentfoundation/semantic/handler/LowHoursWarningPushIntentHandler.java b/src/main/java/com/company/agentfoundation/semantic/handler/LowHoursWarningPushIntentHandler.java
index 414ff37..1dbe241 100644
--- a/src/main/java/com/company/agentfoundation/semantic/handler/LowHoursWarningPushIntentHandler.java
+++ b/src/main/java/com/company/agentfoundation/semantic/handler/LowHoursWarningPushIntentHandler.java
@@ -32,8 +32,11 @@ public class LowHoursWarningPushIntentHandler implements SemanticIntentHandler {
public String handle(SemanticRequestContext context, SemanticRecognition recognition) {
try {
SemanticDateRangeResolver.DateRange range = dateRangeResolver.resolve(context, recognition);
+ String command = context.userText() == null ? "" : context.userText();
+ boolean lowHoursOnly = command.contains("低课时")
+ && !command.contains("高频缺勤") && !command.contains("预警数据");
LowHoursWarningPushService.PushSummary result = service.push(
- context.wecomUserId(), range.startDate(), range.endDate());
+ context.wecomUserId(), range.startDate(), range.endDate(), true, !lowHoursOnly);
return "### ✅ 学员运营预警推送完成\n"
+ "> 日期:**" + range.startDate()
+ (range.startDate().equals(range.endDate()) ? "" : " 至 " + range.endDate()) + "**\n"
diff --git a/src/main/java/com/company/agentfoundation/teaching/report/LowHoursWarningPushService.java b/src/main/java/com/company/agentfoundation/teaching/report/LowHoursWarningPushService.java
index 84b3dfc..0ea915e 100644
--- a/src/main/java/com/company/agentfoundation/teaching/report/LowHoursWarningPushService.java
+++ b/src/main/java/com/company/agentfoundation/teaching/report/LowHoursWarningPushService.java
@@ -6,6 +6,8 @@ import com.company.agentfoundation.security.ReportDataScopeService.Scope;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;
@@ -25,6 +27,7 @@ import java.util.function.Supplier;
@Service
public class LowHoursWarningPushService {
+ private static final Logger log = LoggerFactory.getLogger(LowHoursWarningPushService.class);
private static final String STUDENT = "/api/student/findStudentsByInstitution";
private static final String CONTRACT = "/api/contract/findByInstitution";
private static final String CONTRACT_PRODUCT = "/api/contractProduct/findByInstitution";
@@ -53,6 +56,12 @@ public class LowHoursWarningPushService {
}
public PushSummary push(String wecomUserId, LocalDate startDate, LocalDate endDate) {
+ return push(wecomUserId, startDate, endDate, true, true);
+ }
+
+ public PushSummary push(String wecomUserId, LocalDate startDate, LocalDate endDate,
+ boolean includeLowHours, boolean includeFrequentAbsence) {
+ long startedAt = System.nanoTime();
if (wecomUserId == null || wecomUserId.isBlank()) {
throw new IllegalArgumentException("wecomUserId is required");
}
@@ -67,15 +76,29 @@ public class LowHoursWarningPushService {
throw new ResponseStatusException(HttpStatus.FORBIDDEN,
"仅管理员、区域总、城市总或馆长可以推送学员运营预警");
}
- XuebangTeachingReportDataService.Snapshot snapshot = realtimeData.load(effectiveStart, effectiveEnd, scope);
- List