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

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

import org.apache.ibatis.annotations.Param;

import com.ym.mec.biz.dal.dto.SimpleUserDto;
import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
import com.ym.mec.common.dal.BaseDAO;

public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicGroupPaymentCalenderDetail> {

	/**
	 * 批量新增
	 *
	 * @param musicGroupPaymentCalenderDetailList
	 * @return
	 */
	int batchInsert(List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList);

	/**
	 * 获取列表
	 *
	 * @param ids
	 * @return
	 */
    List<MusicGroupPaymentCalenderDetail> queryListByIds(@Param("ids") String ids);

	/**
	 * 批量修改
	 *
	 * @param calenderDetails
	 */
	void batchUpdate(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);

	/**
	 * 根据指定的日历编号查询
	 *
	 * @param calenderId
	 * @return
	 */
	List<MusicGroupPaymentCalenderDetail> queryByCalenderId(@Param("calenderId") Long calenderId, @Param("paymentStatus") String paymentStatus);

	/**
	 * 根据声部获取乐团下完成缴费的学员
	 *
	 * @param musicGroupId
	 * @param subjectId
	 * @return
	 */
	List<SimpleUserDto> findMusicGroupStudentWithSubject(@Param("musicGroupId") String musicGroupId,
														 @Param("subjectId") Integer subjectId);

	/**
	 * 获取学生最后一期续费记录
	 *
	 * @param musicGroupId
	 * @param userId
	 * @return
	 */
	MusicGroupPaymentCalenderDetail getUserLastCalenderDetail(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);

	/**
	 * 获取可开启缴费的数据集
	 *
	 * @param ids
	 * @return
	 */
	List<MusicGroupPaymentCalenderDetail> queryCanOpenList(@Param("ids") String ids);

	/**
	 * 当前用户是否有进行中的订单
	 *
	 * @param musicGroupId
	 * @param userId
	 * @return
	 */
	int queryIntersectionByPaymentDate(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);

	/**
	 * 刷新学员乐团付费状态
	 */
	void refreshUserMusicGroupPaymentStatusTask();

	/**
	 * 获取可以推送缴费提醒的列表
	 *
	 * @param musicGroupPaymentCalenderId
	 * @return
	 */
	List<MusicGroupPaymentCalenderDetail> queryCanPushList(@Param("musicGroupPaymentCalenderId") Long musicGroupPaymentCalenderId);

	/**
	 * 获取当天创建，已开启缴费，并且未缴费的用户列表
	 *
	 * @return
	 */
	List<MusicGroupPaymentCalenderDetail> queryNoPaymentCanPushList();

	/**
	 * 获取学员对应的乐团
	 *
	 * @return
	 */
	List<Map<Integer, String>> queryPaymentPushMap();

	/**
	 * 删除缴费详情
	 *
	 * @param musicGroupPaymentCalenderIds
	 */
	void batchDel(String musicGroupPaymentCalenderIds);

	/**
	 * 查询学生在指定乐团中未交费的记录
	 *
	 * @param userId
	 * @param musicGroupId
	 */
	List<MusicGroupPaymentCalenderDetail> queryNotPaymentStudentByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);

	/**
	 * 根据缴费记录删除缴费详情
	 *
	 * @param id
	 */
    void deleteByCalenderId(@Param("id") Long id);

	/**
	 * 获取缴费详情学员列表
	 *
	 * @param calenderId
	 * @return
	 */
	Set<Integer> queryStudentIds(Long calenderId);

	/**
	 * 获取未缴费的员列表
	 *
	 * @param calenderId
	 * @return
	 */
	Set<Integer> queryNoPaymentStudentIds(Long calenderId);

	/**
	 * 查询进行中的缴费
	 *
	 * @param musicGroupId
	 * @param userId
	 * @return
	 */
    Integer countOpenPayment(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);

	/**
	 * @param calenderId:
	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail>
	 * @describe 获取指定缴费日历的详情
	 * @author Joburgess
	 * @date 2020.10.27
	 */
	List<MusicGroupPaymentCalenderDetail> getCalenderDetailWithCalender(@Param("calenderId") Long calenderId);

	/**
	 * @param calenderIds:
	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail>
	 * @describe 获取指定缴费日历的详情
	 * @author Joburgess
	 * @date 2020.10.30
	 */
	List<MusicGroupPaymentCalenderDetail> getWithCalenderIds(@Param("calenderIds") List<Long> calenderIds);

    /**
	 * @param batchNo:
	 * @param musicGroupId:
	 * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
	 * @describe 获取缴费日历学员列表
	 * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
	 * @author zouxuan
	 * @date 2020/10/30
	 * @time 16:39
	 */
	List<SimpleUserDto> querySimpleUserDto(@Param("batchNo") String batchNo, @Param("musicGroupId") String musicGroupId);

	/**
	 * 统计实际收款金额
	 *
	 * @param id
	 * @return
	 */
	BigDecimal sumActualAmount(@Param("id") Long id);

	/**
	 * @param calenderId:
	 * @param userId:
	 * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail
	 * @describe 获取学员缴费日历详情
	 * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
	 * @author zouxuan
	 * @date 2020/11/3
	 * @time 14:47
	 */
	MusicGroupPaymentCalenderDetail findByCalenderIdAndUserId(@Param("calenderId") Long calenderId, @Param("userId") Integer userId);

	/**
	 * @param orderId:
	 * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail
	 * @describe 根据订单编号获取缴费详情
	 * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
	 * @author zouxuan
	 * @date 2020/11/3
	 * @time 15:41
	 */
	MusicGroupPaymentCalenderDetail findByOrderId(@Param("orderId") Long orderId);

	/**
	 * 获取未缴费且不是0元的学员列表
	 *
	 * @param calenderId
	 * @return
	 */
    List<Map<Integer, String>> queryNoPaymentAndNotZeroStudent(@Param("calenderId") Long calenderId, @Param("studentIds") Set studentIds);

	/**
	 * 将0元未缴费学员缴费状态更新为已缴费
	 *
	 * @param calenderId
	 */
	void updateNoPaymentAndZeroPaymentStatus(Long calenderId);
}
