Files
railwaysystem/docs/api-v2/03_module_b_plan_enrollment_schedule_api.md
T

11 KiB
Raw Blame History

Module B:开班计划与排课(核心业务模块)API 契约

模块定位: 智慧培训业务核心流转引擎,贯穿“立项建班 → 课程配置 → 名单确定 → 课次编排与冲突检测 → 课程表生成 → 学员报到”。 设计原则: 禁止退化为 5 张表的独立 CRUD,全面以“开班计划聚合工作台”与“业务 Command”为主线。 优先级统计: 共 24 个 API (P0: 17个, P1: 6个, P2: 1个)。


1. 培训计划与聚合工作台 (ClassPlan & Workbench)

1.1 分页查询培训计划列表 【P0】【确认】

  • 业务目的: 管理员分页检索开班班次,支持按状态、开班时间范围筛选。
  • HTTP Method: GET
  • Path: /train/plans
  • Permission: train:plan:list
  • Request (Query): pageNum, pageSize, planName, planStatus, startTimeBegin, startTimeEnd
  • Response (TableDataInfo): 返回包含计划基本信息、课程门数、实际参训人数的概览卡片数据。

1.2 创建培训计划 (UC-01) 【P0】【确认】

  • 业务目的: 立项创建新的培训班,明确培训起止时间、计划人数与报到截止规则。
  • HTTP Method: POST
  • Path: /train/plans
  • Permission: train:plan:add
  • Request (PlanCreateDTO):
    {
      "planName": "沈阳局2026年第1期高速铁路信号检修专项培训班",
      "startTime": "2026-10-10 08:30:00",
      "endTime": "2026-10-24 17:30:00",
      "trainAddress": "沈阳培训基地第3教学楼",
      "recruitNum": 40,
      "applyCondition": "各电务段在岗信号工,具备2年以上工作经验",
      "reportDeadline": "2026-10-09 18:00:00",
      "remark": "全脱产封闭培训"
    }
    
  • 核心校验:
    • startTime < endTime 起止时间有效性;
    • reportDeadline <= startTime 报到截止时间不得晚于开班时间;
    • recruitNum > 0;
    • 初始 plan_status 强制设为 0 (未开始)。
  • 错误码: PLAN_TIME_INVALID (40010), PLAN_NAME_DUPLICATED (40011)

1.3 获取培训计划基本信息 【P0】【确认】

  • HTTP Method: GET
  • Path: /train/plans/{planId}
  • Permission: train:plan:query

1.4 编辑培训计划 (UC-02) 【P0】【确认】

  • HTTP Method: PUT
  • Path: /train/plans/{planId}
  • Permission: train:plan:edit
  • Request (PlanUpdateDTO): 包含名称、地址、人数、报到截止时间、备注。已结训计划不可修改。

1.5 结束培训计划 (UC-29) 【P0】【确认】

  • 业务目的: 标志本期培训结束,将计划状态置为“已结束”,参训学员状态批量归档为“已完成”,历史签到、学习、成绩锁定留存。
  • HTTP Method: POST
  • Path: /train/plans/{planId}/complete
  • Permission: train:plan:complete
  • 事务边界: 强事务。更新 train_class_plan.plan_status = 2,更新该班所有未退学学员的 train_enrollment.enrollment_status = 4 (已完成) 及 complete_time = NOW()。

1.6 获取培训计划综合工作台 (PlanWorkbenchVO) 【P0】【确认】

  • 业务目的: 核心枢纽接口!管理员打开某个计划时调用,一次性获取计划生命周期阶段看板与各维度指标摘要,作为后续操作决策入口。
  • HTTP Method: GET
  • Path: /train/plans/{planId}/workbench
  • Permission: train:plan:query
  • Response (AjaxResult): 聚合返回开班基础信息、课程概览、参训人数统计、排课状态概览、住宿需求与预分配统计、成绩配置概览及下一步操作引导文本。

2. 本期课程配置 (Plan Course)

2.1 查询本期已配置课程列表 【P0】【确认】

  • HTTP Method: GET
  • Path: /train/plans/{planId}/courses
  • Permission: train:plan:query

2.2 配置本期课程 (UC-03) 【P0】【确认】

  • 业务目的: 引入课程库中的一门或多门公共课程作为本期培训内容。
  • HTTP Method: POST
  • Path: /train/plans/{planId}/courses
  • Permission: train:plan:edit
  • Request (PlanCourseAddDTO): {"cIds": ["C001", "C002"], "remark": "专业必修"}
  • 核心校验: 基于 UNIQUE(plan_id, c_id) 防重复添加。

2.3 移除本期课程 【P1】【确认】

  • HTTP Method: DELETE
  • Path: /train/plans/{planId}/courses/{planCourseId}
  • Permission: train:plan:edit
  • 核心校验: 若该课程已排定课次 (train_lesson) 或已关联成绩项目 (train_score_item),严禁删除。

3. 参训人员管理 (Enrollment)

3.1 查看本期参训名单 (UC-06) 【P0】【确认】

  • HTTP Method: GET
  • Path: /train/plans/{planId}/enrollments
  • Permission: train:enrollment:list
  • Request (Query): pageNum, pageSize, studentName, enrollmentStatus, accommodationRequired

3.2 添加单名参训人员 (UC-04) 【P0】【确认】

  • 业务目的: 管理员从已有学员库中选择某位学员加入本班。
  • HTTP Method: POST
  • Path: /train/plans/{planId}/enrollments
  • Permission: train:enrollment:add
  • Request (EnrollmentAddDTO): {"studentId": "S2026001", "sourceType": 1, "accommodationRequired": 1}
  • 核心校验: 防重复参训 (UNIQUE(plan_id, student_id));人数上限告警。

3.3 Excel批量导入参训人员 (UC-05) 【P0】【确认】

  • 业务目的: 基地通过各站段汇总上报的名单 Excel 一次性批量导入本班学员。
  • HTTP Method: POST
  • Path: /train/plans/{planId}/enrollments/batch
  • Permission: train:enrollment:import
  • Request (Multipart): Excel 文件 (file),参数 autoCreateStudent=true。
  • 事务边界: 批量事务入库。

3.4 获取参训档案详情 【P0】【确认】

  • HTTP Method: GET
  • Path: /train/enrollments/{enrollmentId}
  • Permission: train:enrollment:query
  • Response (AjaxResult): 聚合返回参训状态、脱敏身份证、宿舍分配、报到记录、门禁授权状态。

3.5 变更参训状态 【P1】【确认】

  • HTTP Method: PUT
  • Path: /train/enrollments/{enrollmentId}/status
  • Permission: train:enrollment:edit
  • Request (JSON): {"enrollmentStatus": 2, "remark": "因公请假"} (2 请假,3 放弃)

3.6 移除参训人员 【P1】【确认】

  • HTTP Method: DELETE
  • Path: /train/enrollments/{enrollmentId}
  • Permission: train:enrollment:remove
  • 核心校验: 若学员已产生考勤或成绩记录,禁止物理删除,提示转为放弃状态。

4. 课次编排与冲突检查 (Lesson & Timetable)

4.1 新增课次 (UC-07) 【P0】【确认】

  • 业务目的: 排定一次具体的教学活动,指定课程、授课教师、上课时间段及教室或实训场地。
  • HTTP Method: POST
  • Path: /train/plans/{planId}/lessons
  • Permission: train:lesson:add
  • Request (LessonCreateDTO): planCourseId, tId, startTime, endTime, venueType, classRoomId, siteId, remark
  • 核心校验: 课次时间落在计划起止时间内;场地二选一;行锁保护下的教师/教室/场地/本班四维排课冲突检查。
  • 错误码: LESSON_TEACHER_CONFLICT (40040), LESSON_CLASSROOM_CONFLICT (40041), LESSON_SITE_CONFLICT (40042), LESSON_PLAN_OVERLAP (40043)

4.2 修改课次 (UC-08) 【P0】【确认】

  • HTTP Method: PUT
  • Path: /train/lessons/{lessonId}
  • Permission: train:lesson:edit
  • 核心校验: 排除自身后重新进行冲突检查;已有考勤记录时禁止修改时段。

4.3 删除课次 (UC-09) 【P1】【确认】

  • HTTP Method: DELETE
  • Path: /train/lessons/{lessonId}
  • Permission: train:lesson:remove
  • 核心校验: 已有打卡考勤记录时严禁删除。

4.4 排课冲突检查接口 (UC-10) 【P0】【确认】

  • 业务目的: 管理员在排课弹窗中选择好教师、场地、时间后,前端失焦实时调用该接口进行冲突预检,无需真正入库,返回友好的冲突原因与冲突课次列表。
  • HTTP Method: POST
  • Path: /train/lessons/check-conflict
  • Permission: train:lesson:query
  • Response (AjaxResult): 返回是否存在冲突、冲突类型、冲突详细信息及冲突课次列表。

4.5 获取计划完整课表 (UC-11) 【P0】【确认】

  • 业务目的: 按时间轴返回本期培训的所有课次集合,供工作台日历视图展示与打印。
  • HTTP Method: GET
  • Path: /train/plans/{planId}/timetable
  • Permission: train:plan:query
  • Response (AjaxResult)

4.6 获取教师个人课表 【P1】【确认】

  • HTTP Method: GET
  • Path: /train/teacher/{tId}/timetable
  • Permission: train:teacher:query

5. 学员报到 (Class Report)

5.1 学员报到确认 (UC-15) 【P0】【确认】

  • 业务目的: 学员到达基地后,通过刷身份证、人脸识别或管理员人工核验完成到班报到。完成报到后,立即向学员展示其宿舍安排、课程表与首课教室场地。
  • HTTP Method: POST
  • Path: /train/enrollments/{enrollmentId}/report
  • Permission: train:report:confirm
  • Request (ReportConfirmDTO):
    {
      "reportWay": 1,
      "reportDeviceSn": "FACE-PAD-EAST-01",
      "verifyNote": "身份证核验通过",
      "forceOverride": false
    }
    
  • 生命周期策略 (Report Lifecycle Policy):
    • 【确认】:report_deadline 配置在 train_class_plan 上;报到时必须读取并检查该截止时间;
    • 【默认/建议方案(待现场确认)】:若当前时间晚于 report_deadline,当 forceOverride=false 时返回警告(REPORT_DEADLINE_WARNING),提示管理员确认;若 forceOverride=true 或系统策略为宽松模式,则允许完成报到,并在报到流水中标记 is_overdue = true;
    • 兼容现场确认可能收敛为三种模式:严格阻断 (BLOCK)、提示警告 (WARNING) 或管理员强制覆盖 (ADMIN_OVERRIDE)。
  • Response (AjaxResult):
    {
      "code": 200,
      "msg": "报到成功!",
      "data": {
        "enrollmentId": 1001,
        "studentName": "张三",
        "reportTime": "2026-10-09 14:20:00",
        "isOverdue": false,
        "policyAction": "NORMAL",
        "dormitory": {
          "building": "南区2号宿舍楼",
          "room": "305室",
          "bedNo": "1号床"
        },
        "nextLesson": {
          "courseName": "信号基础理论",
          "startTime": "2026-10-10 09:00:00",
          "location": "CR101教室"
        }
      }
    }
    
  • 错误码: REPORT_ALREADY_CONFIRMED (40050), REPORT_DEADLINE_WARNING (40051)

5.2 查询计划报到流水列表 【P1】【确认】

  • HTTP Method: GET
  • Path: /train/plans/{planId}/reports
  • Permission: train:report:list

5.3 学员端获取个人当前培训信息 【P2】【待现场确认】

  • 业务目的: 学员登录后通过手机端或平板查看本人所在培训班、报到状态、宿舍及课表。
  • HTTP Method: GET
  • Path: /train/student/my-training
  • Permission: 登录学员默认可见本人信息。
  • 分级理由: 依赖学员端专用界面的排期建设,不作为一期基地管理端闭环的 P0 阻塞项,标记为 P2。