kindergarten_java/reading-platform-frontend/src/api/task.ts

191 lines
4.3 KiB
TypeScript
Raw Normal View History

import { http } from "./index";
// ==================== 类型定义 ====================
export type TaskType = "READING" | "ACTIVITY" | "HOMEWORK";
export type TargetType = "CLASS" | "STUDENT";
export type TaskStatus = "DRAFT" | "PUBLISHED" | "ARCHIVED";
export type CompletionStatus = "PENDING" | "IN_PROGRESS" | "COMPLETED";
export interface Task {
id: number;
tenantId: number;
title: string;
description?: string;
taskType: TaskType;
targetType: TargetType;
relatedCourseId?: number;
createdBy: number;
startDate: string;
endDate: string;
status: TaskStatus;
createdAt: string;
updatedAt: string;
course?: {
id: number;
name: string;
};
targetCount?: number;
completionCount?: number;
}
export interface TaskCompletion {
id: number;
taskId: number;
studentId: number;
status: CompletionStatus;
completedAt?: string;
feedback?: string;
parentFeedback?: string;
createdAt: string;
student?: {
id: number;
name: string;
gender?: string;
class?: {
id: number;
name: string;
};
};
}
export interface CreateTaskDto {
title: string;
description?: string;
taskType: TaskType;
targetType: TargetType;
relatedCourseId?: number;
startDate: string;
endDate: string;
targetIds: number[];
}
export interface UpdateTaskDto {
title?: string;
description?: string;
startDate?: string;
endDate?: string;
status?: TaskStatus;
targetIds?: number[];
}
export interface UpdateCompletionDto {
status: CompletionStatus;
feedback?: string;
parentFeedback?: string;
}
export interface TaskStats {
totalTasks: number;
publishedTasks: number;
completedTasks: number;
inProgressTasks: number;
}
// ==================== 学校端 API ====================
export const getTasks = (params?: {
page?: number;
pageSize?: number;
status?: TaskStatus;
taskType?: TaskType;
keyword?: string;
}) =>
http.get<{ items: Task[]; total: number; page: number; pageSize: number }>(
"/school/tasks",
{ params },
);
export const getTask = (id: number) => http.get<Task>(`/school/tasks/${id}`);
export const getTaskCompletions = (
taskId: number,
params?: {
page?: number;
pageSize?: number;
status?: CompletionStatus;
},
) =>
http.get<{
items: TaskCompletion[];
total: number;
page: number;
pageSize: number;
}>(`/school/tasks/${taskId}/completions`, { params });
export const createTask = (data: CreateTaskDto) =>
http.post<Task>("/school/tasks", data);
export const updateTask = (id: number, data: UpdateTaskDto) =>
http.put<Task>(`/school/tasks/${id}`, data);
export const deleteTask = (id: number) =>
http.delete(`/api/v1/school/tasks/${id}`);
export const updateTaskCompletion = (
taskId: number,
studentId: number,
data: UpdateCompletionDto,
) =>
http.put<TaskCompletion>(
`/school/tasks/${taskId}/completions/${studentId}`,
data,
);
export const getTaskStats = () =>
http.get<TaskStats>("/api/v1/school/tasks/stats");
// ==================== 教师端 API ====================
export const getTeacherTasks = (params?: {
page?: number;
pageSize?: number;
status?: TaskStatus;
taskType?: TaskType;
keyword?: string;
}) =>
http.get<{ items: Task[]; total: number; page: number; pageSize: number }>(
"/teacher/tasks",
{ params },
);
export const getTeacherTask = (id: number) =>
http.get<Task>(`/teacher/tasks/${id}`);
export const getTeacherTaskCompletions = (
taskId: number,
params?: {
page?: number;
pageSize?: number;
status?: CompletionStatus;
},
) =>
http.get<{
items: TaskCompletion[];
total: number;
page: number;
pageSize: number;
}>(`/teacher/tasks/${taskId}/completions`, { params });
export const createTeacherTask = (data: CreateTaskDto) =>
http.post<Task>("/teacher/tasks", data);
export const updateTeacherTask = (id: number, data: UpdateTaskDto) =>
http.put<Task>(`/teacher/tasks/${id}`, data);
export const deleteTeacherTask = (id: number) =>
http.delete(`/api/v1/teacher/tasks/${id}`);
export const updateTeacherTaskCompletion = (
taskId: number,
studentId: number,
data: UpdateCompletionDto,
) =>
http.put<TaskCompletion>(
`/teacher/tasks/${taskId}/completions/${studentId}`,
data,
);
export const getTeacherTaskStats = () =>
http.get<TaskStats>("/api/v1/teacher/tasks/stats");