通过AI比对原操作文档,生成系统功能完善方案,根据方案进行增补,完善从学期新增到最终的排课功能

This commit is contained in:
2026-09-15 14:42:43 +08:00
parent 5187435285
commit e8a58b19fe
54 changed files with 4577 additions and 134 deletions
@@ -0,0 +1,77 @@
package com.roomroot.jwgl.vo.allocation;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 教学配当 - 单条课程任务的配当行(含铺学时结果)。
*
* <p>铺学时结果只是「粗约束建议」,不写实施课程表(SSKCB),见方案阶段 3「明确不做」。</p>
*/
@Data
public class AllocationTaskVO {
/** 任务编号 */
private String bh;
/** 课编号 */
private String kbh;
/** 课程名(简称优先,缺省取课名称) */
private String kcmc;
/** 课类型 */
private String klx;
/** 学时 */
private Integer xs;
/** 周课时 */
private Integer zks;
/** 配档序号(优选序数) */
private Integer pdxh;
/** 配档起始周 */
private Integer pdqsz;
/** 配档按周:0=连排(单科独进) 1=按周(非连排) */
private Integer pdaz;
/** 配档占正课时间 */
private Integer pdzzksj;
/** 配档编组 */
private Integer pdbz;
/** 教研室代号 */
private String jysdh;
/** 计算起始周(铺学时结果) */
private Integer startWeek;
/** 计算结束周(铺学时结果) */
private Integer endWeek;
/** 溢出学时(超出学期周数没铺完的部分) */
private Integer overflowHours;
/** 每周铺学时(weekNo -> 学时),仅含 &gt;0 的周 */
private List<WeekHours> distribution = new ArrayList<>();
@Data
public static class WeekHours {
private Integer week;
private Integer hours;
public WeekHours() {
}
public WeekHours(Integer week, Integer hours) {
this.week = week;
this.hours = hours;
}
}
}
@@ -0,0 +1,44 @@
package com.roomroot.jwgl.vo.allocation;
import lombok.Data;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
* 教学配当编辑器 - 打开视图。
*/
@Data
public class AllocationViewVO {
/** 班次学期编号 */
private String xydxqbh;
/** 学员队编号 */
private String xydbh;
/** 班次(学员队)名称 */
private String xydmc;
/** 学期代号(6 位) */
private Integer ndCode;
/** 学期起 */
private LocalDate kxrq;
/** 学期止 */
private LocalDate jsrq;
/** 总周数 */
private Integer totalWeeks;
/** 是否冻结(已发布/已结束的教学任务,只读) */
private Boolean frozen;
/** 周视图 */
private List<AllocationWeekVO> weeks = new ArrayList<>();
/** 任务配当行(已铺学时) */
private List<AllocationTaskVO> tasks = new ArrayList<>();
}
@@ -0,0 +1,31 @@
package com.roomroot.jwgl.vo.allocation;
import lombok.Data;
import java.time.LocalDate;
/**
* 教学配当 - 周视图行。
*
* <p>「每周可排正课」口径:该周内 可排课=1 且 正课=1 的时间格数 × 2 学时(双节次一格按 2 学时计)。
* 数据源优先级:班历(假期表)&gt; 校历(学期校历表)&gt; 默认值(周一~五 1-2/3-4/5-6 共 15 格 = 30 学时)。
* 班历已继承校历并允许人工补正课,故直接用班历即等价于「校历正课 − 不可排课 + 班历补正课」。</p>
*/
@Data
public class AllocationWeekVO {
/** 周次(从 1 起) */
private Integer weekNo;
/** 周起(周一) */
private LocalDate startDate;
/** 周止(周日) */
private LocalDate endDate;
/** 该周可排正课学时 */
private Integer availableHours;
/** 容量来源:class-班历 / school-校历 / default-默认 */
private String source;
}
@@ -34,7 +34,8 @@ public class SemesterInitVO {
private Boolean halfYear;
/**
* 默认/推断的学期第次
* 默认/推断的学期第次(学年内学期类别:1 春季 / 2 夏季 / 3 秋季;
* 不是「专业总第几学期」,人培/专业教学计划表的学期第次才是专业总学期口径)
*/
private Integer xqdc;
@@ -0,0 +1,98 @@
package com.roomroot.jwgl.vo.scheduling;
import lombok.Data;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
* 实施排课窗口视图(阶段 5.3):班次头 + 课程列表 + 周次×星期×节次 格子。
*/
@Data
public class SchedulingViewVO {
private String xydxqbh;
private String xydmc;
/** 班次专用教室编号 */
private String zyjsbh;
/** 6 位学期代号 */
private Integer ndCode;
private LocalDate kxrq;
private LocalDate jsrq;
private Integer totalWeeks;
/** 课程列表(已排满 full=true,前端标绿) */
private List<Course> courses = new ArrayList<>();
/** 时间区:按周切分,格子叠加校历/班历不可排与已排课次 */
private List<Week> weeks = new ArrayList<>();
@Data
public static class Course {
private String sskcbh;
private String kbh;
private String kcmc;
private String klx;
private Integer xs;
private Integer zks;
private String jybh;
private String jyxm;
private String jsbh;
private String jsmc;
/** 已排学时(每节 2 学时 + 节次调节) */
private Integer scheduledHours;
/** 是否已排满(scheduledHours >= xs) */
private Boolean full;
/** 当前用户是否可编辑该课程 */
private Boolean editable;
}
@Data
public static class Week {
private Integer weekNo;
private LocalDate startDate;
private LocalDate endDate;
private List<Day> days = new ArrayList<>();
}
@Data
public static class Day {
private LocalDate date;
private Integer weekday;
/** 该日不可排原因(校历整日/班历整日,节次级见格子) */
private String unavailableReason;
private List<Cell> cells = new ArrayList<>();
}
@Data
public static class Cell {
private Integer jc;
/** 硬冲突:不可排课 */
private Boolean unavailable;
/** 硬冲突原因(不可排课来源:校历/班历等) */
private String reason;
/** 软提示(非正课 / 配当周次不符) */
private String warning;
private List<Lesson> lessons = new ArrayList<>();
}
@Data
public static class Lesson {
private String bh;
private String sskcbh;
private String kcmc;
private String jxnr;
private String jxff;
private Integer jcdj;
private String jyxm;
private String jsmc;
private String ycxx;
}
}
@@ -0,0 +1,79 @@
package com.roomroot.jwgl.vo.taskbook;
import lombok.Data;
/**
* 教研室任务书填报列表行(阶段 4)。
*
* <p>一行 = 一条课程任务(学员队任务表)。列表排序:课程 → 责任教员 → 课次;
* 返回 合班分组号(bz2,0=未合班)供前端同色连显。</p>
*/
@Data
public class TaskBookRowVO {
/** 课程任务编号(学员队任务表.编号) */
private String bh;
/** 学员队学期编号 */
private String xydxqbh;
/** 课编号(科目) */
private String kbh;
/** 课程名称(简称优先,缺省取课表课名称) */
private String kcmc;
/** 课类型 */
private String klx;
/** 学时 */
private Integer xs;
/** 周课时 */
private Integer zks;
/** 成绩分制 */
private String cjfz;
/** 学员队编号 */
private String xydbh;
/** 学员队名称 */
private String xydmc;
/** 责任教员编号 */
private String jybh;
/** 责任教员姓名 */
private String jyxm;
/** 场地(教室编号) */
private String jsbh;
/** 场地名称 */
private String jsmc;
/** 课次序号 */
private Integer kcxh;
/** 合班分组号(0=未合班) */
private Integer bz2;
/** 教研室代号 */
private String jysdh;
/** 教研室名称 */
private String jysmc;
/** 教研室计划教员编号 */
private String jysjhjybh;
/** 教研室计划教员姓名 */
private String jysjhjyxm;
/** 排课建议(教研室计划备注) */
private String jysjhbz;
/** 是否只读(教学任务未发布或已结束) */
private Boolean frozen;
}
@@ -132,4 +132,10 @@ public class TimetableConflictDetailVO {
* 统一从学员队表的「所属单位」列取值(WM_CONCAT 去重)。
*/
private String responsibleDept;
/**
* 冲突等级(阶段 5.1):hard-硬冲突(双占 / 三类历不可排,深红);soft-软提示(橙)。
* 本检查器的维度全部为硬冲突;软提示(配当周次不符、非正课)由排课窗实时计算。
*/
private String level;
}