package com.ym.mec.biz.dal.dao;

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.*;
import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
import com.ym.mec.biz.dal.enums.CourseStatusEnum;
import com.ym.mec.biz.dal.enums.GroupType;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {

    /**
     * 根据教师ID获取当前课程信息
     *
     * @param courseID
     * @return
     */
    TeacherAttendanceDto getCurrentCourseDetail(@Param("courseID") Long courseID,
                                                @Param("teacherId") Integer teacherId);

    /**
     * @param startTime:
     * @param endTime:
     * @param teacherId:
     * @return com.ym.mec.biz.dal.dto.TeacherAttendanceDto
     * @describe 根据时间区间获取教师上课的课程
     * @author Joburgess
     * @date 2019/10/18
     */
    List<TeacherAttendanceDto> getTeacherCourseByDateSpeed(@Param("startTime") Date startTime,
                                                           @Param("endTime") Date endTime,
                                                           @Param("teacherId") Long teacherId,
                                                           @Param("schoolId") Integer schoolId);

    int batchAddCourseSchedules(List<CourseSchedule> courseSchedules);

    /**
     * @param courseScheduleId: 课程编号
     * @param status:           状态
     * @return int
     * @describe 修改课程的状态
     * @author Joburgess
     * @date 2019/11/4
     */
    int updateCourscheduleStatus(@Param("courseScheduleId") Integer courseScheduleId,
                                 @Param("status") String status);

    /**
     * @param courseScheduleIds: 课程编号列表
     * @return int
     * @describe 批量删除课程计划
     * @author Joburgess
     * @date 2019/10/31
     */
    int batchDeleteCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    int batchDeleteByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    int batchDeleteCourseSchedulesWithoutCheck(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    int batchDeleteCourseSchedulesWithLogic(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    int batchDeleteAllCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param courseScheduleIds: 课程计划编号
     * @return java.util.List<java.lang.Long>
     * @describe 过滤掉已结束的课程编号
     * @author Joburgess
     * @date 2019/12/24
     */
    List<Long> filterNotStartCourseIdsWithIds(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param musicGroupId:乐团编号
     * @param status:           状态
     * @return java.util.List<java.lang.Integer>
     * @describe 获取指定乐团下对应状态的课程编号列表
     * @author Joburgess
     * @date 2019/11/16
     */
    List<CourseSchedule> findMusicGroupCourseSchedules(@Param("musicGroupId") String musicGroupId,
                                                       @Param("groupType") String groupType,
                                                       @Param("status") String status);


    List<CourseSchedule> findMusicGroupAllCourseSchedules(@Param("musicGroupId") String musicGroupId,
                                                          @Param("groupType") String groupType);

    /**
     * @param startClassTime:
     * @param teacherId:
     * @return com.ym.mec.biz.dal.entity.CourseSchedule
     * @describe 获取教师在指定时间的前一节课程
     * @author Joburgess
     * @date 2020.10.21
     */
    CourseSchedule getTeacherPrevCourseWithStartTime(@Param("startClassTime") Date startClassTime,
                                                     @Param("teacherId") Integer teacherId);

    /**
     * @param startClassTime:
     * @param teacherId:
     * @return com.ym.mec.biz.dal.entity.CourseSchedule
     * @describe 获取教师在指定时间前有签到的课程
     * @author Joburgess
     * @date 2020.10.21
     */
    CourseSchedule getTeacherAttendanceCourseBeforeStartTime(@Param("startClassTime") Date startClassTime,
                                                             @Param("teacherId") Integer teacherId);

    /**
     * @param musicGroupId: 乐团编号
     * @param status:       状态
     * @param userId:       用户编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取乐团下学生指定状态的课程
     * @author Joburgess
     * @date 2019/11/26
     */
    List<CourseSchedule> findMusicGroupCourseSchedulesWithStudent(@Param("musicGroupId") String musicGroupId,
                                                                  @Param("groupType") String groupType,
                                                                  @Param("status") String status,
                                                                  @Param("userId") Integer userId);


    /**
     * @param courseScheduleIds: 课程编号列表
     * @param userId:            用户编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 删除指定乐团下学生的课程
     * @author Joburgess
     * @date 2019/11/26
     */
    int deleteMusicGroupCourseSchedulesWithStudent(@Param("courseScheduleIds") List<Long> courseScheduleIds,
                                                   @Param("userId") Integer userId);

    int deleteMusicGroupCourseSchedulesWithStudents(@Param("courseScheduleIds") List<Long> courseScheduleIds,
                                                    @Param("userIds") List<Integer> userIds);

    /**
     * @param classGroupId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取班级上未开始的课程
     * @author Joburgess
     * @date 2020.11.05
     */
    List<CourseSchedule> getClassGroupNotStartCourse(@Param("classGroupId") Long classGroupId);

    /**
     * @param classGroupId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取班级上的课程
     * @author qnc99
     * @date 2020/12/8 0008
     */
    List<CourseSchedule> getClassGroupCourses(@Param("classGroupId") Long classGroupId);

    /**
     * @param courseIds:
     * @return java.util.List<java.lang.Long>
     * @describe 统计课程上被合课程的数量
     * @author qnc99
     * @date 2020/12/8 0008
     */
    List<Map<Long, Long>> countCourseMergeCourseNum(@Param("courseIds") List<Long> courseIds);


    /**
     * @param teacherId: 教师编号
     * @param classDate: 上课日期
     * @param startTime: 开始时间
     * @param endTime:   结束时间
     * @return int
     * @describe 统计教师在指定时间区段内存在冲突的课程数量
     * @author Joburgess
     * @date 2019/10/28
     */
    int countExistRepeatInDateZone(@Param("teacherId") Integer teacherId, @Param("classDate") Date classDate, @Param("startTime") Date startTime,
                                   @Param("endTime") Date endTime);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/17
     * 统计学生所属班级数量
     */
    Integer[] countStudentInClass(List<Integer> classGroupIDs);

    /**
     * @param courseScheduleIds: 课程编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 根据课程编号列表获取课程列表
     * @author Joburgess
     * @date 2019/10/22
     */
    List<CourseSchedule> findByCourseScheduleIds(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param courseScheduleIds: 课程编号列表
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 根据课程编号列表获取助教列表
     * @author Joburgess
     * @date 2019/10/23
     */
    List<CourseScheduleTeacherSalary> findTeachingTeachers(@Param("courseScheduleIds") List<Long> courseScheduleIds);


    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @Author: Joburgess
     * @Date: 2019/10/14
     * @params [classDates, classGroupId]
     * @describe 根据班级和上课日期获取课程计划
     */
    List<CourseSchedule> findByClassGroupAndDate(@Param("classDates") List<Date> classDates, @Param("classGroupId") Long classGroupId);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/17
     * 根据日期获取学生当日排课信息
     */
    List<CourseScheduleDto> getStudentCourseSchedulesWithDate(@Param("classDate") Date classDate,
                                                              @Param("studentId") Long studentId,
                                                              @Param("quitClassGroupIds") List<Integer> quitClassGroupIds);

    /**
     * @return java.util.List<java.lang.String>
     * @Author: Joburgess
     * @Date: 2019/10/11
     * @params [courseScheduleId]
     * @describe 获取课程签到学生姓名
     */
    List<String> findStudentNamesByCourseSchedule(Long courseScheduleId);

    /**
     * @param classDate: 上课日期
     * @param teacherId: 教师编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
     * @describe 根据日期获取老师当日排课信息
     * @author Joburgess
     * @date 2019/10/18
     */
    List<CourseScheduleDto> getTeacherCourseSchedulesWithDate(@Param("classDate") Date classDate, @Param("teacherId") Long teacherId, @Param("type") String type);

    /**
     * @param teacherId: 教师编号
     * @param classDate: 上课日期
     * @param groupId:
     * @param groupType:
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
     * @describe 获取指定日期的课程
     * @author Joburgess
     * @date 2020/3/10
     */
    List<CourseScheduleDto> findCourseSchedulesWithDate(@Param("teacherId") Integer teacherId,
                                                        @Param("classDate") Date classDate,
                                                        @Param("groupId") String groupId,
                                                        @Param("groupType") GroupType groupType);

    /**
     * @param classDate:
     * @param teacherId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
     * @describe
     * @author Joburgess
     * @date 2019/12/26
     */
    List<CourseScheduleDto> getTeacherHistoryCourseSchedulesWithDate(@Param("classDate") Date classDate, @Param("teacherId") Long teacherId);

    /**
     * @param params:
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
     * @describe 根据日期获取排课
     * @author Joburgess
     * @date 2019/10/18
     */
    List<CourseScheduleDto> getCourseSchedulesWithDate(Map<String, Object> params);

    int countCourseSchedulesWithDate(Map<String, Object> params);

    /**
     * @param musicGroupId: 乐团编号
     * @return int
     * @describe 根据乐团ID删除排课
     * @author Joburgess
     * @date 2019/10/18
     */
    int deleteCourseSchedulesByMusicGroupID(@Param("musicGroupId") String musicGroupId, @Param("groupType") GroupType groupType);

    /**
     * @param groupId:
     * @param groupType:
     * @return int
     * @describe 根据团体删除班级
     * @author Joburgess
     * @date 2020/2/17
     */
    int deleteByGroup(@Param("groupId") String groupId,
                      @Param("groupType") GroupType groupType);

    /**
     * @param groupId:
     * @param groupType:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取团体下未开始的课程
     * @author Joburgess
     * @date 2020/3/4
     */
    List<CourseSchedule> findGroupNotStartCourses(@Param("groupId") String groupId,
                                                  @Param("groupType") GroupType groupType);


    /**
     * @param groupId:
     * @param groupType:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取团体下未结束的课程
     * @author Joburgess
     * @date 2020/3/4
     */
    List<CourseSchedule> findGroupNotFinishCourses(@Param("groupId") String groupId,
                                                   @Param("groupType") GroupType groupType);

    /**
     * @param groupId:
     * @param groupType:
     * @return int
     * @describe 更新课程组下课程的名字
     * @author Joburgess
     * @date 2020/3/5
     */
    int updateCourseNameByGroup(@Param("groupId") String groupId,
                                @Param("groupType") GroupType groupType,
                                @Param("name") String name);

    /**
     * 逻辑删除乐团课程
     *
     * @param musicGroupID
     * @return
     */
    int logicDeleteCourseSchedulesByMusicGroupID(@Param("musicGroupID") String musicGroupID);

    /**
     * 恢复乐团课程
     *
     * @param musicGroupID
     * @return
     */
    int resumeCourseScheduleByMusicGroupId(String musicGroupID);

    /**
     * @param musicGroupID: 乐团编号
     * @param month:        月份
     * @return java.util.List<java.util.Date>
     * @describe 根据月份获取乐团在该月有课的日期
     * @author Joburgess
     * @date 2019/10/18
     */
    List<Date> getCourseScheduleDateByMonth(@Param("musicGroupID") Long musicGroupID, @Param("month") Date month);

    /**
     * @param studentId:
     * @param month:
     * @param isAttend:
     * @return java.util.List<java.util.Date>
     * @describe 获取学生有课日期
     * @author Joburgess
     * @date 2019/10/18
     */
    List<Date> getStudentCourseScheduleDate(@Param("studentId") Long studentId, @Param("month") Date month, @Param("isAttend") Integer isAttend);

    /**
     * @param teacherId:
     * @param month:
     * @return java.util.List<java.util.Date>
     * @describe 获取教师有课日期
     * @author Joburgess
     * @date 2019/10/18
     */
    List<Date> getTeacherCourseScheduleDate(@Param("teacherId") Long teacherId, @Param("month") Date month, @Param("type") String type);

    /**
     * @param teacherId: 教师编号
     * @param month:     月份
     * @param groupId:   课程组编号
     * @param groupType: 课程组类型
     * @return java.util.List<java.util.Date>
     * @describe 获取在指定月份有课的日期
     * @author Joburgess
     * @date 2020/3/10
     */
    List<Date> findHaveClassesDatesWithMonth(@Param("teacherId") Integer teacherId,
                                             @Param("month") Date month,
                                             @Param("groupId") String groupId,
                                             @Param("groupType") GroupType groupType);

    /**
     * @param teacherId: 教师编号
     * @param month:     月份
     * @return java.util.List<java.util.Date>
     * @describe 获取教师历史有课日期
     * @author Joburgess
     * @date 2019/12/26
     */
    List<Date> getTeacherHistoryCourseScheduleDate(@Param("teacherId") Integer teacherId, @Param("month") Date month);

    /**
     * @param month:
     * @param classGroupIds:
     * @return java.util.List<java.util.Date>
     * @describe 获取当月有课的日期
     * @author Joburgess
     * @date 2019/10/18
     */
    List<Date> getCourseScheduleDate(@Param("month") Date month,
                                     @Param("classGroupIds") List<Integer> classGroupIds,
                                     @Param("type") String type);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/23
     * 统计教师在一天内有时间重复的课数
     */
    int countTeacherCourseInOnDayRepeats(CourseSchedule courseSchedule);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/24
     * 根据日期获取对应老师的课程
     */
    List<CourseSchedule> findTeacherCoursesInDates(@Param("dates") List<Date> dates, @Param("teacherId") Long teacherId);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/24
     * 根据日期获取课程
     */
    List<CourseSchedule> findCoursesByDates(@Param("dates") List<Date> dates);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/24
     * 获取在指定时间段内存在重复的课程
     */
    List<CourseSchedule> findOverLapCoursesInDay(@Param("dates") List<Date> dates, @Param("startClassTime") Date startClassTime,
                                                 @Param("endClassTime") Date endClassTime);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/29
     * 获取班级的声部
     */
    String[] findClassSubjects(List<Integer> ids);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/24
     * 根据id批量获取课程
     */
    List<CourseSchedule> findCourseSchedulesByIds(@Param("ids") Long[] ids);

    /**
     * 获取乐团班级未开始的课程计划
     *
     * @param classGroupIds
     * @param groupType
     * @return
     */
    List<CourseSchedule> findClassGroupNoStartCourseSchedules(@Param("classGroupIds") List<Integer> classGroupIds, @Param("groupType") GroupType groupType);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/30
     * 获取学生上课记录
     */
    List<StudentCourseScheduleRecordDto> findStudentCourseScheduleRecords(Map<String, Object> params);

    /**
     * @param classGroupId: 班级编号
     * @return com.ym.mec.biz.dal.entity.CourseSchedule
     * @describe 获取班级的下一节课
     * @author Joburgess
     * @date 2019/11/19
     */
    CourseSchedule getNextCourseSchedule(@Param("classGroupId") Integer classGroupId);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/30
     * 统计学生上课记录
     */
    int countStudentCourseScheduleRecords(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/30
     * 获取学生未上课记录
     */
    List<StudentCourseScheduleRecordDto> findStudentCourseScheduleNotStartRecords(@Param("userId") Long userId, @Param("date") Date date);

    /**
     * @return int
     * @Author: Joburgess
     * @Date: 2019/10/8
     * @params [classGroupId]
     * @describe 统计已上课次
     */
    int countClassTimes(@Param("classGroupId") Long classGroupId, @Param("startClassTime") Date startClassTime);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/17
     * 获取课程信息
     */
    CourseScheduleDto getCourseSchedules(@Param("courseScheduleId") Long courseScheduleId);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @Author: Joburgess
     * @Date: 2019/10/14
     * @params [vipGroupId]
     * @describe 获取vip课排课计划
     */
    List<CourseSchedule> findGroupCourseSchedules(@Param("groupId") Long groupId, @Param("groupType") String groupType);

    /**
     * @param groupId:   乐团编号
     * @param groupType: 乐团类型
     * @return java.util.List<java.lang.Integer>
     * @describe 获取对应乐团下未开始的排课计划编号列表
     * @author Joburgess
     * @date 2019/12/5
     */
    List<Long> findVipGroupNotStartCourseScheduleIds(@Param("groupId") String groupId,
                                                     @Param("groupType") String groupType);

    /**
     * @return java.lang.String
     * @Author: Joburgess
     * @Date: 2019/10/16
     * @params [courseScheduleId]
     * @describe 获取课程关联班级类型
     */
    String findClassTypeByCourse(@Param("courseScheduleId") Long courseScheduleId);

    /**
     * 根据课程状态查询老师指定月份的VIP课程记录数
     *
     * @param monthDate 指定月份
     * @param status    课程状态
     * @return
     */
    List<Map<Integer, Integer>> queryVipGroupTeachereClassTimesByMonth(@Param("monthDate") Date monthDate, @Param("status") CourseStatusEnum status);

    /**
     * 查询已完成未更新状态的课程列表
     *
     * @return
     */
    List<CourseSchedule> queryFinishedWithNoUpdateStatus();

    /**
     * 查询进行中未更新状态的课程列表
     *
     * @return
     */
    List<CourseSchedule> queryUnderwayWithNoUpdateStatus();

    int batchUpdate(List<CourseSchedule> courseScheduleList);

    /**
     * 查询提前指定分钟数还未签到的用户
     *
     * @param minutes 分钟数
     * @return
     */
    List<CourseSchedule> queryNoSignInListByBeforeMinutes(Integer minutes);

    /**
     * @param params: 参数
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassCourseSchudeleDto>
     * @describe 查询老师指定班级的排课信息
     * @author Joburgess
     * @date 2019/10/18
     */
    List<TeacherClassCourseSchudeleDto> queryTeacherClassCourseSchedule(Map<String, Object> params);

    /**
     * @param params
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassCourseSchudeleDto>
     * @describe 获取教师指定乐团下的课程
     * @author Joburgess
     * @date 2020/3/8
     */
    List<TeacherClassCourseSchudeleDto> findTeacherGroupCourses(Map<String, Object> params);

    int countTeacherGroupCourses(Map<String, Object> params);

    /**
     * @param params:
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassCourseSchudeleDto>
     * @describe 查询老师指定班级历史排课信息
     * @author Joburgess
     * @date 2019/10/19
     */
    List<TeacherClassCourseSchudeleDto> queryTeacherHistoryClassCourseSchedule(Map<String, Object> params);

    /**
     * @param params: 参数
     * @return int
     * @describe 统计老师指定班级的排课数量
     * @author Joburgess
     * @date 2019/10/18
     */
    int countTeacherClassCourseSchedule(Map<String, Object> params);

    /**
     * @param params:
     * @return int
     * @describe 统计历史老师指定班级的排课数量
     * @author Joburgess
     * @date 2019/10/19
     */
    int countTeacherHistoryClassCourseSchedule(Map<String, Object> params);

    /**
     * @param musicGroupId: 乐团编号
     * @return java.util.List<java.util.Map < java.lang.Long, java.lang.Integer>>
     * @describe 统计乐团下班级的排课数
     * @author Joburgess
     * @date 2019/10/18
     */
    List<Map<Integer, Long>> countClassCourseNumByMusicGroup(String musicGroupId);

    /**
     * @param courseSchedules: 课程计划编号列表
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 根据课程计划获取对应课次
     * @author Joburgess
     * @date 2019/10/20
     */
    List<Map<Integer, Integer>> findCourseScheduleCurrentTimes(List<Integer> courseSchedules);

    /**
     * 根据乐团编号修改课程教学点
     *
     * @param musicGroupId
     * @param schoolId
     */
    void updateByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("schoolId") Integer schoolId);

    /**
     * @param courseScheduleId:
     * @return int
     * @describe 统计课程上的学生人数
     * @author Joburgess
     * @date 2019/11/21
     */
    @Select("SELECT COUNT(*) FROM course_schedule_student_payment sa WHERE sa.course_schedule_id_ = #{courseScheduleID}")
    int countCourseStudentNum(@Param("courseScheduleID") Long courseScheduleId);

    /**
     * 获取班级某时间后相应节数的课程
     *
     * @param classGroupId
     * @param startDate
     * @param times
     * @return
     */
    List<CourseSchedule> findCourseScheduleByClassGroupIdAndDate(@Param("classGroupId") Integer classGroupId, @Param("startDate") String startDate,
                                                                 @Param("times") int times);

    /**
     * 根据时间范围查询老师指定类型的课程列表
     *
     * @param teacherId 老师编号
     * @param type      课程类型 (如果为null，查询所有类型)
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    List<CourseSchedule> queryTeacherCourseScheduleListByTimeRangeAndType(@Param("teacherId") Integer teacherId,
                                                                          @Param("type") CourseScheduleType type,
                                                                          @Param("startTime") Date startTime,
                                                                          @Param("endTime") Date endTime);

    /**
     * 查询班级上指定状态的课程
     *
     * @param classGroupId
     * @param status
     * @return
     */
    List<CourseSchedule> findCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("status") CourseStatusEnum status);

    /**
     * @param courseScheduleId: 课程编号
     * @return com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto
     * @describe 获取点名详情头部信息
     * @author Joburgess
     * @date 2019/10/24
     */
    CourseAttendanceDetailHeadInfoDto findByCourse(Long courseScheduleId);

    /**
     * 获取学员购买的所有乐团和vip编号分页列表
     *
     * @param params
     * @return
     */
    List<Group> queryMusicGroupIds(Map<String, Object> params);

    /**
     * count学员购买的所有乐团和vip编号分页列表
     *
     * @param params
     * @return
     */
    Integer countMusicGroupIds(Map<String, Object> params);

    /**
     * @param params: 参数
     * @return java.util.List<java.lang.String>
     * @describe 获取学员购买的所有乐团和vip编号分页列表, 排除已结束的乐团
     * @author Joburgess
     * @date 2019/12/2
     */
    List<Group> queryMusicGroupIdsWithoutOverGroup(Map<String, Object> params);

    /**
     * @param params: 参数
     * @return java.util.List<java.lang.String>
     * @describe count学员购买的所有乐团和vip编号分页列表, 排除已结束的乐团
     * @author Joburgess
     * @date 2019/12/2
     */
    Integer countMusicGroupIdsWithoutOverGroup(Map<String, Object> params);

    /**
     * @param startTime: 开始时间
     * @param endTime:   结束时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取时间段内未开始的课程
     * @author Joburgess
     * @date 2019/10/31
     */
    List<CourseSchedule> findByDateZone(@Param("startTime") Date startTime,
                                        @Param("endTime") Date endTime);

    /**
     * @param startTime: 开始时间
     * @param endTime:   结束时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取时间段内所有的课程
     * @author Joburgess
     * @date 2019/10/31
     */
    List<CourseSchedule> findAllCourseByDateZone(@Param("startTime") Date startTime,
                                                 @Param("endTime") Date endTime);

    List<CourseSchedule> findByClassDate(@Param("classDates") List<String> classDates);

    List<CourseSchedule> findByClassDateWithoutMusicGroup(@Param("classDates") List<String> classDates);

    /**
     * @param startTime: 开始时间
     * @param endTime:   结束时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取时间段内所有的课程(去除无关字段)
     * @author Joburgess
     * @date 2019/10/31
     */
    List<CourseSchedule> findAllCourseByDateZone2(@Param("startTime") Date startTime,
                                                  @Param("endTime") Date endTime);

    /**
     * 查询学生明天的课程数
     *
     * @return
     */
    List<Mapper> queryStudentCoursesTimesOfTomorrow();

    /**
     * 查询学生90分钟内未上的课程
     *
     * @return
     */
    List<Mapper> queryStudentNotStartCourseScheduleIn90Mins();

    /**
     * 查询老师明天的课程数
     *
     * @return
     */
    List<Mapper> queryTeacherCoursesTimesOfTomorrow();

    /**
     * 查询老师30分钟内未上的课程
     *
     * @return
     */
    List<Mapper> queryTeacherNotStartCourseScheduleIn30Mins();

    /**
     * @param courseScheduleIds: 课程编号列表
     * @param teacherRole:       教师角色
     * @return java.util.List<com.ym.mec.biz.dal.dto.IntegerAndIntegerListDto>
     * @describe 获取课程编号和与之对应教师编号列表
     * @author Joburgess
     * @date 2019/11/2
     */
    List<IntegerAndIntegerListDto> findCourseScheduleIdAndUserIdsMap(@Param("courseScheduleIds") List<Long> courseScheduleIds,
                                                                     @Param("teacherRole") String teacherRole);

    /**
     * @param classGroup:  班级编号列表
     * @param teacherRole: 教师角色
     * @return java.util.List<com.ym.mec.biz.dal.dto.IntegerAndIntegerListDto>
     * @describe 获取班级编号和与之对应的教师编号列表
     * @author Joburgess
     * @date 2019/11/3
     */
    List<IntegerAndIntegerListDto> findClassGroupAndUserIdsMap(@Param("classGroupIds") List<Integer> classGroup,
                                                               @Param("teacherRole") String teacherRole);

    /**
     * @param date: 日期
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取指定日期的课程
     * @author Joburgess
     * @date 2019/11/3
     */
    List<CourseSchedule> findCourseScheduleWithDate(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * @param startDate:
     * @param endDate:
     * @return int
     * @describe 统计指定时间段内已结算的课程组类型数量
     * @author Joburgess
     * @date 2020/12/29 0029
     */
    int countIsSalaryGroupTypes(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * @param classGroupId: 班级编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 根据班级获取课程计划
     * @author Joburgess
     * @date 2019/11/5
     */
    List<CourseSchedule> findByClassGroup(@Param("classGroupId") Integer classGroupId);

    /**
     * @param classGroupId: 班级编号
     * @param status:       状态
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 根据班级以及课程状态获取课程计划
     * @author Joburgess
     * @date 2019/11/16
     */
    List<CourseSchedule> findByClassGroupAndStatus(@Param("classGroupId") Integer classGroupId,
                                                   @Param("status") String status);

    /**
     * @param classGroupIds: 班级编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 根据班级获取课程计划
     * @author Joburgess
     * @date 2019/11/5
     */
    List<CourseSchedule> findByClassGroups(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * 获取当前课程所有学员列表
     *
     * @param courseScheduleId
     * @return
     */
    List<Map<Integer, String>> findStudentMap(Long courseScheduleId);

    List<CourseSchedule> findAllCourseSches();

    /**
     * 获取一节班级的课程
     *
     * @param classGroupId
     * @return
     */
    CourseSchedule findOneCourseScheduleByClassGroupId(@Param("classGroupId") Integer classGroupId);

    /**
     * @param classGroupIds: 班级编号列表
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 统计指定班级的课程数量
     * @author Joburgess
     * @date 2019/11/12
     */
    List<Map<Integer, Integer>> countClassGroupCourseTimes(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * @param classGroupId:
     * @return int
     * @describe 统计班级上的课程数量
     * @author Joburgess
     * @date 2020/2/13
     */
    int countClassGroupCourses(@Param("classGroupId") Integer classGroupId);


    /**
     * 根据班级编号列表删除课程
     *
     * @param classGroupIds 班级编号列表
     * @return
     */
    int deleteCourseSchedulesByClassGroupIds(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * 查询所有未签到的学生信息
     *
     * @return
     */
    List<StudentAttendance> queryUnsignedStudentList();

    /**
     * @param currentCourseDate: 班级编号
     * @return java.lang.Integer
     * @describe 统计已上的课时数
     * @author Joburgess
     * @date 2019/11/19
     */
    Integer countCurrentTimes(@Param("classGroupId") Integer classGroupId,
                              @Param("currentCourseDate") Date currentCourseDate);

    /**
     * 修改未上课程教学点
     *
     * @param groupType
     * @param musicGroupId
     * @param schoolId
     */
    void updateCourseScheduleSchool(@Param("groupType") String groupType, @Param("musicGroupId") String musicGroupId, @Param("schoolId") Integer schoolId);

    int countCourseScheduleByMusicGroupId(@Param("musicGroupId") String musicGroupId);

    /**
     * @param classGroupId: 班级编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取班级上未删除的课程
     * @author Joburgess
     * @date 2019/12/11
     */
    List<CourseSchedule> findClassGroupCourseSchedules(@Param("classGroupId") Integer classGroupId);

    /**
     * @param classGroupIds: 班级编号，多个逗号分隔
     * @param fromDate:      开始时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取指定班级上指定日期之后的课程
     * @author Joburgess
     * @date 2020/1/2
     */
    List<CourseSchedule> findClassGroupCourseSchedulesWithDate(@Param("classGroupIds") String classGroupIds,
                                                               @Param("fromDate") Date fromDate);

    /**
     * @param groupId:   乐团编号
     * @param groupType: 乐团类型
     * @return int
     * @describe 批量修改乐团下所有课程上的教学点
     * @author Joburgess
     * @date 2019/12/11
     */
    int updateCourseSchoolByGroup(@Param("groupId") String groupId,
                                  @Param("groupType") String groupType,
                                  @Param("schoolId") Integer schoolId);


    int countVipGroupCourses(@Param("vipGroupId") Integer vipGroupId, @Param("groupType") String groupType);

    /**
     * @param groupType:
     * @param groupId:
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentCourseInfoDto>
     * @describe 获取学生剩余课程信息
     * @author Joburgess
     * @date 2019/12/19
     */
    List<StudentCourseInfoDto> findUserSurplusCourseInfoByGroup(@Param("groupType") GroupType groupType,
                                                                @Param("groupId") String groupId,
                                                                @Param("userId") Integer userId);

    /**
     * @param groupType: 团体类型
     * @param groupId:   团体编号
     * @param userId:    用户编号
     * @param type:      查询类型：不传查全部，'history'已消耗的，'surplus'剩余的
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentCourseInfoDto>
     * @describe 获取学生的课程信息
     * @author Joburgess
     * @date 2020/1/15
     */
    List<StudentCourseInfoDto> findUserCourseInfos(@Param("groupType") GroupType groupType,
                                                   @Param("groupId") String groupId,
                                                   @Param("userId") Integer userId,
                                                   @Param("type") String type);

    /**
     * @param groupType:
     * @param groupId:
     * @return java.util.Date
     * @describe 获取指定乐团下课程开始时间
     * @author Joburgess
     * @date 2019/12/19
     */
    Date getMinCourseTime(@Param("groupType") GroupType groupType,
                          @Param("groupId") String groupId);

    /**
     * @param groupType:
     * @param groupId:
     * @return java.util.Date
     * @describe 获取指定乐团下课程结束时间
     * @author Joburgess
     * @date 2019/12/19
     */
    Date getMaxCourseTime(@Param("groupType") GroupType groupType,
                          @Param("groupId") String groupId);

    /**
     * 获取vip未上课时数
     *
     * @param vipGroupId
     * @return
     */
    Integer findCourseNoStartNum(Long vipGroupId);

    /**
     * 已上课时数
     *
     * @param vipGroupId
     * @return
     */
    Integer findCourseEndNum(Long vipGroupId);

    /**
     * 统计vip课时数
     *
     * @param vipGroupId
     * @param teachMode
     * @return
     */
    Integer countCourseNum(@Param("vipGroupId") Long vipGroupId, @Param("teachMode") String teachMode);

    /**
     * @param courseIds: 课程编号列表
     * @return java.lang.String
     * @describe 根据课程编号获取课程类型
     * @author Joburgess
     * @date 2019/12/15
     */
    List<Map<Integer, String>> getTeachModeById(@Param("courseIds") List<Long> courseIds);

    /**
     * 获取总课时
     *
     * @param vipGroupIds
     * @param groupType
     * @return
     */
    List<Map<String, Long>> countTotalCourseScheduleNum(@Param("vipGroupIds") List<String> vipGroupIds, @Param("groupType") String groupType);

    int countTotalCourseScheduleNumWithGroup(@Param("groupId") String groupId,
                                             @Param("groupType") String groupType);

    /**
     * 获取当前课时（已上）
     *
     * @param vipGroupIds vip编号
     * @param groupType
     * @return
     */
    List<Map<String, Long>> countCourseScheduleNum(@Param("vipGroupIds") List<String> vipGroupIds, @Param("groupType") String groupType);

    /**
     * 根据班级编号count总课时
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, Long>> countTotalNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("classDate") Date classDate);

    /**
     * 根据班级编号count当前课时(已上总数)
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, Long>> countExpendNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * 根据班级编号count剩余课时(未上)
     *
     * @param classGroupIds
     * @param teacherId
     * @return
     */
    List<Map<Integer, Long>> countCurrentNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("teacherId") Integer teacherId);

    /**
     * @param groupType:
     * @param groupId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取乐团下剩余课程计划
     * @author Joburgess
     * @date 2019/12/22
     */
    List<CourseSchedule> findSurplusCourseWithGroup(@Param("groupType") GroupType groupType,
                                                    @Param("groupId") String groupId);

    /**
     * @param courseScheduleId
     * @describe 获取未开始的课程
     */
    CourseSchedule getSurplusCourseWithGroup(@Param("courseScheduleId") Long courseScheduleId);

    /**
     * @param classGroupId: 班级编号
     * @return int
     * @describe 统计班级上已结束课时数
     * @author Joburgess
     * @date 2019/12/25
     */
    int countClassGroupOverCourseNum(@Param("classGroupId") Integer classGroupId);

    /**
     * @param params:
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleEndDto>
     * @describe 终极课表获取
     * @author Joburgess
     * @date 2019/12/27
     */
    List<CourseScheduleEndDto> endFindCourseSchedules(Map<String, Object> params);

    int endCountCourseSchedules(Map<String, Object> params);

    /**
     * @param search: 搜索关键字
     * @return java.util.List<java.lang.Integer>
     * @describe 根据关键字查询学生相关的课程编号
     * @author Joburgess
     * @date 2019/12/31
     */
    Set<Integer> findCourseIdsByStudent(String search);

    /**
     * @param search: 搜索关键字
     * @return java.util.List<java.lang.Integer>
     * @describe 根据关键字查询教师相关的课程编号
     * @author Joburgess
     * @date 2019/12/31
     */
    Set<Integer> findCourseIdsByTeacher(String search);

    /**
     * @param groupType:
     * @param groupId:
     * @return int
     * @describe 统计团体下的总课次
     * @author Joburgess
     * @date 2020/1/16
     */
    int countGroupAllCourses(@Param("groupType") GroupType groupType,
                             @Param("groupId") String groupId);

    /**
     * @param groupType:
     * @param groupId:
     * @return java.util.Date
     * @describe 获取乐团开课时间
     * @author Joburgess
     * @date 2020/1/16
     */
    Date findGroupCourseStartTime(@Param("groupType") GroupType groupType,
                                  @Param("groupId") String groupId);

    /**
     * @param groupType:
     * @param groupId:
     * @return java.util.Date
     * @describe 获取乐团课程结束时间
     * @author Joburgess
     * @date 2020/1/16
     */
    Date findGroupCourseEndTime(@Param("groupType") GroupType groupType,
                                @Param("groupId") String groupId);

    /**
     * 获取课程编号列表
     *
     * @param params
     * @return
     */
    Set<Integer> queryMusicCourseScheduleIds(Map<String, Object> params);

    /**
     * 获取课程编号列表
     *
     * @param params
     * @return
     */
    Set<Integer> queryVipCourseScheduleIds(Map<String, Object> params);

    /**
     * 获取陪练课课程编号列表
     *
     * @param params
     * @return
     */
    Set<Integer> queryPracticeCourseScheduleIds(Map<String, Object> params);

    /**
     * @param userIds:   教师编号列表
     * @param startTime: 开始时间
     * @param endTime:   结束时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取教师在指定时间段内的课程
     * @author Joburgess
     * @date 2020/2/2
     */
    List<CourseSchedule> findTeachersCoursesWithDateRange(@Param("userIds") List<Integer> userIds,
                                                          @Param("startTime") Date startTime,
                                                          @Param("endTime") Date endTime);


    int countTeacherPracticeCourse(@Param("userId") Integer userId,
                                   @Param("startTime") Date startTime,
                                   @Param("endTime") Date endTime);

    /**
     * @param userId:    教师编号列表
     * @param startTime: 开始时间
     * @param endTime:   结束时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取教师在指定时间段内的课程
     * @author Joburgess
     * @date 2020/2/2
     */
    List<CourseSchedule> findTeacherCoursesWithDateRange(@Param("userId") Integer userId,
                                                         @Param("startTime") Date startTime,
                                                         @Param("endTime") Date endTime);

    List<CourseSchedule> findTeacherCoursesWithDateRangeWithoutMusicGroup(@Param("userId") Integer userId,
                                                                          @Param("startTime") Date startTime,
                                                                          @Param("endTime") Date endTime);

    /**
     * @param userId: 用户编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseScheduleDto>
     * @describe 获取指定学员的陪练课
     * @author Joburgess
     * @date 2020/2/3
     */
    List<CourseScheduleDto> findStudentPracticeCourses(@Param("userId") Integer userId);

    /**
     * @param userId:
     * @param startTime:
     * @param endTime:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取教师课程中包含指定时间区间的课程
     * @author Joburgess
     * @date 2020/2/4
     */
    List<CourseSchedule> findTeacherCoursesWithIncludeDateRange(@Param("userId") Integer userId,
                                                                @Param("startTime") Date startTime,
                                                                @Param("endTime") Date endTime);

    /**
     * @param userId:
     * @param startTime:
     * @param endTime:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取学生课程中包含指定时间区间的课程
     * @author Joburgess
     * @date 2020/2/4
     */
    List<CourseSchedule> findStudentCoursesWithIncludeDateRange(@Param("userId") Integer userId,
                                                                @Param("startTime") Date startTime,
                                                                @Param("endTime") Date endTime);

    /**
     * 获取当前课程，下一次连堂课
     *
     * @param continueCourseTime
     * @param courseSchedule
     * @return
     */
    CourseSchedule queryStudentContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
                                              @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);

    /**
     * 获取当前课程，下一次连堂课
     *
     * @param continueCourseTime
     * @param courseSchedule
     * @return
     */
    CourseSchedule queryTeacherContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
                                              @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);

    /**
     * 获取单节课时长
     *
     * @param courseScheduleId
     * @return
     */
    Integer getSingleClassMinutes(@Param("courseScheduleId") Long courseScheduleId);

    /**
     * @param groupIds: 课程组编号列表
     * @return java.util.List<java.util.Map < java.lang.Long, java.lang.Integer>>
     * @describe 统计课程组已上课程数量
     * @author Joburgess
     * @date 2019/10/21
     */
    List<Map<Long, Integer>> countGroupOverCourse(@Param("groupIds") List<String> groupIds, @Param("groupType") String groupType);


    int countGroupFinishCourse(@Param("groupId") String groupId, @Param("groupType") String groupType);

    /**
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取学生相关的课程
     * @author Joburgess
     * @date 2020/2/10
     */
    List<CourseSchedule> findUserCourses(@Param("userId") Integer userId,
                                         @Param("teacherIds") List<Integer> teacherIds);

    /**
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取学生相关的课程
     * @author Joburgess
     * @date 2020/2/10
     */
    List<CourseSchedule> findUserCourses2(@Param("userId") Integer userId,
                                          @Param("teacherIds") List<Integer> teacherIds);


    List<CourseSchedule> findUserCourses3(@Param("studentId") Integer studentId,
                                          @Param("teacherIds") List<Integer> teacherIds);

    /**
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取学生相关的课程
     * @author Joburgess
     * @date 2020/2/10
     */
    List<CourseSchedule> findUserCoursesWithPay(@Param("userId") Integer userId,
                                                @Param("teacherIds") List<Integer> teacherIds);

    /**
     * 获取课程实际上课老师
     *
     * @param courseScheduleIds
     * @return
     */
    List<Map<Long, String>> queryTeacherName(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param studentIds:
     * @param startTime:
     * @param endTime:
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 统计学生在指定周期内的vip课数量
     * @author Joburgess
     * @date 2020.04.28
     */
    List<Map<Integer, Long>> countStudentVipCoursesWithDate(@Param("studentIds") List<Integer> studentIds,
                                                            @Param("startTime") Date startTime,
                                                            @Param("endTime") Date endTime,
                                                            @Param("groupType") GroupType groupType);


    /**
     * @param studentIds:
     * @param startTime:
     * @param endTime:
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Long>>
     * @describe 统计学生在指定周期内的付费网管课数量
     * @author Joburgess
     * @date 2020.05.06
     */
    List<Map<Integer, Long>> countStudentPayPracticeCoursesWithDate(@Param("studentIds") List<Integer> studentIds,
                                                                    @Param("startTime") Date startTime,
                                                                    @Param("endTime") Date endTime);

    /**
     * @param studentIds:
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 统计学生在未来的vip课数量
     * @author Joburgess
     * @date 2020.04.28
     */
    List<Map<Integer, Long>> countStudentVipCoursesInFuture(@Param("studentIds") List<Integer> studentIds);

    /**
     * @param groupId:
     * @param groupType:
     * @param isLock:    冻结状态：1、冻结，0、正常
     * @return int
     * @describe 更改团体下课程的冻结状态
     * @author Joburgess
     * @date 2020/2/17
     */
    int updateGroupCourseLock(@Param("groupId") String groupId,
                              @Param("groupType") GroupType groupType,
                              @Param("isLock") Integer isLock);

    /**
     * @param courseId:
     * @param isLock:   冻结状态：1、冻结，0、正常
     * @return int
     * @describe 通过班级编号更改课程的冻结状态
     * @author zouxuan
     */
    int batchUpdateLockByCourseIds(@Param("courseId") List<Long> courseId,
                                   @Param("isLock") Integer isLock);


    /**
     * 获取当前课程是第几课时
     *
     * @param courseScheduleId
     * @return
     */
    int countCurrentCourseTime(Long courseScheduleId);

    /**
     * @param classGroupIds: 班级编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取班级课程列表
     * @author Joburgess
     * @date 2020/2/20
     */
    List<CourseSchedule> findCourseSchedulesByClassGroups(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * @param groupId:
     * @param groupType:
     * @return com.ym.mec.biz.dal.entity.CourseSchedule
     * @describe 获取指定团体的第一节课程
     * @author Joburgess
     * @date 2020/2/23
     */
    CourseSchedule findFirstCourseWithGroup(@Param("groupId") String groupId,
                                            @Param("groupType") GroupType groupType);

    List<CourseSchedule> findClassGroupLastTeacher(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * @param groupIds:
     * @param groupType:
     * @return java.util.List<com.ym.mec.biz.dal.dto.GroupCourseTimesDto>
     * @describe 获取团体课次信息
     * @author Joburgess
     * @date 2020/3/8
     */
    List<GroupCourseTimesDto> findGroupsCourseTimesInfo(@Param("groupIds") List<String> groupIds,
                                                        @Param("groupType") GroupType groupType);

    /**
     * @param groupIds:
     * @param groupType:
     * @return java.util.List<com.ym.mec.biz.dal.dto.GroupValidDateDto>
     * @describe 获取课程组有效期
     * @author Joburgess
     * @date 2020/3/18
     */
    List<GroupValidDateDto> findGroupsValidate(@Param("groupIds") List<String> groupIds,
                                               @Param("groupType") GroupType groupType);

    /**
     * 获取当前课程声部
     *
     * @param courseScheduleId
     * @return
     */
    String getSubjectNameById(Long courseScheduleId);

    /**
     * 教师端中间页网络教室课程进度列表
     *
     * @param groupId
     * @param groupType
     * @return
     */
    List<CourseScheduleRateDto> findCourseRate(@Param("groupId") String groupId, @Param("groupType") String groupType, @Param("classGroupId") Integer classGroupId);

    /**
     * 获取最后一次已结束的课程
     *
     * @param groupId
     * @param groupType
     * @return
     */
    CourseSchedule getLastEndCourse(@Param("groupId") String groupId, @Param("groupType") String groupType, @Param("classGroupId") Integer classGroupId);

    /**
     * 根据课程组获取课表信息
     *
     * @param groupType
     * @param groupId
     * @return
     */
    List<CourseSchedule> findCourseByGroupId(@Param("groupType") String groupType, @Param("groupId") String groupId);

    /**
     * 获取老师正常签退的课程
     *
     * @param month
     * @return
     */
    List<CourseSchedule> queryScheduleByAttendance(Integer month);

    /**
     * 获取学生课程数量
     *
     * @param studentIds
     * @param groupType
     * @param status
     * @retur
     */
    List<CourseGroupExportDto> getStudentCourseScheduleNum(@Param("studentIds") Set<Integer> studentIds, @Param("groupType") GroupType groupType, @Param("status") CourseStatusEnum status);

    /**
     * 获取导出VIP课信息
     *
     * @param organIds
     * @return
     */
    List<CourseGroupExportDto> getVipGroupExport(@Param("organIds") String organIds);

    /**
     * 获取用户课程信息
     *
     * @param studentIds
     * @param groupType
     * @return
     */
    List<CourseGroupExportDto> getStudentCourseInfo(@Param("studentIds") Set<Integer> studentIds, @Param("groupType") GroupType groupType);

    List<CourseGroupExportDto> getStudentVipCourseInfo(@Param("studentIds") Set<Integer> studentIds);

    /**
     * 获取上一次连堂课
     *
     * @param classGroupId
     * @param startTime
     * @param teacherId
     * @return
     */
    CourseSchedule getLastCourse(@Param("classGroupId") Integer classGroupId,
                                 @Param("startTime") String startTime,
                                 @Param("teacherId") Integer teacherId,
                                 @Param("continueCourseTime") String continueCourseTime);

    /**
     * 获取课程组已结束最后一节课时间
     *
     * @param vipGroupIds
     * @return
     */
    List<Map<String, String>> findLastOverTime(@Param("vipGroupIds") List<String> vipGroupIds);

    /**
     * 获取课程状态列表
     *
     * @param courseScheduleIds
     * @return
     */
    List<Long> findNotStartCourseByIds(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * 获取第一节课时间
     *
     * @param practiceGroupId
     * @param groupType
     * @return
     */
    Date getFirstTime(@Param("practiceGroupId") Long practiceGroupId, @Param("groupType") String groupType);

    /**
     * 获取最后一节课时间
     *
     * @param practiceGroupId
     * @param groupType
     * @return
     */
    Date getLastTime(@Param("practiceGroupId") Long practiceGroupId, @Param("groupType") String groupType);

    /**
     * 重置上课学生人数
     *
     * @param courseScheduleId
     */
    void resetStudentNum(@Param("courseScheduleId") List<Long> courseScheduleId);

    /**
     * 获取当前班级列表的所有未开始的课程
     *
     * @param classGroupIds
     * @param teacherId
     * @param teacherRole
     * @return
     */
    List<CourseSchedule> queryNoStartCourseByTeacherId(@Param("classGroupIds") String classGroupIds, @Param("teacherId") Integer teacherId, @Param("teacherRole") String teacherRole);

    /**
     * 当前班级是否有未开始的课程
     *
     * @param classGroupIds
     * @param teacherId
     * @return
     */
    List<Map<Integer, Integer>> queryHasReatClass(@Param("classGroupIds") Set<String> classGroupIds, @Param("teacherId") String teacherId);


    /**
     * 查询班级未上的课程类型对应的时长
     *
     * @param classGroupIdList
     * @return
     */
    List<RemainCourseTypeDurationDto> queryRemainCourseTypeDuration(String classGroupIdList);


    /**
     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseRepeatCheckDto>
     * @describe 获取检测课程冲突需要的数据
     * @author qnc99
     * @date 2020/11/25 0025
     */
    List<CourseRepeatCheckDto> getCourseRepeatCheckInfos();

    CourseSchedule getLock(long courseId);

    /**
     * @param courseId:
     * @return int
     * @describe 统计指定课程合并的课程数量
     * @author qnc99
     * @date 2020/11/27 0027
     */
    int countCourseMergeTime(@Param("courseId") Long courseId);

    /**
     * 获取班级剩余的课程类型和课程数量
     *
     * @param classGroupId
     * @return
     * @author zouxuan
     */
    List<Map<String, Integer>> querySubCourseNumMap(@Param("classGroupId") Integer classGroupId);

    /**
     * 获取班级剩余的课程类型和课程总时长
     *
     * @param classGroupId
     * @return
     * @author zouxuan
     */
    List<Map<String, BigDecimal>> querySubCourseTimeMap(@Param("classGroupId") Integer classGroupId);

    /**
     * 获取所选班级最大剩余课时
     *
     * @param classGroupIds
     * @return
     */
    List<Map<String, Integer>> findClassMaxCourseNumMap(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * 根据学员和班级列表获取未开始的课程列表
     *
     * @param classGroupIds
     * @param studentIds
     * @return
     * @author zouxuan
     */
    List<Long> queryStudentNotStartByClassIdsAndStudentIds(@Param("classGroupIds") List<Integer> classGroupIds,
                                                           @Param("studentIds") List<Integer> studentIds);

    /**
     * 获取没有学员的课程
     *
     * @param courseIds
     * @return
     * @author zouxuan
     */
    List<Long> findNoStudentCourseIds(@Param("courseIds") List<Long> courseIds);

    /**
     * 根据班级编号获取未开始的主课
     *
     * @param classGroupIds
     * @return
     * @author zouxuan
     */
    int findNoStartMasterCourseNum(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
     *
     * @param params
     * @return
     * @author zouxuan
     */
    List<StudentNoStartCoursesDto> queryStudentNoStartCourse(Map<String, Object> params);

    /**
     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
     *
     * @param params
     * @return
     * @author zouxuan
     */
    int countStudentNoStartCourse(Map<String, Object> params);

    /**
     * 根据班级编号和课程编号获取课程列表
     *
     * @param classGroupId
     * @param allLockCourseIds
     * @return
     */
    List<CourseSchedule> findCoursesByClassGroupIdAndCourseIds(@Param("classGroupId") Long classGroupId, @Param("allLockCourseIds") List<Long> allLockCourseIds);

    /**
     * 获取班级总剩余时长
     *
     * @param masterClassGroupId
     * @return
     */
    Integer queryTotalCourseTimes(Integer masterClassGroupId);


    /**
     * 获取进行中课程数量
     *
     * @return
     */
    Integer getUnderwayCourseNum(@Param("musicGroupId") String musicGroupId, @Param("groupType") GroupType groupType, @Param("status") CourseStatusEnum status);
}
