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<EduCourseSchedule> 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<EduCourseSchedule> selectScheduleByClassId(Long classId);

    /**
     * 根据开课ID删除节次安排
     * 
     * @param classId 开课ID
     * @return 结果
     */
    public int deleteScheduleByClassId(Long classId);

    /**
     * 查询指定教室的课程安排
     * 
     * @param classroomId 教室ID
     * @param semesterId 学期ID
     * @return 课程安排集合
     */
    public List<EduCourseSchedule> selectScheduleByClassroom(Long classroomId, Long semesterId);

    /**
     * 查询指定教师的课程安排
     * 
     * @param teacherId 教师ID
     * @param semesterId 学期ID
     * @return 课程安排集合
     */
    public List<EduCourseSchedule> selectScheduleByTeacher(Long teacherId, Long semesterId);

    /**
     * 查询指定学期的所有课程安排
     * 
     * @param semesterId 学期ID
     * @return 课程安排集合
     */
    public List<EduCourseSchedule> 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<EduCourseSchedule> generateClassroomTimetable(Long classroomId, Long semesterId);

    /**
     * 生成课表数据 - 按教师
     * 
     * @param teacherId 教师ID
     * @param semesterId 学期ID
     * @return 课表数据
     */
    public List<EduCourseSchedule> generateTeacherTimetable(Long teacherId, Long semesterId);

    /**
     * 批量插入节次安排
     * 
     * @param scheduleList 节次安排列表
     * @return 结果
     */
    public int batchInsertSchedule(List<EduCourseSchedule> scheduleList);
}