7.5 KiB
7.5 KiB
RailwaySystem Service 聚合边界与模块责任划分
架构定位: 解决传统若依代码生成后业务逻辑严重泄漏在 Controller 层的痛点。 分层原则: Controller 仅负责参数接收与简单校验;所有跨表事务、业务不变量校验、状态机流转与外部系统适配编排全部收敛在 业务编排层 (Application Service)。底层保留轻量级的 基础领域持久化 Service (Domain / Mapper Service)。
1. Service 分层架构模型
flowchart TD
subgraph ControllerLayer["Web Controller 层"]
C1[TrainClassPlanController]
C2[TrainEnrollmentController]
C3[TrainLessonController]
C4[TrainAccommodationController]
C5[TrainAttendanceController]
C6[TrainScoreController]
end
subgraph ApplicationServiceLayer["业务编排层 (Application Service / 事务边界)"]
AS1[PlanAppService]
AS2[EnrollmentAppService]
AS3[SchedulingAppService]
AS4[AccommodationAppService]
AS5[ReportAppService]
AS6[AttendanceAppService]
AS7[ScoreAppService]
AS8[LearningAppService]
AS9[StatisticsAppService]
AS10[PortraitAppService]
AS11[ExternalIntegrationAppService]
end
subgraph DomainServiceLayer["基础持久化与数据访问层 (Domain / Mapper Service)"]
DS1[ITrainClassPlanService]
DS2[ITrainEnrollmentService]
DS3[ITrainLessonService]
DS4[ITrainAccommodationService]
DS5[ITrainCheckinService]
DS6[ITrainScoreItemService]
DS7[ITrainStudentScoreService]
DS8[ITrainDormitoryInfoService]
DS9[ITrainTeacherService]
DS10[ITrainStudentService]
end
subgraph ExternalAdapters["外部适配器层 (Mock First / 轻量异步)"]
EA1[FaceAttendanceAdapter]
EA2[DoorAccessAdapter]
EA3[ExternalLearningAdapter]
end
ControllerLayer --> ApplicationServiceLayer
ApplicationServiceLayer --> DomainServiceLayer
ApplicationServiceLayer --> ExternalAdapters
2. 核心业务编排 Service 职责规范
2.1 PlanAppService (培训计划生命周期编排)
- 核心职责: 开班计划的创建、编辑、状态流转、工作台聚合数据装配、结训归档。
- 关键方法:
PlanWorkbenchVO getPlanWorkbench(String planId): 跨表聚合本期课程、学员入班、排课、住宿、成绩配置概况。String createPlan(PlanCreateDTO dto): 校验起止时间与人数,初始化状态为未开始。void updatePlan(PlanUpdateDTO dto): 校验计划状态与已排课次时段边界。void completePlan(String planId, String operator): 结束培训计划,事务内将计划状态更新为 2 (已结束),批量将该班有效参训记录更新为 4 (已完成)。
2.2 EnrollmentAppService (参训人员全流程编排)
- 核心职责: 学员入班准入、查重、Excel批量名单解析、参训状态维护、退班清理。
- 关键方法:
Long addEnrollment(String planId, EnrollmentAddDTO dto): 校验防重复参训 (UNIQUE(plan_id, student_id)),创建参训档案。BatchImportResultVO batchImportEnrollments(String planId, MultipartFile file, boolean autoCreate): 解析 Excel 批量原子入班。void updateEnrollmentStatus(Long enrollmentId, Integer status, String reason): 维护请假、放弃状态。
2.3 SchedulingAppService (排课编排与冲突检测)
- 核心职责: 课次增删改、四维排课冲突检测引擎、完整课程表结构化装配。
- 关键方法:
LessonConflictVO checkConflict(LessonConflictCheckDTO dto): 四维排课冲突预检算法(教师、教室、场地、本班)。Long createLesson(String planId, LessonCreateDTO dto): 行锁保护下排课入库。void updateLesson(Long lessonId, LessonUpdateDTO dto): 排除自身后冲突校验;已有考勤记录阻断改期。PlanTimetableVO getPlanTimetable(String planId): 组装日历日程矩阵。
2.4 AccommodationAppService (住宿策略与分配编排)
- 核心职责: 批量住宿自动化预分配算法、单人调房、走读设置、房间入住看板聚合。
- 关键方法:
void preallocateAccommodations(String planId, AccommodationPreallocateDTO dto): 按“男女分开、同班同寝、相邻房间优先”批量预分配,行锁保护容量。void adjustAccommodation(Long enrollmentId, AccommodationAdjustDTO dto): 单人调房,校验目标房间容量与性别匹配。void setDayStudent(Long enrollmentId, boolean isDayStudent, String remark): 走读免宿设置,清退床位。
2.5 ReportAppService (学员报到业务编排)
- 核心职责: 报到身份确认、时效生命周期校验、联动信息(住宿、课表、首课)即时输出。
- 关键方法:
ReportResultVO confirmReport(Long enrollmentId, ReportConfirmDTO dto): 检查report_deadline生命周期策略(支持严格阻断、警告提示或管理员强制覆盖三种模式),写入报到记录并更新参训状态为 1 (已报到)。
2.6 AttendanceAppService (考勤事件与人工修正)
- 核心职责: 班牌签到/签退事件接入、业务不变量 1 校验、考勤状态判定、人工补签修正。
- 关键方法:
void recordSignIn(AttendanceSignInDTO dto): 强校验enrollment.plan_id == lesson.plan_course.plan_id,幂等记录签到。void recordSignOut(AttendanceSignOutDTO dto): 记录签退并核算本次出勤是否达标。void adjustAttendance(Long checkinId, AttendanceAdjustDTO dto): 人工修正考勤,manual_flag = 1留痕。
2.7 ScoreAppService (成绩项目权重与折算引擎)
- 核心职责: 成绩项权重总和 100% 校验、打分录入、满分上限校验、加权综合分实时计算。
- 关键方法:
void configureScoreItems(String planId, ScoreItemBatchConfigDTO dto): 强校验权重总和 100.0 及课程归属性。void recordScores(ScoreEntryBatchDTO dto): 强校验score <= fullScore及跨班不变量 2,批量入库。PlanScoreMatrixVO getPlanScoreMatrix(String planId): 动态计算每名学员的加权综合成绩weightedTotalScore,及格判定作为可选扩展。
2.8 LearningAppService (外部学习记录幂等接入)
- 核心职责: 接收 VR/3D 学习时长、防重去重、时间与时长有效性校验。
- 关键方法:
StudyEventResultVO receiveLearningRecord(StudyRecordReceiveDTO dto): 基于(source_system, source_event_id)幂等入库,返回 accepted / duplicate / invalid。
2.9 StatisticsAppService (多维实时统计聚合)
- 核心职责: 计划大屏综合统计、课程出勤横向对比、自主学习时长分布(一期不设统计中间表)。
2.10 PortraitAppService (学员画像计算)
- 核心职责: 基于考勤、理论、实操、学习时长生成简单画像指标集与标签集。
2.11 ExternalIntegrationAppService (外部系统防腐与适配编排)
- 核心职责: 统一隔离外部网络波动与设备协议差异;数据库事务提交成功后通过
afterCommit触发后续 Adapter 调用(一期默认建议:afterCommit→ 轻量异步执行器 → Adapter;若未引入异步执行器则为当前线程事务外调用 Adapter,两者皆保证外部调用失败不回滚本地已提交事务,保留待同步状态并支持手工重试),一期不引入 MQ / Outbox / 分布式事务【扩展】。