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