feat(shared-proto): core_edu proto 扩展 admin/dashboard/leave-requests/grpc 定义
This commit is contained in:
@@ -6,7 +6,16 @@ package next_edu_cloud.core_edu.v1;
|
|||||||
// Covers exam management, homework assignment, grade recording,
|
// Covers exam management, homework assignment, grade recording,
|
||||||
// attendance tracking, and class queries.
|
// 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.
|
// Event contracts live in events.proto under next_edu_cloud.events.v1.
|
||||||
//
|
//
|
||||||
// Status naming (ISSUE-003-ai08 arbitration, scheme A):
|
// Status naming (ISSUE-003-ai08 arbitration, scheme A):
|
||||||
@@ -14,6 +23,7 @@ package next_edu_cloud.core_edu.v1;
|
|||||||
// HomeworkStatus: assigned / submitted / graded
|
// HomeworkStatus: assigned / submitted / graded
|
||||||
// SubmissionStatus: not_submitted / submitted / graded
|
// SubmissionStatus: not_submitted / submitted / graded
|
||||||
// AttendanceStatus: present / absent / late / leave
|
// AttendanceStatus: present / absent / late / leave
|
||||||
|
// LeaveRequestStatus: pending / approved / rejected / cancelled
|
||||||
|
|
||||||
service ExamService {
|
service ExamService {
|
||||||
rpc CreateExam(CreateExamRequest) returns (CreateExamResponse);
|
rpc CreateExam(CreateExamRequest) returns (CreateExamResponse);
|
||||||
@@ -24,6 +34,8 @@ service ExamService {
|
|||||||
rpc PublishExam(PublishExamRequest) returns (PublishExamResponse);
|
rpc PublishExam(PublishExamRequest) returns (PublishExamResponse);
|
||||||
rpc SubmitExam(SubmitExamRequest) returns (SubmitExamResponse);
|
rpc SubmitExam(SubmitExamRequest) returns (SubmitExamResponse);
|
||||||
rpc GradeExam(GradeExamRequest) returns (GradeExamResponse);
|
rpc GradeExam(GradeExamRequest) returns (GradeExamResponse);
|
||||||
|
rpc SaveExamDraft(SaveExamDraftRequest) returns (SaveExamDraftResponse);
|
||||||
|
rpc RecordExamViolation(RecordExamViolationRequest) returns (RecordExamViolationResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
service HomeworkService {
|
service HomeworkService {
|
||||||
@@ -41,6 +53,7 @@ service GradeService {
|
|||||||
rpc ListGradesByExam(ListGradesByExamRequest) returns (ListGradesResponse);
|
rpc ListGradesByExam(ListGradesByExamRequest) returns (ListGradesResponse);
|
||||||
rpc ListGradesByHomework(ListGradesByHomeworkRequest) returns (ListGradesResponse);
|
rpc ListGradesByHomework(ListGradesByHomeworkRequest) returns (ListGradesResponse);
|
||||||
rpc UpdateGrade(UpdateGradeRequest) returns (UpdateGradeResponse);
|
rpc UpdateGrade(UpdateGradeRequest) returns (UpdateGradeResponse);
|
||||||
|
rpc GetReportCard(GetReportCardRequest) returns (ReportCard);
|
||||||
}
|
}
|
||||||
|
|
||||||
service ClassService {
|
service ClassService {
|
||||||
@@ -57,6 +70,28 @@ service AttendanceService {
|
|||||||
rpc ListAttendanceByClass(ListAttendanceByClassRequest) returns (ListAttendanceResponse);
|
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
|
// Exam domain
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -431,3 +466,264 @@ message ListAttendanceByClassRequest {
|
|||||||
message ListAttendanceResponse {
|
message ListAttendanceResponse {
|
||||||
repeated Attendance attendance = 1;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user