From 774af93d761f2df1f7435cc0f588efdec4bf1285 Mon Sep 17 00:00:00 2001 From: SpecialX <47072643+wangxiner55@users.noreply.github.com> Date: Tue, 14 Jul 2026 15:48:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(shared-proto):=20core=5Fedu=20proto=20?= =?UTF-8?q?=E6=89=A9=E5=B1=95=20admin/dashboard/leave-requests/grpc=20?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/shared-proto/proto/core_edu.proto | 298 ++++++++++++++++++++- 1 file changed, 297 insertions(+), 1 deletion(-) diff --git a/packages/shared-proto/proto/core_edu.proto b/packages/shared-proto/proto/core_edu.proto index 640d373..9cf8a67 100644 --- a/packages/shared-proto/proto/core_edu.proto +++ b/packages/shared-proto/proto/core_edu.proto @@ -6,7 +6,16 @@ package next_edu_cloud.core_edu.v1; // Covers exam management, homework assignment, grade recording, // attendance tracking, and class queries. // -// Total: 5 Service / 27 RPC (P3 target state per president-final-rulings §2.5). +// Total: 9 Service / 40 RPC (P3.13 expanded state per downstream 9-module analysis). +// - ExamService: 10 RPC (8 original + SaveExamDraft + RecordExamViolation) +// - HomeworkService: 5 RPC +// - GradeService: 7 RPC (6 original + GetReportCard) +// - ClassService: 4 RPC +// - AttendanceService: 4 RPC +// - ScheduleService: 1 RPC (GetScheduleByStudent) +// - LeaveRequestService: 3 RPC +// - DashboardService: 2 RPC +// - AdminService: 4 RPC (aggregation stubs) // Event contracts live in events.proto under next_edu_cloud.events.v1. // // Status naming (ISSUE-003-ai08 arbitration, scheme A): @@ -14,6 +23,7 @@ package next_edu_cloud.core_edu.v1; // HomeworkStatus: assigned / submitted / graded // SubmissionStatus: not_submitted / submitted / graded // AttendanceStatus: present / absent / late / leave +// LeaveRequestStatus: pending / approved / rejected / cancelled service ExamService { rpc CreateExam(CreateExamRequest) returns (CreateExamResponse); @@ -24,6 +34,8 @@ service ExamService { rpc PublishExam(PublishExamRequest) returns (PublishExamResponse); rpc SubmitExam(SubmitExamRequest) returns (SubmitExamResponse); rpc GradeExam(GradeExamRequest) returns (GradeExamResponse); + rpc SaveExamDraft(SaveExamDraftRequest) returns (SaveExamDraftResponse); + rpc RecordExamViolation(RecordExamViolationRequest) returns (RecordExamViolationResponse); } service HomeworkService { @@ -41,6 +53,7 @@ service GradeService { rpc ListGradesByExam(ListGradesByExamRequest) returns (ListGradesResponse); rpc ListGradesByHomework(ListGradesByHomeworkRequest) returns (ListGradesResponse); rpc UpdateGrade(UpdateGradeRequest) returns (UpdateGradeResponse); + rpc GetReportCard(GetReportCardRequest) returns (ReportCard); } service ClassService { @@ -57,6 +70,28 @@ service AttendanceService { rpc ListAttendanceByClass(ListAttendanceByClassRequest) returns (ListAttendanceResponse); } +service ScheduleService { + rpc GetScheduleByStudent(GetScheduleByStudentRequest) returns (GetScheduleByStudentResponse); +} + +service LeaveRequestService { + rpc ListLeaveRequestsByStudent(ListLeaveRequestsByStudentRequest) returns (ListLeaveRequestsResponse); + rpc CreateLeaveRequest(CreateLeaveRequestRequest) returns (CreateLeaveRequestResponse); + rpc CancelLeaveRequest(CancelLeaveRequestRequest) returns (CancelLeaveRequestResponse); +} + +service DashboardService { + rpc GetDashboard(GetDashboardRequest) returns (DashboardData); + rpc GetClassPerformance(GetClassPerformanceRequest) returns (ClassPerformance); +} + +service AdminService { + rpc ListSchools(ListSchoolsRequest) returns (ListSchoolsResponse); + rpc ListGradeLevels(ListGradeLevelsRequest) returns (ListGradeLevelsResponse); + rpc ListDepartments(ListDepartmentsRequest) returns (ListDepartmentsResponse); + rpc ListAcademicYears(ListAcademicYearsRequest) returns (ListAcademicYearsResponse); +} + // ---------------------------------------------------------------------------- // Exam domain // ---------------------------------------------------------------------------- @@ -431,3 +466,264 @@ message ListAttendanceByClassRequest { message ListAttendanceResponse { repeated Attendance attendance = 1; } + +// ---------------------------------------------------------------------------- +// Exam domain extensions (P3.13) +// ---------------------------------------------------------------------------- + +message SaveExamDraftRequest { + string exam_id = 1; + string student_id = 2; + repeated AnswerInput answers = 3; +} + +message SaveExamDraftResponse { + string draft_id = 1; +} + +message RecordExamViolationRequest { + string exam_id = 1; + string student_id = 2; + string violation_type = 3; // tab_switch / window_blur / copy_paste / fullscreen_exit / browser_devtools + string detail = 4; + int32 severity = 5; // 1=info, 2=warning, 3=critical +} + +message RecordExamViolationResponse { + string violation_id = 1; +} + +// ---------------------------------------------------------------------------- +// Grade domain extensions (P3.13) +// ---------------------------------------------------------------------------- + +message GetReportCardRequest { + string student_id = 1; + string term_id = 2; // optional: filter by academic term +} + +message ReportCard { + string student_id = 1; + string term_id = 2; + repeated ReportCardEntry entries = 3; + string overall_grade = 4; + string class_rank = 5; + string created_at = 6; +} + +message ReportCardEntry { + string subject_id = 1; + string subject_name = 2; + string exam_score = 3; + string exam_total = 4; + string homework_score = 5; + string homework_total = 6; + string final_score = 7; + string grade_level = 8; // A / B / C / D / F + string teacher_comment = 9; +} + +// ---------------------------------------------------------------------------- +// Schedule domain extensions (P3.13) +// ---------------------------------------------------------------------------- + +message GetScheduleByStudentRequest { + string student_id = 1; + string week_start = 2; // ISO 8601 date, optional +} + +message GetScheduleByStudentResponse { + repeated ScheduleSlotInfo slots = 1; +} + +message ScheduleSlotInfo { + string id = 1; + string course_id = 2; + string course_name = 3; + string teacher_id = 4; + string class_id = 5; + string room_id = 6; + string start_time = 7; // ISO 8601 + string end_time = 8; // ISO 8601 + string subject_id = 9; +} + +// ---------------------------------------------------------------------------- +// LeaveRequest domain (P3.13) +// ---------------------------------------------------------------------------- + +message LeaveRequest { + string id = 1; + string student_id = 2; + string class_id = 3; + string leave_type = 4; // sick / personal / family / activity / other + string start_date = 5; // ISO 8601 + string end_date = 6; // ISO 8601 + string reason = 7; + string status = 8; // pending / approved / rejected / cancelled + string submitted_by = 9; + string reviewed_by = 10; + string review_comment = 11; + string school_id = 12; + string created_at = 13; + string updated_at = 14; +} + +message ListLeaveRequestsByStudentRequest { + string student_id = 1; + string status = 2; // optional filter +} + +message ListLeaveRequestsResponse { + repeated LeaveRequest leave_requests = 1; +} + +message CreateLeaveRequestRequest { + string student_id = 1; + string class_id = 2; + string leave_type = 3; + string start_date = 4; + string end_date = 5; + string reason = 6; + string submitted_by = 7; + string school_id = 8; +} + +message CreateLeaveRequestResponse { + string id = 1; +} + +message CancelLeaveRequestRequest { + string id = 1; + string cancelled_by = 2; +} + +message CancelLeaveRequestResponse { + bool success = 1; +} + +// ---------------------------------------------------------------------------- +// Dashboard domain (P3.13) +// ---------------------------------------------------------------------------- + +message GetDashboardRequest { + string teacher_id = 1; +} + +message DashboardData { + string teacher_id = 1; + int32 total_classes = 2; + int32 total_students = 3; + int32 pending_homework = 4; + int32 upcoming_exams = 5; + int32 ungraded_submissions = 6; + repeated DashboardClassCard classes = 7; + repeated DashboardExamCard upcoming_exam_list = 8; + string generated_at = 9; +} + +message DashboardClassCard { + string class_id = 1; + string class_name = 2; + int32 student_count = 3; +} + +message DashboardExamCard { + string exam_id = 1; + string title = 2; + string exam_date = 3; + string class_id = 4; + string class_name = 5; +} + +message GetClassPerformanceRequest { + string class_id = 1; + string subject_id = 2; // optional +} + +message ClassPerformance { + string class_id = 1; + string class_name = 2; + int32 student_count = 3; + string average_score = 4; + string highest_score = 5; + string lowest_score = 6; + string median_score = 7; + repeated ClassPerformanceSubject subjects = 8; + string generated_at = 9; +} + +message ClassPerformanceSubject { + string subject_id = 1; + string subject_name = 2; + string average_score = 3; + int32 student_count = 4; +} + +// ---------------------------------------------------------------------------- +// Admin aggregation domain (P3.13 stubs) +// ---------------------------------------------------------------------------- + +message ListSchoolsRequest { + // no params - returns all schools (admin scope) +} + +message ListSchoolsResponse { + repeated SchoolInfo schools = 1; +} + +message SchoolInfo { + string id = 1; + string name = 2; + string address = 3; + string principal_id = 4; + string created_at = 5; +} + +message ListGradeLevelsRequest { + string school_id = 1; +} + +message ListGradeLevelsResponse { + repeated GradeLevelInfo grade_levels = 1; +} + +message GradeLevelInfo { + string id = 1; + string name = 2; // 如 "7年级" + string school_id = 3; + int32 order = 4; +} + +message ListDepartmentsRequest { + string school_id = 1; +} + +message ListDepartmentsResponse { + repeated DepartmentInfo departments = 1; +} + +message DepartmentInfo { + string id = 1; + string name = 2; + string school_id = 3; + string head_id = 4; + string created_at = 5; +} + +message ListAcademicYearsRequest { + string school_id = 1; // optional +} + +message ListAcademicYearsResponse { + repeated AcademicYearInfo academic_years = 1; +} + +message AcademicYearInfo { + string id = 1; + string name = 2; // 如 "2025-2026 第一学期" + string school_id = 3; + string start_date = 4; + string end_date = 5; + bool is_current = 6; +}