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

import com.ym.mec.auth.api.entity.SysUser;
import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.CourseHomework;
import com.ym.mec.biz.dal.entity.Teacher;
import com.ym.mec.common.dal.BaseDAO;
import com.ym.mec.common.entity.ImUserModel;

import org.apache.ibatis.annotations.Param;

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

public interface TeacherDao extends BaseDAO<Integer, Teacher> {
	
	Teacher getLocked(Integer id);

    /**
     * 根据证件号查询老师
     *
     * @param certificateNum 证件号
     * @return Teacher 老师信息
     */
    Teacher findByCertificateNum(@Param("certificateNum") String certificateNum);

    /**
     * 修改用户信息
     *
     * @param user
     */
    void updateUser(SysUser user);

    /**
     * 新增sysUser
     *
     * @param user
     */
    void addSysUser(SysUser user);

    /**
     * 获取和当前教师相关的学员列表
     *
     * @param teacherId
     * @param search
     * @return
     */
    List<BasicUserDto> queryGroupStudents(@Param("teacherId") Integer teacherId, @Param("search") String search);

    /**
     * 根据用户编号列表获取用户realName
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, String>> queryNameByIds(@Param("userIds") String userIds);

    List<Map<Integer, String>> queryNameByIdList(@Param("userIds") List<Integer> userIds);

    List<Map<Integer, String>> queryUserNameByIdList(@Param("userIds") List<Integer> userIds);

    List<Map<Integer, String>> querySubjectNameByIdList(@Param("userIds") List<Integer> userIds);

    /**
     * 根据用户编号列表获取手机号
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, String>> queryPhoneByIds(@Param("userIds") String userIds);

    /**
     * 根据用户编号获取用户名称
     *
     * @param userId
     * @return
     */
    String queryNameById(@Param("userId") Integer userId);

    /**
     * @param userIds:
     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
     * @describe
     * @author Joburgess
     * @date 2020/2/10
     */
    List<SimpleUserDto> findSimpleTeachers(@Param("userIds") List<Integer> userIds);

    List<SimpleUserDto> getUsersSimpleInfo(@Param("userIds") List<Integer> userIds);

    /**
     * @param organId:   分部编号
     * @param subjectId: 声部编号列表
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherBasicDto>
     * @describe 获取指定声部和分部下的全职老师
     * @author Joburgess
     * @date 2020/2/2
     */
    List<TeacherBasicDto> findTeaTeachersByOrganAndSubject(@Param("organId") Integer organId,
                                                           @Param("subjectId") Integer subjectId);


    /**
     * @param organId:   分部编号
     * @param subjectId: 声部编号列表
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherBasicDto>
     * @describe 获取指定声部和分部下的全职老师
     * @author Joburgess
     * @date 2020/2/2
     */
    List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject1(@Param("organId") Integer organId,
                                                                  @Param("subjectId") Integer subjectId);

    /**
     * @param organId:   分部编号
     * @param subjectId: 声部编号列表
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherBasicDto>
     * @describe 获取指定声部和分部下的全职老师--付费
     * @author Joburgess
     * @date 2020/2/2
     */
    List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject2(@Param("organId") Integer organId,
                                                                  @Param("subjectId") Integer subjectId);

    List<ExtendTeacherBasicDto> findTeaTeachersByOrganAndSubject3(@Param("organId") Integer organId,
                                                                  @Param("subjectId") Integer subjectId);

    /**
     * @param organIds:   部门编号列表
     * @param subjectIds: 声部编号列表
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherBasicDto>
     * @describe 根据部门和声部获取教师列表
     * @author Joburgess
     * @date 2019/12/24
     */
    List<TeacherBasicDto> findTeacherByOrganAndSubject(@Param("organIds") String organIds,
                                                       @Param("subjectIds") String subjectIds);

    /**
     * @param teacherId:
     * @return com.ym.mec.biz.dal.dto.TeacherBasicDto
     * @describe 获取教师
     * @author Joburgess
     * @date 2019/12/26
     */
    TeacherBasicDto findByTeacherId(@Param("teacherId") Integer teacherId);

    /**
     * count上课结算列表
     *
     * @param params
     * @return
     */
    int countCloses(Map<String, Object> params);

    /**
     * 获取教师上课结算列表
     *
     * @param params
     * @return
     */
    List<TeacherCloseDto> queryCloses(Map<String, Object> params);

    /**
     * @param musicGroupId: 乐团编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>
     * @describe 获取指定乐团下的所有老师
     * @author Joburgess
     * @date 2019/10/19
     */
    List<BasicUserDto> findTeacherByMusicGroup(String musicGroupId);


    /**
     * 获取教师未结算课酬综合
     *
     * @param teacherId
     * @return
     */
    BigDecimal findTeacherNoPay(Integer teacherId);

    /**
     * 获取乐团详情老师列表
     *
     * @param params
     * @return
     */
    List<MusicGroupTeachersDto> queryMusicGroupTeachers(Map<String, Object> params);

    /**
     * Count乐团详情老师列表
     *
     * @param params
     * @return
     */
    int countMusicGroupTeachers(Map<String, Object> params);

    /**
     * 根据教师编号列表，和班级编号列表获取教师签到次数
     *
     * @param teacherIdStr
     * @return
     */
    List<Map<Integer, Integer>> findSignNum(@Param("teacherIdStr") String teacherIdStr, @Param("musicGroupId") String musicGroupId);

    /**
     * 获取教师乐团上课记录（乐团管理--乐团详情）
     *
     * @param params
     * @return
     */
    List<MusicGroupTeacherAttendanceDto> queryTeacherAttendance(Map<String, Object> params);

    /**
     * COUNT教师乐团上课记录（乐团管理--乐团详情）
     *
     * @param params
     * @return
     */
    int countTeacherAttendance(Map<String, Object> params);

    /**
     * 获取乐团学员报名列表
     *
     * @param params
     * @return
     */
    List<MusicGroupStudentApplyDto> queryMusicGroupStudentApply(Map<String, Object> params);

    /**
     * COUNT乐团学员报名列表
     *
     * @param params
     * @return
     */
    int countMusicGroupStudentApply(Map<String, Object> params);

    /**
     * 获取老师的群组基本信息
     *
     * @param teacherIds
     * @param search
     * @return
     */
    List<BasicUserDto> queryMusicGroupStudents(@Param("teacherIds") String teacherIds, @Param("search") String search);

    /**
     * @param subjectId: 声部编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.Teacher>
     * @describe 根据声部获取部门下的老师
     * @author Joburgess
     * @date 2019/11/4
     */
    List<Teacher> findOrganTeacherBySubject(@Param("subjectId") Integer subjectId);

    /**
     * 根据分部查询老师数
     *
     * @param organId
     * @return
     */
    Map<String, Integer> queryOrganTeacherNum(@Param("organId") String organId);

    /**
     * @param teacherIds: 教师编号里列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.Teacher>
     * @describe 根据教师编号获取教师信息
     * @author Joburgess
     * @date 2019/12/10
     */
    List<Teacher> findByTeacherIds(@Param("teacherIds") List<Integer> teacherIds);

    /**
     * 获取分部下的老师列表
     *
     * @param organId
     * @param subjectIds
     * @return
     */
    List<Teacher> findTeacherByOrganId(@Param("organId") String organId, @Param("subjectIds") String subjectIds, @Param("jobNature") String jobNature);

    /**
     * 获取用户username
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, String>> queryUsernameByIds(@Param("userIds") List<Integer> userIds);

    /**
     * @param params: 搜索参数
     * @return java.util.List<com.ym.mec.biz.dal.entity.Teacher>
     * @describe 教师搜索
     * @author Joburgess
     * @date 2020/1/7
     */
    List<TeacherBasicDto> searchTeachers(Map<String, Object> params);

    /**
     * 获取教师列表
     *
     * @param params
     * @return
     */
    int countTeacherName(Map<String, Object> params);

    List<Teacher> queryPageName(Map<String, Object> params);

    /**
     * 获取教师布置的作业
     *
     * @param courseScheduleId
     * @return
     */
    CourseHomework getCourseScheduleHomework(Integer courseScheduleId);

    List<Integer> lockTeachers(@Param("userIds") List<Integer> userIds);

    /**
     * 获取user
     *
     * @param userId
     * @return
     */
    SysUser getUser(int userId);

    /**
     * 获取教师基本信息
     *
     * @param teacherId
     * @return
     */
    List<BasicUserDto> queryTeacherBaseInfo(@Param("teacherId") Set<Integer> teacherId,@Param("search") String search);

    /**
     * 获取教师immodel
     *
     * @param teacherIds
     * @return
     */
    List<ImUserModel> queryTeacherImModel(@Param("teacherIds") Set<Integer> teacherIds, @Param("search") String search);

    /**
     * 获取和学员相关的乐团老师列表
     *
     * @param studentId
     * @return
     */
    Set<Integer> findMusicTeacherIds(@Param("studentId") Integer studentId);

    /**
     * 获取和学员相关的VIP老师列表
     *
     * @param studentId
     * @return
     */
    Set<Integer> findVipTeacherIds(Integer studentId);

    /**
     * 获取和学员相关的陪练课老师列表
     *
     * @param studentId
     * @return
     */
    Set<Integer> findPracticeTeacherIds(Integer studentId);

    /**
     * 获取教师基本信息
     * @param id
     * @return
     */
    BasicUserDto findTeacherInfo(Integer id);

    /**
     * 获取管理员通讯录
     * @param userId
     * @param search
     * @return
     */
    List<BasicUserDto> queryEducationIpa(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取当前学员关联的课程上的老师（已结束的vip和陪练）
     * @param studentId
     * @return
     */
    Set<Integer> findCloseCourseTeacherIds(Integer studentId);

    /**
     * 获取已结束课程老师关联的学生列表
     * @param teacherId
     * @return
     */
    List<BasicUserDto> findCloseCourseStudentIds(@Param("teacherId") Integer teacherId,@Param("search") String search);

    /**
     * 获取相关vip教务的学员编号
     * @param teacherId
     * @return
     */
    List<BasicUserDto> findVipEducationalStudentId(@Param("teacherId") Integer teacherId,@Param("search") String search);
    /**
     * 获取相关vip教务的学员编号
     * @param teacherId
     * @return
     */
    List<BasicUserDto> findCommEducationalStudentId(@Param("teacherId") Integer teacherId,@Param("search") String search);
    /**
     * 获取相关陪练教务的学员编号
     * @param teacherId
     * @return
     */
    List<BasicUserDto> findPracticeEducationalStudentId(@Param("teacherId") Integer teacherId,@Param("search") String search);

    /**
     * 获取学员相关的陪练课教务老师
     * @param userId
     * @return
     */
    Set<Integer> findPracticeEducationalTeacherId(Integer userId);

    /**
     * 获取学员相关的VIP课教务老师
     * @param studentId
     * @return
     */
    Set<Integer> findVipEducationalTeacherId(Integer studentId);

    /**
     * 获取学员相关的对外课教务老师
     * @param studentId
     * @return
     */
    Set<Integer> findCommEducationalTeacherId(Integer studentId);

    /**
     * 获取教师关联的学员列表
     * @param teacherId
     * @return
     */
    Set<Integer> queryCourseClassStudentIds(Integer teacherId);

    /**
     * 获取教师关联的老师列表
     * @param teacherId
     * @return
     */
    Set<Integer> queryCourseClassTeacherIds(Integer teacherId);

    /**
     * 获取老师关联的乐团的管理人员
     * @param teacherId
     * @return
     */
    List<String> queryMusicLeaderIds(Integer teacherId);

    /**
     * 获取和当前指导老师关联的学员
     * @return
     */
    List<BasicUserDto> queryStudent(Map<String, Object> params);

    /**
     * COUNT当前指导老师关联的学员
     * @param params
     * @return
     */
    int countStudent(Map<String, Object> params);
    
    List<TeacherDefaultSalaryDto> queryTeacherDefaultSalary(@Param("organIdList") String organIdList);

    BasicUserDto findUserByPhone(String phone);
    /**
     * 是否存在该userId
     * @Author zouxuan
     * @param userId
     * @return
     */
    Boolean existUser(@Param("userId") Object userId);

    /**
     * 获取流动分部老师
     * @param organId
     * @return
     */
    List<TeacherBasicDto> findByFlowOrganRangeTeachers(@Param("organId") String organId);

    /**
     * 根据教师编号列表获取名称map
     * @zouxuan
     * @param teachingTeacherIds
     * @return
     */
    String queryTeacherNameByTeacherIds(@Param("teachingTeacherIds") String teachingTeacherIds);

    List<Integer> queryAllIds();
}
