@@ -3,146 +3,195 @@
> **最高原则**:**拒绝根据 URL 猜测表名与调用状态**!
> 1. **`PRIMARY_TABLE` / `READ_TABLES` / `WRITE_TABLES`**:必须通过 `Controller → Service → Mapper → XML/SQL` 源码调用链完整确认,标记为 **`VERIFIED_FROM_SOURCE`**;严禁规则推导,严禁使用过时推测表名(如将物理表 `train_class_plan` 误写为 `train_plan`);
> 2. **`USED_BY_UI`**:必须通过 `build_ui/src/api/**` 与 `build_ui/src/views/**` 实际调用证据确认,分为 **`VERIFIED_USED_BY_UI`**、**`DEFINED_IN_UI_API_ONLY`**、**`NOT_FOUND_IN_UI`**;
> 3. **`IMPLEMENTATION_STATUS`**: Controller 存在证明端点已定义,标注为 **`ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)`**,受外部硬件阻断的标注为 **`ENDPOINT_DEFINED (BLOCKED_EXTERNAL)`**。
> 3. **`IMPLEMENTATION_STATUS`**: Controller 存在证明端点已定义,标注为 **`ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)`**,受外部硬件阻断的标注为 **`ENDPOINT_DEFINED (BLOCKED_EXTERNAL)`**;
> 4. **`V2_SCORE_SCHEMA`**:成绩模块已完成底层 V2 架构平滑闭环,所有 `/train/score/**` 与 `/train/scoreinfo/**` 运行时底层均已切换至 `train_student_score` + `train_score_item`,彻底废弃并清零对历史下线表 `train_score_info` 的任何运行时 SQL 调用。
---
## 1. 核心培训业务 API 账本 (`CUSTOM_TRAIN_BUSINESS_API` — 107 个端点源码穿透验证)
## 1. 核心培训业务 API 账本 (`CUSTOM_TRAIN_BUSINESS_API` — 148 个端点源码穿透验证)
| 接口路径 (API) | 请求方式 (METHOD) | 领域模块 | 控制器方法 (CTRL_METHOD) | 服务层方法 (SERVICE_METHOD) | 映射层方法 (MAPPER_METHOD) | 映射XML语句 (XML_STMT) | 主实体表 (PRIMARY_TABLE) | 读操作表 (READ_TABLES) | 写操作表 (WRITE_TABLES) | 调用链状态 (LINEAGE_STATUS) | UI调用状态 (USED_BY_UI) | 实现状态 (STATUS) |
| :--- | :---: | :---: | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :---: | :---: | :---: |
| `/train/teacher/list` | `GET` | `Train` | `list ` | `I TrainTeacherService.selectTrainTeacherList ` | `TrainTeacher Mapper.selectTrainTeacherList` | `selectTrainTeacherList ` | `train_teacher ` | `train_teacher ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId} ` | `GET` | `Train` | `getInfo ` | `I TrainTeacherService.selectTrainTeacherByTId ` | `TrainTeacher Mapper.selectTrainTeacherByTId ` | `selectTrainTeacherByTId ` | `train_teacher ` | `train_teacher ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher ` | `POS T` | `Train` | `add ` | `I TrainTeacherService.insertTrainTeacher ` | `TrainTeacher Mapper.inser tTrainTeacher ` | `inser tTrainTeacher ` | `train_teacher` | `NONE` | `train_teacher ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher ` | `PU T` | `Train` | `edit ` | `I TrainTeacherService.updateTrainTeacher` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher ` | `train_teacher ` | `train_teacher` | `train_teacher ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BA CKEN D_IMPLEMENTED )` |
| `/train/teacher/{tIds} ` | `DELETE ` | `Train` | `remove ` | `I TrainTeacherService.deleteTrainTeacherByTIds` | `TrainTeacherMapper.deleteTrainTeacherByTIds` | `deleteTrainTeacherByTIds ` | `train_teacher ` | `train_teacher` | `train_teacher ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BA CKEN D_IMPLEMENTED )` |
| `/train/teacher/export ` | `POS T` | `Train` | `export` | `ITrainTeacherService.selectTrainTeacherList` | `TrainTeacherMapper.selectTrainTeacherList` | `selectTrainTeacherList` | `train_teacher` | `train_teacher ` | `NONE` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/plans ` | `GE T` | `Train` | `getMyPlans ` | `I TrainingIdentityService.assertTeacherIdentity` | `TrainLessonMapper.selectPlansByTeacherId` | `selectPlansByTeacherId` | `train_class_plan` | `train_class_plan, train_plan_course, train_lesson` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher ` | `GE T` | `Train` | `getTeacherProfile ` | `I TrainingIdentityService.assertTeacherIdentity` | `TrainTeacher Mapper.selec tTrainTeacherByTId ` | `selec tTrainTeacherByTId` | `train_teacher` | `train_teacher` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/students ` | `GET` | `Train` | `getMyClassStudents` | `TrainLessonMapper.countTeacherInPlan` | `TrainEnrollmentMapper.selectEnrollmentItemList` | `selectEnrollmentItemList` | `train_enrollment` | `train_enrollment, train_lesson, train_student ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/lessons/{lessonId}/attendance ` | `G ET` | `Train` | `getLessonAttendance` | `TrainLessonMapper.selectTrainLessonById` | `TrainStudentCheck inMapper.s electCheckinsByLesson Id` | `s electCheckinsByLessonId` | `train_student_check in` | `train_lesson, train_student_checkin` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/list` | `GET` | `Train` | `list ` | `I TrainStudentService.selectTrainStudentList` | `TrainStudentMapper.selectTrainStudentList` | `selectTrainStudentList` | `train_student` | `train_student ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{s Id}` | `GE T` | `Train` | `getInfo ` | `I TrainStudentService.selectTrainStudentBySId` | `TrainStudentMapper.selectTrainStudentBySId` | `selectTrainStudentBySId ` | `train_student ` | `train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student ` | `POST` | `Train` | `add` | `ITrainStudentService.insertTrainStudent` | `TrainStudentMapper.insertTrainStudent` | `insertTrainStudent` | `train_student` | `NONE` | `train_student ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student ` | `PUT` | `Train` | `edit` | `ITrainStudentService.updateTrainStudent` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `train_student` | `train_student ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{s Ids }` | `DEL ETE ` | `Train` | `remove` | `ITrainStudentService.deleteTrainStudentByS Ids ` | `TrainStudentMapper.deleteTrainStudentBySIds` | `deleteTrainStudentBySIds` | `train_student` | `train_student` | `train_student ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/export ` | `POS T` | `Train` | `export` | `ITrainStudentService.selectTrainStudentList` | `TrainStudentMapper.selectTrainStudentList` | `selectTrainStudentList` | `train_student` | `train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/importTemplate ` | `GET` | `Train` | `importTemplate ` | `I TrainStudentService.importTemplate` | `NONE` | `NONE` | `train_student` | `NONE ` | `NONE` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/importData ` | `POST ` | `Train` | `importData` | `ITrainStudentService.importStudent` | `TrainStudentMapper.insertTrainStudent` | `insertTrainStudent` | `train_student` | `train_student` | `train_student ` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/enrollments` | `GET` | `Train` | `getMyEnrollments ` | `I TrainingIdentityService.assertStudentIdentity` | `TrainEnrollmentMapper.selectEnrollmentsByStudentId` | `selectEnrollmentsByStudentId` | `train_enrollment` | `train_enrollment, train_class_pla n` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/timetable ` | `GE T` | `Train` | `getMyTimetable ` | `I TrainingIdentityService.assertStudentIdentity` | `TrainLessonMapper.selectScheduleLessonsByStudentId` | `selectScheduleLessonsByStudentId ` | `train_less on` | `train_lesson, train_plan_course, train_course, train_classroom_info, train_training_site` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/repor t` | `GE T` | `Train` | `getMyRepor t` | `I TrainingIdentityService.assertStudentIdentity` | `TrainClassReportMapper.selectLatestReportByStudentId` | `selectLatestReportByStudentId` | `train_class_report` | `train_class_report, train_enrollment, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/attendance ` | `GE T` | `Train` | `getMyAttendance ` | `I TrainingIdentityService.assertStudentIdentity` | `TrainStudentCheckinMapper.selectCheckinsByStudentId` | `selectCheckinsByStudentId` | `train_student_checkin` | `train_student_checkin, train_lesson, train_enrollment` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/duration ` | `GET` | `Train` | `getMyDuration` | `ITrainingIdentityService.assertStudentIdentity` | `TrainStudyDurationMapper.selectDurationsByStudentId` | `selectDurationsByStudentId` | `train_study_duration` | `train_study_duration, train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/portrait ` | `GET` | `Train` | `getMyPortrait` | `ITrainingIdentityService.assertStudentIdentity` | `TrainStudentPortraitMapper.selectPortraitByStudentId` | `selectPortraitByStudentId` | `train_student_portrait` | `train_student_portrait, train_enrollment, train_class_plan, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/list ` | `GET` | `Train` | `list` | `ITrainCourseService.selectTrainCourseList` | `TrainCourseMapper.selectTrainCourseList` | `selectTrainCourseList` | `train_course` | `train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/{cId} ` | `GET` | `Train` | `getInfo` | `ITrainCourseService.selectTrainCourseByCId` | `TrainCourseMapper.selectTrainCourseByCId` | `selectTrainCourseByCId` | `train_course` | `train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course ` | `POS T` | `Train` | `add` | `ITrainCourseService.insertTrainCourse` | `TrainCourseMapper.insertTrainCourse` | `insertTrainCourse` | `train_course` | `NONE` | `train_course ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course ` | `PU T` | `Train` | `edit ` | `I TrainCourseService.updateTrainCourse` | `TrainCourseMapper.updateTrainCourse` | `updateTrainCourse` | `train_course` | `train_course` | `train_course ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/{cIds} ` | `DELETE ` | `Train` | `remov e` | `I TrainCourseService.deleteTrainCourseByCIds` | `TrainCourseMapper.deleteTrainCourseByCIds` | `deleteTrainCourseByCIds` | `train_course` | `train_course` | `train_course ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/classroom/list ` | `GE T` | `Train` | `list ` | `I TrainClassroomInfoService.selectTrainClassroomInfoList` | `TrainClassroomInfoMapper.selectTrainClassroomInfoList` | `selectTrainClassroomInfoList` | `train_classroom_info` | `train_classroom_info` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/classroom/{classRoomId} ` | `GE T` | `Train` | `getInfo ` | `I TrainClassroomInfoService.selectTrainClassroomInfoByClassRoomId` | `TrainClassroomInfoMapper.selectTrainClassroomInfoByClassRoomId` | `selectTrainClassroomInfoByClassRoomId` | `train_classroom_info` | `train_classroom_info` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/classroom ` | `POS T` | `Train` | `add ` | `I TrainClassroomInfoService.insertTrainClassroomInfo` | `TrainClassroomInfoMapper.insertTrainClassroomInfo` | `insertTrainClassroomInfo` | `train_classroom_info` | `NONE` | `train_classroom_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/classroom ` | `PU T` | `Train` | `edit` | `ITrainClassroomInfoService.updateTrainClassroomInfo` | `TrainClassroomInfoMapper.updateTrainClassroomInfo` | `updateTrainClassroomInfo` | `train_classroom_info` | `train_classroom_info` | `train_classroom_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/classroom/{classRoomIds} ` | `DELETE ` | `Train` | `remove` | `ITrainClassroomInfo Service.dele teTrainClassroomInfoByClassRoomIds` | `TrainClassroomInfo Mapper.dele teTrainClassroomInfoByClassRoomIds ` | `dele teTrainClassroomInfoByClassRoomIds` | `train_classroom_info` | `train_classroom_info` | `train_classroom_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site/lis t` | `GE T` | `Train` | `list` | `ITrainTrainingSite Service.selectTrainTrainingSite List` | `TrainTrainingSite Mapper.selectTrainTrainingSite List` | `selectTrainTrainingSite List` | `train_training_site` | `train_training_site ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site/{siteId} ` | `GET` | `Train` | `getInfo` | `ITrainTrainingSiteService.selectTrainTrainingSiteBySiteId` | `TrainTrainingSiteMapper.selectTrainTrainingSiteBySiteId` | `selectTrainTrainingSiteBySiteId` | `train_training_site` | `train_training_site ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site ` | `POST ` | `Train` | `add` | `ITrainTrainingSiteService.insertTrainTrainingSite` | `TrainTrainingSiteMapper.insertTrainTrainingSite` | `insertTrainTrainingSite` | `train_training_site` | `NONE` | `train_training_site ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site ` | `PU T` | `Train` | `edit` | `ITrainTrainingSiteService.updateTrainTrainingSite` | `TrainTrainingSiteMapper.updateTrainTrainingSite` | `updateTrainTrainingSite` | `train_training_site` | `train_training_site` | `train_training_site ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site/{siteIds} ` | `DELETE ` | `Train` | `remove` | `ITrainTrainingSite Service.d elete TrainTrainingSiteBySiteIds` | `TrainTrainingSite Mapper.d elete TrainTrainingSiteBySiteIds ` | `d elete TrainTrainingSiteBySiteIds` | `train_training_site` | `train_training_site` | `train_training_site ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans ` | `GET` | `Train` | `list` | `PlanAppService.selectPlanItem List` | `TrainClassPla nMapper.selectTrainClassPla nList` | `selectTrainClassPla nList` | `train_class_plan` | `train_class_plan, train_plan_course, train_enrollment ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{pla nId}` | `GET` | `Train` | `getInfo` | `ITrainClassPla nService.selectTrainClassPlanByPla nId` | `TrainClassPla nMapper.selectTrainClassPlanByPlanId` | `selectTrainClassPlanByPlanId` | `train_class_plan` | `train_class_pla n` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/p lan s` | `POST` | `Train` | `add` | `PlanAppService.createPlan ` | `TrainClassPlan Mapper.insertTrainClassPlan ` | `insertTrainClassPlan ` | `train_class_plan ` | `NONE` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/p lans/{planId} ` | `PU T` | `Train` | `edit` | `PlanAppService.updatePlan ` | `TrainClassPlan Mapper.update TrainClassPlan ` | `update TrainClassPlan ` | `train_class_plan ` | `train_class_plan` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/p lan s/{p lan Ids}` | `DELETE` | `Train` | `remove` | `ITrainClassPlan Service.deleteTrainClassPlan ByP lan Ids` | `TrainClassPlan Mapper.deleteTrainClassPlan ByP lan Ids` | `deleteTrainClassPlan ByP lan Ids` | `train_class_plan ` | `train_class_plan ` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/p lan s/{p lanId}/publish ` | `POS T` | `Train` | `publish` | `PlanAppService.publishPlan ` | `TrainClassPlan Mapper.update TrainClassPlan ` | `update TrainClassPlan ` | `train_class_plan ` | `train_class_plan` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/p lan s/{p lanId}/start ` | `POS T` | `Train` | `start` | `PlanAppService.startPlan ` | `TrainClassPlan Mapper.updateTrainClassPlan ` | `updateTrainClassPlan ` | `train_class_plan ` | `train_class_plan ` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/complet e` | `POST` | `Train` | `complete` | `PlanAppService.completePlan` | `TrainClassPlanMapper.updateTrainClassPlan` | `updateTrainClassPlan` | `train_class_plan` | `train_class_plan, train_enrollment` | `train_class_plan, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/ courses ` | `GET` | `Train` | `list` | `PlanAppService.list Courses ` | `TrainPlan CourseMapper.selectCourseItemsByPlanId ` | `selectCourseItemsByPlanId ` | `train_plan_ course` | `train_plan_course, train_course` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/courses ` | `POST ` | `Train` | `bind` | `PlanAppService.b ind Courses` | `TrainPlan CourseMapper.insertTrainPla nCourse` | `insertTrainPla nCourse` | `train_plan_ course` | `train_plan_ course` | `train_plan_ course` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/ courses /{planCourse Id}` | `DEL ETE ` | `Train` | `unbind` | `PlanAppService.unb ind Course` | `TrainPlan CourseMapper.d elete TrainPlan CourseByPlanCourse Id` | `d elete TrainPlan CourseByPlanCourse Id` | `train_plan_ course` | `train_plan_ course` | `train_plan_course ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/enrollments ` | `GE T` | `Train` | `list` | `EnrollmentAppService.listEnrollments` | `TrainEnrollmentMapper.selectEnrollmentItemList` | `selectEnrollmentItemList ` | `train_enrollment ` | `train_enrollment, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/enrollments ` | `POST` | `Train` | `enroll` | `EnrollmentAppService.enrollStudent` | `TrainEnrollment Mapper.insertTrainEnrollment ` | `insertTrainEnrollment` | `train_enrollment` | `train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/enrollments/batch ` | `POS T` | `Train` | `batchEnroll` | `EnrollmentAppService.batchEnrollStudents` | `TrainEnrollment Mapper.inser tTrainEnrollmen t` | `inser tTrainEnrollment` | `train_enrollment` | `train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollmentId} ` | `GET` | `Train` | `getInfo` | `EnrollmentAppService.getEnrollmentDetail` | `TrainEnrollmentMapper.selectEnrollmentItemById` | `selectEnrollmentItemById` | `train_enrollment` | `train_enrollment, train_student, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollmentId}/status ` | `PU T` | `Train` | `updateStatus` | `EnrollmentAppService.updateStatus` | `TrainEnrollmentMapper.updateTrainEnrollment` | `updateTrainEnrollment` | `train_enrollment` | `train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollmentId} ` | `DELETE ` | `Train` | `remove` | `EnrollmentAppService.removeEnrollment` | `TrainEnrollment Mapper.d elete TrainEnrollmentByEnrollmentId ` | `d elete TrainEnrollmentByEnrollmentId` | `train_enrollment` | `train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/lessons ` | `GET` | `Train` | `list` | `SchedulingAppService.listLessons ` | `TrainLess onMapper.selectLessonItemsByPlanId` | `selectLessonItemsByPlanId ` | `train_less on` | `train_lesson, train_plan_course, train_course, train_teacher, train_classroom_info, train_training_site ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/lessons ` | `POS T` | `Train` | `schedule` | `SchedulingAppService.scheduleLesson ` | `TrainLess onMapper.inser tTrainLesson ` | `inser tTrainLesson ` | `train_less on` | `train_lesson` | `train_lesson ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/{lesson Id}` | `G ET` | `Train` | `getInfo` | `SchedulingAppService.getLessonDetail ` | `TrainLesson Mapper.s electLessonItem ById` | `s electLessonItem ById` | `train_lesson ` | `train_lesson, train_plan_course, train_course, train_teacher, train_classroom_info, train_training_site` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/{lesson Id}` | `PU T` | `Train` | `update` | `SchedulingAppService.updateLesson` | `TrainLessonMapper.updateTrainLesson` | `updateTrainLesson ` | `train_lesson ` | `train_lesson` | `train_lesson ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_US ED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/{lessonId} ` | `DELETE ` | `Train` | `cancel` | `SchedulingAppService.cancelLesson ` | `TrainLesson Mapper.dele teTrainLessonByLessonId ` | `dele teTrainLessonByLessonId ` | `train_lesson ` | `train_lesson` | `train_lesson ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/check-conflict ` | `POS T` | `Train` | `checkConflict` | `SchedulingAppService.checkConflict` | `TrainLessonMapper.countTeacherConflicts` | `countTeacherConflict s` | `train_lesson ` | `train_lesson` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/s cheduling-options ` | `GE T` | `Train` | `getOptions` | `SchedulingAppService.getSchedulingOptions` | `TrainClassroomInfoMapper.selectTrainClassroomInfoList` | `selectTrainClassroomInfoList` | `train_classroom_info` | `train_classroom_info, train_training_site, train_teacher ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/timetable ` | `GET` | `Train` | `getTimetable` | `SchedulingAppService.getTimetable` | `TrainLessonMapper.selectScheduleLessonsByPlanId` | `selectScheduleLessonsByPlanId` | `train_lesson` | `train_lesson, train_plan_course, train_course, train_teacher, train_classroom_info, train_training_site ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollmentId}/report ` | `POST ` | `Train` | `report` | `ITrainClassReportService.reportEnrollment` | `TrainClassReportMapper.insertTrainClassReport` | `insertTrainClassReport ` | `train_class_report ` | `train_enrollment, train_class_pla n` | `train_class_report ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/report/list ` | `GE T` | `Train` | `list` | `ITrainClassReportService.selectTrainClassReportList` | `TrainClassReportMapper.selectTrainClassReportList` | `selectTrainClassReportList ` | `train_class_report ` | `train_class_report, train_enrollment, train_student, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/checkin/lis t` | `GET` | `Train` | `list` | `ITrainStudentCheckinService.selectTrainStudentCheckinList ` | `TrainStudentCheckin Mapper.selectTrainStudentCheckinList ` | `selectTrainStudentCheckinList ` | `train_student_checkin ` | `train_student_checkin, train_student, train_lesson ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/lessons/{lessonId}/checkins` | `GET` | `Train` | `getLessonRoster` | `AttendanceAppService.getLessonRoster ` | `TrainStudentCheckinMapper.selectCheckinsByLesson Id` | `selectCheckinsByLesson Id` | `train_student_checkin` | `train_student_checkin, train_enrollment , train_stud ent` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/sign-i n` | `POS T` | `Train` | `signIn` | `AttendanceAppService.signIn` | `TrainStudentCheckinMapper.insertTrainStudentCheckin` | `insertTrainStudentCheckin ` | `train_student_checki n` | `train_student_checkin` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/sign-out ` | `POS T` | `Train` | `signOut` | `AttendanceAppService.signOut` | `TrainStudentCheckinMapper.updateTrainStudentCheckin` | `updateTrainStudentCheckin` | `train_student_checkin` | `train_student_checkin` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/proxy-checkin ` | `POS T` | `Train` | `signIn` | `AttendanceAppService.signIn` | `TrainStudentCheckinMapper.inse rtT rain StudentCheckin` | `inse rtT rain StudentCheckin ` | `train_student_checkin ` | `train_student_checkin` | ` train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/mark-absen t` | `POS T` | `Train` | `markAbsence` | `AttendanceAppService.markAbsence` | `TrainStudentCheckinMapper.insertTrainStudentCheckin` | `insertTrainStudentCheckin` | `train_student_checkin` | `train_student_checkin` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/adjust ` | `PU T` | `Train` | `adjust` | `AttendanceAppService.adjust` | `TrainStudentCheckinMapper.updateTrainStudentCheckin` | `updateTrainStudentCheckin` | `train_student_checkin` | `train_student_checkin` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory/list ` | `GET` | `Train` | `list` | `ITrainDormitoryInfoService.selectTrainDormitoryInfoList` | `TrainDormitoryInfo Mapper.selectTrainDormitoryInfoList ` | `selectTrainDormitoryInfoList` | `train_dormitory_info` | `train_dormitory_info ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory/{dormId} ` | `GET` | `Train` | `getInfo` | `ITrainDormitoryInfoService.selectTrainDormitoryInfoByDormId` | `TrainDormitoryInfoMapper.selectTrainDormitoryInfoByDormId` | `selectTrainDormitoryInfoByDormId` | `train_dormitory_info` | `train_dormitory_info ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory ` | `POS T` | `Train` | `add` | `ITrainDormitoryInfo Service.in sertTrainDormitoryInfo` | `TrainDormitoryInfoMapper.insertTrainDormitoryInfo` | `insertTrainDormitoryInfo` | `train_dormitory_info` | `NONE` | `train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory ` | `PU T` | `Train` | `edit` | `ITrainDormitoryInfoService.updateTrainDormitoryInfo` | `TrainDormitoryInfoMapper.updateTrainDormitoryInfo` | `updateTrainDormitoryInfo` | `train_dormitory_info` | `train_dormitory_info` | `train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory/{dormIds} ` | `DEL ETE ` | `Train` | `remove` | `ITrainDormitoryInfoService.deleteTrainDormitoryInfoByDormIds` | `TrainDormitoryInfo Mapper.d eleteTrainDormitoryInfoByDormIds ` | `d eleteTrainDormitoryInfoByDormIds` | `train_dormitory_info` | `train_dormitory_info` | `train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/list ` | `GET` | `Train` | `list` | `ITrainAccommodationService.selectTrainAccommodationList ` | `TrainAccommodati onMapper.selectTrainAccommodationList` | `selectTrainAccommodationList ` | `train_accommodati on` | `train_accommodation, train_dormitory_info , train_student ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}` | `GET` | `Train` | `getInfo` | `ITrainAccommodationService.selectTrainAccommodationByAccommodationId` | `TrainAccommodationMapper.selectTrainAccommodationByAccommodationId` | `selectTrainAccommodationByAccommodationId ` | `train_accommodatio n` | `train_accommodation, train_dormitory_info , train_stud ent` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/enrollment/{enrollmentId} ` | `GE T` | `Train` | `getByEnrollment` | `ITrainAccommodationService.selectTrainAccommodationByEnrollmentId` | `TrainAccommodatio nMapper.selec tTrainAccommodationByEnrollmentId ` | `selec tTrainAccommodationByEnrollmentId` | `train_accommodation` | `train_accommodation, train_dormitory_info, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/enrollment/{enrollmentId}/history` | `GET` | `Train` | `getHistory` | `ITrainAccommodationService.selectAccommodationHistory` | `TrainAccommodationMapper.selectAccommodationHistory` | `selectAccommodationHistory ` | `train_accommodatio n` | `train_accommodation, train_dormitory_info, train_student ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation ` | `POS T` | `Train` | `add` | `ITrainAccommodationService.insertTrainAccommodation` | `TrainAccommodationMapper.insertTrainAccommodation` | `insertTrainAccommodatio n` | `train_accommodatio n` | `train_accommodation, train_dormitory_info` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}/checkin` | `POST` | `Train` | `checkin` | `ITrainAccommodationService.checkinAccommodatio n` | `TrainAccommodatio nMapper.updateTrainAccommodatio n` | `updateTrainAccommodatio n` | `train_accommodatio n` | `train_accommodation, train_dormitory_info` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}/checkout ` | `POS T` | `Train` | `checkout` | `ITrainAccommodationService.checkoutAccommodation` | `TrainAccommodationMapper.updateTrainAccommodation` | `updateTrainAccommodation` | `train_accommodation` | `train_accommodation, train_dormitory_info` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}/transfer ` | `POST` | `Train` | `t ransfer` | `ITrainAccommodationService.transferAccommodation` | `TrainAccommodationMapper.updateTrainAccommodation` | `updateTrainAccommodation` | `train_accommodation` | `train_accommodation, train_dormitory_info` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodation Ids }` | `DELETE` | `Train` | `remove` | `ITrainAccommodationService.deleteTrainAccommodationByAccommodationIds` | `TrainAccommodationMapper.deleteTrainAccommodationByAccommodation Ids ` | `deleteTrainAccommodationByAccommodation Ids ` | `train_accommodation` | `train_accommodation` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score/list ` | `GET` | `Train` | `list ` | `ITrainScoreInfo Service.selectTrainScoreInfo List` | `TrainScoreInfo Mapper.selectTrainScoreInfo List` | `selectTrainScoreInfo List` | `train_score_info ` | `train_score_info , train_student, train_course ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score/{scoreId} ` | `GE T` | `Train` | `getInfo` | `ITrainScoreInfoService.selectTrainScoreInfoByScoreId` | `TrainScoreInfoMapper.selectTrainScoreInfoByScoreId` | `selectTrainScoreInfoByScoreId ` | `train_score_info ` | `train_score_info, train_student, train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score` | `POST` | `Train` | `add` | `ITrainScoreInfoService.insertTrainScoreInfo` | `TrainScoreInfoMapper.insertTrainScoreInfo` | `insertTrainScoreInfo` | `train_score_info` | `NONE ` | `train_score_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score ` | `PU T` | `Train` | `edit` | `ITrainScoreInfoService.updateTrainScoreInfo` | `TrainScoreInfoMapper.updateTrainScoreInfo` | `updateTrainScoreInfo ` | `train_score_info ` | `train_score_info ` | `train_score_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score/{scoreIds} ` | `DEL ETE ` | `Train` | `remove` | `ITrainScoreInfoService.deleteTrainScoreInfoByScoreIds ` | `TrainScoreInfo Mapper.d eleteTrainScoreInfoByScore Ids ` | `d eleteTrainScoreInfoByScore Ids ` | `train_score_info ` | `train_score_info` | `train_score_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/dashboard/overview ` | `GE T` | `Train` | `getDashboardOverview` | `ITrainAnalysisService.getDashboardOverview` | `TrainAnalysisMapper.selectDashboardOverview` | `selectDashboardOverview` | `train_class_plan` | `train_class_plan, train_enrollment, train_lesson, train_student_checkin, train_accommodation ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/dashboard/charts ` | `GET` | `Train` | `getDashboardCharts` | `ITrainAnalysisService.getDashboardCharts` | `TrainAnalysisMapper.selectDashboardCharts` | `selectDashboardCharts` | `train_class_plan` | `train_class_plan, train_enrollment, train_lesson, train_student_checkin, train_accommodation ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/attendance/summary ` | `GET` | `Train` | `getAttendanceSummary` | `ITrainAnalysisService.getAttendanceSummary` | `TrainAnalysisMapper.selectAttendanceSummary` | `selectAttendanceSummary ` | `train_student_checkin ` | `train_student_checkin, train_lesson, train_class_plan ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/attendance/cha rts ` | `GE T` | `Train` | `getAttendanceCharts` | `ITrainAnalysisService.getAttendanceCha rts ` | `TrainAnalysisMapper.selectAttendanceCharts` | `selectAttendanceCharts` | `train_student_checkin` | `train_student_checkin, train_lesson, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/portrait/student-360/{studentId}` | `GET` | `Train` | `getStudent360` | `ITrainAnalysisService.getStudent360 ` | `TrainAnalysis Mapper.selectStudent360` | `selectStudent360` | `train_student` | `train_student, train_enrollment, train_student_checkin, train_score_info, train_study_duration ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/mapping/list ` | `GET` | `Train` | `getDormMapping` | `IExternalResourceMappingService.getActiveRoomMapping` | `TrainExternalResourceMappingMapper.selectTrainExternalResourceMappingList` | `selectTrainExternalResourceMappingList` | `train_external_resource_mapping` | `train_external_resource_mapping, train_dormitory_info ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/auth/list ` | `GE T` | `Train` | `listAuth ` | `ITrainDormAuth Service.selec tTrainDormAuthList` | `TrainDormAuthMapper.selectTrainDormAuthList` | `selectTrainDormAuthList` | `train_dorm_auth` | `train_dorm_auth, train_accommodation, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/operation/list ` | `GE T` | `Train` | `getOperationHistory` | `IExternalOperationService.listOperationsByDoorAuthId` | `TrainExternalOperationMapper.selectTrainExternalOperationList` | `selectTrainExternalOperationList` | `train_external_operation` | `train_external_operation` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/capability ` | `GE T` | `Train` | `getCapabilities` | `N/A (配置与只读状态)` | `NONE` | `NONE` | `N/A (配置与常量)` | `NONE ` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/issue ` | `POS T` | `Train` | `issueCredential` | `AccessAuthorizationOrchestrator.issueAuthorization` | `TrainDormAuthMapper.updateTrainDormAuth` | `updateTrainDormAuth` | `train_dorm_auth` | `train_dorm_auth, train_accommodation` | `train_dorm_auth, train_external_operation ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY _UI` | `ENDPOINT_DEFINED (BLO CKED_EXTERNAL )` |
| `/train/access/revoke ` | `POST ` | `Train` | `revokeAuth` | `AccessAuthorizationOrchestrator.revokeAuthorization ` | `TrainDormAuth Mapper.upda teTrainDormAuth ` | `upda teTrainDormAuth` | `train_dorm_auth` | `train_dorm_auth, train_accommodation` | `train_dorm_auth, train_external_operation ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_US ED_BY _UI` | `ENDPOINT_DEFINED (BLO CKED_EXTERNAL )` |
| `/train/binding/teachers/bindable-users` | `GET` | `Train` | `getTeacherBindableUsers ` | `TrainAccountBindingAdminService.selectBindableUsers` | `SysUserMapper.selectUserList` | `selectUserList` | `sys_user` | `sys_user, train_teacher, train_student ` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/binding/teachers/{teacherId}/bind ` | `POST` | `Train` | `bindTeacherUser ` | `TrainAccountBindingAdmin Service.b indTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `sys_user, train_teacher` | `train_teacher ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/binding/students/bindable-users ` | `GE T` | `Train` | `getStudentBindableUsers ` | `TrainAccountBindingAdminService.selectBindableUsers` | `SysUserMapper.selectUserList` | `selectUserList` | `sys_user` | `sys_user, train_teacher, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/binding/students/{studentId}/bind` | `POST` | `Train` | `bindStudentUser ` | `TrainAccountBindingAdminService.bindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStuden t` | `train_student` | `sys_user, train_student` | `train_student ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| :--- | :---: | :---: | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :---: | :---: |
| `/train/access/auth/accommodation/{accommodationId}` | `GET` | `Train` | `TrainAccessManagementController.getAuthByAccommodationId ` | `TrainAccessManagementService.getAuthByAccommodationId ` | `TrainDormAuth Mapper.selectByAccommodationId` | `selectByAccommodationId ` | `train_dorm_auth ` | `train_dorm_auth ` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/auth/list ` | `GET` | `Train` | `TrainAccessManagementController.listAuth ` | `TrainAccessManagementService.listAuth ` | `TrainDormAuth Mapper.selectTrainDormAuthList ` | `selectTrainDormAuthList ` | `train_dorm_auth ` | `train_dorm_auth, train_student, train_accommodation, train_dormitory_info ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/auth/{authId} ` | `GE T` | `Train` | `TrainAccessManagementController.getAuthDetail ` | `TrainAccessManagementService.getAuthDetail ` | `TrainDormAuth Mapper.selec tTrainDormAuthById ` | `selec tTrainDormAuthById ` | `train_dorm_auth` | `train_dorm_auth, train_student, train_accommodation` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/auth/{authId}/issue ` | `POS T` | `Train` | `TrainAccessManagementController.issueCredential ` | `TrainAccessManagementService.issueCredential` | `DmsAccessManagementService.issueCredential` | `insertTrainExternalOperation ` | `train_dorm_auth ` | `train_dorm_auth, train_external_resource_mapping` | `train_dorm_auth, train_external_operation ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BLO CKED_EXTERNAL )` |
| `/train/access/auth/{authId}/revoke ` | `POST ` | `Train` | `TrainAccessManagementController.revokeAuth ` | `TrainAccessManagementService.revokeAuth` | `DmsAccessManagementService.revokeAuth` | `insertTrainExternalOperation ` | `train_dorm_auth ` | `train_dorm_auth, train_external_resource_mapping` | `train_dorm_auth, train_external_operation ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BLO CKED_EXTERNAL )` |
| `/train/access/capabilities ` | `GE T` | `Train` | `TrainAccessManagementController.getCapabilities` | `TrainAccessManagementService.getCapabilities` | `DmsAccessManagementService.getCapabilities` | `NONE` | `sys_config` | `sys_config ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/mapping/bind-lock ` | `POS T` | `Train` | `TrainAccessManagementController.bindLockMapping ` | `TrainAccessManagementService.bindLockMapping` | `TrainExternalResourceMappingMapper.insertTrainExternalResourceMapping` | `insertTrainExternalResourceMapping` | `train_external_resource_mapping` | `train_external_resource_mapping` | `train_external_resource_mapping ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/mapping/bind-room ` | `POS T` | `Train` | `TrainAccessManagementController.bindRoomMapping ` | `TrainAccessManagementService.bindRoomMapping` | `TrainExternalResourceMapping Mapper.inser tTrainExternalResourceMapping ` | `inser tTrainExternalResourceMapping` | `train_external_resource_mapping` | `train_external_resource_mapping` | `train_external_resource_mapping ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/mapping/dorm/{dormId} ` | `GET` | `Train` | `TrainAccessManagementController.getDormMapping` | `TrainAccessManagementService.getDormMapping` | `TrainExternalResourceMappingMapper.selectByDormId` | `selectByDormId` | `train_external_resource_mapping` | `train_external_resource_mapping, train_dormitory_info ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/mapping/{mappingId} ` | `DEL ETE ` | `Train` | `TrainAccessManagementController.unbindMapping` | `TrainAccessManagementService.unbindMapping` | `TrainExternalResourceMapp ing Mapper.d eleteBy Id` | `d eleteById` | `train_external_resource_mapp ing ` | `train_external_resource_mapping` | `train_external_resource_mapping ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/operations/{doorAuthId}` | `GET` | `Train` | `TrainAccessManagementController.getOperationHistory ` | `TrainAccessManagementService.getOperationHistory` | `TrainExternalOperationMapper.selectByDoorAuthId` | `selectByDoorAuthId` | `train_external_operation` | `train_external_operation ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/access/reconcile/{enrollment Id}` | `POS T` | `Train` | `TrainAccessManagementController.manualReconcile ` | `TrainAccessManagementService.reconcileEnrollment` | `TrainDormAuthMapper.updateTrainDormAuth` | `updateTrainDormAuth ` | `train_dorm_auth ` | `train_dorm_auth, train_enrollment` | `train_dorm_auth ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation ` | `POST` | `Train` | `TrainAccommodationController.add` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation ` | `PUT` | `Train` | `TrainAccommodationController.edit` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/enrollment/{enrollment Id}` | `G ET` | `Train` | `TrainAccommodationController.getByEnrollment Id` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/enrollment/{enrollmentId}/history ` | `GE T` | `Train` | `TrainAccommodationController.getHistoryByEnrollmentId` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/list ` | `GET` | `Train` | `TrainAccommodationController.list ` | `TrainAccommodationService.list` | `TrainAccommodationMapper.selectTrainAccommodationList` | `selectTrainAccommodationList` | `train_accommodation` | `train_accommodation, train_dormitory_info, train_student, train_class_plan ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationIds} ` | `DELETE ` | `Train` | `TrainAccommodationController.remove` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}` | `GET` | `Train` | `TrainAccommodationController.getInfo ` | `TrainAccommodationService.getInfo` | `TrainAccommodationMapper.selectTrainAccommodationById` | `selectTrainAccommodationById` | `train_accommodation` | `train_accommodatio n` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}/checkin ` | `POS T` | `Train` | `TrainAccommodationController.checkIn ` | `TrainAccommodationService.checkIn` | `TrainAccommodationMapper.updateTrainAccommodation` | `updateTrainAccommodation ` | `train_accommodati on` | `train_accommodation` | `train_accommodation ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}/checkou t` | `POS T` | `Train` | `TrainAccommodationController.checkOu t` | `TrainAccommodationService.checkOut` | `TrainAccommodationMapper.updateTrainAccommodation` | `updateTrainAccommodation` | `train_accommodation` | `train_accommodation, train_dormitory_info` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/accommodation/{accommodationId}/transfer ` | `POS T` | `Train` | `TrainAccommodationController.transfer ` | `TrainAccommodationService.transfer` | `TrainAccommodationMapper.updateTrainAccommodation` | `updateTrainAccommodation` | `train_accommodation` | `train_accommodation, train_dormitory_info` | `train_accommodation, train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/attendance/charts ` | `GET` | `Train` | `TrainAnalysisController.getAttendanceCharts` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/attendance/summary ` | `GET` | `Train` | `TrainAnalysisController.getAttendanceSummary` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/dashboard/charts ` | `GET` | `Train` | `TrainAnalysisController.getDashboardCharts` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/dashboard/overview ` | `GET` | `Train` | `TrainAnalysisController.getDashboardOverview` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/analysis/portrait/student-360/{studentId} ` | `GE T` | `Train` | `TrainAnalysisController.getStudent360` | `ITrainAnalysisService.getStudent360` | `TrainAnalysisMapper.countStudentScores` | `countStudentScores` | `train_student_score` | `train_student, train_enrollment, train_student_score` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/lessons/{lessonId}/roster ` | `GE T` | `Train` | `AttendanceController.getLessonRoster ` | `TrainAttendanceService.getLessonRoster` | `TrainStudentCheckinMapper.selectRosterByLessonId` | `selectRosterByLessonId` | `train_student_checkin` | `train_student_checkin, train_enrollment, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/mark-absence ` | `POST ` | `Train` | `AttendanceController.markAbsenc e` | `TrainAttendanceService.markAbsence` | `TrainStudentCheckinMapper.insertStudentCheckin` | `insertStudentCheckin` | `train_student_checkin` | `train_student_checkin, train_lesson, train_enrollment` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/sign-in ` | `POS T` | `Train` | `AttendanceController.signIn ` | `TrainAttendanceService.signIn` | `TrainStudentCheckinMapper.insertStudentCheckin` | `insertStudentCheckin` | `train_student_checkin` | `train_student_checkin, train_lesson, train_enrollment` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/sign-out ` | `POS T` | `Train` | `AttendanceController.signOut ` | `TrainAttendanceService.signOut` | `TrainStudentCheckinMapper.updateStudentCheckin` | `updateStudentCheckin` | `train_student_checkin` | `train_student_checkin, train_lesson` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/attendance/{checkinId} ` | `PU T` | `Train` | `AttendanceController.adjust ` | `TrainAttendanceService.adjust` | `TrainStudentCheckinMapper.updateStudentCheckin` | `updateStudentCheckin` | `train_student_checkin` | `train_student_checkin` | `train_student_checkin ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/board ` | `POS T` | `Train` | `TrainElectronicBoardController.add` | `ITrainElectronicBoardService.insertTrainElectronicBoard` | `TrainElectronicBoardMapper.insertTrainElectronicBoard` | `insertTrainElectronicBoard` | `train_electronic_board` | `NONE` | `train_electronic_board ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/board ` | `PUT ` | `Train` | `TrainElectronicBoardController.edit` | `ITrainElectronicBoard Service.upda teTrainElectronicBoard` | `TrainElectronicBoard Mapper.upda teTrainElectronicBoard ` | `upda teTrainElectronicBoard` | `train_electronic_board` | `train_electronic_board` | `train_electronic_board ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/board/expor t` | `POS T` | `Train` | `TrainElectronicBoardController.export` | `ITrainElectronicBoard Service.selectTrainElectronicBoard List` | `TrainElectronicBoard Mapper.selectTrainElectronicBoard List` | `selectTrainElectronicBoard List` | `train_electronic_board` | `train_electronic_board ` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/board/list ` | `GET` | `Train` | `TrainElectronicBoardController.list` | `ITrainElectronicBoardService.selectTrainElectronicBoardList` | `TrainElectronicBoardMapper.selectTrainElectronicBoardList` | `selectTrainElectronicBoardList` | `train_electronic_board` | `train_electronic_board ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/board/{boardIds} ` | `DELETE ` | `Train` | `TrainElectronicBoardController.remove` | `ITrainElectronicBoardService.deleteTrainElectronicBoardByBoardIds` | `TrainElectronicBoardMapper.deleteTrainElectronicBoardByBoardIds` | `deleteTrainElectronicBoardByBoardIds` | `train_electronic_board` | `train_electronic_board` | `train_electronic_board ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/board/{boardId} ` | `GE T` | `Train` | `TrainElectronicBoardController.getInfo` | `ITrainElectronicBoardService.selectTrainElectronicBoardByBoardId` | `TrainElectronicBoardMapper.selectTrainElectronicBoardByBoardId` | `selectTrainElectronicBoardByBoardId` | `train_electronic_board` | `train_electronic_board` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/checkin/export ` | `POST ` | `Train` | `TrainStudentCheckinController.export` | `ITrainStudentCheckin Service.s elec tTrainStudentCheckinList` | `TrainStudentCheckin Mapper.s elec tTrainStudentCheckinList ` | `s elec tTrainStudentCheckinList` | `train_student_checkin` | `train_student_checkin` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/checkin/list ` | `GET` | `Train` | `TrainStudentCheckinController.list` | `ITrainStudentCheckinService.selectTrainStudentCheckin List` | `TrainStudentChecki nMapper.selectTrainStudentChecki nList` | `selectTrainStudentChecki nList` | `train_student_checkin` | `train_student_checkin ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/checkin/{checki nId}` | `GET` | `Train` | `TrainStudentCheckinController. getInfo` | `ITrainStudentChecki nService.selectTrainStudentCheckinByChecki nId` | `TrainStudentChecki nMapper.selectTrainStudentCheckinByCheckinId` | `selectTrainStudentCheckinByCheckinId` | `train_student_checkin` | `train_student_checki n` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/c lassroom ` | `POST` | `Train` | `TrainClassroomInfoController.add` | `ITrainClassroomInfoService.insertTrainClassroomInfo ` | `TrainClassroomInfo Mapper.insertTrainClassroomInfo ` | `insertTrainClassroomInfo ` | `train_classroom_info ` | `NONE` | `train_classroom_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/c lassroom/list ` | `GE T` | `Train` | `TrainClassroomInfoController.list` | `ITrainClassroomInfoService.selectTrainClassroomInfoList ` | `TrainClassroomInfo Mapper.select TrainClassroomInfoList ` | `select TrainClassroomInfoList ` | `train_classroom_info ` | `train_classroom_info` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/c lassroom /{c lassRoom Ids}` | `DELETE` | `Train` | `TrainClassroomInfoController. remove` | `ITrainClassroomInfo Service.deleteTrainClassroomInfo ByC lassRoom Ids` | `TrainClassroomInfo Mapper.deleteTrainClassroomInfo ByC lassRoom Ids` | `deleteTrainClassroomInfo ByC lassRoom Ids` | `train_classroom_info ` | `train_classroom_info ` | `train_classroom_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/c lassroom /{c lassRoomId} ` | `GE T` | `Train` | `TrainClassroomInfoController.getInfo` | `ITrainClassroomInfoService.selectTrainClassroomInfoByClassRoomId ` | `TrainClassroomInfo Mapper.select TrainClassroomInfoByClassRoomId ` | `select TrainClassroomInfoByClassRoomId ` | `train_classroom_info ` | `train_classroom_info` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/c lassroom /{c lassRoomId} ` | `PU T` | `Train` | `TrainClassroomInfoController.edit` | `ITrainClassroomInfoService.updateTrainClassroomInfo ` | `TrainClassroomInfo Mapper.updateTrainClassroomInfo ` | `updateTrainClassroomInfo ` | `train_classroom_info ` | `train_classroom_info ` | `train_classroom_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/cours e` | `POST` | `Train` | `TrainCourseController.add` | `ITrainCourseService.insertTrainCourse` | `TrainCourseMapper.insertTrainCourse` | `insertTrainCourse` | `train_course` | `NONE` | `train_course ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/list ` | `GET` | `Train` | `TrainCourseController.list` | `ITrainCourseService.selectTrain CourseList ` | `TrainCourseMapper.selectTrain CourseList ` | `selectTrain CourseList ` | `train_course` | `train_course` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/{cIds} ` | `DELETE ` | `Train` | `TrainCourseController.remove` | `ITrainCourseService.deleteTra inCourseByCId s` | `TrainCourseMapper.deleteTrai nCourseByCIds ` | `deleteTrai nCourseByCIds ` | `train_course` | `train_course` | `train_course` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/{c Id}` | `G ET` | `Train` | `TrainCourseController.getInfo` | `ITrainCourseService.selectTra inCourseByCId ` | `TrainCourseMapper.s elec tTrainCourseByC Id` | `s elec tTrainCourseByC Id` | `train_course` | `train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/course/{cId} ` | `PU T` | `Train` | `TrainCourseController.edit` | `ITrainCourseService.updateTrainCourse` | `TrainCourseMapper.updateTrainCourse` | `updateTrainCourse ` | `train_course ` | `train_course` | `train_course ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory ` | `POST` | `Train` | `TrainDormitoryInfoController.add` | `ITrainDormitoryInfoService.insertTrainDormitoryInfo` | `TrainDormitoryInfo Mapper.insertTrainDormitoryInfo ` | `insertTrainDormitoryInfo` | `train_dormitory_info` | `NONE` | `train_dormitory_info ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory/list ` | `GE T` | `Train` | `TrainDormitoryInfoController.list` | `ITrainDormitoryInfoService.selectTrainDormitoryInfoList` | `TrainDormitoryInfo Mapper.selec tTrainDormitoryInfoLis t` | `selec tTrainDormitoryInfoList` | `train_dormitory_info` | `train_dormitory_info` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory/options ` | `GET` | `Train` | `TrainDormitoryInfoController.options` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/dormitory/{dormId} ` | `GE T` | `Train` | `TrainDormitoryInfoController.getInfo` | `ITrainDormitoryInfoService.selectTrainDormitoryInfoByDormId` | `TrainDormitoryInfoMapper.selectTrainDormitoryInfoByDormId` | `selectTrainDormitoryInfoByDormId` | `train_dormitory_info` | `train_dormitory_info` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/duration/export ` | `POST ` | `Train` | `TrainStudyDurationController.export` | `ITrainStudyDurationService.selectTrainStudyDurationList` | `TrainStudyDuration Mapper.s elec tTrainStudyDurationList ` | `s elec tTrainStudyDurationList` | `train_study_duration` | `train_study_duration` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/duration/list ` | `GET` | `Train` | `TrainStudyDurationController.list` | `ITrainStudyDurationService.selectTrainStudyDurationList ` | `TrainStudyDurati onMapper.selectTrainStudyDurationList` | `selectTrainStudyDurationList ` | `train_study_durati on` | `train_study_duration ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/duration/{durId} ` | `GE T` | `Train` | `TrainStudyDurationController.getInfo` | `ITrainStudyDurationService.selectTrainStudyDurationByDurId ` | `TrainStudyDurati onMapper.selec tTrainStudyDurationByDurId ` | `selec tTrainStudyDurationByDurId ` | `train_study_durati on` | `train_study_duration` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollment Id}` | `DEL ETE ` | `Train` | `TrainEnrollmentController.removeEnrollment` | `ITrainEnrollmentService.deleteEnrollmentById ` | `TrainEnrollment Mapper.d eleteEnrollment ById` | `d eleteEnrollment ById` | `train_enrollment ` | `train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollment Id}` | `GE T` | `Train` | `TrainEnrollmentController.getDetail` | `ITrainEnrollmentService.selectEnrollmentById` | `TrainEnrollmentMapper.selectEnrollmentById` | `selectEnrollmentById ` | `train_enrollment ` | `train_enrollment, train_student, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DEFIN ED_IN _UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollmentId}/report ` | `POST ` | `Train` | `TrainReportActionController.confirmReport` | `TrainClassReportService.confirmReport ` | `TrainClassReport Mapper.upda teTrainClassReport ` | `upda teTrainClassReport ` | `train_class_report ` | `train_class_report, train_enrollment` | `train_class_report, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/enrollments/{enrollmentId}/status ` | `PU T` | `Train` | `TrainEnrollmentController.updateStatus` | `ITrainEnrollmentService.updateEnrollmentStatus` | `TrainEnrollmentMapper.updateEnrollmentStatus` | `updateEnrollmentStatu s` | `train_enrollment ` | `train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/check-conflict ` | `POS T` | `Train` | `TrainLessonController.checkConflict` | `LessonAppService.checkConflict` | `TrainLessonMapper.checkConflict` | `checkConflict` | `train_lesson` | `train_lesson ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/scheduling-options ` | `GET` | `Train` | `TrainLessonController.getSchedulingOptions` | `LessonAppService.getSchedulingOptions` | `TrainLessonMapper.selectOptions` | `selectOptions` | `train_lesson` | ` train_classroom_info, train_teacher ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/{lessonId} ` | `DELETE ` | `Train` | `TrainLessonController.removeLesson` | `LessonAppService.deleteLesson` | `TrainLessonMapper.deleteTrainLessonById` | `deleteTrainLessonById ` | `train_lesson ` | `train_lesso n` | `train_lesson ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/lessons/{lessonId} ` | `PU T` | `Train` | `TrainLessonController.editLesson` | `LessonAppService.updateLesson` | `TrainLessonMapper.updateTrainLesson` | `updateTrainLesson ` | `train_lesson ` | `train_lesson` | `train_lesson ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/studen t` | `GET` | `Train` | `TrainStudentMeController.getStudentProfile` | `ITrainingIdentityService.assertStudentIdentity ` | `TrainStudentMapper.selectTrainStudentBySId ` | `selectTrainStudentBySId ` | `train_student` | `train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/attendance` | `GET` | `Train` | `TrainStudentMeController.getMyAttendance` | `ITrainingIdentityService.assertStudentIdentity ` | `TrainStudentCheckinMapper.selectCheckinsByStudent Id` | `selectCheckinsByStudent Id` | `train_student_checkin` | `train_student_checkin, train_lesson , train_enrollm ent` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/duratio n` | `GE T` | `Train` | `TrainStudentMeController.getMyDuration` | `ITrainingIdentityService.assertStudentIdentity` | `TrainStudyDurationMapper.selectDurationsByStudentId` | `selectDurationsByStudentId ` | `train_study_duratio n` | `train_study_duration, train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/enrollments ` | `GE T` | `Train` | `TrainStudentMeController.getMyEnrollments` | `ITrainingIdentityService.assertStudentIdentity` | `TrainEnrollmentMapper.selectEnrollmentsByStudentId` | `selectEnrollmentsByStudentId` | `train_enrollment` | `train_enrollment, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/portrait ` | `GE T` | `Train` | `TrainStudentMeController.getMyPortrait` | `ITrainingIdentityService.assertStudentIdentity` | `TrainStudentPortraitMapper.selectPo rtraitBy StudentId` | `selectPo rtraitBy StudentId ` | `train_student_portrait ` | `train_student_portrait, train_enrollment, train_class_plan, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/repor t` | `GE T` | `Train` | `TrainStudentMeController.getMyReport` | `ITrainingIdentityService.assertStudentIdentity` | `TrainClassReportMapper.selectLatestReportByStudentId` | `selectLatestReportByStudentId` | `train_class_report` | `train_class_report, train_enrollment, train_class_plan` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/student/timetable ` | `GE T` | `Train` | `TrainStudentMeController.getMyTimetable` | `ITrainingIdentityService.assertStudentIdentity` | `TrainLessonMapper.selectScheduleLessonsByStudentId` | `selectScheduleLessonsByStudentId` | `train_lesson` | `train_lesson, train_plan_course, train_course, train_classroom_info, train_training_site` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher ` | `GET` | `Train` | `TrainTeacherMeController.getTeacherProfile` | `ITrainingIdentityService.assertTeacherIdentity` | `TrainTeacher Mapper.selectTrainTeacherByTId ` | `selectTrainTeacherByTId` | `train_teacher` | `train_teacher ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/lessons ` | `GET` | `Train` | `TrainTeacherMeController.getMyTimetable` | `ITrainingIdentityService.assertTeacherIdentity` | `TrainLessonMapper.selectScheduleLessonsByTeacherId` | `selectScheduleLessonsByTeacherId` | `train_lesson` | `train_lesson, train_plan_course, train_course ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/lessons/{lessonId}/attendance ` | `GE T` | `Train` | `TrainTeacherMeController.getLessonAttendance` | `ITrainingIdentity Service.as sertTeacherIdentity` | `TrainStudentCheckinMapper.selectCheckinsByLessonId` | `selectCheckinsByLessonId` | `train_student_checkin` | `train_lesson, train_student_checkin` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/plans ` | `GE T` | `Train` | `TrainTeacherMeController.getMyPlans` | `ITrainingIdentityService.assertTeacherIdentity` | `TrainLessonMapper.selectPlansByTeacherId` | `selectPlansByTeacherId` | `train_class_plan` | `train_class_plan, train_plan_course, train_lesson` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/students ` | `G ET` | `Train` | `TrainTeacherMeController.getMyClassStudents` | `ITrainingIdentityService.assertTeacherIdentity` | `TrainEnrollment Mapper.s electEnrollmentItemList ` | `s electEnrollmentItemList` | `train_enrollment` | `train_enrollment, train_lesson, train_student` | `NONE ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/me/teacher/timetable ` | `GET` | `Train` | `TrainTeacherMeController.getMyTimetable` | `ITrainingIdentityService.assertTeacherIdentity ` | `TrainLess onMapper.selectScheduleLessonsByTeacherId` | `selectScheduleLessonsByTeacherId ` | `train_less on` | `train_lesson, train_plan_course , train_course ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans` | `GET` | `Train` | `TrainPlanController.list` | `PlanAppService.selectPlanItemList` | `TrainClassPlanMapper.selectTrainClassPlanList` | `selectTrainClassPlanList ` | `train_class_pla n` | `train_class_plan, train_plan_course , train_enrollm ent` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans ` | `POS T` | `Train` | `TrainPlanController.add` | `PlanAppService.createPlan` | `TrainClassPla nMapper.inser tTrainClassPlan ` | `inser tTrainClassPlan` | `train_class_plan` | `NONE` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERI FIED_USED_BY_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}` | `GET` | `Train` | `TrainPlanController.getInfo` | `PlanAppService.selectPlanById` | `TrainClassPlanMapper.selectTrainClassPlanByPlanId` | `selectTrainClassPlanByPlanId ` | `train_class_pla n` | `train_class_plan ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId} ` | `PU T` | `Train` | `TrainPlanController.edit` | `PlanAppService.updatePlan` | `TrainClassPlanMapper.updateTrainClassPlan` | `updateTrainClassPla n` | `train_class_pla n` | `train_class_plan` | `train_class_plan ` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/complete` | `POST` | `Train` | `TrainPlanController.complete` | `PlanAppService.completePla n` | `TrainClassPla nMapper.updateTrainClassPla n` | `updateTrainClassPla n` | `train_class_pla n` | `train_class_plan, train_enrollment` | `train_class_plan, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/courses ` | `GE T` | `Train` | `TrainPlanCourseController.list` | `PlanAppService.selectPlanCourses` | `TrainPlanCourseMapper.selectPlanCourseList` | `selectPlanCourseList` | `train_plan_course` | `train_plan_course, train_course, train_teacher` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/courses ` | `POST` | `Train` | `T rainPlanCourseController.add` | `PlanAppService.addPlanCourse` | `TrainPlanCourseMapper.insertTrainPlanCourse` | `insertTrainPlanCourse` | `train_plan_course` | `train_class_plan` | `train_plan_course ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/courses/{planCourse Id}` | `DELETE` | `Train` | `TrainPlanCourseController.remove` | `PlanAppService.removePlanCourse` | `TrainPlanCourseMapper.deleteTrainPlanCourseBy Id` | `deleteTrainPlanCourseBy Id` | `train_plan_course` | `train_plan_course` | `train_plan_course ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/enrollments ` | `GET` | `Train` | `TrainEnrollmentController.listEnrollments ` | `ITrainEnrollment Service.selectEnrollment List` | `TrainEnrollment Mapper.selectEnrollment List` | `selectEnrollment List` | `train_enrollment ` | `train_enrollment , train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/enrollments ` | `POS T` | `Train` | `TrainEnrollmentController.addEnrollment` | `ITrainEnrollmentService.insertEnrollment` | `TrainEnrollmentMapper.insertEnrollment` | `insertEnrollment ` | `train_enrollment ` | `train_class_plan, train_enrollment` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/enrollments/batch` | `POST` | `Train` | `TrainEnrollmentController.batchImportEnrollments` | `ITrainEnrollmentService.batchInsertEnrollments` | `TrainEnrollmentMapper.batchInsertEnrollments` | `batchInsertEnrollments` | `train_enrollment` | `train_class_plan ` | `train_enrollment ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/lessons ` | `POS T` | `Train` | `TrainLessonController.addLesson` | `LessonAppService.createLesson` | `TrainLessonMapper.insertTrainLesson` | `insertTrainLesson ` | `train_lesson ` | `train_class_plan, train_plan_course, train_lesson ` | `train_lesson ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/plans/{planId}/timetable ` | `G ET` | `Train` | `TrainLessonController.getTimetable` | `LessonAppService.getTimetable ` | `TrainLesson Mapper.s electTimetableByPlan Id` | `s electTimetableByPlan Id` | `train_lesson ` | `train_lesson, train_plan_course, train_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/portrait/export ` | `POS T` | `Train` | `TrainStudentPortraitController.export` | `ITrainStudentPortraitService.selectTrainStudentPortraitList` | `TrainStudentPortraitMapper.selectTrainStudentPortraitList` | `selectTrainStudentPortraitList` | `train_student_portrait` | `train_student_portrait ` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/portrait/list ` | `GET` | `Train` | `TrainStudentPortraitController.list` | `ITrainStudentPortraitService.selectTrainStudentPortraitList` | `TrainStudentPortraitMapper.selectTrainStudentPortraitList` | `selectTrainStudentPortraitList` | `train_student_portrait` | `train_student_portrait ` | `NONE` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/portrait/{portraitId} ` | `GET` | `Train` | `TrainStudentPortraitController.getInfo` | `ITrainStudentPortraitService.selectTrainStudentPortraitByPortraitId` | `TrainStudentPortraitMapper.selectTrainStudentPortraitByPortraitId` | `selectTrainStudentPortraitByPortraitId ` | `train_student_portrait ` | `train_student_portrait ` | `NONE` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/report/expo rt` | `POS T` | `Train` | `TrainClassReportController.expo rt` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN` | `UNKNOWN ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/report/list` | `GET` | `Train` | `TrainClassReportController.list` | `ITrainClassReportService.selectTrainClassReportList ` | `TrainClassReport Mapper.selectTrainClassReportList` | `selectTrainClassReportList` | `train_class_report` | `train_class_report ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/report/{reportId} ` | `GET` | `Train` | `TrainClassReportController.getInfo` | `ITrainClassReportService.selectTrainClassReportById` | `TrainClassReportMapper.selectTrainClassReportById` | `selectTrainClassReportById` | `train_class_report` | `train_class_report ` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score ` | `POS T` | `Train` | `TrainScoreInfoController.add ` | `ITrainScoreInfo Service.inser tTrainScoreInfo` | `TrainScoreInfoMapper.insertStudentScoreRow` | `insertStudentScoreRow` | `train_student_score` | `train_enrollment, train_score_item` | `train_student_score, train_score_item, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score ` | `PU T` | `Train` | `TrainScoreInfoController.edit` | `ITrainScoreInfoService.updateTrainScoreInfo` | `TrainScoreInfoMapper.updateStudentScoreRow` | `updateStudentScoreRow` | `train_student_score` | `train_student_score, train_enrollment, train_score_item` | `train_student_score, train_score_item, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `DE FIN ED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score/export ` | `POS T` | `Train` | `TrainScoreInfoController.export` | `ITrainScoreInfoService.selectTrainScoreInfoList` | `TrainScoreInfoMapper.selectTrainScoreInfoList` | `selectTrainScoreInfoList` | `train_student_score` | `train_student_score, train_score_item, train_enrollment, train_plan_course ` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/score/list ` | `GE T` | `Train` | `TrainScoreInfoController.list` | `ITrainScoreInfoService.selectTrainScoreInfoList` | `TrainScoreInfoMapper.selectTrainScoreInfoList` | `selectTrainScoreInfoList` | `train_student_score` | `train_student_score, train_score_item, train_enrollment, train_plan_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN _UI` | `ENDPOINT_DEFINED (BA CKEN D_IMPLEMENTED )` |
| `/train/score/{scoreIds} ` | `DELETE ` | `Train` | `TrainScoreInfoController.remove` | `ITrainScoreInfoService.deleteTrainScoreInfoByScoreIds ` | `TrainScoreInfo Mapper.dele teTrainScoreInfoByScoreIds ` | `dele teTrainScoreInfoByScoreIds` | `train_student_score` | `train_student_score` | `train_student_score ` | `VERIFIED_FROM_SOURCE` | `DEFIN ED_IN _UI_API_ONLY ` | `ENDPOINT_DEFINED (BA CKEN D_IMPLEMENTED )` |
| `/train/score/{scoreId}` | `GET` | `Train` | `TrainScoreInfoController.getInfo ` | `I TrainScoreInfoService.selectTrainScoreInfoByScoreId` | `TrainScoreInfoMapper.selectTrainScoreInfoByScoreId` | `selectTrainScoreInfoByScoreId` | `train_student_score` | `train_student_score, train_score_item, train_enrollment, train_plan_course ` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/scoreinfo ` | `POST` | `Train` | `TrainScoreInfoController.add ` | `I TrainScoreInfo Service.insertTrainScoreInfo` | `TrainScoreInfoMapper.insertStudentScoreRow` | `insertStudentScoreRow` | `train_student_score` | `train_enrollment, train_score_item` | `train_student_score, train_score_item, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/scoreinfo ` | `PU T` | `Train` | `TrainScoreInfoController.edit ` | `I TrainScoreInfoService.updateTrainScoreInfo` | `TrainScoreInfoMapper.updateStudentScoreRow` | `updateStudentScoreRow` | `train_student_score` | `train_student_score, train_enrollment, train_score_item` | `train_student_score, train_score_item, train_enrollment ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/scoreinfo/export` | `POST` | `Train` | `TrainScoreInfoController.export ` | `I TrainScoreInfoService.selectTrainScoreInfoList` | `TrainScoreInfoMapper.selectTrainScoreInfoList` | `selectTrainScoreInfoLis t` | `train_student_score ` | `train_student_score, train_score_item, train_enrollment, train_plan_course` | `NONE ` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY ` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/scoreinfo/list` | `GET` | `Train` | `TrainScoreInfoController.list` | `ITrainScoreInfoService.selectTrainScoreInfoList` | `TrainScoreInfoMapper.selectTrainScoreInfoList` | `selectTrainScoreInfoList` | `train_student_score` | `train_student_score, train_score_item, train_enrollment, train_plan_course` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/scoreinfo/{scoreIds}` | `DELETE` | `Train` | `TrainScoreInfoController.remove` | `ITrainScoreInfoService.deleteTrainScoreInfoByScoreIds` | `TrainScoreInfoMapper.deleteTrainScoreInfoByScoreIds` | `deleteTrainScoreInfoByScoreIds` | `train_student_score` | `train_student_score` | `train_student_score` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/scoreinfo/{scoreId}` | `GET` | `Train` | `TrainScoreInfoController.getInfo` | `ITrainScoreInfoService.selectTrainScoreInfoByScoreId` | `TrainScoreInfoMapper.selectTrainScoreInfoByScoreId` | `selectTrainScoreInfoByScoreId` | `train_student_score` | `train_student_score, train_score_item, train_enrollment, train_plan_course` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student` | `POST` | `Train` | `TrainStudentController.add` | `ITrainStudentService.insertTrainStudent` | `TrainStudentMapper.insertTrainStudent` | `insertTrainStudent` | `train_student` | `NONE` | `train_student` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/bindable-users` | `GET` | `Train` | `TrainAccountBindingAdminController.getStudentBindableUsers` | `TrainAccountBindingAdminService.selectBindableUsers` | `SysUserMapper.selectUserList` | `selectUserList` | `train_student` | `sys_user, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/list` | `GET` | `Train` | `TrainStudentController.list` | `ITrainStudentService.selectTrainStudentList` | `TrainStudentMapper.selectTrainStudentList` | `selectTrainStudentList` | `train_student` | `train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{sId}` | `DELETE` | `Train` | `TrainStudentController.remove` | `ITrainStudentService.deleteTrainStudentBySId` | `TrainStudentMapper.deleteTrainStudentBySId` | `deleteTrainStudentBySId` | `train_student` | `train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{sId}` | `GET` | `Train` | `TrainStudentController.getInfo` | `ITrainStudentService.selectTrainStudentBySId` | `TrainStudentMapper.selectTrainStudentBySId` | `selectTrainStudentBySId` | `train_student` | `train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{sId}/user-binding` | `DELETE` | `Train` | `TrainAccountBindingAdminController.unbindStudentUser` | `TrainAccountBindingAdminService.unbindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{sId}/user-binding` | `POST` | `Train` | `TrainAccountBindingAdminController.bindStudentUser` | `TrainAccountBindingAdminService.bindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `sys_user, train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/student/{sId}/user-binding` | `PUT` | `Train` | `TrainAccountBindingAdminController.bindStudentUser` | `TrainAccountBindingAdminService.bindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `sys_user, train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students` | `POST` | `Train` | `TrainStudentController.add` | `ITrainStudentService.insertTrainStudent` | `TrainStudentMapper.insertTrainStudent` | `insertTrainStudent` | `train_student` | `NONE` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/bindable-users` | `GET` | `Train` | `TrainAccountBindingAdminController.getStudentBindableUsers` | `TrainAccountBindingAdminService.selectBindableUsers` | `SysUserMapper.selectUserList` | `selectUserList` | `train_student` | `sys_user, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/list` | `GET` | `Train` | `TrainStudentController.list` | `ITrainStudentService.selectTrainStudentList` | `TrainStudentMapper.selectTrainStudentList` | `selectTrainStudentList` | `train_student` | `train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/{sId}` | `DELETE` | `Train` | `TrainStudentController.remove` | `ITrainStudentService.deleteTrainStudentBySId` | `TrainStudentMapper.deleteTrainStudentBySId` | `deleteTrainStudentBySId` | `train_student` | `train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/{sId}` | `GET` | `Train` | `TrainStudentController.getInfo` | `ITrainStudentService.selectTrainStudentBySId` | `TrainStudentMapper.selectTrainStudentBySId` | `selectTrainStudentBySId` | `train_student` | `train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/{sId}/user-binding` | `DELETE` | `Train` | `TrainAccountBindingAdminController.unbindStudentUser` | `TrainAccountBindingAdminService.unbindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/{sId}/user-binding` | `POST` | `Train` | `TrainAccountBindingAdminController.bindStudentUser` | `TrainAccountBindingAdminService.bindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `sys_user, train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/students/{sId}/user-binding` | `PUT` | `Train` | `TrainAccountBindingAdminController.bindStudentUser` | `TrainAccountBindingAdminService.bindStudentAccount` | `TrainStudentMapper.updateTrainStudent` | `updateTrainStudent` | `train_student` | `sys_user, train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher` | `POST` | `Train` | `TrainTeacherController.add` | `ITrainTeacherService.insertTrainTeacher` | `TrainTeacherMapper.insertTrainTeacher` | `insertTrainTeacher` | `train_teacher` | `NONE` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/bindable-users` | `GET` | `Train` | `TrainAccountBindingAdminController.getTeacherBindableUsers` | `TrainAccountBindingAdminService.selectBindableUsers` | `SysUserMapper.selectUserList` | `selectUserList` | `train_teacher` | `sys_user, train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/list` | `GET` | `Train` | `TrainTeacherController.list` | `ITrainTeacherService.selectTrainTeacherList` | `TrainTeacherMapper.selectTrainTeacherList` | `selectTrainTeacherList` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId}` | `DELETE` | `Train` | `TrainTeacherController.remove` | `ITrainTeacherService.deleteTrainTeacherByTId` | `TrainTeacherMapper.deleteTrainTeacherByTId` | `deleteTrainTeacherByTId` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId}` | `GET` | `Train` | `TrainTeacherController.getInfo` | `ITrainTeacherService.selectTrainTeacherByTId` | `TrainTeacherMapper.selectTrainTeacherByTId` | `selectTrainTeacherByTId` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId}` | `PUT` | `Train` | `TrainTeacherController.edit` | `ITrainTeacherService.updateTrainTeacher` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId}/user-binding` | `DELETE` | `Train` | `TrainAccountBindingAdminController.unbindTeacherUser` | `TrainAccountBindingAdminService.unbindTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId}/user-binding` | `POST` | `Train` | `TrainAccountBindingAdminController.bindTeacherUser` | `TrainAccountBindingAdminService.bindTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `sys_user, train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teacher/{tId}/user-binding` | `PUT` | `Train` | `TrainAccountBindingAdminController.bindTeacherUser` | `TrainAccountBindingAdminService.bindTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `sys_user, train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers` | `POST` | `Train` | `TrainTeacherController.add` | `ITrainTeacherService.insertTrainTeacher` | `TrainTeacherMapper.insertTrainTeacher` | `insertTrainTeacher` | `train_teacher` | `NONE` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/bindable-users` | `GET` | `Train` | `TrainAccountBindingAdminController.getTeacherBindableUsers` | `TrainAccountBindingAdminService.selectBindableUsers` | `SysUserMapper.selectUserList` | `selectUserList` | `train_teacher` | `sys_user, train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/list` | `GET` | `Train` | `TrainTeacherController.list` | `ITrainTeacherService.selectTrainTeacherList` | `TrainTeacherMapper.selectTrainTeacherList` | `selectTrainTeacherList` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/{tId}` | `DELETE` | `Train` | `TrainTeacherController.remove` | `ITrainTeacherService.deleteTrainTeacherByTId` | `TrainTeacherMapper.deleteTrainTeacherByTId` | `deleteTrainTeacherByTId` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/{tId}` | `GET` | `Train` | `TrainTeacherController.getInfo` | `ITrainTeacherService.selectTrainTeacherByTId` | `TrainTeacherMapper.selectTrainTeacherByTId` | `selectTrainTeacherByTId` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/{tId}` | `PUT` | `Train` | `TrainTeacherController.edit` | `ITrainTeacherService.updateTrainTeacher` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/{tId}/user-binding` | `DELETE` | `Train` | `TrainAccountBindingAdminController.unbindTeacherUser` | `TrainAccountBindingAdminService.unbindTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/{tId}/user-binding` | `POST` | `Train` | `TrainAccountBindingAdminController.bindTeacherUser` | `TrainAccountBindingAdminService.bindTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `sys_user, train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/teachers/{tId}/user-binding` | `PUT` | `Train` | `TrainAccountBindingAdminController.bindTeacherUser` | `TrainAccountBindingAdminService.bindTeacherAccount` | `TrainTeacherMapper.updateTrainTeacher` | `updateTrainTeacher` | `train_teacher` | `sys_user, train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site` | `POST` | `Train` | `TrainTrainingSiteController.add` | `ITrainTrainingSiteService.insertTrainTrainingSite` | `TrainTrainingSiteMapper.insertTrainTrainingSite` | `insertTrainTrainingSite` | `train_training_site` | `NONE` | `train_training_site` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site/list` | `GET` | `Train` | `TrainTrainingSiteController.list` | `ITrainTrainingSiteService.selectTrainTrainingSiteList` | `TrainTrainingSiteMapper.selectTrainTrainingSiteList` | `selectTrainTrainingSiteList` | `train_training_site` | `train_training_site` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site/{siteId}` | `GET` | `Train` | `TrainTrainingSiteController.getInfo` | `ITrainTrainingSiteService.selectTrainTrainingSiteBySiteId` | `TrainTrainingSiteMapper.selectTrainTrainingSiteBySiteId` | `selectTrainTrainingSiteBySiteId` | `train_training_site` | `train_training_site` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
| `/train/training-site/{siteId}` | `PUT` | `Train` | `TrainTrainingSiteController.edit` | `ITrainTrainingSiteService.updateTrainTrainingSite` | `TrainTrainingSiteMapper.updateTrainTrainingSite` | `updateTrainTrainingSite` | `train_training_site` | `train_training_site` | `train_training_site` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` |
---
## 2. 统计汇总与一致性强制检查 (Task F & Task G)
### 2.1 端点数量与结构化审计指标
- **内部业务端点总数 (`INTERNAL_API_COUNT` )**: **107 个**
- **唯一端点标识 (`UNIQUE_METHOD_PATH_COUNT` )**: **107 项**(以 `METHOD + PATH` 为联合主键,0 冲突,0 重复记录)
- **内部业务端点总数 (`INTERNAL_API_COUNT` )**: **148 个**
- **唯一端点标识 (`UNIQUE_METHOD_PATH_COUNT` )**: **148 项**(以 `METHOD + PATH` 为联合主键,0 冲突,0 重复记录,覆盖 24 个培训业务控制器 )
- **代码与文档端点一致性 (`CODE_DOCUMENT_CONSISTENCY` )**:
- `CODE_ENDPOINT_COUNT` : **148 **
- `DOCUMENT_ENDPOINT_COUNT` : **148 **
- `CODE_NOT_IN_DOCUMENT` : **0 **
- `DOCUMENT_NOT_IN_CODE` : **0 **
- `FINAL_INTERNAL_API_COUNT` : **148 **
### 2.2 数据库调用链追踪分布 (`LINEAGE_STATUS`)
- **源码逐项验证通过 (`API_DB_LINEAGE_VERIFIED_COUNT` )**: **107 个** (100% 经 Controller → Service → Mapper → XML 链路追踪验证)
- **源码逐项验证通过 (`API_DB_LINEAGE_VERIFIED_COUNT` )**: **148 个** (100% 经 Controller → Service → Mapper → XML 链路追踪验证)
- **规则启发式推导 (`API_DB_LINEAGE_HEURISTIC_COUNT` )**:**0 个** (彻底清零规则推导,全部端点均具备源码定位凭据)
- **未经证实猜测量 (`API_DB_LINEAGE_UNVERIFIED_COUNT` )**: **0 个**
- **已知表名纠偏完成**:
- 彻底纠偏历史文档中的 `train_plan` 误称,物理主表统一修正为实际数据库表名 * * `train_class_plan` **;
- 彻底核验 * * `train_student_portrait` ** 为真实物理业务表(定义于 `004_rebuild_business_tables.sql` ,由 `010_verify.sql` 强断言)。
- 彻底核验 * * `train_student_portrait` ** 为真实物理业务表(定义于 `004_rebuild_business_tables.sql` ,由 `010_verify.sql` 强断言);
- 彻底确认 * * `train_score_info = LEGACY_DROPPED / NON_RUNTIME` **,成绩 API (`/train/score/**` , `/train/scoreinfo/**` ) 与学生画像 (`student-360` ) 运行时数据链路全部穿透至 V2 `train_student_score` + `train_score_item` + `train_enrollment` 。
### 2.3 前端调用状态分布 (`USED_BY_UI` 基于 `build_ui/` 扫描)
- **`VERIFIED_USED_BY_UI` **: **9 2 项**(在 `build_ui/src/views/` 页面中实际被用户交互触发)
- **`DEFINED_IN_UI_API_ONLY` **: **11 项**(在 `build_ui/src/api/` 中已封装接口,但页面视图暂未直接引用)
- **`NOT_FOUND_IN_UI` **: **4 项**( 纯管理端底层端点,前端未声明:教师/学员账号手工绑定与候选人过滤接口 )
- **`VERIFIED_USED_BY_UI` **: **8 2 项**(在 `build_ui/src/views/` 页面中实际被用户交互触发)
- **`DEFINED_IN_UI_API_ONLY` **: **16 项**(在 `build_ui/src/api/` 中已封装接口,但页面视图暂未直接引用)
- **`NOT_FOUND_IN_UI` **: **50 项**( 系统后端管理端点/别名端点/只读聚合端点 )
### 2.4 四类 API 边界范围确立 (API Scope Definition — 概念分离)
1. * * `CUSTOM_TRAIN_BUSINESS_API` (RailwaySystem 自研培训业务端点)**: **107 个**
- 涵盖开班、排课、学员、考勤、报到、住宿、成绩与画像全生命周期;
1. * * `CUSTOM_TRAIN_BUSINESS_API` (RailwaySystem 自研培训业务端点)**: **148 个**
- 涵盖开班、排课、学员、考勤、报到、住宿、门禁、 成绩与画像全生命周期;
2. * * `RUOYI_PLATFORM_API` (RuoYi 底座系统平台端点)**: **95 个**
- 涵盖 `/login` 、`/captchaImage` 、`/system/user/*` 、`/system/role/*` 、`/system/menu/*` 、`/system/dict/*` 、`/monitor/*` 等通用平台能力;
3. * * `CLIENT_PROVIDED_API` (甲方沈阳房建公寓段向项目交付的外部接口契约)**:**27 个**
@@ -154,7 +203,9 @@
### 2.5 数据库与 API 调用链强制一致性检查 (Task G)
- **`LINEAGE_TABLE_NOT_IN_DATABASE_CATALOG` **: **0 项**(所有 API 引用的表均存在于 03 数据库总账中)
- **`DATABASE_TABLE_NOT_REFERENCED_BY_ANY_API` **: **5 项**
- 说明:`train_course_resource` 、`train_electronic_board` 、 `train_resource` 、 `train_score_item` 、 `train_student_score` 5 张表暂未暴露于当前 107 个内部 HTTP API 中(如电子班牌由独立控制器处理,成绩 V2 细粒度表等待 C03 成绩闭环对接 );
- **`DATABASE_TABLE_NOT_REFERENCED_BY_ANY_API` **: **2 项**
- 说明:`train_course_resource` 、`train_resource` 2 张课程资源从属表暂未通过独立端点直接暴露(通过课程主档及静态资源管理维护 );
- `train_score_item` 与 `train_student_score` 现已由 `/train/score/**` 及学员 360 画像直接读写并形成闭环;`train_electronic_board` 由 `TrainElectronicBoardController` 6 个端点完整覆盖;
- **`RUNTIME_REFERENCES_TO_TRAIN_SCORE_INFO` **:**0 项**(彻底杜绝运行时对已 drop 旧表的任何读写)
- **`UNKNOWN_TABLE_REFERENCES` **:**0 项**(无任何未识别或猜测表名引用)
- **`API_DB_LINEAGE_FREEZE` **: **YES**