feat: add student followup report

This commit is contained in:
Codex
2026-06-30 16:42:23 +08:00
parent 7f97b52165
commit 7473c7a6d7
13 changed files with 567 additions and 22 deletions

View File

@@ -138,6 +138,42 @@ export interface TenantStudentCrmPushInput {
idempotencyKey?: string;
}
export interface TenantStudentFollowupReport {
item?: {
range?: Record<string, unknown>;
filters?: Record<string, unknown>;
summary?: {
total?: number;
open?: number;
inProgress?: number;
done?: number;
cancelled?: number;
highPriority?: number;
crmPushTasks?: number;
openBacklog?: number;
overdueBacklog?: number;
completedInRange?: number;
completionRate?: number;
completedInRangeRate?: number;
avgCompleteHours?: number;
};
crmQueue?: {
total?: number;
pending?: number;
sent?: number;
failed?: number;
studentCount?: number;
};
byStatus?: Record<string, unknown>[];
byType?: Record<string, unknown>[];
byPriority?: Record<string, unknown>[];
byAssignee?: Record<string, unknown>[];
byClass?: Record<string, unknown>[];
dailyTrend?: Record<string, unknown>[];
overdueItems?: TenantStudentFollowupItem[];
};
}
export interface ImportJobItem {
id: string;
importType?: string;
@@ -1063,6 +1099,20 @@ export async function loadTenantStudentFollowups(query: {
});
}
export async function loadTenantStudentFollowupReport(query: {
timeRange?: '7d' | '30d' | '90d';
startDate?: string;
endDate?: string;
assignedToUserId?: string;
followupType?: string;
classId?: string;
limit?: number;
} = {}) {
return apiRequest<TenantStudentFollowupReport>('/api/tenant-admin/students/followups/report', {
query: { ...query, limit: query.limit || 10 },
});
}
export async function upsertTenantStudentFollowup(input: {
id?: string;
studentUserId: string;