diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduCourseClassController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduCourseClassController.java new file mode 100644 index 0000000..8c74fc8 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduCourseClassController.java @@ -0,0 +1,340 @@ +package com.ruoyi.web.controller.education; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.education.domain.EduCourseClass; +import com.ruoyi.education.service.IEduCourseClassService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.StringUtils; + +/** + * 开课计划Controller + * + * @author ruoyi + * @date 2024-09-26 + */ +@RestController +@RequestMapping("/education/courseClass") +public class EduCourseClassController extends BaseController +{ + @Autowired + private IEduCourseClassService eduCourseClassService; + + /** + * 查询开课计划列表 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:list')") + @GetMapping("/list") + public TableDataInfo list(EduCourseClass eduCourseClass) + { + startPage(); + List list = eduCourseClassService.selectEduCourseClassList(eduCourseClass); + return getDataTable(list); + } + + /** + * 导出开课计划列表 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:export')") + @Log(title = "开课计划", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EduCourseClass eduCourseClass) + { + List list = eduCourseClassService.selectEduCourseClassList(eduCourseClass); + ExcelUtil util = new ExcelUtil(EduCourseClass.class); + util.exportExcel(response, list, "开课计划数据"); + } + + /** + * 获取开课计划详细信息 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping(value = "/{classId}") + public AjaxResult getInfo(@PathVariable("classId") Long classId) + { + return success(eduCourseClassService.selectEduCourseClassByClassId(classId)); + } + + /** + * 新增开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:add')") + @Log(title = "开课计划", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EduCourseClass eduCourseClass) + { + if ("NOT_UNIQUE".equals(eduCourseClassService.checkClassCodeUnique(eduCourseClass))) + { + return error("新增开课计划失败,班级编号已存在"); + } + + String capacityResult = eduCourseClassService.checkCapacityValid(eduCourseClass); + if (!"VALID".equals(capacityResult)) + { + return getCapacityErrorMessage(capacityResult); + } + + String classroomConflictResult = eduCourseClassService.checkClassroomConflict(eduCourseClass); + if ("CONFLICT".equals(classroomConflictResult)) + { + return error("新增开课计划失败,教室时间冲突"); + } + + String teacherConflictResult = eduCourseClassService.checkTeacherConflict(eduCourseClass); + if ("CONFLICT".equals(teacherConflictResult)) + { + return error("新增开课计划失败,教师时间冲突"); + } + + eduCourseClass.setCreateBy(getUsername()); + return toAjax(eduCourseClassService.insertEduCourseClass(eduCourseClass)); + } + + /** + * 修改开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:edit')") + @Log(title = "开课计划", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EduCourseClass eduCourseClass) + { + if ("NOT_UNIQUE".equals(eduCourseClassService.checkClassCodeUnique(eduCourseClass))) + { + return error("修改开课计划失败,班级编号已存在"); + } + + String capacityResult = eduCourseClassService.checkCapacityValid(eduCourseClass); + if (!"VALID".equals(capacityResult)) + { + return getCapacityErrorMessage(capacityResult); + } + + String classroomConflictResult = eduCourseClassService.checkClassroomConflict(eduCourseClass); + if ("CONFLICT".equals(classroomConflictResult)) + { + return error("修改开课计划失败,教室时间冲突"); + } + + String teacherConflictResult = eduCourseClassService.checkTeacherConflict(eduCourseClass); + if ("CONFLICT".equals(teacherConflictResult)) + { + return error("修改开课计划失败,教师时间冲突"); + } + + eduCourseClass.setUpdateBy(getUsername()); + return toAjax(eduCourseClassService.updateEduCourseClass(eduCourseClass)); + } + + /** + * 删除开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:remove')") + @Log(title = "开课计划", businessType = BusinessType.DELETE) + @DeleteMapping("/{classIds}") + public AjaxResult remove(@PathVariable Long[] classIds) + { + return toAjax(eduCourseClassService.deleteEduCourseClassByClassIds(classIds)); + } + + /** + * 发布开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:publish')") + @Log(title = "发布开课计划", businessType = BusinessType.UPDATE) + @PutMapping("/publish/{classId}") + public AjaxResult publishCourseClass(@PathVariable Long classId) + { + EduCourseClass courseClass = eduCourseClassService.selectEduCourseClassByClassId(classId); + if (StringUtils.isNull(courseClass)) + { + return error("开课计划不存在"); + } + + if (!"0".equals(courseClass.getStatus())) + { + return error("只有待发布状态的开课计划才能发布"); + } + + return toAjax(eduCourseClassService.publishCourseClass(classId)); + } + + /** + * 批量发布开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:publish')") + @Log(title = "批量发布开课计划", businessType = BusinessType.UPDATE) + @PutMapping("/batchPublish") + public AjaxResult batchPublishCourseClass(@RequestBody Long[] classIds) + { + return toAjax(eduCourseClassService.batchPublishCourseClass(classIds)); + } + + /** + * 停止选课 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:edit')") + @Log(title = "停止选课", businessType = BusinessType.UPDATE) + @PutMapping("/stopEnrollment/{classId}") + public AjaxResult stopEnrollment(@PathVariable Long classId) + { + EduCourseClass courseClass = eduCourseClassService.selectEduCourseClassByClassId(classId); + if (StringUtils.isNull(courseClass)) + { + return error("开课计划不存在"); + } + + if (!"1".equals(courseClass.getStatus())) + { + return error("只有可选课状态的开课计划才能停止选课"); + } + + return toAjax(eduCourseClassService.stopEnrollment(classId)); + } + + /** + * 结课 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:edit')") + @Log(title = "结课", businessType = BusinessType.UPDATE) + @PutMapping("/finish/{classId}") + public AjaxResult finishCourse(@PathVariable Long classId) + { + EduCourseClass courseClass = eduCourseClassService.selectEduCourseClassByClassId(classId); + if (StringUtils.isNull(courseClass)) + { + return error("开课计划不存在"); + } + + if (!"1".equals(courseClass.getStatus()) && !"2".equals(courseClass.getStatus())) + { + return error("只有可选课或已满额状态的开课计划才能结课"); + } + + return toAjax(eduCourseClassService.finishCourse(classId)); + } + + /** + * 调整容量 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:capacity')") + @Log(title = "调整容量", businessType = BusinessType.UPDATE) + @PutMapping("/adjustCapacity/{classId}/{newCapacity}") + public AjaxResult adjustCapacity(@PathVariable Long classId, @PathVariable Integer newCapacity) + { + if (newCapacity == null || newCapacity <= 0) + { + return error("容量必须大于0"); + } + + int result = eduCourseClassService.adjustCapacity(classId, newCapacity); + if (result == -1) + { + return error("新容量不能小于已选课人数"); + } + + return toAjax(result); + } + + /** + * 获取指定学期的开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/semester/{semesterId}") + public AjaxResult getBySemester(@PathVariable Long semesterId) + { + return success(eduCourseClassService.selectCourseClassBySemester(semesterId)); + } + + /** + * 获取指定教师的开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/teacher/{teacherId}") + public AjaxResult getByTeacher(@PathVariable Long teacherId) + { + return success(eduCourseClassService.selectCourseClassByTeacher(teacherId)); + } + + /** + * 获取可选课的开课计划 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/enrollable") + public AjaxResult getEnrollableCourseClasses() + { + return success(eduCourseClassService.selectEnrollableCourseClasses()); + } + + /** + * 获取开课计划统计信息 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/statistics/{semesterId}") + public AjaxResult getStatistics(@PathVariable Long semesterId) + { + return success(eduCourseClassService.getCourseClassStatistics(semesterId)); + } + + /** + * 获取课程列表用于下拉选择 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/courseOptions") + public AjaxResult getCourseOptions() + { + return success(eduCourseClassService.getCourseOptions()); + } + + /** + * 获取教师列表用于下拉选择 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/teacherOptions") + public AjaxResult getTeacherOptions() + { + return success(eduCourseClassService.getTeacherOptions()); + } + + /** + * 获取教室列表用于下拉选择 + */ + @PreAuthorize("@ss.hasPermi('education:courseClass:query')") + @GetMapping("/classroomOptions") + public AjaxResult getClassroomOptions() + { + return success(eduCourseClassService.getClassroomOptions()); + } + + /** + * 获取容量校验错误信息 + */ + private AjaxResult getCapacityErrorMessage(String capacityResult) + { + switch (capacityResult) + { + case "INVALID_CAPACITY": + return error("容量必须大于0"); + case "ENROLL_LIMIT_EXCEED_CAPACITY": + return error("选课人数上限不能超过容量"); + case "ENROLLED_EXCEED_LIMIT": + return error("已选课人数超过了容量限制"); + default: + return error("容量设置无效"); + } + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduCourseScheduleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduCourseScheduleController.java new file mode 100644 index 0000000..9835bd2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduCourseScheduleController.java @@ -0,0 +1,404 @@ +package com.ruoyi.web.controller.education; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.education.domain.EduCourseSchedule; +import com.ruoyi.education.service.IEduCourseScheduleService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.StringUtils; + +/** + * 开课节次安排Controller + * + * @author ruoyi + * @date 2024-09-26 + */ +@RestController +@RequestMapping("/education/schedule") +public class EduCourseScheduleController extends BaseController +{ + @Autowired + private IEduCourseScheduleService eduCourseScheduleService; + + /** + * 查询开课节次安排列表 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:list')") + @GetMapping("/list") + public TableDataInfo list(EduCourseSchedule eduCourseSchedule) + { + startPage(); + List list = eduCourseScheduleService.selectEduCourseScheduleList(eduCourseSchedule); + return getDataTable(list); + } + + /** + * 导出开课节次安排列表 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:export')") + @Log(title = "开课节次安排", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EduCourseSchedule eduCourseSchedule) + { + List list = eduCourseScheduleService.selectEduCourseScheduleList(eduCourseSchedule); + ExcelUtil util = new ExcelUtil(EduCourseSchedule.class); + util.exportExcel(response, list, "开课节次安排数据"); + } + + /** + * 获取开课节次安排详细信息 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping(value = "/{scheduleId}") + public AjaxResult getInfo(@PathVariable("scheduleId") Long scheduleId) + { + return success(eduCourseScheduleService.selectEduCourseScheduleByScheduleId(scheduleId)); + } + + /** + * 新增开课节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:add')") + @Log(title = "开课节次安排", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EduCourseSchedule eduCourseSchedule) + { + String periodResult = eduCourseScheduleService.checkPeriodValid(eduCourseSchedule); + if (!"VALID".equals(periodResult)) + { + return getPeriodErrorMessage(periodResult); + } + + String weeksResult = eduCourseScheduleService.checkWeeksValid(eduCourseSchedule.getWeeks()); + if (!"VALID".equals(weeksResult)) + { + return getWeeksErrorMessage(weeksResult); + } + + String conflictResult = eduCourseScheduleService.checkTimeConflict(eduCourseSchedule); + if (!"NO_CONFLICT".equals(conflictResult)) + { + return getConflictErrorMessage(conflictResult); + } + + eduCourseSchedule.setCreateBy(getUsername()); + return toAjax(eduCourseScheduleService.insertEduCourseSchedule(eduCourseSchedule)); + } + + /** + * 修改开课节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:edit')") + @Log(title = "开课节次安排", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EduCourseSchedule eduCourseSchedule) + { + String periodResult = eduCourseScheduleService.checkPeriodValid(eduCourseSchedule); + if (!"VALID".equals(periodResult)) + { + return getPeriodErrorMessage(periodResult); + } + + String weeksResult = eduCourseScheduleService.checkWeeksValid(eduCourseSchedule.getWeeks()); + if (!"VALID".equals(weeksResult)) + { + return getWeeksErrorMessage(weeksResult); + } + + String conflictResult = eduCourseScheduleService.checkTimeConflict(eduCourseSchedule); + if (!"NO_CONFLICT".equals(conflictResult)) + { + return getConflictErrorMessage(conflictResult); + } + + eduCourseSchedule.setUpdateBy(getUsername()); + return toAjax(eduCourseScheduleService.updateEduCourseSchedule(eduCourseSchedule)); + } + + /** + * 删除开课节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:remove')") + @Log(title = "开课节次安排", businessType = BusinessType.DELETE) + @DeleteMapping("/{scheduleIds}") + public AjaxResult remove(@PathVariable Long[] scheduleIds) + { + return toAjax(eduCourseScheduleService.deleteEduCourseScheduleByScheduleIds(scheduleIds)); + } + + /** + * 根据开课ID查询节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/class/{classId}") + public AjaxResult getByClassId(@PathVariable Long classId) + { + return success(eduCourseScheduleService.selectScheduleByClassId(classId)); + } + + /** + * 根据开课ID删除节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:remove')") + @Log(title = "删除开课节次安排", businessType = BusinessType.DELETE) + @DeleteMapping("/class/{classId}") + public AjaxResult removeByClassId(@PathVariable Long classId) + { + return toAjax(eduCourseScheduleService.deleteScheduleByClassId(classId)); + } + + /** + * 查询指定教室的课程安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/classroom/{classroomId}/{semesterId}") + public AjaxResult getByClassroom(@PathVariable Long classroomId, @PathVariable Long semesterId) + { + return success(eduCourseScheduleService.selectScheduleByClassroom(classroomId, semesterId)); + } + + /** + * 查询指定教师的课程安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/teacher/{teacherId}/{semesterId}") + public AjaxResult getByTeacher(@PathVariable Long teacherId, @PathVariable Long semesterId) + { + return success(eduCourseScheduleService.selectScheduleByTeacher(teacherId, semesterId)); + } + + /** + * 查询指定学期的所有课程安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/semester/{semesterId}") + public AjaxResult getBySemester(@PathVariable Long semesterId) + { + return success(eduCourseScheduleService.selectScheduleBySemester(semesterId)); + } + + /** + * 生成教室课表 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/timetable/classroom/{classroomId}/{semesterId}") + public AjaxResult generateClassroomTimetable(@PathVariable Long classroomId, @PathVariable Long semesterId) + { + return success(eduCourseScheduleService.generateClassroomTimetable(classroomId, semesterId)); + } + + /** + * 生成教师课表 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/timetable/teacher/{teacherId}/{semesterId}") + public AjaxResult generateTeacherTimetable(@PathVariable Long teacherId, @PathVariable Long semesterId) + { + return success(eduCourseScheduleService.generateTeacherTimetable(teacherId, semesterId)); + } + + /** + * 批量添加节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:add')") + @Log(title = "批量添加节次安排", businessType = BusinessType.INSERT) + @PostMapping("/batch/{classId}") + public AjaxResult batchAdd(@PathVariable Long classId, @RequestBody List scheduleList) + { + if (scheduleList == null || scheduleList.isEmpty()) + { + return error("节次安排列表不能为空"); + } + + for (EduCourseSchedule schedule : scheduleList) + { + String periodResult = eduCourseScheduleService.checkPeriodValid(schedule); + if (!"VALID".equals(periodResult)) + { + return error("第" + scheduleList.indexOf(schedule) + "项:" + getPeriodErrorText(periodResult)); + } + + String weeksResult = eduCourseScheduleService.checkWeeksValid(schedule.getWeeks()); + if (!"VALID".equals(weeksResult)) + { + return error("第" + scheduleList.indexOf(schedule) + "项:" + getWeeksErrorText(weeksResult)); + } + + String conflictResult = eduCourseScheduleService.checkTimeConflict(schedule); + if (!"NO_CONFLICT".equals(conflictResult)) + { + return error("第" + scheduleList.indexOf(schedule) + "项:" + getConflictErrorText(conflictResult)); + } + } + + return toAjax(eduCourseScheduleService.batchAddSchedule(classId, scheduleList)); + } + + /** + * 复制节次安排 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:add')") + @Log(title = "复制节次安排", businessType = BusinessType.INSERT) + @PostMapping("/copy/{sourceClassId}/{targetClassId}") + public AjaxResult copySchedule(@PathVariable Long sourceClassId, @PathVariable Long targetClassId) + { + return toAjax(eduCourseScheduleService.copySchedule(sourceClassId, targetClassId)); + } + + /** + * 自动排课 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:add')") + @Log(title = "自动排课", businessType = BusinessType.INSERT) + @PostMapping("/auto/{classId}/{semesterId}/{courseHours}") + public AjaxResult autoSchedule(@PathVariable Long classId, @PathVariable Long semesterId, @PathVariable Integer courseHours) + { + String result = eduCourseScheduleService.autoSchedule(classId, semesterId, courseHours); + if ("AUTO_SCHEDULE_NOT_IMPLEMENTED".equals(result)) + { + return error("自动排课功能暂未实现"); + } + return success("自动排课完成"); + } + + /** + * 获取时间段统计信息 + */ + @PreAuthorize("@ss.hasPermi('education:schedule:query')") + @GetMapping("/statistics/{semesterId}") + public AjaxResult getStatistics(@PathVariable Long semesterId) + { + return success(eduCourseScheduleService.getTimeSlotStatistics(semesterId)); + } + + /** + * 获取节次校验错误信息 + */ + private AjaxResult getPeriodErrorMessage(String periodResult) + { + switch (periodResult) + { + case "INVALID_WEEKDAY": + return error("星期几必须在1-7之间"); + case "INVALID_PERIOD_START": + return error("开始节次必须在1-12之间"); + case "INVALID_PERIOD_END": + return error("结束节次必须在1-12之间"); + case "PERIOD_START_AFTER_END": + return error("开始节次不能大于结束节次"); + case "PERIOD_TOO_LONG": + return error("单次课程最多不能超过4节课"); + default: + return error("节次设置无效"); + } + } + + /** + * 获取周次校验错误信息 + */ + private AjaxResult getWeeksErrorMessage(String weeksResult) + { + switch (weeksResult) + { + case "INVALID_FORMAT": + return error("周次格式不正确,应为数字、逗号、减号的组合"); + case "INVALID_RANGE": + return error("周次范围格式不正确"); + case "INVALID_WEEK_NUMBER": + return error("周次必须在1-25之间"); + case "INVALID_NUMBER": + return error("周次必须为数字"); + default: + return error("周次设置无效"); + } + } + + /** + * 获取冲突校验错误信息 + */ + private AjaxResult getConflictErrorMessage(String conflictResult) + { + switch (conflictResult) + { + case "CLASSROOM_CONFLICT": + return error("教室时间冲突"); + case "TEACHER_CONFLICT": + return error("教师时间冲突"); + default: + return error("时间冲突"); + } + } + + /** + * 获取节次校验错误文本 + */ + private String getPeriodErrorText(String periodResult) + { + switch (periodResult) + { + case "INVALID_WEEKDAY": + return "星期几必须在1-7之间"; + case "INVALID_PERIOD_START": + return "开始节次必须在1-12之间"; + case "INVALID_PERIOD_END": + return "结束节次必须在1-12之间"; + case "PERIOD_START_AFTER_END": + return "开始节次不能大于结束节次"; + case "PERIOD_TOO_LONG": + return "单次课程最多不能超过4节课"; + default: + return "节次设置无效"; + } + } + + /** + * 获取周次校验错误文本 + */ + private String getWeeksErrorText(String weeksResult) + { + switch (weeksResult) + { + case "INVALID_FORMAT": + return "周次格式不正确"; + case "INVALID_RANGE": + return "周次范围格式不正确"; + case "INVALID_WEEK_NUMBER": + return "周次必须在1-25之间"; + case "INVALID_NUMBER": + return "周次必须为数字"; + default: + return "周次设置无效"; + } + } + + /** + * 获取冲突校验错误文本 + */ + private String getConflictErrorText(String conflictResult) + { + switch (conflictResult) + { + case "CLASSROOM_CONFLICT": + return "教室时间冲突"; + case "TEACHER_CONFLICT": + return "教师时间冲突"; + default: + return "时间冲突"; + } + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduSemesterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduSemesterController.java new file mode 100644 index 0000000..f1a5f91 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/education/EduSemesterController.java @@ -0,0 +1,201 @@ +package com.ruoyi.web.controller.education; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +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.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.education.domain.EduSemester; +import com.ruoyi.education.service.IEduSemesterService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.StringUtils; + +/** + * 学期信息Controller + * + * @author ruoyi + * @date 2024-09-26 + */ +@RestController +@RequestMapping("/education/semester") +public class EduSemesterController extends BaseController +{ + @Autowired + private IEduSemesterService eduSemesterService; + + /** + * 查询学期信息列表 + */ + @PreAuthorize("@ss.hasPermi('education:semester:list')") + @GetMapping("/list") + public TableDataInfo list(EduSemester eduSemester) + { + startPage(); + List list = eduSemesterService.selectEduSemesterList(eduSemester); + return getDataTable(list); + } + + /** + * 导出学期信息列表 + */ + @PreAuthorize("@ss.hasPermi('education:semester:export')") + @Log(title = "学期信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EduSemester eduSemester) + { + List list = eduSemesterService.selectEduSemesterList(eduSemester); + ExcelUtil util = new ExcelUtil(EduSemester.class); + util.exportExcel(response, list, "学期信息数据"); + } + + /** + * 获取学期信息详细信息 + */ + @PreAuthorize("@ss.hasPermi('education:semester:query')") + @GetMapping(value = "/{semesterId}") + public AjaxResult getInfo(@PathVariable("semesterId") Long semesterId) + { + return success(eduSemesterService.selectEduSemesterBySemesterId(semesterId)); + } + + /** + * 新增学期信息 + */ + @PreAuthorize("@ss.hasPermi('education:semester:add')") + @Log(title = "学期信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EduSemester eduSemester) + { + if ("NOT_UNIQUE".equals(eduSemesterService.checkSemesterCodeUnique(eduSemester))) + { + return error("新增学期'" + eduSemester.getSemesterName() + "'失败,学期编码已存在"); + } + + String timeConflictResult = eduSemesterService.checkSemesterTimeConflict(eduSemester); + if ("CONFLICT".equals(timeConflictResult)) + { + return error("新增学期'" + eduSemester.getSemesterName() + "'失败,教学时间与其他学期冲突"); + } + else if ("ENROLL_CONFLICT".equals(timeConflictResult)) + { + return error("新增学期'" + eduSemester.getSemesterName() + "'失败,选课时间与其他学期冲突"); + } + + eduSemester.setCreateBy(getUsername()); + return toAjax(eduSemesterService.insertEduSemester(eduSemester)); + } + + /** + * 修改学期信息 + */ + @PreAuthorize("@ss.hasPermi('education:semester:edit')") + @Log(title = "学期信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EduSemester eduSemester) + { + if ("NOT_UNIQUE".equals(eduSemesterService.checkSemesterCodeUnique(eduSemester))) + { + return error("修改学期'" + eduSemester.getSemesterName() + "'失败,学期编码已存在"); + } + + String timeConflictResult = eduSemesterService.checkSemesterTimeConflict(eduSemester); + if ("CONFLICT".equals(timeConflictResult)) + { + return error("修改学期'" + eduSemester.getSemesterName() + "'失败,教学时间与其他学期冲突"); + } + else if ("ENROLL_CONFLICT".equals(timeConflictResult)) + { + return error("修改学期'" + eduSemester.getSemesterName() + "'失败,选课时间与其他学期冲突"); + } + + eduSemester.setUpdateBy(getUsername()); + return toAjax(eduSemesterService.updateEduSemester(eduSemester)); + } + + /** + * 删除学期信息 + */ + @PreAuthorize("@ss.hasPermi('education:semester:remove')") + @Log(title = "学期信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{semesterIds}") + public AjaxResult remove(@PathVariable Long[] semesterIds) + { + return toAjax(eduSemesterService.deleteEduSemesterBySemesterIds(semesterIds)); + } + + /** + * 发布学期 + */ + @PreAuthorize("@ss.hasPermi('education:semester:publish')") + @Log(title = "发布学期", businessType = BusinessType.UPDATE) + @PutMapping("/publish/{semesterId}") + public AjaxResult publishSemester(@PathVariable Long semesterId) + { + EduSemester semester = eduSemesterService.selectEduSemesterBySemesterId(semesterId); + if (StringUtils.isNull(semester)) + { + return error("学期信息不存在"); + } + + if (!"0".equals(semester.getStatus())) + { + return error("只有草稿状态的学期才能发布"); + } + + return toAjax(eduSemesterService.publishSemester(semesterId)); + } + + /** + * 归档学期 + */ + @PreAuthorize("@ss.hasPermi('education:semester:archive')") + @Log(title = "归档学期", businessType = BusinessType.UPDATE) + @PutMapping("/archive/{semesterId}") + public AjaxResult archiveSemester(@PathVariable Long semesterId) + { + EduSemester semester = eduSemesterService.selectEduSemesterBySemesterId(semesterId); + if (StringUtils.isNull(semester)) + { + return error("学期信息不存在"); + } + + if (!"1".equals(semester.getStatus())) + { + return error("只有进行中状态的学期才能归档"); + } + + return toAjax(eduSemesterService.archiveSemester(semesterId)); + } + + /** + * 获取当前学期 + */ + @PreAuthorize("@ss.hasPermi('education:semester:query')") + @GetMapping("/current") + public AjaxResult getCurrentSemester() + { + return success(eduSemesterService.selectCurrentSemester()); + } + + /** + * 获取可选课学期列表 + */ + @PreAuthorize("@ss.hasPermi('education:semester:query')") + @GetMapping("/enrollable") + public AjaxResult getEnrollableSemesters() + { + return success(eduSemesterService.selectEnrollableSemesters()); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduCourseClass.java b/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduCourseClass.java new file mode 100644 index 0000000..73e39cf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduCourseClass.java @@ -0,0 +1,328 @@ +package com.ruoyi.education.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 开课计划对象 edu_course_class + * + * @author ruoyi + * @date 2024-09-26 + */ +public class EduCourseClass extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 开课ID */ + private Long classId; + + /** 课程ID */ + @Excel(name = "课程ID") + private Long courseId; + + /** 学期ID */ + @Excel(name = "学期ID") + private Long semesterId; + + /** 授课教师ID */ + @Excel(name = "授课教师ID") + private Long teacherId; + + /** 班级编号 */ + @Excel(name = "班级编号") + private String classCode; + + /** 容量上限 */ + @Excel(name = "容量上限") + private Integer capacity; + + /** 选课人数上限,0表示同容量 */ + @Excel(name = "选课人数上限") + private Integer enrollLimit; + + /** 已选人数 */ + @Excel(name = "已选人数") + private Integer enrolledCount; + + /** 授课教室 */ + @Excel(name = "授课教室") + private Long classroomId; + + /** 选课开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "选课开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date enrollStartTime; + + /** 选课结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "选课结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date enrollEndTime; + + /** 开课日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开课日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date teachStartDate; + + /** 结课日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结课日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date teachEndDate; + + /** 上课星期描述,例如 周一 */ + @Excel(name = "上课星期") + private String weekday; + + /** 上课节次描述,例如 第1-2节 */ + @Excel(name = "上课节次") + private String timeSlot; + + /** 状态(0待发布 1可选课 2已满额 3已结课) */ + @Excel(name = "状态", readConverterExp = "0=待发布,1=可选课,2=已满额,3=已结课") + private String status; + + /** 课程名称 - 关联查询字段 */ + @Excel(name = "课程名称") + private String courseName; + + /** 课程编码 - 关联查询字段 */ + @Excel(name = "课程编码") + private String courseCode; + + /** 教师姓名 - 关联查询字段 */ + @Excel(name = "教师姓名") + private String teacherName; + + /** 学期名称 - 关联查询字段 */ + @Excel(name = "学期名称") + private String semesterName; + + /** 教室名称 - 关联查询字段 */ + @Excel(name = "教室名称") + private String classroomName; + + public void setClassId(Long classId) + { + this.classId = classId; + } + + public Long getClassId() + { + return classId; + } + public void setCourseId(Long courseId) + { + this.courseId = courseId; + } + + public Long getCourseId() + { + return courseId; + } + public void setSemesterId(Long semesterId) + { + this.semesterId = semesterId; + } + + public Long getSemesterId() + { + return semesterId; + } + public void setTeacherId(Long teacherId) + { + this.teacherId = teacherId; + } + + public Long getTeacherId() + { + return teacherId; + } + public void setClassCode(String classCode) + { + this.classCode = classCode; + } + + public String getClassCode() + { + return classCode; + } + public void setCapacity(Integer capacity) + { + this.capacity = capacity; + } + + public Integer getCapacity() + { + return capacity; + } + public void setEnrollLimit(Integer enrollLimit) + { + this.enrollLimit = enrollLimit; + } + + public Integer getEnrollLimit() + { + return enrollLimit; + } + public void setEnrolledCount(Integer enrolledCount) + { + this.enrolledCount = enrolledCount; + } + + public Integer getEnrolledCount() + { + return enrolledCount; + } + public void setClassroomId(Long classroomId) + { + this.classroomId = classroomId; + } + + public Long getClassroomId() + { + return classroomId; + } + public void setEnrollStartTime(Date enrollStartTime) + { + this.enrollStartTime = enrollStartTime; + } + + public Date getEnrollStartTime() + { + return enrollStartTime; + } + public void setEnrollEndTime(Date enrollEndTime) + { + this.enrollEndTime = enrollEndTime; + } + + public Date getEnrollEndTime() + { + return enrollEndTime; + } + public void setTeachStartDate(Date teachStartDate) + { + this.teachStartDate = teachStartDate; + } + + public Date getTeachStartDate() + { + return teachStartDate; + } + public void setTeachEndDate(Date teachEndDate) + { + this.teachEndDate = teachEndDate; + } + + public Date getTeachEndDate() + { + return teachEndDate; + } + public void setWeekday(String weekday) + { + this.weekday = weekday; + } + + public String getWeekday() + { + return weekday; + } + public void setTimeSlot(String timeSlot) + { + this.timeSlot = timeSlot; + } + + public String getTimeSlot() + { + return timeSlot; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public String getCourseName() + { + return courseName; + } + + public void setCourseName(String courseName) + { + this.courseName = courseName; + } + + public String getCourseCode() + { + return courseCode; + } + + public void setCourseCode(String courseCode) + { + this.courseCode = courseCode; + } + + public String getTeacherName() + { + return teacherName; + } + + public void setTeacherName(String teacherName) + { + this.teacherName = teacherName; + } + + public String getSemesterName() + { + return semesterName; + } + + public void setSemesterName(String semesterName) + { + this.semesterName = semesterName; + } + + public String getClassroomName() + { + return classroomName; + } + + public void setClassroomName(String classroomName) + { + this.classroomName = classroomName; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("classId", getClassId()) + .append("courseId", getCourseId()) + .append("semesterId", getSemesterId()) + .append("teacherId", getTeacherId()) + .append("classCode", getClassCode()) + .append("capacity", getCapacity()) + .append("enrollLimit", getEnrollLimit()) + .append("enrolledCount", getEnrolledCount()) + .append("classroomId", getClassroomId()) + .append("enrollStartTime", getEnrollStartTime()) + .append("enrollEndTime", getEnrollEndTime()) + .append("teachStartDate", getTeachStartDate()) + .append("teachEndDate", getTeachEndDate()) + .append("weekday", getWeekday()) + .append("timeSlot", getTimeSlot()) + .append("status", getStatus()) + .append("remark", getRemark()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduCourseSchedule.java b/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduCourseSchedule.java new file mode 100644 index 0000000..8a34481 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduCourseSchedule.java @@ -0,0 +1,238 @@ +package com.ruoyi.education.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 开课节次安排对象 edu_course_schedule + * + * @author ruoyi + * @date 2024-09-26 + */ +public class EduCourseSchedule extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 节次ID */ + private Long scheduleId; + + /** 开课ID */ + @Excel(name = "开课ID") + private Long classId; + + /** 周几(1-7) */ + @Excel(name = "周几", readConverterExp = "1=周一,2=周二,3=周三,4=周四,5=周五,6=周六,7=周日") + private Integer weekday; + + /** 开始节次 */ + @Excel(name = "开始节次") + private Integer periodStart; + + /** 结束节次 */ + @Excel(name = "结束节次") + private Integer periodEnd; + + /** 上课周次,例如 1-16 */ + @Excel(name = "上课周次") + private String weeks; + + /** 教室ID */ + @Excel(name = "教室ID") + private Long classroomId; + + /** 班级编号 - 关联查询字段 */ + @Excel(name = "班级编号") + private String classCode; + + /** 课程名称 - 关联查询字段 */ + @Excel(name = "课程名称") + private String courseName; + + /** 课程编码 - 关联查询字段 */ + @Excel(name = "课程编码") + private String courseCode; + + /** 教师姓名 - 关联查询字段 */ + @Excel(name = "教师姓名") + private String teacherName; + + /** 学期名称 - 关联查询字段 */ + @Excel(name = "学期名称") + private String semesterName; + + /** 教室名称 - 关联查询字段 */ + @Excel(name = "教室名称") + private String classroomName; + + /** 星期描述 - 关联查询字段 */ + @Excel(name = "星期") + private String weekdayName; + + /** 节次描述 - 关联查询字段 */ + @Excel(name = "节次") + private String periodName; + + public void setScheduleId(Long scheduleId) + { + this.scheduleId = scheduleId; + } + + public Long getScheduleId() + { + return scheduleId; + } + public void setClassId(Long classId) + { + this.classId = classId; + } + + public Long getClassId() + { + return classId; + } + public void setWeekday(Integer weekday) + { + this.weekday = weekday; + } + + public Integer getWeekday() + { + return weekday; + } + public void setPeriodStart(Integer periodStart) + { + this.periodStart = periodStart; + } + + public Integer getPeriodStart() + { + return periodStart; + } + public void setPeriodEnd(Integer periodEnd) + { + this.periodEnd = periodEnd; + } + + public Integer getPeriodEnd() + { + return periodEnd; + } + public void setWeeks(String weeks) + { + this.weeks = weeks; + } + + public String getWeeks() + { + return weeks; + } + public void setClassroomId(Long classroomId) + { + this.classroomId = classroomId; + } + + public Long getClassroomId() + { + return classroomId; + } + + public String getClassCode() + { + return classCode; + } + + public void setClassCode(String classCode) + { + this.classCode = classCode; + } + + public String getCourseName() + { + return courseName; + } + + public void setCourseName(String courseName) + { + this.courseName = courseName; + } + + public String getCourseCode() + { + return courseCode; + } + + public void setCourseCode(String courseCode) + { + this.courseCode = courseCode; + } + + public String getTeacherName() + { + return teacherName; + } + + public void setTeacherName(String teacherName) + { + this.teacherName = teacherName; + } + + public String getSemesterName() + { + return semesterName; + } + + public void setSemesterName(String semesterName) + { + this.semesterName = semesterName; + } + + public String getClassroomName() + { + return classroomName; + } + + public void setClassroomName(String classroomName) + { + this.classroomName = classroomName; + } + + public String getWeekdayName() + { + return weekdayName; + } + + public void setWeekdayName(String weekdayName) + { + this.weekdayName = weekdayName; + } + + public String getPeriodName() + { + return periodName; + } + + public void setPeriodName(String periodName) + { + this.periodName = periodName; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("scheduleId", getScheduleId()) + .append("classId", getClassId()) + .append("weekday", getWeekday()) + .append("periodStart", getPeriodStart()) + .append("periodEnd", getPeriodEnd()) + .append("weeks", getWeeks()) + .append("classroomId", getClassroomId()) + .append("remark", getRemark()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduSemester.java b/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduSemester.java new file mode 100644 index 0000000..5670957 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/domain/EduSemester.java @@ -0,0 +1,146 @@ +package com.ruoyi.education.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 学期信息对象 edu_semester + * + * @author ruoyi + * @date 2024-09-26 + */ +public class EduSemester extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 学期ID */ + private Long semesterId; + + /** 学期编码,例如 2024-2025-1 */ + @Excel(name = "学期编码") + private String semesterCode; + + /** 学期名称 */ + @Excel(name = "学期名称") + private String semesterName; + + /** 教学开始日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "教学开始日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date startDate; + + /** 教学结束日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "教学结束日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date endDate; + + /** 统一选课开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "选课开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date enrollStartTime; + + /** 统一选课结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "选课结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date enrollEndTime; + + /** 状态(0草稿 1进行中 2已归档) */ + @Excel(name = "状态", readConverterExp = "0=草稿,1=进行中,2=已归档") + private String status; + + public void setSemesterId(Long semesterId) + { + this.semesterId = semesterId; + } + + public Long getSemesterId() + { + return semesterId; + } + public void setSemesterCode(String semesterCode) + { + this.semesterCode = semesterCode; + } + + public String getSemesterCode() + { + return semesterCode; + } + public void setSemesterName(String semesterName) + { + this.semesterName = semesterName; + } + + public String getSemesterName() + { + return semesterName; + } + public void setStartDate(Date startDate) + { + this.startDate = startDate; + } + + public Date getStartDate() + { + return startDate; + } + public void setEndDate(Date endDate) + { + this.endDate = endDate; + } + + public Date getEndDate() + { + return endDate; + } + public void setEnrollStartTime(Date enrollStartTime) + { + this.enrollStartTime = enrollStartTime; + } + + public Date getEnrollStartTime() + { + return enrollStartTime; + } + public void setEnrollEndTime(Date enrollEndTime) + { + this.enrollEndTime = enrollEndTime; + } + + public Date getEnrollEndTime() + { + return enrollEndTime; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("semesterId", getSemesterId()) + .append("semesterCode", getSemesterCode()) + .append("semesterName", getSemesterName()) + .append("startDate", getStartDate()) + .append("endDate", getEndDate()) + .append("enrollStartTime", getEnrollStartTime()) + .append("enrollEndTime", getEnrollEndTime()) + .append("status", getStatus()) + .append("remark", getRemark()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduCourseClassMapper.java b/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduCourseClassMapper.java new file mode 100644 index 0000000..1697544 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduCourseClassMapper.java @@ -0,0 +1,155 @@ +package com.ruoyi.education.mapper; + +import java.util.List; +import com.ruoyi.education.domain.EduCourseClass; + +/** + * 开课计划Mapper接口 + * + * @author ruoyi + * @date 2024-09-26 + */ +public interface EduCourseClassMapper +{ + /** + * 查询开课计划 + * + * @param classId 开课计划主键 + * @return 开课计划 + */ + public EduCourseClass selectEduCourseClassByClassId(Long classId); + + /** + * 查询开课计划列表 + * + * @param eduCourseClass 开课计划 + * @return 开课计划集合 + */ + public List selectEduCourseClassList(EduCourseClass eduCourseClass); + + /** + * 新增开课计划 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public int insertEduCourseClass(EduCourseClass eduCourseClass); + + /** + * 修改开课计划 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public int updateEduCourseClass(EduCourseClass eduCourseClass); + + /** + * 删除开课计划 + * + * @param classId 开课计划主键 + * @return 结果 + */ + public int deleteEduCourseClassByClassId(Long classId); + + /** + * 批量删除开课计划 + * + * @param classIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEduCourseClassByClassIds(Long[] classIds); + + /** + * 根据班级编号查询开课计划 + * + * @param classCode 班级编号 + * @return 开课计划 + */ + public EduCourseClass selectEduCourseClassByClassCode(String classCode); + + /** + * 查询指定学期的开课计划 + * + * @param semesterId 学期ID + * @return 开课计划集合 + */ + public List selectCourseClassBySemester(Long semesterId); + + /** + * 查询指定教师的开课计划 + * + * @param teacherId 教师ID + * @return 开课计划集合 + */ + public List selectCourseClassByTeacher(Long teacherId); + + /** + * 查询可选课的开课计划 + * + * @return 开课计划集合 + */ + public List selectEnrollableCourseClasses(); + + /** + * 查询教室在指定时间的课程安排冲突 + * + * @param classroomId 教室ID + * @param weekday 星期几 + * @param timeSlot 时间段 + * @param semesterId 学期ID + * @param excludeClassId 排除的课程班级ID + * @return 冲突的课程数量 + */ + public int checkClassroomConflict(Long classroomId, String weekday, String timeSlot, Long semesterId, Long excludeClassId); + + /** + * 查询教师在指定时间的课程安排冲突 + * + * @param teacherId 教师ID + * @param weekday 星期几 + * @param timeSlot 时间段 + * @param semesterId 学期ID + * @param excludeClassId 排除的课程班级ID + * @return 冲突的课程数量 + */ + public int checkTeacherConflict(Long teacherId, String weekday, String timeSlot, Long semesterId, Long excludeClassId); + + /** + * 更新已选课人数 + * + * @param classId 班级ID + * @param enrolledCount 已选人数 + * @return 结果 + */ + public int updateEnrolledCount(Long classId, Integer enrolledCount); + + /** + * 批量更新开课计划状态 + * + * @param classIds 班级ID数组 + * @param status 状态 + * @return 结果 + */ + public int batchUpdateStatus(Long[] classIds, String status); + + /** + * 获取课程列表用于下拉选择 + * + * @return 课程选项集合 + */ + public List getCourseOptions(); + + /** + * 获取教师列表用于下拉选择 + * + * @return 教师选项集合 + */ + public List getTeacherOptions(); + + /** + * 获取教室列表用于下拉选择 + * + * @return 教室选项集合 + */ + public List getClassroomOptions(); +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduCourseScheduleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduCourseScheduleMapper.java new file mode 100644 index 0000000..7632bf5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduCourseScheduleMapper.java @@ -0,0 +1,155 @@ +package com.ruoyi.education.mapper; + +import java.util.List; +import com.ruoyi.education.domain.EduCourseSchedule; + +/** + * 开课节次安排Mapper接口 + * + * @author ruoyi + * @date 2024-09-26 + */ +public interface EduCourseScheduleMapper +{ + /** + * 查询开课节次安排 + * + * @param scheduleId 开课节次安排主键 + * @return 开课节次安排 + */ + public EduCourseSchedule selectEduCourseScheduleByScheduleId(Long scheduleId); + + /** + * 查询开课节次安排列表 + * + * @param eduCourseSchedule 开课节次安排 + * @return 开课节次安排集合 + */ + public List selectEduCourseScheduleList(EduCourseSchedule eduCourseSchedule); + + /** + * 新增开课节次安排 + * + * @param eduCourseSchedule 开课节次安排 + * @return 结果 + */ + public int insertEduCourseSchedule(EduCourseSchedule eduCourseSchedule); + + /** + * 修改开课节次安排 + * + * @param eduCourseSchedule 开课节次安排 + * @return 结果 + */ + public int updateEduCourseSchedule(EduCourseSchedule eduCourseSchedule); + + /** + * 删除开课节次安排 + * + * @param scheduleId 开课节次安排主键 + * @return 结果 + */ + public int deleteEduCourseScheduleByScheduleId(Long scheduleId); + + /** + * 批量删除开课节次安排 + * + * @param scheduleIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEduCourseScheduleByScheduleIds(Long[] scheduleIds); + + /** + * 根据开课ID查询节次安排 + * + * @param classId 开课ID + * @return 节次安排集合 + */ + public List selectScheduleByClassId(Long classId); + + /** + * 根据开课ID删除节次安排 + * + * @param classId 开课ID + * @return 结果 + */ + public int deleteScheduleByClassId(Long classId); + + /** + * 查询指定教室的课程安排 + * + * @param classroomId 教室ID + * @param semesterId 学期ID + * @return 课程安排集合 + */ + public List selectScheduleByClassroom(Long classroomId, Long semesterId); + + /** + * 查询指定教师的课程安排 + * + * @param teacherId 教师ID + * @param semesterId 学期ID + * @return 课程安排集合 + */ + public List selectScheduleByTeacher(Long teacherId, Long semesterId); + + /** + * 查询指定学期的所有课程安排 + * + * @param semesterId 学期ID + * @return 课程安排集合 + */ + public List selectScheduleBySemester(Long semesterId); + + /** + * 检查时间冲突 - 教室维度 + * + * @param classroomId 教室ID + * @param weekday 星期几 + * @param periodStart 开始节次 + * @param periodEnd 结束节次 + * @param weeks 上课周次 + * @param excludeScheduleId 排除的节次安排ID + * @return 冲突的安排数量 + */ + public int checkClassroomTimeConflict(Long classroomId, Integer weekday, Integer periodStart, Integer periodEnd, String weeks, Long excludeScheduleId); + + /** + * 检查时间冲突 - 教师维度 + * + * @param teacherId 教师ID + * @param weekday 星期几 + * @param periodStart 开始节次 + * @param periodEnd 结束节次 + * @param weeks 上课周次 + * @param excludeScheduleId 排除的节次安排ID + * @return 冲突的安排数量 + */ + public int checkTeacherTimeConflict(Long teacherId, Integer weekday, Integer periodStart, Integer periodEnd, String weeks, Long excludeScheduleId); + + /** + * 生成课表数据 - 按教室 + * + * @param classroomId 教室ID + * @param semesterId 学期ID + * @return 课表数据 + */ + public List generateClassroomTimetable(Long classroomId, Long semesterId); + + /** + * 生成课表数据 - 按教师 + * + * @param teacherId 教师ID + * @param semesterId 学期ID + * @return 课表数据 + */ + public List generateTeacherTimetable(Long teacherId, Long semesterId); + + /** + * 批量插入节次安排 + * + * @param scheduleList 节次安排列表 + * @return 结果 + */ + public int batchInsertSchedule(List scheduleList); +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduSemesterMapper.java b/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduSemesterMapper.java new file mode 100644 index 0000000..43e95c1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/mapper/EduSemesterMapper.java @@ -0,0 +1,83 @@ +package com.ruoyi.education.mapper; + +import java.util.List; +import com.ruoyi.education.domain.EduSemester; + +/** + * 学期信息Mapper接口 + * + * @author ruoyi + * @date 2024-09-26 + */ +public interface EduSemesterMapper +{ + /** + * 查询学期信息 + * + * @param semesterId 学期信息主键 + * @return 学期信息 + */ + public EduSemester selectEduSemesterBySemesterId(Long semesterId); + + /** + * 查询学期信息列表 + * + * @param eduSemester 学期信息 + * @return 学期信息集合 + */ + public List selectEduSemesterList(EduSemester eduSemester); + + /** + * 新增学期信息 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + public int insertEduSemester(EduSemester eduSemester); + + /** + * 修改学期信息 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + public int updateEduSemester(EduSemester eduSemester); + + /** + * 删除学期信息 + * + * @param semesterId 学期信息主键 + * @return 结果 + */ + public int deleteEduSemesterBySemesterId(Long semesterId); + + /** + * 批量删除学期信息 + * + * @param semesterIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEduSemesterBySemesterIds(Long[] semesterIds); + + /** + * 根据学期编码查询学期信息 + * + * @param semesterCode 学期编码 + * @return 学期信息 + */ + public EduSemester selectEduSemesterBySemesterCode(String semesterCode); + + /** + * 查询当前进行中的学期 + * + * @return 当前学期信息 + */ + public EduSemester selectCurrentSemester(); + + /** + * 查询可选课的学期列表 + * + * @return 学期信息集合 + */ + public List selectEnrollableSemesters(); +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduCourseClassService.java b/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduCourseClassService.java new file mode 100644 index 0000000..fb87f43 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduCourseClassService.java @@ -0,0 +1,203 @@ +package com.ruoyi.education.service; + +import java.util.List; +import com.ruoyi.education.domain.EduCourseClass; + +/** + * 开课计划Service接口 + * + * @author ruoyi + * @date 2024-09-26 + */ +public interface IEduCourseClassService +{ + /** + * 查询开课计划 + * + * @param classId 开课计划主键 + * @return 开课计划 + */ + public EduCourseClass selectEduCourseClassByClassId(Long classId); + + /** + * 查询开课计划列表 + * + * @param eduCourseClass 开课计划 + * @return 开课计划集合 + */ + public List selectEduCourseClassList(EduCourseClass eduCourseClass); + + /** + * 新增开课计划 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public int insertEduCourseClass(EduCourseClass eduCourseClass); + + /** + * 修改开课计划 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public int updateEduCourseClass(EduCourseClass eduCourseClass); + + /** + * 批量删除开课计划 + * + * @param classIds 需要删除的开课计划主键集合 + * @return 结果 + */ + public int deleteEduCourseClassByClassIds(Long[] classIds); + + /** + * 删除开课计划信息 + * + * @param classId 开课计划主键 + * @return 结果 + */ + public int deleteEduCourseClassByClassId(Long classId); + + /** + * 根据班级编号查询开课计划 + * + * @param classCode 班级编号 + * @return 开课计划 + */ + public EduCourseClass selectEduCourseClassByClassCode(String classCode); + + /** + * 查询指定学期的开课计划 + * + * @param semesterId 学期ID + * @return 开课计划集合 + */ + public List selectCourseClassBySemester(Long semesterId); + + /** + * 查询指定教师的开课计划 + * + * @param teacherId 教师ID + * @return 开课计划集合 + */ + public List selectCourseClassByTeacher(Long teacherId); + + /** + * 查询可选课的开课计划 + * + * @return 开课计划集合 + */ + public List selectEnrollableCourseClasses(); + + /** + * 发布开课计划(将状态改为可选课) + * + * @param classId 开课计划ID + * @return 结果 + */ + public int publishCourseClass(Long classId); + + /** + * 批量发布开课计划 + * + * @param classIds 开课计划ID数组 + * @return 结果 + */ + public int batchPublishCourseClass(Long[] classIds); + + /** + * 停止选课(将状态改为已满额) + * + * @param classId 开课计划ID + * @return 结果 + */ + public int stopEnrollment(Long classId); + + /** + * 结课(将状态改为已结课) + * + * @param classId 开课计划ID + * @return 结果 + */ + public int finishCourse(Long classId); + + /** + * 校验班级编号是否唯一 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public String checkClassCodeUnique(EduCourseClass eduCourseClass); + + /** + * 校验容量设置是否合理 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public String checkCapacityValid(EduCourseClass eduCourseClass); + + /** + * 校验教室时间冲突 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public String checkClassroomConflict(EduCourseClass eduCourseClass); + + /** + * 校验教师时间冲突 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + public String checkTeacherConflict(EduCourseClass eduCourseClass); + + /** + * 更新已选课人数 + * + * @param classId 班级ID + * @param enrolledCount 已选人数 + * @return 结果 + */ + public int updateEnrolledCount(Long classId, Integer enrolledCount); + + /** + * 调整容量 + * + * @param classId 班级ID + * @param newCapacity 新容量 + * @return 结果 + */ + public int adjustCapacity(Long classId, Integer newCapacity); + + /** + * 获取开课计划统计信息 + * + * @param semesterId 学期ID + * @return 统计结果 + */ + public Object getCourseClassStatistics(Long semesterId); + + /** + * 获取课程列表用于下拉选择 + * + * @return 课程选项集合 + */ + public List getCourseOptions(); + + /** + * 获取教师列表用于下拉选择 + * + * @return 教师选项集合 + */ + public List getTeacherOptions(); + + /** + * 获取教室列表用于下拉选择 + * + * @return 教室选项集合 + */ + public List getClassroomOptions(); +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduCourseScheduleService.java b/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduCourseScheduleService.java new file mode 100644 index 0000000..3a8d92d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduCourseScheduleService.java @@ -0,0 +1,197 @@ +package com.ruoyi.education.service; + +import java.util.List; +import com.ruoyi.education.domain.EduCourseSchedule; + +/** + * 开课节次安排Service接口 + * + * @author ruoyi + * @date 2024-09-26 + */ +public interface IEduCourseScheduleService +{ + /** + * 查询开课节次安排 + * + * @param scheduleId 开课节次安排主键 + * @return 开课节次安排 + */ + public EduCourseSchedule selectEduCourseScheduleByScheduleId(Long scheduleId); + + /** + * 查询开课节次安排列表 + * + * @param eduCourseSchedule 开课节次安排 + * @return 开课节次安排集合 + */ + public List selectEduCourseScheduleList(EduCourseSchedule eduCourseSchedule); + + /** + * 新增开课节次安排 + * + * @param eduCourseSchedule 开课节次安排 + * @return 结果 + */ + public int insertEduCourseSchedule(EduCourseSchedule eduCourseSchedule); + + /** + * 修改开课节次安排 + * + * @param eduCourseSchedule 开课节次安排 + * @return 结果 + */ + public int updateEduCourseSchedule(EduCourseSchedule eduCourseSchedule); + + /** + * 批量删除开课节次安排 + * + * @param scheduleIds 需要删除的开课节次安排主键集合 + * @return 结果 + */ + public int deleteEduCourseScheduleByScheduleIds(Long[] scheduleIds); + + /** + * 删除开课节次安排信息 + * + * @param scheduleId 开课节次安排主键 + * @return 结果 + */ + public int deleteEduCourseScheduleByScheduleId(Long scheduleId); + + /** + * 根据开课ID查询节次安排 + * + * @param classId 开课ID + * @return 节次安排集合 + */ + public List selectScheduleByClassId(Long classId); + + /** + * 根据开课ID删除节次安排 + * + * @param classId 开课ID + * @return 结果 + */ + public int deleteScheduleByClassId(Long classId); + + /** + * 查询指定教室的课程安排 + * + * @param classroomId 教室ID + * @param semesterId 学期ID + * @return 课程安排集合 + */ + public List selectScheduleByClassroom(Long classroomId, Long semesterId); + + /** + * 查询指定教师的课程安排 + * + * @param teacherId 教师ID + * @param semesterId 学期ID + * @return 课程安排集合 + */ + public List selectScheduleByTeacher(Long teacherId, Long semesterId); + + /** + * 查询指定学期的所有课程安排 + * + * @param semesterId 学期ID + * @return 课程安排集合 + */ + public List selectScheduleBySemester(Long semesterId); + + /** + * 检查时间冲突 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + public String checkTimeConflict(EduCourseSchedule eduCourseSchedule); + + /** + * 检查教室时间冲突 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + public String checkClassroomTimeConflict(EduCourseSchedule eduCourseSchedule); + + /** + * 检查教师时间冲突 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + public String checkTeacherTimeConflict(EduCourseSchedule eduCourseSchedule); + + /** + * 校验节次设置是否合理 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + public String checkPeriodValid(EduCourseSchedule eduCourseSchedule); + + /** + * 生成课表数据 - 按教室 + * + * @param classroomId 教室ID + * @param semesterId 学期ID + * @return 课表数据 + */ + public List generateClassroomTimetable(Long classroomId, Long semesterId); + + /** + * 生成课表数据 - 按教师 + * + * @param teacherId 教师ID + * @param semesterId 学期ID + * @return 课表数据 + */ + public List generateTeacherTimetable(Long teacherId, Long semesterId); + + /** + * 批量添加节次安排 + * + * @param classId 开课ID + * @param scheduleList 节次安排列表 + * @return 结果 + */ + public int batchAddSchedule(Long classId, List scheduleList); + + /** + * 复制节次安排 + * + * @param sourceClassId 源开课ID + * @param targetClassId 目标开课ID + * @return 结果 + */ + public int copySchedule(Long sourceClassId, Long targetClassId); + + /** + * 自动排课 + * + * @param classId 开课ID + * @param semesterId 学期ID + * @param courseHours 课程总学时 + * @return 结果 + */ + public String autoSchedule(Long classId, Long semesterId, Integer courseHours); + + /** + * 获取时间段统计信息 + * + * @param semesterId 学期ID + * @return 统计结果 + */ + public Object getTimeSlotStatistics(Long semesterId); + + /** + * 检查周次范围是否合理 + * + * @param weeks 周次字符串 + * @return 结果 + */ + public String checkWeeksValid(String weeks); +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduSemesterService.java b/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduSemesterService.java new file mode 100644 index 0000000..b43f5b8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/service/IEduSemesterService.java @@ -0,0 +1,115 @@ +package com.ruoyi.education.service; + +import java.util.List; +import com.ruoyi.education.domain.EduSemester; + +/** + * 学期信息Service接口 + * + * @author ruoyi + * @date 2024-09-26 + */ +public interface IEduSemesterService +{ + /** + * 查询学期信息 + * + * @param semesterId 学期信息主键 + * @return 学期信息 + */ + public EduSemester selectEduSemesterBySemesterId(Long semesterId); + + /** + * 查询学期信息列表 + * + * @param eduSemester 学期信息 + * @return 学期信息集合 + */ + public List selectEduSemesterList(EduSemester eduSemester); + + /** + * 新增学期信息 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + public int insertEduSemester(EduSemester eduSemester); + + /** + * 修改学期信息 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + public int updateEduSemester(EduSemester eduSemester); + + /** + * 批量删除学期信息 + * + * @param semesterIds 需要删除的学期信息主键集合 + * @return 结果 + */ + public int deleteEduSemesterBySemesterIds(Long[] semesterIds); + + /** + * 删除学期信息信息 + * + * @param semesterId 学期信息主键 + * @return 结果 + */ + public int deleteEduSemesterBySemesterId(Long semesterId); + + /** + * 根据学期编码查询学期信息 + * + * @param semesterCode 学期编码 + * @return 学期信息 + */ + public EduSemester selectEduSemesterBySemesterCode(String semesterCode); + + /** + * 查询当前进行中的学期 + * + * @return 当前学期信息 + */ + public EduSemester selectCurrentSemester(); + + /** + * 查询可选课的学期列表 + * + * @return 学期信息集合 + */ + public List selectEnrollableSemesters(); + + /** + * 发布学期(将状态改为进行中) + * + * @param semesterId 学期ID + * @return 结果 + */ + public int publishSemester(Long semesterId); + + /** + * 归档学期(将状态改为已归档) + * + * @param semesterId 学期ID + * @return 结果 + */ + public int archiveSemester(Long semesterId); + + /** + * 校验学期编码是否唯一 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + public String checkSemesterCodeUnique(EduSemester eduSemester); + + /** + * 校验学期时间是否冲突 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + public String checkSemesterTimeConflict(EduSemester eduSemester); +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduCourseClassServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduCourseClassServiceImpl.java new file mode 100644 index 0000000..8f3ec7a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduCourseClassServiceImpl.java @@ -0,0 +1,450 @@ +package com.ruoyi.education.service.impl; + +import java.util.List; +import java.util.HashMap; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.education.mapper.EduCourseClassMapper; +import com.ruoyi.education.domain.EduCourseClass; +import com.ruoyi.education.service.IEduCourseClassService; + +/** + * 开课计划Service业务层处理 + * + * @author ruoyi + * @date 2024-09-26 + */ +@Service +public class EduCourseClassServiceImpl implements IEduCourseClassService +{ + @Autowired + private EduCourseClassMapper eduCourseClassMapper; + + /** + * 查询开课计划 + * + * @param classId 开课计划主键 + * @return 开课计划 + */ + @Override + public EduCourseClass selectEduCourseClassByClassId(Long classId) + { + return eduCourseClassMapper.selectEduCourseClassByClassId(classId); + } + + /** + * 查询开课计划列表 + * + * @param eduCourseClass 开课计划 + * @return 开课计划 + */ + @Override + public List selectEduCourseClassList(EduCourseClass eduCourseClass) + { + return eduCourseClassMapper.selectEduCourseClassList(eduCourseClass); + } + + /** + * 新增开课计划 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + @Override + public int insertEduCourseClass(EduCourseClass eduCourseClass) + { + if (eduCourseClass.getEnrolledCount() == null) + { + eduCourseClass.setEnrolledCount(0); + } + if (eduCourseClass.getStatus() == null) + { + eduCourseClass.setStatus("0"); + } + eduCourseClass.setCreateTime(DateUtils.getNowDate()); + return eduCourseClassMapper.insertEduCourseClass(eduCourseClass); + } + + /** + * 修改开课计划 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + @Override + public int updateEduCourseClass(EduCourseClass eduCourseClass) + { + eduCourseClass.setUpdateTime(DateUtils.getNowDate()); + return eduCourseClassMapper.updateEduCourseClass(eduCourseClass); + } + + /** + * 批量删除开课计划 + * + * @param classIds 需要删除的开课计划主键 + * @return 结果 + */ + @Override + public int deleteEduCourseClassByClassIds(Long[] classIds) + { + return eduCourseClassMapper.deleteEduCourseClassByClassIds(classIds); + } + + /** + * 删除开课计划信息 + * + * @param classId 开课计划主键 + * @return 结果 + */ + @Override + public int deleteEduCourseClassByClassId(Long classId) + { + return eduCourseClassMapper.deleteEduCourseClassByClassId(classId); + } + + /** + * 根据班级编号查询开课计划 + * + * @param classCode 班级编号 + * @return 开课计划 + */ + @Override + public EduCourseClass selectEduCourseClassByClassCode(String classCode) + { + return eduCourseClassMapper.selectEduCourseClassByClassCode(classCode); + } + + /** + * 查询指定学期的开课计划 + * + * @param semesterId 学期ID + * @return 开课计划集合 + */ + @Override + public List selectCourseClassBySemester(Long semesterId) + { + return eduCourseClassMapper.selectCourseClassBySemester(semesterId); + } + + /** + * 查询指定教师的开课计划 + * + * @param teacherId 教师ID + * @return 开课计划集合 + */ + @Override + public List selectCourseClassByTeacher(Long teacherId) + { + return eduCourseClassMapper.selectCourseClassByTeacher(teacherId); + } + + /** + * 查询可选课的开课计划 + * + * @return 开课计划集合 + */ + @Override + public List selectEnrollableCourseClasses() + { + return eduCourseClassMapper.selectEnrollableCourseClasses(); + } + + /** + * 发布开课计划(将状态改为可选课) + * + * @param classId 开课计划ID + * @return 结果 + */ + @Override + public int publishCourseClass(Long classId) + { + EduCourseClass courseClass = new EduCourseClass(); + courseClass.setClassId(classId); + courseClass.setStatus("1"); + courseClass.setUpdateBy(SecurityUtils.getUsername()); + courseClass.setUpdateTime(DateUtils.getNowDate()); + return eduCourseClassMapper.updateEduCourseClass(courseClass); + } + + /** + * 批量发布开课计划 + * + * @param classIds 开课计划ID数组 + * @return 结果 + */ + @Override + public int batchPublishCourseClass(Long[] classIds) + { + return eduCourseClassMapper.batchUpdateStatus(classIds, "1"); + } + + /** + * 停止选课(将状态改为已满额) + * + * @param classId 开课计划ID + * @return 结果 + */ + @Override + public int stopEnrollment(Long classId) + { + EduCourseClass courseClass = new EduCourseClass(); + courseClass.setClassId(classId); + courseClass.setStatus("2"); + courseClass.setUpdateBy(SecurityUtils.getUsername()); + courseClass.setUpdateTime(DateUtils.getNowDate()); + return eduCourseClassMapper.updateEduCourseClass(courseClass); + } + + /** + * 结课(将状态改为已结课) + * + * @param classId 开课计划ID + * @return 结果 + */ + @Override + public int finishCourse(Long classId) + { + EduCourseClass courseClass = new EduCourseClass(); + courseClass.setClassId(classId); + courseClass.setStatus("3"); + courseClass.setUpdateBy(SecurityUtils.getUsername()); + courseClass.setUpdateTime(DateUtils.getNowDate()); + return eduCourseClassMapper.updateEduCourseClass(courseClass); + } + + /** + * 校验班级编号是否唯一 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + @Override + public String checkClassCodeUnique(EduCourseClass eduCourseClass) + { + Long classId = StringUtils.isNull(eduCourseClass.getClassId()) ? -1L : eduCourseClass.getClassId(); + EduCourseClass info = eduCourseClassMapper.selectEduCourseClassByClassCode(eduCourseClass.getClassCode()); + if (StringUtils.isNotNull(info) && info.getClassId().longValue() != classId.longValue()) + { + return "NOT_UNIQUE"; + } + return "UNIQUE"; + } + + /** + * 校验容量设置是否合理 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + @Override + public String checkCapacityValid(EduCourseClass eduCourseClass) + { + if (eduCourseClass.getCapacity() == null || eduCourseClass.getCapacity() <= 0) + { + return "INVALID_CAPACITY"; + } + + if (eduCourseClass.getEnrollLimit() != null && eduCourseClass.getEnrollLimit() > 0) + { + if (eduCourseClass.getEnrollLimit() > eduCourseClass.getCapacity()) + { + return "ENROLL_LIMIT_EXCEED_CAPACITY"; + } + } + + if (eduCourseClass.getEnrolledCount() != null && eduCourseClass.getEnrolledCount() > 0) + { + Integer limit = eduCourseClass.getEnrollLimit() != null && eduCourseClass.getEnrollLimit() > 0 + ? eduCourseClass.getEnrollLimit() : eduCourseClass.getCapacity(); + if (eduCourseClass.getEnrolledCount() > limit) + { + return "ENROLLED_EXCEED_LIMIT"; + } + } + + return "VALID"; + } + + /** + * 校验教室时间冲突 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + @Override + public String checkClassroomConflict(EduCourseClass eduCourseClass) + { + if (eduCourseClass.getClassroomId() == null || StringUtils.isEmpty(eduCourseClass.getWeekday()) + || StringUtils.isEmpty(eduCourseClass.getTimeSlot()) || eduCourseClass.getSemesterId() == null) + { + return "NO_CONFLICT"; + } + + int conflictCount = eduCourseClassMapper.checkClassroomConflict( + eduCourseClass.getClassroomId(), + eduCourseClass.getWeekday(), + eduCourseClass.getTimeSlot(), + eduCourseClass.getSemesterId(), + eduCourseClass.getClassId() + ); + + return conflictCount > 0 ? "CONFLICT" : "NO_CONFLICT"; + } + + /** + * 校验教师时间冲突 + * + * @param eduCourseClass 开课计划 + * @return 结果 + */ + @Override + public String checkTeacherConflict(EduCourseClass eduCourseClass) + { + if (eduCourseClass.getTeacherId() == null || StringUtils.isEmpty(eduCourseClass.getWeekday()) + || StringUtils.isEmpty(eduCourseClass.getTimeSlot()) || eduCourseClass.getSemesterId() == null) + { + return "NO_CONFLICT"; + } + + int conflictCount = eduCourseClassMapper.checkTeacherConflict( + eduCourseClass.getTeacherId(), + eduCourseClass.getWeekday(), + eduCourseClass.getTimeSlot(), + eduCourseClass.getSemesterId(), + eduCourseClass.getClassId() + ); + + return conflictCount > 0 ? "CONFLICT" : "NO_CONFLICT"; + } + + /** + * 更新已选课人数 + * + * @param classId 班级ID + * @param enrolledCount 已选人数 + * @return 结果 + */ + @Override + public int updateEnrolledCount(Long classId, Integer enrolledCount) + { + return eduCourseClassMapper.updateEnrolledCount(classId, enrolledCount); + } + + /** + * 调整容量 + * + * @param classId 班级ID + * @param newCapacity 新容量 + * @return 结果 + */ + @Override + public int adjustCapacity(Long classId, Integer newCapacity) + { + EduCourseClass courseClass = eduCourseClassMapper.selectEduCourseClassByClassId(classId); + if (StringUtils.isNull(courseClass)) + { + return 0; + } + + if (newCapacity < courseClass.getEnrolledCount()) + { + return -1; + } + + EduCourseClass updateClass = new EduCourseClass(); + updateClass.setClassId(classId); + updateClass.setCapacity(newCapacity); + updateClass.setUpdateBy(SecurityUtils.getUsername()); + updateClass.setUpdateTime(DateUtils.getNowDate()); + + return eduCourseClassMapper.updateEduCourseClass(updateClass); + } + + /** + * 获取开课计划统计信息 + * + * @param semesterId 学期ID + * @return 统计结果 + */ + @Override + public Object getCourseClassStatistics(Long semesterId) + { + EduCourseClass queryParam = new EduCourseClass(); + queryParam.setSemesterId(semesterId); + List classList = eduCourseClassMapper.selectEduCourseClassList(queryParam); + + Map statistics = new HashMap<>(); + int totalClasses = classList.size(); + int publishedClasses = 0; + int fullClasses = 0; + int finishedClasses = 0; + int totalCapacity = 0; + int totalEnrolled = 0; + + for (EduCourseClass courseClass : classList) + { + if ("1".equals(courseClass.getStatus()) || "2".equals(courseClass.getStatus())) + { + publishedClasses++; + } + if ("2".equals(courseClass.getStatus())) + { + fullClasses++; + } + if ("3".equals(courseClass.getStatus())) + { + finishedClasses++; + } + + totalCapacity += courseClass.getCapacity() != null ? courseClass.getCapacity() : 0; + totalEnrolled += courseClass.getEnrolledCount() != null ? courseClass.getEnrolledCount() : 0; + } + + statistics.put("totalClasses", totalClasses); + statistics.put("publishedClasses", publishedClasses); + statistics.put("fullClasses", fullClasses); + statistics.put("finishedClasses", finishedClasses); + statistics.put("totalCapacity", totalCapacity); + statistics.put("totalEnrolled", totalEnrolled); + statistics.put("enrollmentRate", totalCapacity > 0 ? (double)totalEnrolled / totalCapacity * 100 : 0); + + return statistics; + } + + /** + * 获取课程列表用于下拉选择 + * + * @return 课程选项集合 + */ + @Override + public List getCourseOptions() + { + return eduCourseClassMapper.getCourseOptions(); + } + + /** + * 获取教师列表用于下拉选择 + * + * @return 教师选项集合 + */ + @Override + public List getTeacherOptions() + { + return eduCourseClassMapper.getTeacherOptions(); + } + + /** + * 获取教室列表用于下拉选择 + * + * @return 教室选项集合 + */ + @Override + public List getClassroomOptions() + { + return eduCourseClassMapper.getClassroomOptions(); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduCourseScheduleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduCourseScheduleServiceImpl.java new file mode 100644 index 0000000..7e43667 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduCourseScheduleServiceImpl.java @@ -0,0 +1,495 @@ +package com.ruoyi.education.service.impl; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.education.mapper.EduCourseScheduleMapper; +import com.ruoyi.education.mapper.EduCourseClassMapper; +import com.ruoyi.education.domain.EduCourseSchedule; +import com.ruoyi.education.domain.EduCourseClass; +import com.ruoyi.education.service.IEduCourseScheduleService; + +/** + * 开课节次安排Service业务层处理 + * + * @author ruoyi + * @date 2024-09-26 + */ +@Service +public class EduCourseScheduleServiceImpl implements IEduCourseScheduleService +{ + @Autowired + private EduCourseScheduleMapper eduCourseScheduleMapper; + + @Autowired + private EduCourseClassMapper eduCourseClassMapper; + + /** + * 查询开课节次安排 + * + * @param scheduleId 开课节次安排主键 + * @return 开课节次安排 + */ + @Override + public EduCourseSchedule selectEduCourseScheduleByScheduleId(Long scheduleId) + { + return eduCourseScheduleMapper.selectEduCourseScheduleByScheduleId(scheduleId); + } + + /** + * 查询开课节次安排列表 + * + * @param eduCourseSchedule 开课节次安排 + * @return 开课节次安排 + */ + @Override + public List selectEduCourseScheduleList(EduCourseSchedule eduCourseSchedule) + { + return eduCourseScheduleMapper.selectEduCourseScheduleList(eduCourseSchedule); + } + + /** + * 新增开课节次安排 + * + * @param eduCourseSchedule 开课节次安排 + * @return 结果 + */ + @Override + public int insertEduCourseSchedule(EduCourseSchedule eduCourseSchedule) + { + eduCourseSchedule.setCreateTime(DateUtils.getNowDate()); + return eduCourseScheduleMapper.insertEduCourseSchedule(eduCourseSchedule); + } + + /** + * 修改开课节次安排 + * + * @param eduCourseSchedule 开课节次安排 + * @return 结果 + */ + @Override + public int updateEduCourseSchedule(EduCourseSchedule eduCourseSchedule) + { + eduCourseSchedule.setUpdateTime(DateUtils.getNowDate()); + return eduCourseScheduleMapper.updateEduCourseSchedule(eduCourseSchedule); + } + + /** + * 批量删除开课节次安排 + * + * @param scheduleIds 需要删除的开课节次安排主键 + * @return 结果 + */ + @Override + public int deleteEduCourseScheduleByScheduleIds(Long[] scheduleIds) + { + return eduCourseScheduleMapper.deleteEduCourseScheduleByScheduleIds(scheduleIds); + } + + /** + * 删除开课节次安排信息 + * + * @param scheduleId 开课节次安排主键 + * @return 结果 + */ + @Override + public int deleteEduCourseScheduleByScheduleId(Long scheduleId) + { + return eduCourseScheduleMapper.deleteEduCourseScheduleByScheduleId(scheduleId); + } + + /** + * 根据开课ID查询节次安排 + * + * @param classId 开课ID + * @return 节次安排集合 + */ + @Override + public List selectScheduleByClassId(Long classId) + { + return eduCourseScheduleMapper.selectScheduleByClassId(classId); + } + + /** + * 根据开课ID删除节次安排 + * + * @param classId 开课ID + * @return 结果 + */ + @Override + public int deleteScheduleByClassId(Long classId) + { + return eduCourseScheduleMapper.deleteScheduleByClassId(classId); + } + + /** + * 查询指定教室的课程安排 + * + * @param classroomId 教室ID + * @param semesterId 学期ID + * @return 课程安排集合 + */ + @Override + public List selectScheduleByClassroom(Long classroomId, Long semesterId) + { + return eduCourseScheduleMapper.selectScheduleByClassroom(classroomId, semesterId); + } + + /** + * 查询指定教师的课程安排 + * + * @param teacherId 教师ID + * @param semesterId 学期ID + * @return 课程安排集合 + */ + @Override + public List selectScheduleByTeacher(Long teacherId, Long semesterId) + { + return eduCourseScheduleMapper.selectScheduleByTeacher(teacherId, semesterId); + } + + /** + * 查询指定学期的所有课程安排 + * + * @param semesterId 学期ID + * @return 课程安排集合 + */ + @Override + public List selectScheduleBySemester(Long semesterId) + { + return eduCourseScheduleMapper.selectScheduleBySemester(semesterId); + } + + /** + * 检查时间冲突 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + @Override + public String checkTimeConflict(EduCourseSchedule eduCourseSchedule) + { + String classroomResult = checkClassroomTimeConflict(eduCourseSchedule); + if (!"NO_CONFLICT".equals(classroomResult)) + { + return classroomResult; + } + + String teacherResult = checkTeacherTimeConflict(eduCourseSchedule); + if (!"NO_CONFLICT".equals(teacherResult)) + { + return teacherResult; + } + + return "NO_CONFLICT"; + } + + /** + * 检查教室时间冲突 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + @Override + public String checkClassroomTimeConflict(EduCourseSchedule eduCourseSchedule) + { + if (eduCourseSchedule.getClassroomId() == null || eduCourseSchedule.getWeekday() == null || + eduCourseSchedule.getPeriodStart() == null || eduCourseSchedule.getPeriodEnd() == null) + { + return "NO_CONFLICT"; + } + + EduCourseClass courseClass = eduCourseClassMapper.selectEduCourseClassByClassId(eduCourseSchedule.getClassId()); + if (courseClass == null) + { + return "NO_CONFLICT"; + } + + int conflictCount = eduCourseScheduleMapper.checkClassroomTimeConflict( + eduCourseSchedule.getClassroomId(), + eduCourseSchedule.getWeekday(), + eduCourseSchedule.getPeriodStart(), + eduCourseSchedule.getPeriodEnd(), + eduCourseSchedule.getWeeks(), + eduCourseSchedule.getScheduleId() + ); + + return conflictCount > 0 ? "CLASSROOM_CONFLICT" : "NO_CONFLICT"; + } + + /** + * 检查教师时间冲突 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + @Override + public String checkTeacherTimeConflict(EduCourseSchedule eduCourseSchedule) + { + if (eduCourseSchedule.getClassId() == null || eduCourseSchedule.getWeekday() == null || + eduCourseSchedule.getPeriodStart() == null || eduCourseSchedule.getPeriodEnd() == null) + { + return "NO_CONFLICT"; + } + + EduCourseClass courseClass = eduCourseClassMapper.selectEduCourseClassByClassId(eduCourseSchedule.getClassId()); + if (courseClass == null || courseClass.getTeacherId() == null) + { + return "NO_CONFLICT"; + } + + int conflictCount = eduCourseScheduleMapper.checkTeacherTimeConflict( + courseClass.getTeacherId(), + eduCourseSchedule.getWeekday(), + eduCourseSchedule.getPeriodStart(), + eduCourseSchedule.getPeriodEnd(), + eduCourseSchedule.getWeeks(), + eduCourseSchedule.getScheduleId() + ); + + return conflictCount > 0 ? "TEACHER_CONFLICT" : "NO_CONFLICT"; + } + + /** + * 校验节次设置是否合理 + * + * @param eduCourseSchedule 节次安排 + * @return 结果 + */ + @Override + public String checkPeriodValid(EduCourseSchedule eduCourseSchedule) + { + if (eduCourseSchedule.getWeekday() == null || eduCourseSchedule.getWeekday() < 1 || eduCourseSchedule.getWeekday() > 7) + { + return "INVALID_WEEKDAY"; + } + + if (eduCourseSchedule.getPeriodStart() == null || eduCourseSchedule.getPeriodStart() < 1 || eduCourseSchedule.getPeriodStart() > 12) + { + return "INVALID_PERIOD_START"; + } + + if (eduCourseSchedule.getPeriodEnd() == null || eduCourseSchedule.getPeriodEnd() < 1 || eduCourseSchedule.getPeriodEnd() > 12) + { + return "INVALID_PERIOD_END"; + } + + if (eduCourseSchedule.getPeriodStart() > eduCourseSchedule.getPeriodEnd()) + { + return "PERIOD_START_AFTER_END"; + } + + if (eduCourseSchedule.getPeriodEnd() - eduCourseSchedule.getPeriodStart() > 3) + { + return "PERIOD_TOO_LONG"; + } + + return "VALID"; + } + + /** + * 生成课表数据 - 按教室 + * + * @param classroomId 教室ID + * @param semesterId 学期ID + * @return 课表数据 + */ + @Override + public List generateClassroomTimetable(Long classroomId, Long semesterId) + { + return eduCourseScheduleMapper.generateClassroomTimetable(classroomId, semesterId); + } + + /** + * 生成课表数据 - 按教师 + * + * @param teacherId 教师ID + * @param semesterId 学期ID + * @return 课表数据 + */ + @Override + public List generateTeacherTimetable(Long teacherId, Long semesterId) + { + return eduCourseScheduleMapper.generateTeacherTimetable(teacherId, semesterId); + } + + /** + * 批量添加节次安排 + * + * @param classId 开课ID + * @param scheduleList 节次安排列表 + * @return 结果 + */ + @Override + @Transactional + public int batchAddSchedule(Long classId, List scheduleList) + { + if (scheduleList == null || scheduleList.isEmpty()) + { + return 0; + } + + for (EduCourseSchedule schedule : scheduleList) + { + schedule.setClassId(classId); + schedule.setCreateBy(SecurityUtils.getUsername()); + } + + return eduCourseScheduleMapper.batchInsertSchedule(scheduleList); + } + + /** + * 复制节次安排 + * + * @param sourceClassId 源开课ID + * @param targetClassId 目标开课ID + * @return 结果 + */ + @Override + @Transactional + public int copySchedule(Long sourceClassId, Long targetClassId) + { + List sourceSchedules = eduCourseScheduleMapper.selectScheduleByClassId(sourceClassId); + if (sourceSchedules.isEmpty()) + { + return 0; + } + + List targetSchedules = new ArrayList<>(); + for (EduCourseSchedule sourceSchedule : sourceSchedules) + { + EduCourseSchedule targetSchedule = new EduCourseSchedule(); + targetSchedule.setClassId(targetClassId); + targetSchedule.setWeekday(sourceSchedule.getWeekday()); + targetSchedule.setPeriodStart(sourceSchedule.getPeriodStart()); + targetSchedule.setPeriodEnd(sourceSchedule.getPeriodEnd()); + targetSchedule.setWeeks(sourceSchedule.getWeeks()); + targetSchedule.setClassroomId(sourceSchedule.getClassroomId()); + targetSchedule.setRemark(sourceSchedule.getRemark()); + targetSchedule.setCreateBy(SecurityUtils.getUsername()); + targetSchedules.add(targetSchedule); + } + + return eduCourseScheduleMapper.batchInsertSchedule(targetSchedules); + } + + /** + * 自动排课 + * + * @param classId 开课ID + * @param semesterId 学期ID + * @param courseHours 课程总学时 + * @return 结果 + */ + @Override + public String autoSchedule(Long classId, Long semesterId, Integer courseHours) + { + return "AUTO_SCHEDULE_NOT_IMPLEMENTED"; + } + + /** + * 获取时间段统计信息 + * + * @param semesterId 学期ID + * @return 统计结果 + */ + @Override + public Object getTimeSlotStatistics(Long semesterId) + { + List scheduleList = eduCourseScheduleMapper.selectScheduleBySemester(semesterId); + + Map statistics = new HashMap<>(); + Map weekdayCount = new HashMap<>(); + Map periodCount = new HashMap<>(); + + for (EduCourseSchedule schedule : scheduleList) + { + String weekdayKey = "weekday_" + schedule.getWeekday(); + weekdayCount.put(weekdayKey, weekdayCount.getOrDefault(weekdayKey, 0) + 1); + + for (int period = schedule.getPeriodStart(); period <= schedule.getPeriodEnd(); period++) + { + String periodKey = "period_" + period; + periodCount.put(periodKey, periodCount.getOrDefault(periodKey, 0) + 1); + } + } + + statistics.put("totalSchedules", scheduleList.size()); + statistics.put("weekdayDistribution", weekdayCount); + statistics.put("periodDistribution", periodCount); + + return statistics; + } + + /** + * 检查周次范围是否合理 + * + * @param weeks 周次字符串 + * @return 结果 + */ + @Override + public String checkWeeksValid(String weeks) + { + if (StringUtils.isEmpty(weeks)) + { + return "VALID"; + } + + Pattern pattern = Pattern.compile("^[0-9,-]+$"); + if (!pattern.matcher(weeks).matches()) + { + return "INVALID_FORMAT"; + } + + String[] ranges = weeks.split(","); + for (String range : ranges) + { + if (range.contains("-")) + { + String[] parts = range.split("-"); + if (parts.length != 2) + { + return "INVALID_RANGE"; + } + try + { + int start = Integer.parseInt(parts[0].trim()); + int end = Integer.parseInt(parts[1].trim()); + if (start <= 0 || end <= 0 || start > end || end > 25) + { + return "INVALID_WEEK_NUMBER"; + } + } + catch (NumberFormatException e) + { + return "INVALID_NUMBER"; + } + } + else + { + try + { + int week = Integer.parseInt(range.trim()); + if (week <= 0 || week > 25) + { + return "INVALID_WEEK_NUMBER"; + } + } + catch (NumberFormatException e) + { + return "INVALID_NUMBER"; + } + } + } + + return "VALID"; + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduSemesterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduSemesterServiceImpl.java new file mode 100644 index 0000000..a598020 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/education/service/impl/EduSemesterServiceImpl.java @@ -0,0 +1,239 @@ +package com.ruoyi.education.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.education.mapper.EduSemesterMapper; +import com.ruoyi.education.domain.EduSemester; +import com.ruoyi.education.service.IEduSemesterService; + +/** + * 学期信息Service业务层处理 + * + * @author ruoyi + * @date 2024-09-26 + */ +@Service +public class EduSemesterServiceImpl implements IEduSemesterService +{ + @Autowired + private EduSemesterMapper eduSemesterMapper; + + /** + * 查询学期信息 + * + * @param semesterId 学期信息主键 + * @return 学期信息 + */ + @Override + public EduSemester selectEduSemesterBySemesterId(Long semesterId) + { + return eduSemesterMapper.selectEduSemesterBySemesterId(semesterId); + } + + /** + * 查询学期信息列表 + * + * @param eduSemester 学期信息 + * @return 学期信息 + */ + @Override + public List selectEduSemesterList(EduSemester eduSemester) + { + return eduSemesterMapper.selectEduSemesterList(eduSemester); + } + + /** + * 新增学期信息 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + @Override + public int insertEduSemester(EduSemester eduSemester) + { + eduSemester.setCreateTime(DateUtils.getNowDate()); + return eduSemesterMapper.insertEduSemester(eduSemester); + } + + /** + * 修改学期信息 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + @Override + public int updateEduSemester(EduSemester eduSemester) + { + eduSemester.setUpdateTime(DateUtils.getNowDate()); + return eduSemesterMapper.updateEduSemester(eduSemester); + } + + /** + * 批量删除学期信息 + * + * @param semesterIds 需要删除的学期信息主键 + * @return 结果 + */ + @Override + public int deleteEduSemesterBySemesterIds(Long[] semesterIds) + { + return eduSemesterMapper.deleteEduSemesterBySemesterIds(semesterIds); + } + + /** + * 删除学期信息信息 + * + * @param semesterId 学期信息主键 + * @return 结果 + */ + @Override + public int deleteEduSemesterBySemesterId(Long semesterId) + { + return eduSemesterMapper.deleteEduSemesterBySemesterId(semesterId); + } + + /** + * 根据学期编码查询学期信息 + * + * @param semesterCode 学期编码 + * @return 学期信息 + */ + @Override + public EduSemester selectEduSemesterBySemesterCode(String semesterCode) + { + return eduSemesterMapper.selectEduSemesterBySemesterCode(semesterCode); + } + + /** + * 查询当前进行中的学期 + * + * @return 当前学期信息 + */ + @Override + public EduSemester selectCurrentSemester() + { + return eduSemesterMapper.selectCurrentSemester(); + } + + /** + * 查询可选课的学期列表 + * + * @return 学期信息集合 + */ + @Override + public List selectEnrollableSemesters() + { + return eduSemesterMapper.selectEnrollableSemesters(); + } + + /** + * 发布学期(将状态改为进行中) + * + * @param semesterId 学期ID + * @return 结果 + */ + @Override + public int publishSemester(Long semesterId) + { + EduSemester semester = new EduSemester(); + semester.setSemesterId(semesterId); + semester.setStatus("1"); + semester.setUpdateBy(SecurityUtils.getUsername()); + semester.setUpdateTime(DateUtils.getNowDate()); + return eduSemesterMapper.updateEduSemester(semester); + } + + /** + * 归档学期(将状态改为已归档) + * + * @param semesterId 学期ID + * @return 结果 + */ + @Override + public int archiveSemester(Long semesterId) + { + EduSemester semester = new EduSemester(); + semester.setSemesterId(semesterId); + semester.setStatus("2"); + semester.setUpdateBy(SecurityUtils.getUsername()); + semester.setUpdateTime(DateUtils.getNowDate()); + return eduSemesterMapper.updateEduSemester(semester); + } + + /** + * 校验学期编码是否唯一 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + @Override + public String checkSemesterCodeUnique(EduSemester eduSemester) + { + Long semesterId = StringUtils.isNull(eduSemester.getSemesterId()) ? -1L : eduSemester.getSemesterId(); + EduSemester info = eduSemesterMapper.selectEduSemesterBySemesterCode(eduSemester.getSemesterCode()); + if (StringUtils.isNotNull(info) && info.getSemesterId().longValue() != semesterId.longValue()) + { + return "NOT_UNIQUE"; + } + return "UNIQUE"; + } + + /** + * 校验学期时间是否冲突 + * + * @param eduSemester 学期信息 + * @return 结果 + */ + @Override + public String checkSemesterTimeConflict(EduSemester eduSemester) + { + Long semesterId = StringUtils.isNull(eduSemester.getSemesterId()) ? -1L : eduSemester.getSemesterId(); + EduSemester queryParam = new EduSemester(); + + List semesterList = eduSemesterMapper.selectEduSemesterList(queryParam); + + for (EduSemester semester : semesterList) + { + if (semester.getSemesterId().longValue() != semesterId.longValue()) + { + if (isTimeOverlap(eduSemester.getStartDate(), eduSemester.getEndDate(), + semester.getStartDate(), semester.getEndDate())) + { + return "CONFLICT"; + } + + if (isTimeOverlap(eduSemester.getEnrollStartTime(), eduSemester.getEnrollEndTime(), + semester.getEnrollStartTime(), semester.getEnrollEndTime())) + { + return "ENROLL_CONFLICT"; + } + } + } + return "NO_CONFLICT"; + } + + /** + * 判断两个时间段是否重叠 + * + * @param start1 开始时间1 + * @param end1 结束时间1 + * @param start2 开始时间2 + * @param end2 结束时间2 + * @return 是否重叠 + */ + private boolean isTimeOverlap(java.util.Date start1, java.util.Date end1, + java.util.Date start2, java.util.Date end2) + { + if (start1 == null || end1 == null || start2 == null || end2 == null) + { + return false; + } + + return start1.before(end2) && end1.after(start2); + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/education/EduCourseClassMapper.xml b/ruoyi-system/src/main/resources/mapper/education/EduCourseClassMapper.xml new file mode 100644 index 0000000..332354f --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/education/EduCourseClassMapper.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select c.class_id, c.course_id, c.semester_id, c.teacher_id, c.class_code, c.capacity, + c.enroll_limit, c.enrolled_count, c.classroom_id, c.enroll_start_time, c.enroll_end_time, + c.teach_start_date, c.teach_end_date, c.weekday, c.time_slot, c.status, c.remark, + c.create_by, c.create_time, c.update_by, c.update_time, + co.course_name, co.course_code, + t.real_name as teacher_name, + s.semester_name, + CONCAT(cr.building, cr.room_no) as classroom_name + from edu_course_class c + left join edu_course co on c.course_id = co.course_id + left join edu_teacher t on c.teacher_id = t.teacher_id + left join edu_semester s on c.semester_id = s.semester_id + left join edu_classroom cr on c.classroom_id = cr.classroom_id + + + + + + + + + + + + + + + + + + + + insert into edu_course_class + + course_id, + semester_id, + teacher_id, + class_code, + capacity, + enroll_limit, + enrolled_count, + classroom_id, + enroll_start_time, + enroll_end_time, + teach_start_date, + teach_end_date, + weekday, + time_slot, + status, + remark, + create_by, + create_time + + + #{courseId}, + #{semesterId}, + #{teacherId}, + #{classCode}, + #{capacity}, + #{enrollLimit}, + #{enrolledCount}, + #{classroomId}, + #{enrollStartTime}, + #{enrollEndTime}, + #{teachStartDate}, + #{teachEndDate}, + #{weekday}, + #{timeSlot}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + + + + + update edu_course_class + + course_id = #{courseId}, + semester_id = #{semesterId}, + teacher_id = #{teacherId}, + class_code = #{classCode}, + capacity = #{capacity}, + enroll_limit = #{enrollLimit}, + enrolled_count = #{enrolledCount}, + classroom_id = #{classroomId}, + enroll_start_time = #{enrollStartTime}, + enroll_end_time = #{enrollEndTime}, + teach_start_date = #{teachStartDate}, + teach_end_date = #{teachEndDate}, + weekday = #{weekday}, + time_slot = #{timeSlot}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where class_id = #{classId} + + + + update edu_course_class + set enrolled_count = #{enrolledCount}, + status = case + when #{enrolledCount} >= IFNULL(NULLIF(enroll_limit, 0), capacity) then '2' + when #{enrolledCount} > 0 then '1' + else status + end + where class_id = #{classId} + + + + update edu_course_class set status = #{status} + where class_id in + + #{classId} + + + + + delete from edu_course_class where class_id = #{classId} + + + + delete from edu_course_class where class_id in + + #{classId} + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/education/EduCourseScheduleMapper.xml b/ruoyi-system/src/main/resources/mapper/education/EduCourseScheduleMapper.xml new file mode 100644 index 0000000..736f978 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/education/EduCourseScheduleMapper.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select s.schedule_id, s.class_id, s.weekday, s.period_start, s.period_end, s.weeks, + s.classroom_id, s.remark, s.create_by, s.create_time, s.update_by, s.update_time, + cc.class_code, + c.course_name, c.course_code, + t.real_name as teacher_name, + sem.semester_name, + CONCAT(cr.building, cr.room_no) as classroom_name, + CASE s.weekday + WHEN 1 THEN '周一' + WHEN 2 THEN '周二' + WHEN 3 THEN '周三' + WHEN 4 THEN '周四' + WHEN 5 THEN '周五' + WHEN 6 THEN '周六' + WHEN 7 THEN '周日' + END as weekday_name, + CONCAT('第', s.period_start, '-', s.period_end, '节') as period_name + from edu_course_schedule s + left join edu_course_class cc on s.class_id = cc.class_id + left join edu_course c on cc.course_id = c.course_id + left join edu_teacher t on cc.teacher_id = t.teacher_id + left join edu_semester sem on cc.semester_id = sem.semester_id + left join edu_classroom cr on s.classroom_id = cr.classroom_id + + + + + + + + + + + + + + + + + + + + + + + + insert into edu_course_schedule + + class_id, + weekday, + period_start, + period_end, + weeks, + classroom_id, + remark, + create_by, + create_time + + + #{classId}, + #{weekday}, + #{periodStart}, + #{periodEnd}, + #{weeks}, + #{classroomId}, + #{remark}, + #{createBy}, + sysdate() + + + + + insert into edu_course_schedule (class_id, weekday, period_start, period_end, weeks, classroom_id, remark, create_by, create_time) + values + + (#{item.classId}, #{item.weekday}, #{item.periodStart}, #{item.periodEnd}, #{item.weeks}, #{item.classroomId}, #{item.remark}, #{item.createBy}, sysdate()) + + + + + update edu_course_schedule + + class_id = #{classId}, + weekday = #{weekday}, + period_start = #{periodStart}, + period_end = #{periodEnd}, + weeks = #{weeks}, + classroom_id = #{classroomId}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where schedule_id = #{scheduleId} + + + + delete from edu_course_schedule where schedule_id = #{scheduleId} + + + + delete from edu_course_schedule where schedule_id in + + #{scheduleId} + + + + + delete from edu_course_schedule where class_id = #{classId} + + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/education/EduSemesterMapper.xml b/ruoyi-system/src/main/resources/mapper/education/EduSemesterMapper.xml new file mode 100644 index 0000000..7704b26 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/education/EduSemesterMapper.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + select semester_id, semester_code, semester_name, start_date, end_date, enroll_start_time, enroll_end_time, status, remark, create_by, create_time, update_by, update_time from edu_semester + + + + + + + + + + + + + + insert into edu_semester + + semester_code, + semester_name, + start_date, + end_date, + enroll_start_time, + enroll_end_time, + status, + remark, + create_by, + create_time + + + #{semesterCode}, + #{semesterName}, + #{startDate}, + #{endDate}, + #{enrollStartTime}, + #{enrollEndTime}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + + + + + update edu_semester + + semester_code = #{semesterCode}, + semester_name = #{semesterName}, + start_date = #{startDate}, + end_date = #{endDate}, + enroll_start_time = #{enrollStartTime}, + enroll_end_time = #{enrollEndTime}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where semester_id = #{semesterId} + + + + delete from edu_semester where semester_id = #{semesterId} + + + + delete from edu_semester where semester_id in + + #{semesterId} + + + \ No newline at end of file