feat: 提交课表冲突检查相关功能模块

This commit is contained in:
dengxiaoyue
2026-08-21 14:39:03 +08:00
parent 179b12e3bf
commit f190c29e05
857 changed files with 10838 additions and 5 deletions
@@ -0,0 +1,101 @@
package com.roomroot.jwgl.vo.courserunning;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 分组教学任务列表展示 VO。
* <p>
* 对应"分组教学任务"页面表格展示的所有字段,
* 通过多表关联查询(教学任务 + 学员队 + 课表 + 教材 + 教员 + 教室 + 实施课程)聚合展示。
* </p>
*
* @author management
*/
@Data
public class GroupTeachingTaskVO {
/**
* 序号,前端展示用的行号。
*/
private Integer xh;
/**
* 课程名称,关联课表的"课名称"。
*/
private String kcmc;
/**
* 教材名称,关联教材信息表的"名称"。
*/
private String jcmc;
/**
* 实施教员姓名,关联教员表的"教员姓名"。
*/
private String jyxm;
/**
* 教学场地(教室名称),关联教室表的"教室名称"。
*/
private String jsmc;
/**
* 可选队别班次名称(学员队名称),多个班次用分号分隔。
* 例:"2025级计算机1班;2025级计算机2班"。
*/
private String xydmc;
/**
* 计划学时,来自实施_课程表的"学时"字段。
*/
private Integer jhxs;
/**
* 运行学时,来自实施_课程表的"运行学时"字段。
*/
private Integer yxxs;
/**
* 学分,来自实施_课程表的"学分"字段。
*/
private Float xf;
/**
* 开课日期,班次的开始教学日期。
*/
private LocalDateTime kkrq;
/**
* 结课日期,班次的结束教学日期。
*/
private LocalDateTime jkrq;
/**
* 报名日期,学员报名截止日期。
*/
private LocalDateTime bmrq;
/**
* 计划人数,来自学员队表的"学员队人数"。
*/
private Integer jhrs;
/**
* 要求说明,来自学员队拼班信息的"要求说明"。
*/
private String yqsm;
// ====== 查询条件字段(仅用于筛选,不回显) ======
/**
* 年度(查询条件)。
*/
private Integer nd;
/**
* 任务状态(查询条件)。
*/
private String zt;
}
@@ -0,0 +1,51 @@
package com.roomroot.jwgl.vo.timetableconflict;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 单张"冲突检查卡片"结果 VO。
* <p>
* 对应页面上方 6 个检查卡片,每个卡片有:标题、描述、检查状态、冲突数量、维度编码。
* 前端根据 conflictCount 的值展示为"0(绿色通过)/ >0(红色警告)"。
* </p>
*
* @author management
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimetableConflictCardVO {
/**
* 冲突维度编码(见 {@link com.roomroot.jwgl.unit.conflict.TimetableConflictDimension})。
* 例:TEAM_CONFLICT、TEACHER_CONFLICT。
*/
private String dimensionCode;
/**
* 卡片标题。例:"教学班时间冲突检查"。
*/
private String title;
/**
* 卡片描述。例:"同一教学班次在同一时间段被安排多门课程"。
*/
private String description;
/**
* 是否已执行检查。
* true = 已检查(页面去掉"未检查"标签,显示冲突数)
* false = 未检查(页面显示灰色"未检查"标签,冲突数视为 0)
*/
private boolean checked;
/**
* 检测出的冲突总数(= 冲突明细列表的总行数,非聚合数)。
* 例:同一班次在 3 个日期节次有冲突 → conflictCount = 3。
*/
private int conflictCount;
}
@@ -0,0 +1,135 @@
package com.roomroot.jwgl.vo.timetableconflict;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 单条冲突明细 VO。
* <p>
* 对应页面下方"冲突明细"表格的每一行数据。
* 所有维度的冲突统一用此结构返回,前端根据 dimensionCode 做颜色区分或图标区分。
* </p>
*
* @author management
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimetableConflictDetailVO {
/**
* 冲突维度编码(见枚举 TimetableConflictDimension#code)。
* 例:TEACHER_CONFLICT → 前端用红色标签标注"教员冲突"。
*/
private String dimensionCode;
/**
* 冲突维度标题(中文)。例:"教员时间冲突"。
*/
private String dimensionTitle;
// ==================== 发生冲突的资源 ====================
/**
* 发生冲突的资源编号。
* 根据维度不同,含义不同:
* TEAM_CONFLICT → 教学班次(学员队)编号
* ELECTIVE_REQUIRED_CONFLICT → 教学班次(学员队)编号
* TEACHER_CONFLICT → 教员编号
* CLASSROOM_CONFLICT → 教室编号
* GUARANTEE_CONFLICT → 保障项目编号
* EVENT_CONFLICT → 活动事件编号
*/
private String resourceId;
/**
* 发生冲突的资源中文名(直接展示给用户,无需再次翻译)。
* 例:"张教授"、"101多媒体教室"、"2025级计算机1班"。
*/
private String resourceName;
// ==================== 冲突的日期节次 ====================
/**
* 发生冲突的日期。
* 例:2026-09-10。
*/
private LocalDateTime rq;
/**
* 发生冲突的节次。
* 例:3(表示当日第 3 节有冲突)。
*/
private Integer jc;
// ==================== 冲突涉及的课次/课程信息 ====================
/**
* 同一"资源+日期节次"上发生冲突的课次数量。
* 一般 >= 2(1 个资源同一时间被安排多门课)。
* 用于明细列"占用课次数"展示。
*/
private Integer occupiedLessonCount;
/**
* 冲突涉及的课程名称列表,用";"分隔。
* 例:"高等数学;大学英语"。
*/
private String courseNames;
/**
* 冲突涉及的课次编号列表,用","分隔。
* 对应表【实施_课程表 SSKCB】的主键 编号。
* 用于前端做"点击跳转到具体课次详情"的超链接。
*/
private String conflictSskcbBhs;
// ==================== 备注 ====================
/**
* 冲突原因的中文描述。
* 例:"教学班次【2025级计算机1班】在 2026-09-10 第3节同时被安排《高等数学》和《大学英语》两门课程"。
* 用于"查看详情"弹窗,或表格的备注列。
*/
private String reason;
// ==================== UI 明细表格新增业务字段(对应截图8列:冲突号/班次/教员/场地/责任单位)====================
/**
* 冲突组唯一编号(格式:日期_节次_资源编号,例:20260821_03_XYD001)。
* 由内层聚合出的"日期+节次+资源号"在外层直接拼接,便于前端定位和排查。
*/
private String conflictNo;
/**
* 班次名称(学员队名称)。
* 该冲突涉及的所有教学班次/学员队,多值用 WM_CONCAT(DISTINCT ...) 去重拼接,展示给用户。
* 例:"2025级计算机1班;2025级计算机2班"。
*/
private String xydNames;
/**
* 教员姓名。
* 该冲突涉及的所有主讲/辅讲教员,多个时拼接;可带【主】/【辅】前缀便于区分角色。
* 例:"【主】张教授;【辅】李助教"。
*/
private String teacherNames;
/**
* 场地/教室名称。
* 该冲突涉及的所有教学场地(教室)名称,多值去重拼接。
* 例:"1号教学楼101多媒体教室;2号教学楼实验机房"。
*/
private String classroomNames;
/**
* 责任单位(班次的所属单位 / 教研室名称)。
* 统一从学员队表的「所属单位」列取值(WM_CONCAT 去重)。
*/
private String responsibleDept;
}
@@ -0,0 +1,67 @@
package com.roomroot.jwgl.vo.timetableconflict;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 课表冲突检查 —— 全维度汇总结果 VO。
* <p>
* 对应页面"执行全部检查"按钮:返回 6 张卡片的检查结果数组。
* 页面初次加载时也返回此对象(所有卡片的 checked=false),供前端渲染卡片布局。
* </p>
*
* @author management
*/
@Data
public class TimetableConflictSummaryVO {
/**
* 当前检查所属年度(学期)。
* 例:2026(对应页面顶部 2026年秋季学期)。
*/
private Integer nd;
/**
* 6 张(当前已启用 4 张)冲突检查卡片的结果列表。
* 列表顺序与 UI 卡片顺序保持一致:
* 1.教学班时间冲突 → 2.必修选修冲突 → 3.教员时间冲突 → 4.教室时间冲突 → 5.保障 → 6.活动事件
*/
private List<TimetableConflictCardVO> cards;
/**
* 全部冲突总数(= 所有卡片 conflictCount 之和)。
* 用于页面顶部快速展示"本学期共有多少条冲突待处理"。
*/
private int totalConflictCount;
/**
* 是否已完成完整的全量检查(即所有卡片都执行过一次)。
* true 表示用户至少点过一次"执行全部检查"
* false 表示还未全部检查(可能只单独检查过部分卡片)
*/
private boolean fullyChecked;
public TimetableConflictSummaryVO() {
this.cards = new ArrayList<>();
this.totalConflictCount = 0;
this.fullyChecked = false;
}
/**
* 重计算总冲突数。每次单卡片检查结果更新后,上层汇总时调用此方法。
*/
public void recalculateTotal() {
int total = 0;
boolean all = !cards.isEmpty();
for (TimetableConflictCardVO c : cards) {
total += c.getConflictCount();
if (!c.isChecked()) {
all = false;
}
}
this.totalConflictCount = total;
this.fullyChecked = all;
}
}