# 04 - 系统全量 API 接口总账与数据库调用链 (API Inventory & Database Lineage) > **最高原则**:**拒绝根据 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)`**。 --- ## 1. 核心培训业务 API 账本 (`CUSTOM_TRAIN_BUSINESS_API` — 107 个端点源码穿透验证) | 接口路径 (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` | `ITrainTeacherService.selectTrainTeacherList` | `TrainTeacherMapper.selectTrainTeacherList` | `selectTrainTeacherList` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/teacher/{tId}` | `GET` | `Train` | `getInfo` | `ITrainTeacherService.selectTrainTeacherByTId` | `TrainTeacherMapper.selectTrainTeacherByTId` | `selectTrainTeacherByTId` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/teacher` | `POST` | `Train` | `add` | `ITrainTeacherService.insertTrainTeacher` | `TrainTeacherMapper.insertTrainTeacher` | `insertTrainTeacher` | `train_teacher` | `NONE` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/teacher` | `PUT` | `Train` | `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/{tIds}` | `DELETE` | `Train` | `remove` | `ITrainTeacherService.deleteTrainTeacherByTIds` | `TrainTeacherMapper.deleteTrainTeacherByTIds` | `deleteTrainTeacherByTIds` | `train_teacher` | `train_teacher` | `train_teacher` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/teacher/export` | `POST` | `Train` | `export` | `ITrainTeacherService.selectTrainTeacherList` | `TrainTeacherMapper.selectTrainTeacherList` | `selectTrainTeacherList` | `train_teacher` | `train_teacher` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/me/teacher/plans` | `GET` | `Train` | `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` | `GET` | `Train` | `getTeacherProfile` | `ITrainingIdentityService.assertTeacherIdentity` | `TrainTeacherMapper.selectTrainTeacherByTId` | `selectTrainTeacherByTId` | `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` | `GET` | `Train` | `getLessonAttendance` | `TrainLessonMapper.selectTrainLessonById` | `TrainStudentCheckinMapper.selectCheckinsByLessonId` | `selectCheckinsByLessonId` | `train_student_checkin` | `train_lesson, train_student_checkin` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/student/list` | `GET` | `Train` | `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}` | `GET` | `Train` | `getInfo` | `ITrainStudentService.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/{sIds}` | `DELETE` | `Train` | `remove` | `ITrainStudentService.deleteTrainStudentBySIds` | `TrainStudentMapper.deleteTrainStudentBySIds` | `deleteTrainStudentBySIds` | `train_student` | `train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/student/export` | `POST` | `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` | `ITrainStudentService.importTemplate` | `NONE` | `NONE` | `train_student` | `NONE` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_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` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/me/student/enrollments` | `GET` | `Train` | `getMyEnrollments` | `ITrainingIdentityService.assertStudentIdentity` | `TrainEnrollmentMapper.selectEnrollmentsByStudentId` | `selectEnrollmentsByStudentId` | `train_enrollment` | `train_enrollment, train_class_plan` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/me/student/timetable` | `GET` | `Train` | `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` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/me/student/report` | `GET` | `Train` | `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/attendance` | `GET` | `Train` | `getMyAttendance` | `ITrainingIdentityService.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` | `POST` | `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` | `PUT` | `Train` | `edit` | `ITrainCourseService.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` | `remove` | `ITrainCourseService.deleteTrainCourseByCIds` | `TrainCourseMapper.deleteTrainCourseByCIds` | `deleteTrainCourseByCIds` | `train_course` | `train_course` | `train_course` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/classroom/list` | `GET` | `Train` | `list` | `ITrainClassroomInfoService.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}` | `GET` | `Train` | `getInfo` | `ITrainClassroomInfoService.selectTrainClassroomInfoByClassRoomId` | `TrainClassroomInfoMapper.selectTrainClassroomInfoByClassRoomId` | `selectTrainClassroomInfoByClassRoomId` | `train_classroom_info` | `train_classroom_info` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/classroom` | `POST` | `Train` | `add` | `ITrainClassroomInfoService.insertTrainClassroomInfo` | `TrainClassroomInfoMapper.insertTrainClassroomInfo` | `insertTrainClassroomInfo` | `train_classroom_info` | `NONE` | `train_classroom_info` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/classroom` | `PUT` | `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` | `ITrainClassroomInfoService.deleteTrainClassroomInfoByClassRoomIds` | `TrainClassroomInfoMapper.deleteTrainClassroomInfoByClassRoomIds` | `deleteTrainClassroomInfoByClassRoomIds` | `train_classroom_info` | `train_classroom_info` | `train_classroom_info` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/training-site/list` | `GET` | `Train` | `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` | `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` | `PUT` | `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` | `ITrainTrainingSiteService.deleteTrainTrainingSiteBySiteIds` | `TrainTrainingSiteMapper.deleteTrainTrainingSiteBySiteIds` | `deleteTrainTrainingSiteBySiteIds` | `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.selectPlanItemList` | `TrainClassPlanMapper.selectTrainClassPlanList` | `selectTrainClassPlanList` | `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/{planId}` | `GET` | `Train` | `getInfo` | `ITrainClassPlanService.selectTrainClassPlanByPlanId` | `TrainClassPlanMapper.selectTrainClassPlanByPlanId` | `selectTrainClassPlanByPlanId` | `train_class_plan` | `train_class_plan` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans` | `POST` | `Train` | `add` | `PlanAppService.createPlan` | `TrainClassPlanMapper.insertTrainClassPlan` | `insertTrainClassPlan` | `train_class_plan` | `NONE` | `train_class_plan` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans/{planId}` | `PUT` | `Train` | `edit` | `PlanAppService.updatePlan` | `TrainClassPlanMapper.updateTrainClassPlan` | `updateTrainClassPlan` | `train_class_plan` | `train_class_plan` | `train_class_plan` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans/{planIds}` | `DELETE` | `Train` | `remove` | `ITrainClassPlanService.deleteTrainClassPlanByPlanIds` | `TrainClassPlanMapper.deleteTrainClassPlanByPlanIds` | `deleteTrainClassPlanByPlanIds` | `train_class_plan` | `train_class_plan` | `train_class_plan` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans/{planId}/publish` | `POST` | `Train` | `publish` | `PlanAppService.publishPlan` | `TrainClassPlanMapper.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}/start` | `POST` | `Train` | `start` | `PlanAppService.startPlan` | `TrainClassPlanMapper.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}/complete` | `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.listCourses` | `TrainPlanCourseMapper.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.bindCourses` | `TrainPlanCourseMapper.insertTrainPlanCourse` | `insertTrainPlanCourse` | `train_plan_course` | `train_plan_course` | `train_plan_course` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans/{planId}/courses/{planCourseId}` | `DELETE` | `Train` | `unbind` | `PlanAppService.unbindCourse` | `TrainPlanCourseMapper.deleteTrainPlanCourseByPlanCourseId` | `deleteTrainPlanCourseByPlanCourseId` | `train_plan_course` | `train_plan_course` | `train_plan_course` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans/{planId}/enrollments` | `GET` | `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` | `TrainEnrollmentMapper.insertTrainEnrollment` | `insertTrainEnrollment` | `train_enrollment` | `train_enrollment` | `train_enrollment` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/plans/{planId}/enrollments/batch` | `POST` | `Train` | `batchEnroll` | `EnrollmentAppService.batchEnrollStudents` | `TrainEnrollmentMapper.insertTrainEnrollment` | `insertTrainEnrollment` | `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` | `PUT` | `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` | `TrainEnrollmentMapper.deleteTrainEnrollmentByEnrollmentId` | `deleteTrainEnrollmentByEnrollmentId` | `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` | `TrainLessonMapper.selectLessonItemsByPlanId` | `selectLessonItemsByPlanId` | `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/plans/{planId}/lessons` | `POST` | `Train` | `schedule` | `SchedulingAppService.scheduleLesson` | `TrainLessonMapper.insertTrainLesson` | `insertTrainLesson` | `train_lesson` | `train_lesson` | `train_lesson` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/lessons/{lessonId}` | `GET` | `Train` | `getInfo` | `SchedulingAppService.getLessonDetail` | `TrainLessonMapper.selectLessonItemById` | `selectLessonItemById` | `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/{lessonId}` | `PUT` | `Train` | `update` | `SchedulingAppService.updateLesson` | `TrainLessonMapper.updateTrainLesson` | `updateTrainLesson` | `train_lesson` | `train_lesson` | `train_lesson` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/lessons/{lessonId}` | `DELETE` | `Train` | `cancel` | `SchedulingAppService.cancelLesson` | `TrainLessonMapper.deleteTrainLessonByLessonId` | `deleteTrainLessonByLessonId` | `train_lesson` | `train_lesson` | `train_lesson` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/lessons/check-conflict` | `POST` | `Train` | `checkConflict` | `SchedulingAppService.checkConflict` | `TrainLessonMapper.countTeacherConflicts` | `countTeacherConflicts` | `train_lesson` | `train_lesson` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/lessons/scheduling-options` | `GET` | `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_plan` | `train_class_report` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/report/list` | `GET` | `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/list` | `GET` | `Train` | `list` | `ITrainStudentCheckinService.selectTrainStudentCheckinList` | `TrainStudentCheckinMapper.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.selectCheckinsByLessonId` | `selectCheckinsByLessonId` | `train_student_checkin` | `train_student_checkin, train_enrollment, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/attendance/sign-in` | `POST` | `Train` | `signIn` | `AttendanceAppService.signIn` | `TrainStudentCheckinMapper.insertTrainStudentCheckin` | `insertTrainStudentCheckin` | `train_student_checkin` | `train_student_checkin` | `train_student_checkin` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/attendance/sign-out` | `POST` | `Train` | `signOut` | `AttendanceAppService.signOut` | `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/attendance/proxy-checkin` | `POST` | `Train` | `signIn` | `AttendanceAppService.signIn` | `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/mark-absent` | `POST` | `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` | `PUT` | `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` | `TrainDormitoryInfoMapper.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` | `POST` | `Train` | `add` | `ITrainDormitoryInfoService.insertTrainDormitoryInfo` | `TrainDormitoryInfoMapper.insertTrainDormitoryInfo` | `insertTrainDormitoryInfo` | `train_dormitory_info` | `NONE` | `train_dormitory_info` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/dormitory` | `PUT` | `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}` | `DELETE` | `Train` | `remove` | `ITrainDormitoryInfoService.deleteTrainDormitoryInfoByDormIds` | `TrainDormitoryInfoMapper.deleteTrainDormitoryInfoByDormIds` | `deleteTrainDormitoryInfoByDormIds` | `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` | `TrainAccommodationMapper.selectTrainAccommodationList` | `selectTrainAccommodationList` | `train_accommodation` | `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_accommodation` | `train_accommodation, train_dormitory_info, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/accommodation/enrollment/{enrollmentId}` | `GET` | `Train` | `getByEnrollment` | `ITrainAccommodationService.selectTrainAccommodationByEnrollmentId` | `TrainAccommodationMapper.selectTrainAccommodationByEnrollmentId` | `selectTrainAccommodationByEnrollmentId` | `train_accommodation` | `train_accommodation, train_dormitory_info, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `DEFINED_IN_UI_API_ONLY` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/accommodation/enrollment/{enrollmentId}/history` | `GET` | `Train` | `getHistory` | `ITrainAccommodationService.selectAccommodationHistory` | `TrainAccommodationMapper.selectAccommodationHistory` | `selectAccommodationHistory` | `train_accommodation` | `train_accommodation, train_dormitory_info, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/accommodation` | `POST` | `Train` | `add` | `ITrainAccommodationService.insertTrainAccommodation` | `TrainAccommodationMapper.insertTrainAccommodation` | `insertTrainAccommodation` | `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}/checkin` | `POST` | `Train` | `checkin` | `ITrainAccommodationService.checkinAccommodation` | `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}/checkout` | `POST` | `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` | `transfer` | `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/{accommodationIds}` | `DELETE` | `Train` | `remove` | `ITrainAccommodationService.deleteTrainAccommodationByAccommodationIds` | `TrainAccommodationMapper.deleteTrainAccommodationByAccommodationIds` | `deleteTrainAccommodationByAccommodationIds` | `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` | `ITrainScoreInfoService.selectTrainScoreInfoList` | `TrainScoreInfoMapper.selectTrainScoreInfoList` | `selectTrainScoreInfoList` | `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}` | `GET` | `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` | `PUT` | `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}` | `DELETE` | `Train` | `remove` | `ITrainScoreInfoService.deleteTrainScoreInfoByScoreIds` | `TrainScoreInfoMapper.deleteTrainScoreInfoByScoreIds` | `deleteTrainScoreInfoByScoreIds` | `train_score_info` | `train_score_info` | `train_score_info` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/analysis/dashboard/overview` | `GET` | `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` | `VERIFIED_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` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/analysis/attendance/charts` | `GET` | `Train` | `getAttendanceCharts` | `ITrainAnalysisService.getAttendanceCharts` | `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` | `TrainAnalysisMapper.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` | `GET` | `Train` | `listAuth` | `ITrainDormAuthService.selectTrainDormAuthList` | `TrainDormAuthMapper.selectTrainDormAuthList` | `selectTrainDormAuthList` | `train_dorm_auth` | `train_dorm_auth, train_accommodation, train_student` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/access/operation/list` | `GET` | `Train` | `getOperationHistory` | `IExternalOperationService.listOperationsByDoorAuthId` | `TrainExternalOperationMapper.selectTrainExternalOperationList` | `selectTrainExternalOperationList` | `train_external_operation` | `train_external_operation` | `NONE` | `VERIFIED_FROM_SOURCE` | `VERIFIED_USED_BY_UI` | `ENDPOINT_DEFINED (BACKEND_IMPLEMENTED)` | | `/train/access/capability` | `GET` | `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` | `POST` | `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 (BLOCKED_EXTERNAL)` | | `/train/access/revoke` | `POST` | `Train` | `revokeAuth` | `AccessAuthorizationOrchestrator.revokeAuthorization` | `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 (BLOCKED_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` | `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/binding/students/bindable-users` | `GET` | `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` | `updateTrainStudent` | `train_student` | `sys_user, train_student` | `train_student` | `VERIFIED_FROM_SOURCE` | `NOT_FOUND_IN_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 重复记录) ### 2.2 数据库调用链追踪分布 (`LINEAGE_STATUS`) - **源码逐项验证通过 (`API_DB_LINEAGE_VERIFIED_COUNT`)**:**107 个** (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` 强断言)。 ### 2.3 前端调用状态分布 (`USED_BY_UI` 基于 `build_ui/` 扫描) - **`VERIFIED_USED_BY_UI`**:**92 项**(在 `build_ui/src/views/` 页面中实际被用户交互触发) - **`DEFINED_IN_UI_API_ONLY`**:**11 项**(在 `build_ui/src/api/` 中已封装接口,但页面视图暂未直接引用) - **`NOT_FOUND_IN_UI`**:**4 项**(纯管理端底层端点,前端未声明:教师/学员账号手工绑定与候选人过滤接口) ### 2.4 四类 API 边界范围确立 (API Scope Definition — 概念分离) 1. **`CUSTOM_TRAIN_BUSINESS_API` (RailwaySystem 自研培训业务端点)**:**107 个** - 涵盖开班、排课、学员、考勤、报到、住宿、成绩与画像全生命周期; 2. **`RUOYI_PLATFORM_API` (RuoYi 底座系统平台端点)**:**95 个** - 涵盖 `/login`、`/captchaImage`、`/system/user/*`、`/system/role/*`、`/system/menu/*`、`/system/dict/*`、`/monitor/*` 等通用平台能力; 3. **`CLIENT_PROVIDED_API` (甲方沈阳房建公寓段向项目交付的外部接口契约)**:**27 个** - 甲方正式提供的完整外部技术契约(详见 [05A-CLIENT-PROVIDED-API-CATALOG.md](05A-CLIENT-PROVIDED-API-CATALOG.md)),禁止再标记为 0 个; 4. **`DMS_VENDOR_API` (由第三方 DMS 物联网厂商托管运营的接口)**:**27 个** - 实际运行于厂商 IoT 云管平台,与甲方交付契约完全对齐; 5. **`MOCK_ONLY_INTERFACE` (纯本地模拟桩接口)**:**1 个** - 电子班牌硬件数据推送。 ### 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 成绩闭环对接); - **`UNKNOWN_TABLE_REFERENCES`**:**0 项**(无任何未识别或猜测表名引用) - **`API_DB_LINEAGE_FREEZE`**:**YES**