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

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

import com.ym.mec.biz.dal.dto.FeeStudentDto;
import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
import org.apache.ibatis.annotations.Param;

import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
import com.ym.mec.common.dal.BaseDAO;

public interface MusicGroupStudentFeeDao extends BaseDAO<Long, MusicGroupStudentFee> {

	/**
	 * 根据乐团编号和学员编号获取乐团费用信息
	 * @param userId
	 * @return
	 */
	MusicGroupStudentFee findByUser(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);

	/**
	 * 删除缴费记录
	 * @param userId
	 * @param musicGroupId
	 * @return
	 */
	int deleteByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
	
	/**
	 * 删除缴费记录
	 * @param musicGroupId
	 * @return
	 */
	int deleteByMusicGroupId(@Param("musicGroupId") String musicGroupId,@Param("isLock") Integer isLock);

	/**
	 * @describe 根据学生编号和乐团编号更新旷课次数
	 * @author Joburgess
	 * @date 2019/10/19
	 * @param userId: 用户编号
	 * @param musicGroupId: 乐团编号
	 * @param operate: 0重置,1加1
	 * @return int
	 */
	int updateStudentAbsenteeismTimes(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId, @Param("operate") Integer operate);

	/**
	 * 更新乐团下所有学生的下次缴费时间
	 * @param musicGroupId 乐团编号
	 * @param nextPaymentDate 下次缴费时间
	 * @return
	 */
	int updateNextPaymentDate(@Param("musicGroupId") String musicGroupId, @Param("nextPaymentDate") Date nextPaymentDate);

	/**
	 * 根据可提前缴费的天数查询即将续费的列表
	 * @param days 可提前缴费天数
	 * @return
	 */
	List<MusicGroupStudentFee> queryWillRenewList(int days);

	/**
	 * 批量更新对象
	 * @param updateList
	 * @return
	 */
	int batchUpdate(List<MusicGroupStudentFee> updateList);

	/**
	 * @Author: Joburgess
	 * @Date: 2019/10/17
	 * @params [musicGroupIds]
	 * @return java.util.List<java.util.Map<java.lang.Long,java.lang.Integer>>
	 * @describe 统计乐团下连续旷课超过次数的学生人数
	 */
	List<Map<Long, Integer>> countContinuosAbsenteeismStudentNum(@Param("musicGroupIds") List<String> musicGroupIds);

	/**
	 * 根据乐团编号列表和学员编号获取学员缴费状态
	 * @param userId
	 * @return
	 */
	List<Map<String, String>> queryUserPaymentStatus(@Param("userId") Integer userId, @Param("musicGroupIds") String musicGroupIds);

	/**
	 * @describe 获取学生对应乐团下的连续旷课次数
	 * @author Joburgess
	 * @date 2019/10/28
	 * @param musicGroupId: 乐团编号
	 * @param userIds: 用户编号列表
	 * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
	 */
	List<Map<Integer, Integer>> findContinuousAbsenteeismTimesByUsersAndMusicGroup(@Param("musicGroupId") String musicGroupId,
			@Param("userIds") List<Integer> userIds);

	/**
	 * 获取当前乐团未缴费的学员人数
	 * @param musicGroupId
	 * @return
	 */
	Integer countStudentNoPayNum(String musicGroupId);

	/**
	 * 根据乐团声部修改学员课程费用
	 * @param musicGroupId
	 * @param subjectId
	 */
    void updateCourseFee(@Param("musicGroupId") String musicGroupId, @Param("subjectId") Integer subjectId,@Param("courseFee") BigDecimal courseFee);

	/**
	 * 初始化学员缴费信息
	 * @param musicGroupId
	 */
	List<MusicGroupStudentFee> initMusicGroupStudentFee(String musicGroupId);

	/**
	 * 批量新增学员缴费信息
	 * @param musicGroupStudentFees
	 * @param nextPaymentDate
	 */
	void batchInsert(@Param("musicGroupStudentFees") List<MusicGroupStudentFee> musicGroupStudentFees
			, @Param("nextPaymentDate") Date nextPaymentDate, @Param("paymentStatus") String paymentStatus);

	/**
	 * 获取当前乐团下所有学员缴费状态
	 * @param musicGroupId
	 * @return
	 */
	List<Map<Integer, String>> findPaymentStatusMap(String musicGroupId);

	/**
	 * 修改单个学员缴费周期
	 * @param fee
	 */
    void updateStudentFee(@Param("fee") UpdateStudentFeeDto fee);

	/**
	 * 根据乐团编号获取fee表
	 * @param musicGroupId
	 * @return
	 */
	List<MusicGroupStudentFee> queryByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("studentIds") String studentIds);

	/**
	 * 修改学员缴费周期锁定状态
	 * @param fee
	 */
	void updateStudentFeeIsLock(@Param("fee") UpdateStudentFeeDto fee);

	/**
	 * 批量修改学员缴费周期
	 * @param month
	 * @param musicGroupId
	 */
	void batchUpdateCalender(@Param("month") String month, @Param("musicGroupId") String musicGroupId);

	/**
	 * 批量修改学员缴费周期
	 * @param musicGroupId
	 */
    void batchUpdateCalenders(String musicGroupId);

	/**
	 * 修改个人缴费周期
	 * @param userId
	 * @param musicGroupId
	 */
	void updateCalender(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);

	/**
	 * 修改课程费用
	 * @param ids
	 * @param courseFee
	 */
    void batchUpdateCourseFee(@Param("ids") String ids, @Param("courseFee") BigDecimal courseFee);

	/**
	 * 将乐团的学生缴费状态设置为未缴费
	 * @param calenderDetails
	 */
	void setNoPayment(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);

	/**
	 * 修改为缴费完成
	 * @param calenderDetails
	 */
	void setPaidCompleted(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);

	/**
	 * 剩余网管课课次加一
	 * @param musicGroupPaymentCalenderDetailIds
	 */
	void remainNetworkClassTimesAdd(@Param("musicGroupPaymentCalenderDetailIds") String musicGroupPaymentCalenderDetailIds);

	/**
	 * 获取fee表学员列表
	 * @param musicGroupId
	 * @return
	 */
    List<FeeStudentDto> queryFeeStudents(@Param("musicGroupId") String musicGroupId, @Param("search") String search, @Param("subjectId") Integer subjectId);

	/**
	 * 根据缴费项目修改缴费状态
	 * @param calenderId
	 * @param paymentStatus
	 */
	void updatePaymentStatus(@Param("calenderId") Long calenderId, @Param("paymentStatus") String paymentStatus);

}
