diff --git a/3.教学实施计划编排系统操作手册.pdf b/3.教学实施计划编排系统操作手册.pdf new file mode 100755 index 000000000..d60ec43e7 Binary files /dev/null and b/3.教学实施计划编排系统操作手册.pdf differ diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/KCBController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/KCBController.java index 82328f135..dd0f2febf 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/KCBController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/KCBController.java @@ -1,17 +1,24 @@ package com.roomroot.web.controller.jwgl; +import com.roomroot.jwgl.dto.kcb.TimetableGridQuery; import com.roomroot.jwgl.dto.kcb.TimetableQuery; import com.roomroot.jwgl.entity.KCB; import com.roomroot.jwgl.service.KCBService; +import com.roomroot.jwgl.service.TimetableGridService; import com.roomroot.jwgl.unit.PageQuery; import com.roomroot.jwgl.unit.PageResult; import com.roomroot.jwgl.unit.Result; import com.roomroot.jwgl.vo.kcb.ClassTimetableVO; import com.roomroot.jwgl.vo.kcb.DailyWeeklyTimetableRangeVO; +import com.roomroot.jwgl.vo.kcb.TimetableGridVO; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; +import java.nio.charset.StandardCharsets; import java.util.List; /** @@ -24,6 +31,9 @@ public class KCBController { @Resource private KCBService kcbService; + @Resource + private TimetableGridService timetableGridService; + /** * 新增 */ @@ -133,4 +143,27 @@ public class KCBController { public void exportClassCourses(TimetableQuery cond, HttpServletResponse response) { kcbService.exportClassCourses(cond, response); } + + /** + * 周次横版课表网格(手册一第12章)。 + *
dim=semester|team|teacher|room,id 为对应编号;可传 mbbh 套用课表模板。
+ */ + @GetMapping("/grid") + public Resultdim 维度:semester 班次学期 / team 学员队 / teacher 教员 / room 教室。 + * id 为对应维度主键(xydxqbh / xydbh / jybh / jsbh)。
+ */ +@Data +public class TimetableGridQuery { + + /** 维度:semester | team | teacher | room */ + private String dim; + + /** 维度目标编号 */ + private String id; + + /** 年度(校历/备注取数用;semester 维度自动从班次学期带出) */ + private Integer nd; + + /** 起始日期 yyyy-MM-dd;空时 semester 取学期范围,其它维度取本周 */ + private String start; + + /** 结束日期 yyyy-MM-dd */ + private String end; + + /** 课表模板编号(可选;套用模板显示开关:78节/晚上/夜间/选修/天数) */ + private String mbbh; +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ClassPeriodService.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ClassPeriodService.java index e5cf0e342..f49f34505 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ClassPeriodService.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ClassPeriodService.java @@ -1,5 +1,7 @@ package com.roomroot.jwgl.service; +import com.roomroot.jwgl.entity.JCSJB; + import java.util.List; import java.util.Set; @@ -18,4 +20,10 @@ public interface ClassPeriodService { * 上午时段的双节次标签,用于「正课」默认判定。 */ Set按 班次学期/学员队/教员/教室 四个维度生成「周次 × 星期 × 节次」横版网格。
+ */ +public interface TimetableGridService { + + /** + * 生成课表网格数据。 + */ + TimetableGridVO grid(TimetableGridQuery query); + + /** + * 导出网格课表为矩阵 Excel(每周一个 sheet)。 + */ + byte[] exportGrid(TimetableGridQuery query); +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ClassPeriodServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ClassPeriodServiceImpl.java index 8d7be1f65..d2cb1c0a5 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ClassPeriodServiceImpl.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ClassPeriodServiceImpl.java @@ -51,6 +51,14 @@ public class ClassPeriodServiceImpl implements ClassPeriodService { return main.isEmpty() ? DEFAULT_MAIN_SLOTS : main; } + @Override + public List课次一律从 实施_课程表(SSKCB) 按日期范围取;维度过滤经三张关联子表 + * (学员队 / 教室 / 辅助教员)在内存归并,避免 N+1 与达梦 GUID 双形态问题。
+ */ +@Service +public class TimetableGridServiceImpl implements TimetableGridService { + + private static final DateTimeFormatter DAY = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter COMPACT = DateTimeFormatter.ofPattern("yyyyMMdd"); + private static final String[] WEEKDAY_NAMES = {"", "一", "二", "三", "四", "五", "六", "日"}; + + @Resource + private SSKCBMapper sskcbMapper; + @Resource + private SSKCBXYDMapper sskcbxydMapper; + @Resource + private SSKCBJSMapper sskcbjsMapper; + @Resource + private SSKCBFZJYMapper sskcbfzjyMapper; + @Resource + private SSKCMapper sskcMapper; + @Resource + private KBMapper kbMapper; + @Resource + private XYDBMapper xydbMapper; + @Resource + private JYBMapper jybMapper; + @Resource + private ClassRoomMapper classRoomMapper; + @Resource + private ClassSemesterMapper classSemesterMapper; + @Resource + private SemesterCalendarMapper semesterCalendarMapper; + @Resource + private JQBMapper jqbMapper; + @Resource + private KCBMBBMapper kcbmbbMapper; + @Resource + private ClassPeriodService classPeriodService; + + @Override + public TimetableGridVO grid(TimetableGridQuery query) { + if (query == null || query.getDim() == null || query.getId() == null || query.getId().isEmpty()) { + throw new BusinessException("课表网格需要维度(dim)与目标编号(id)"); + } + + // ---- 维度目标与日期范围 ---- + String dim = query.getDim(); + String targetName = query.getId(); + String teamFilter = null; // 学员队编号(semester/team 维度) + String teacherFilter = null; + String roomFilter = null; + String semesterBh = null; // 班历取数用(semester 维度) + LocalDate start = parseDay(query.getStart()); + LocalDate end = parseDay(query.getEnd()); + Integer nd = query.getNd(); + + switch (dim) { + case "semester": { + XYDNDXQJBXXB sem = classSemesterMapper.selectById(query.getId()); + if (sem == null) { + throw new BusinessException("班次学期不存在:" + query.getId()); + } + semesterBh = sem.getBh(); + teamFilter = sem.getXydbh(); + nd = sem.getNd(); + if (start == null) start = sem.getKxrq(); + if (end == null) end = sem.getJsrq(); + String xydmc = resolveTeamName(teamFilter); + targetName = xydmc + "(" + sem.getNd() + "年度 第" + sem.getXqdc() + "学期)"; + break; + } + case "team": { + XYDB team = xydbMapper.selectOne(new LambdaQueryWrapperweeks 按周纵向排列;每周内 行=节次、列=星期一~日; + * 晚上/夜间/周末且「备注显示」的历表事件进 remarks,不占格子。
+ */ +@Data +public class TimetableGridVO { + + /** 维度 */ + private String dim; + + /** 维度目标显示名(标题用) */ + private String targetName; + + /** 年度 */ + private Integer nd; + + private String startDate; + private String endDate; + + /** 节次行定义(升序) */ + private List| 节次 | +
+ 星期{{ weekdayName(d.weekday) }}
+ {{ d.date }}
+ {{ d.blockReason }}
+ |
+
|---|---|
|
+ {{ p.mc }}
+ {{ p.kssj }}-{{ p.jssj }}
+ {{ p.sd }}
+ |
+
+
+
+ {{ cell.kcjc || cell.kcmc }}
+ {{ cell.jyxm }}
+ {{ cell.jsmc }}
+ {{ cell.xydmc }}
+ |
+