From f3ae9fb2fdb687f0bba0404fcfa768b026bbf865 Mon Sep 17 00:00:00 2001 From: liweijie Date: Fri, 18 Sep 2026 10:38:39 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=A0=A1=E5=8E=86=E7=9A=8478?= =?UTF-8?q?=E3=80=81=E6=99=9A=E4=B8=8A=E3=80=81=E5=A4=9C=E9=97=B4=E7=AD=89?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E8=90=BD=E5=BA=93=EF=BC=8C=202=E3=80=81?= =?UTF-8?q?=E9=85=8D=E5=BD=93=E3=80=81=E4=BB=BB=E5=8A=A1=E4=B9=A6=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E3=80=81=E6=8E=92=E8=AF=BE=E7=AA=97=E5=AE=8C=E5=96=84?= =?UTF-8?q?=EF=BC=9B=203=E3=80=81=E4=BB=BB=E5=8A=A1=E4=B9=A6=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=8F=91=E5=B8=83=E3=80=81=E5=88=A0=E9=99=A4=E7=AD=89?= =?UTF-8?q?=EF=BC=9B=204=E3=80=81=E7=8F=AD=E5=8E=86=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=A0=A1=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwgl/ClassEventCalendarController.java | 8 +- .../web/controller/jwgl/KCBController.java | 22 ++ .../controller/jwgl/MyBusinessController.java | 109 ++++++ .../jwgl/SchedulingWindowController.java | 29 ++ .../jwgl/SystemSettingsController.java | 50 +++ .../jwgl/TaskBookFillController.java | 50 ++- .../jwgl/TeachingAllocationController.java | 11 + .../jwgl/TeachingTaskController.java | 12 +- .../roomroot/jwgl/dto/kcb/TimetableQuery.java | 17 + .../dto/scheduling/SchedulingMoveRequest.java | 20 ++ .../taskbook/TaskBookBatchFillRequest.java | 30 ++ .../taskbook/TaskBookBatchRoomRequest.java | 21 ++ .../taskbook/TaskBookBatchTeacherRequest.java | 26 ++ .../dto/taskbook/TaskBookFillRequest.java | 3 + .../jwgl/mapper/KcbTimetableMapper.xml | 82 +++++ .../jwgl/mapper/TeachingTaskMapper.xml | 2 + .../service/ClassEventCalendarService.java | 5 +- .../jwgl/service/ClassPeriodService.java | 6 + .../com/roomroot/jwgl/service/KCBService.java | 7 + .../jwgl/service/MyBusinessService.java | 54 +++ .../jwgl/service/SchedulingWindowService.java | 12 + .../jwgl/service/SystemSettingsService.java | 22 ++ .../jwgl/service/TaskBookFillService.java | 47 ++- .../service/TeachingAllocationService.java | 9 + .../jwgl/service/TeachingTaskService.java | 10 +- .../jwgl/service/TimetableGridService.java | 7 + .../impl/ClassEventCalendarServiceImpl.java | 83 ++++- .../service/impl/ClassPeriodServiceImpl.java | 5 + .../impl/ClassSemesterServiceImpl.java | 2 +- .../impl/CourseRunningImportServiceImpl.java | 8 + .../jwgl/service/impl/KCBServiceImpl.java | 61 ++++ .../service/impl/MyBusinessServiceImpl.java | 332 ++++++++++++++++++ .../impl/SchedulingWindowServiceImpl.java | 249 +++++++++++++ .../impl/SystemSettingsServiceImpl.java | 60 ++++ .../service/impl/TaskBookFillServiceImpl.java | 216 +++++++++++- .../impl/TeachingAllocationServiceImpl.java | 114 ++++++ .../service/impl/TeachingTaskServiceImpl.java | 19 +- .../impl/TimetableGridServiceImpl.java | 44 +++ .../jwgl/vo/allocation/AllocationTaskVO.java | 6 + .../jwgl/vo/allocation/AllocationWeekVO.java | 6 + .../vo/calendar/ClassCalendarResyncVO.java | 10 + .../roomroot/jwgl/vo/kcb/FreePeriodsVO.java | 43 +++ .../jwgl/vo/mybusiness/MyCourseTaskVO.java | 82 +++++ .../jwgl/vo/taskbook/TaskBookRowVO.java | 3 + frontend/src/api/teachBusiness/allocation.js | 11 + frontend/src/api/teachBusiness/my.js | 98 ++++++ .../src/api/teachBusiness/schedulingWindow.js | 19 + .../src/api/teachBusiness/systemSettings.js | 26 ++ frontend/src/api/teachBusiness/taskBook.js | 53 ++- .../src/api/teachBusiness/teachingTask.js | 24 +- frontend/src/api/teachBusiness/timetable.js | 26 ++ .../src/api/teachOffice/classCalendarEvent.js | 7 +- frontend/src/views/student/myClass/index.vue | 154 ++++++++ .../components/SchoolCalendarEditor.vue | 166 +++++++-- .../teachBusiness/schedulingWindow/index.vue | 190 +++++++++- .../src/views/teachOffice/myOffice/index.vue | 137 ++++++++ .../src/views/teachOffice/myTeach/index.vue | 158 +++++++++ .../ClassEventCalendarDialog.vue | 38 +- .../TeachingAllocationDialog.vue | 158 +++++++-- .../views/teachOffice/shiftSemester/index.vue | 19 + .../taskPlan/TaskBookFillDialog.vue | 215 +++++++++++- .../src/views/teachOffice/taskPlan/index.vue | 138 +++++++- 62 files changed, 3508 insertions(+), 143 deletions(-) create mode 100644 backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/MyBusinessController.java create mode 100644 backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SystemSettingsController.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/scheduling/SchedulingMoveRequest.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchFillRequest.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchRoomRequest.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchTeacherRequest.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/MyBusinessService.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/SystemSettingsService.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/MyBusinessServiceImpl.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/SystemSettingsServiceImpl.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/kcb/FreePeriodsVO.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/mybusiness/MyCourseTaskVO.java create mode 100644 frontend/src/api/teachBusiness/my.js create mode 100644 frontend/src/api/teachBusiness/systemSettings.js create mode 100644 frontend/src/views/student/myClass/index.vue create mode 100644 frontend/src/views/teachOffice/myOffice/index.vue create mode 100644 frontend/src/views/teachOffice/myTeach/index.vue diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ClassEventCalendarController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ClassEventCalendarController.java index ecb8db72..4d77d883 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ClassEventCalendarController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ClassEventCalendarController.java @@ -47,12 +47,14 @@ public class ClassEventCalendarController { } /** - * 重新同步校历:confirm=false 返回缺失格预览,confirm=true 实际补齐(只补缺失,不覆盖人工改动) + * 重新同步校历:confirm=false 返回差异预览,confirm=true 实际写入; + * force=true 时额外覆盖与校历不一致的已有格。 */ @PostMapping("/resync") public Result resync(@RequestParam("xydxqbh") String xydxqbh, - @RequestParam(value = "confirm", defaultValue = "false") boolean confirm) { - return Result.success(classEventCalendarService.resync(xydxqbh, confirm)); + @RequestParam(value = "confirm", defaultValue = "false") boolean confirm, + @RequestParam(value = "force", defaultValue = "false") boolean force) { + return Result.success(classEventCalendarService.resync(xydxqbh, confirm, force)); } @PostMapping("/apply") 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 dd0f2feb..88579b64 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 @@ -10,6 +10,8 @@ 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.DailyWeeklyTimetableVO; +import com.roomroot.jwgl.vo.kcb.FreePeriodsVO; import com.roomroot.jwgl.vo.kcb.TimetableGridVO; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; @@ -166,4 +168,24 @@ public class KCBController { new String(name.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); return ResponseEntity.ok().headers(headers).body(bytes); } + + /** + * 有课/无课时段查询:按日期给出 busy(有课节次)与 free(无课节次)。 + *

dim=semester|team|teacher|room,id 为对应编号;start/end 缺省本周。

+ */ + @GetMapping("/freeSlots") + public Result freeSlots(TimetableGridQuery query) { + return Result.success(timetableGridService.freePeriods(query)); + } + + /** + * 课次综合查询:按 年度/学期/学员队/教员/教室/教研室/学员 组合过滤课次日历。 + *

学员账号只看本队;教员只看本人;教研室只看本室课程。

+ */ + @GetMapping("/lessons") + public Result> listLessons(TimetableQuery cond, + @RequestParam(value = "start", required = false) String start, + @RequestParam(value = "end", required = false) String end) { + return Result.success(kcbService.listLessons(cond, start, end)); + } } diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/MyBusinessController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/MyBusinessController.java new file mode 100644 index 00000000..8957624a --- /dev/null +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/MyBusinessController.java @@ -0,0 +1,109 @@ +package com.roomroot.web.controller.jwgl; + +import com.roomroot.jwgl.service.MyBusinessService; +import com.roomroot.jwgl.unit.Result; +import com.roomroot.jwgl.vo.kcb.ClassTimetableVO; +import com.roomroot.jwgl.vo.kcb.DailyWeeklyTimetableVO; +import com.roomroot.jwgl.vo.kcb.TimetableGridVO; +import com.roomroot.jwgl.vo.mybusiness.MyCourseTaskVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +/** + * 「我的教学」角色视图接口(阶段 C)。 + * + *

教员/教研室/学员维度全部由服务端按登录身份解析, + * 不接受调用方传入他人编号。

+ */ +@RestController +@RequestMapping("/my") +public class MyBusinessController { + + @Autowired + private MyBusinessService myBusinessService; + + // ==================== 教员 ==================== + + /** 本教员课程任务 */ + @GetMapping("/teacher/courses") + public Result> teacherCourses(@RequestParam(value = "nd", required = false) Integer nd, + @RequestParam(value = "xqdc", required = false) Integer xqdc) { + return Result.success(myBusinessService.teacherCourses(nd, xqdc)); + } + + /** 本教员实施计划(默认本周) */ + @GetMapping("/teacher/lessons") + public Result> teacherLessons(@RequestParam(value = "start", required = false) String start, + @RequestParam(value = "end", required = false) String end, + @RequestParam(value = "nd", required = false) Integer nd) { + return Result.success(myBusinessService.teacherLessons(start, end, nd)); + } + + /** 本教员课表网格 */ + @GetMapping("/teacher/grid") + public Result teacherGrid(@RequestParam(value = "mbbh", required = false) String mbbh, + @RequestParam(value = "start", required = false) String start, + @RequestParam(value = "end", required = false) String end, + @RequestParam(value = "nd", required = false) Integer nd) { + return Result.success(myBusinessService.teacherGrid(mbbh, start, end, nd)); + } + + // ==================== 教研室 ==================== + + /** 今日本室计划 */ + @GetMapping("/office/today") + public Result> officeToday(@RequestParam(value = "rq", required = false) String rq, + @RequestParam(value = "offset", required = false) Integer offset) { + return Result.success(myBusinessService.officeToday(rq, offset)); + } + + /** 本室课程 */ + @GetMapping("/office/courses") + public Result> officeCourses(@RequestParam(value = "nd", required = false) Integer nd, + @RequestParam(value = "xqdc", required = false) Integer xqdc) { + return Result.success(myBusinessService.officeCourses(nd, xqdc)); + } + + /** 本室教员清单 */ + @GetMapping("/office/teachers") + public Result>> officeTeachers() { + return Result.success(myBusinessService.officeTeachers()); + } + + // ==================== 学员 ==================== + + /** 本学员队课程列表 */ + @GetMapping("/student/courses") + public Result> studentCourses(@RequestParam(value = "nd", required = false) Integer nd, + @RequestParam(value = "xqdc", required = false) Integer xqdc) { + return Result.success(myBusinessService.studentCourses(nd, xqdc)); + } + + /** 本学员队课次(默认本周) */ + @GetMapping("/student/lessons") + public Result> studentLessons(@RequestParam(value = "start", required = false) String start, + @RequestParam(value = "end", required = false) String end) { + return Result.success(myBusinessService.studentLessons(start, end)); + } + + /** 本学员队课表网格 */ + @GetMapping("/student/grid") + public Result studentGrid(@RequestParam(value = "mbbh", required = false) String mbbh, + @RequestParam(value = "start", required = false) String start, + @RequestParam(value = "end", required = false) String end, + @RequestParam(value = "nd", required = false) Integer nd) { + return Result.success(myBusinessService.studentGrid(mbbh, start, end, nd)); + } + + /** 本学员队干部清单 */ + @GetMapping("/team/cadres") + public Result>> teamCadres() { + return Result.success(myBusinessService.teamCadres()); + } +} diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SchedulingWindowController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SchedulingWindowController.java index b7c865e2..36e70137 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SchedulingWindowController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SchedulingWindowController.java @@ -4,11 +4,15 @@ import com.roomroot.common.exception.ServiceException; import com.roomroot.jwgl.dto.scheduling.SchedulingArrangeRequest; import com.roomroot.jwgl.dto.scheduling.SchedulingCellOpRequest; import com.roomroot.jwgl.dto.scheduling.SchedulingCourseEditRequest; +import com.roomroot.jwgl.dto.scheduling.SchedulingMoveRequest; import com.roomroot.jwgl.service.RunningCoursePublishService; import com.roomroot.jwgl.service.SchedulingWindowService; import com.roomroot.jwgl.unit.Result; import com.roomroot.jwgl.vo.scheduling.SchedulingViewVO; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -17,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -38,6 +43,20 @@ public class SchedulingWindowController { @Autowired private RunningCoursePublishService runningCoursePublishService; + /** + * 导出排课窗视图 Excel:每周一个 sheet(节次×星期网格,阶段 E4)。 + */ + @PreAuthorize("@ss.hasPermi('teach:schedulingWindow:list')") + @GetMapping("/export") + public ResponseEntity export(@RequestParam("xydxqbh") String xydxqbh) { + byte[] bytes = schedulingWindowService.exportView(xydxqbh); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", + new String("排课窗口.xlsx".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); + return ResponseEntity.ok().headers(headers).body(bytes); + } + /** * 排课窗组合视图:班次头 + 课程列表(排满标绿)+ 周次×星期×节次格子。 */ @@ -56,6 +75,16 @@ public class SchedulingWindowController { return Result.success(schedulingWindowService.arrange(request)); } + /** + * 拖拽移动课次:把 from 格的课次平移到 to 格(阶段 E4)。 + * 目标格走与 arrange 相同的硬冲突校验;软提示照常移动并返回 warning。 + */ + @PreAuthorize("@ss.hasPermi('teach:schedulingWindow:edit')") + @PostMapping("/move") + public Result> move(@RequestBody SchedulingMoveRequest request) { + return Result.success(schedulingWindowService.moveLesson(request)); + } + /** * 删除所选节次:仅删除该课程在这些格上的课次;已提交实施计划的课次拒绝。 */ diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SystemSettingsController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SystemSettingsController.java new file mode 100644 index 00000000..f44d8d67 --- /dev/null +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SystemSettingsController.java @@ -0,0 +1,50 @@ +package com.roomroot.web.controller.jwgl; + +import com.roomroot.jwgl.entity.DBVersion; +import com.roomroot.jwgl.entity.JCSJB; +import com.roomroot.jwgl.service.ClassPeriodService; +import com.roomroot.jwgl.service.SystemSettingsService; +import com.roomroot.jwgl.unit.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 教务系统参数(DBVersion 单行,阶段 E1)。 + * + *

当前开放字段:显示78节(xs78j)、显示晚上(xsws)、显示夜间(xsyj)、 + * 教学要点名称(jxydmc)。更新只写非空字段。

+ */ +@RestController +@RequestMapping("/systemSettings") +public class SystemSettingsController { + + @Autowired + private SystemSettingsService systemSettingsService; + + @Autowired + private ClassPeriodService classPeriodService; + + /** 读取系统参数 */ + @GetMapping("/get") + public Result get() { + return Result.success(systemSettingsService.get()); + } + + /** 节次段字典:节次时间表的双节次行,供日历编辑器渲染节次列 */ + @GetMapping("/periodSlots") + public Result> periodSlots() { + return Result.success(classPeriodService.slotRows()); + } + + /** 更新系统参数(只写非空字段) */ + @PostMapping("/update") + public Result update(@RequestBody DBVersion settings) { + return Result.success(systemSettingsService.update(settings)); + } +} diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TaskBookFillController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TaskBookFillController.java index 129906d1..27fda1b0 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TaskBookFillController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TaskBookFillController.java @@ -1,5 +1,8 @@ package com.roomroot.web.controller.jwgl; +import com.roomroot.jwgl.dto.taskbook.TaskBookBatchFillRequest; +import com.roomroot.jwgl.dto.taskbook.TaskBookBatchRoomRequest; +import com.roomroot.jwgl.dto.taskbook.TaskBookBatchTeacherRequest; import com.roomroot.jwgl.dto.taskbook.TaskBookBhListRequest; import com.roomroot.jwgl.dto.taskbook.TaskBookFillRequest; import com.roomroot.jwgl.dto.taskbook.TaskBookRoomRequest; @@ -34,8 +37,9 @@ public class TaskBookFillController { * 填报列表:某教学任务下全部课程任务行(排序 课程→责任教员→课次,含合班分组号)。 */ @GetMapping("/list") - public Result> list(@RequestParam("jxrwbh") String jxrwbh) { - return Result.success(taskBookFillService.list(jxrwbh)); + public Result> list(@RequestParam("jxrwbh") String jxrwbh, + @RequestParam(value = "jybh", required = false) String jybh) { + return Result.success(taskBookFillService.list(jxrwbh, jybh)); } /** @@ -80,10 +84,50 @@ public class TaskBookFillController { } /** - * 填报字段:计划教员 / 场地(同合班同步)/ 排课建议。 + * 填报字段:计划教员 / 场地(同合班同步)/ 排课建议 / 课次序号。 */ @PostMapping("/fill") public Result fill(@RequestBody TaskBookFillRequest request) { return Result.success(taskBookFillService.fill(request)); } + + /** + * 批量指定责任教员:对每行执行与 setTeacher 相同的校验与合班组同步。 + */ + @PostMapping("/batchSetTeacher") + public Result batchSetTeacher(@RequestBody TaskBookBatchTeacherRequest request) { + return Result.success(taskBookFillService.batchSetTeacher(request)); + } + + /** + * 批量指定场地:对每行执行与 setRoom 相同的校验与合班组同步。 + */ + @PostMapping("/batchSetRoom") + public Result batchSetRoom(@RequestBody TaskBookBatchRoomRequest request) { + return Result.success(taskBookFillService.batchSetRoom(request)); + } + + /** + * 批量填报:对所选行统一应用填报字段(仅写非空),单事务。 + */ + @PostMapping("/batchFill") + public Result batchFill(@RequestBody TaskBookBatchFillRequest request) { + return Result.success(taskBookFillService.batchFill(request)); + } + + /** + * 行级删除:所选课程任务行逻辑删除;已发布到运行课表的班次须先撤回。 + */ + @PostMapping("/deleteRows") + public Result deleteRows(@RequestBody TaskBookBhListRequest request) { + return Result.success(taskBookFillService.deleteRows(request)); + } + + /** + * 教研室跨任务汇总:该教研室全部任务书(附教学任务名称/年度/状态)。 + */ + @GetMapping("/officeSummary") + public Result>> officeSummary(@RequestParam("jysdh") String jysdh) { + return Result.success(taskBookFillService.officeSummary(jysdh)); + } } diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingAllocationController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingAllocationController.java index 1742d957..f3d130bf 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingAllocationController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingAllocationController.java @@ -72,6 +72,17 @@ public class TeachingAllocationController { return Result.success(teachingAllocationService.setGroup(request)); } + /** + * 自动排布:按铺学时建议把计算起始周回填到 pdqsz。 + * onlyMissing=true(辅助排布)只补未设起始周的任务;body 可选传任务编号列表限定范围。 + */ + @PostMapping("/autoArrange") + public Result autoArrange(@RequestParam("xydxqbh") String xydxqbh, + @RequestParam(value = "onlyMissing", defaultValue = "false") boolean onlyMissing, + @RequestBody(required = false) List bhList) { + return Result.success(teachingAllocationService.autoArrange(xydxqbh, bhList, onlyMissing)); + } + /** * 导出配当 Excel(支持批量:xydxqbh 逗号分隔)。 */ diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingTaskController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingTaskController.java index 007926d8..c2db2314 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingTaskController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TeachingTaskController.java @@ -81,15 +81,15 @@ public class TeachingTaskController { } /** - * 发布教学任务及教研室任务书 - * 根据教学任务编号修改状态为"发布",并批量更新所有关联的教研室任务书状态为"发布" + * 批量发布教学任务及教研室任务书 + * 逐个任务置"发布"并同步教研室任务书;任一校验失败(已结束/任务书未生成)整批回滚。 * - * @param bh 教学任务编号 - * @return 更新数量 + * @param bhList 教学任务编号列表 + * @return 更新的教研室任务书行数合计 */ @PostMapping("/batchPublish") - public Result batchPublish(@RequestParam("bh") String bh) { - int count = teachingTaskService.batchPublish(bh); + public Result batchPublish(@RequestBody List bhList) { + int count = teachingTaskService.batchPublish(bhList); return Result.success(count); } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/kcb/TimetableQuery.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/kcb/TimetableQuery.java index 933f2218..9948f8bb 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/kcb/TimetableQuery.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/kcb/TimetableQuery.java @@ -2,6 +2,8 @@ package com.roomroot.jwgl.dto.kcb; import lombok.Data; +import java.util.List; + /** * 班次课表查询条件。 *

未传年度、学期时按当前时间取本学期。

@@ -20,4 +22,19 @@ public class TimetableQuery { /** 学员队名称(队别班次模糊) */ private String xydmc; + + /** 教员编号(主讲/辅讲/责任教员任一命中) */ + private String jybh; + + /** 教室编号(课次场地或课程默认场地任一命中) */ + private String jsbh; + + /** 教研室代号(按课程归属教研室过滤) */ + private String jysdh; + + /** 学员编号(服务端解析为其所在学员队后按队过滤) */ + private String xybh; + + /** 教员编号集合(教研室等批量范围过滤用) */ + private List jybhs; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/scheduling/SchedulingMoveRequest.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/scheduling/SchedulingMoveRequest.java new file mode 100644 index 00000000..5404c881 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/scheduling/SchedulingMoveRequest.java @@ -0,0 +1,20 @@ +package com.roomroot.jwgl.dto.scheduling; + +import lombok.Data; + +/** + * 拖拽移动课次请求(阶段 E4):把课程在 from 格的课次平移到 to 格。 + * 目标格沿用 arrange 的硬冲突校验;软提示(配当周次不符)照常移动并返回 warning。 + */ +@Data +public class SchedulingMoveRequest { + + /** 实施_课程编号 */ + private String sskcbh; + + /** 源格(已有课次) */ + private SchedulingArrangeRequest.Cell from; + + /** 目标格 */ + private SchedulingArrangeRequest.Cell to; +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchFillRequest.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchFillRequest.java new file mode 100644 index 00000000..ff728d62 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchFillRequest.java @@ -0,0 +1,30 @@ +package com.roomroot.jwgl.dto.taskbook; + +import lombok.Data; + +import java.util.List; + +/** + * 批量填报请求:对所选课程任务行统一应用填报字段(仅写非空字段)。 + */ +@Data +public class TaskBookBatchFillRequest { + + /** 课程任务编号列表 */ + private List bhList; + + /** 教研室计划教员编号 */ + private String jysjhjybh; + + /** 场地编号(useSpecial=true 时忽略,取班次专用教室) */ + private String jsbh; + + /** 使用班次专用教室 */ + private Boolean useSpecial; + + /** 排课建议(教研室计划备注) */ + private String jysjhbz; + + /** 课次序号 */ + private Integer kcxh; +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchRoomRequest.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchRoomRequest.java new file mode 100644 index 00000000..d6bffc55 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchRoomRequest.java @@ -0,0 +1,21 @@ +package com.roomroot.jwgl.dto.taskbook; + +import lombok.Data; + +import java.util.List; + +/** + * 批量指定场地请求。 + */ +@Data +public class TaskBookBatchRoomRequest { + + /** 课程任务编号列表 */ + private List bhList; + + /** 教室编号(useSpecial=false 时必传) */ + private String jsbh; + + /** true=使用各行班次专用教室(忽略 jsbh,取各班次学期.专用教室编号) */ + private Boolean useSpecial; +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchTeacherRequest.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchTeacherRequest.java new file mode 100644 index 00000000..840e5c62 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookBatchTeacherRequest.java @@ -0,0 +1,26 @@ +package com.roomroot.jwgl.dto.taskbook; + +import lombok.Data; + +import java.util.List; + +/** + * 批量指定责任教员请求。 + */ +@Data +public class TaskBookBatchTeacherRequest { + + /** 课程任务编号列表 */ + private List bhList; + + /** + * 指定方式: + * unit — 责任单位教员(教员必须属于各行教研室 jysdh); + * academy — 全院教员(任意在职教员); + * plan — 应用各行教研室计划教员(jybh = 各行 jysjhjybh)。 + */ + private String mode; + + /** 责任教员编号(mode=unit / academy 时必传) */ + private String jybh; +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookFillRequest.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookFillRequest.java index 813499a3..76c00d66 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookFillRequest.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/dto/taskbook/TaskBookFillRequest.java @@ -19,4 +19,7 @@ public class TaskBookFillRequest { /** 排课建议(教研室计划备注) */ private String jysjhbz; + + /** 课次序号(课序设置;非空时写入) */ + private Integer kcxh; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/KcbTimetableMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/KcbTimetableMapper.xml index 4567c9f1..97cbb3d8 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/KcbTimetableMapper.xml +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/KcbTimetableMapper.xml @@ -25,6 +25,44 @@ AND cxf."学期第次" = #{cond.xqdc} ) + + AND ( + c."教员编号" = #{cond.jybh} + OR c."责任教员编号" = #{cond.jybh} + OR EXISTS ( + SELECT 1 FROM "实施_课程表_辅助教员" f2 + WHERE f2."实施_课程表编号" = s."编号" + AND f2."辅助教员编号" = #{cond.jybh} + ) + ) + + + AND ( + c."教员编号" IN + #{j} + OR c."责任教员编号" IN + #{j} + OR EXISTS ( + SELECT 1 FROM "实施_课程表_辅助教员" f3 + WHERE f3."实施_课程表编号" = s."编号" + AND f3."辅助教员编号" IN + #{j} + ) + ) + + + AND ( + c."教室编号" = #{cond.jsbh} + OR EXISTS ( + SELECT 1 FROM "实施_课程表_教室" j2 + WHERE j2."实施_课程表编号" = s."编号" + AND j2."教室编号" = #{cond.jsbh} + ) + ) + + + AND k."教研室代号" = #{cond.jysdh} +