feat: 提交课表冲突检查相关功能模块
This commit is contained in:
+101
@@ -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;
|
||||
}
|
||||
+51
@@ -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;
|
||||
}
|
||||
+135
@@ -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;
|
||||
}
|
||||
+67
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user