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

import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto;
import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
import com.ym.mec.biz.dal.dto.StudentErrorLeaveDto;
import com.ym.mec.biz.dal.dto.StudentLeaveCourseDto;
import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
import com.ym.mec.biz.dal.enums.*;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Param;
import org.apache.poi.ss.formula.functions.Index;

import java.math.BigDecimal;
import java.util.*;

public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData> {

    int batchInsert(@Param("datas") List<IndexBaseMonthData> datas);

    int batchInsertWithDataType(@Param("datas") List<IndexBaseMonthData> datas,
                                @Param("dataType")IndexDataType dataType);

    int deleteWithMonthAndType(@Param("months") Collection months,
                               @Param("dataType")IndexDataType dataType,@Param("tenantId") Integer tenantId);

    IndexBaseMonthData getOrganDataWithDayAndDataType(@Param("organId") Integer organId,
                                                      @Param("day") String day,
                                                      @Param("dataType")IndexDataType dataType);

    /**
     * @describe 获取首页统计数据
     * @author Joburgess
     * @date 2021/1/8 0008
     * @param organIds:
     * @param dataTypes:
     * @param startMonth:
     * @param endMonth:
     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
     */
	List<IndexBaseMonthData> getIndexBaseData(@Param("organIds") Set<Integer> organIds,
                                              @Param("dataTypes") Set<String> dataTypes,
                                              @Param("startMonth") String startMonth,
                                              @Param("endMonth") String endMonth,@Param("tenantId") Integer tenantId);

	List<IndexBaseMonthData> getAllIndexBaseData(@Param("organIds") Set<Integer> organIds,
                                                 @Param("dataTypes") Set<String> dataTypes,
                                                 @Param("startMonth") String startMonth,
                                                 @Param("endMonth") String endMonth,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getVipCourseDataList(@Param("organIds") Set<Integer> organIds,
                                              @Param("dataTypes") Set<String> dataTypes,
                                              @Param("startMonth") String startMonth,
                                              @Param("endMonth") String endMonth,@Param("tenantId") Integer tenantId);

	List<IndexBaseMonthData> getWithDayAndDataType(@Param("day") String day,
                                                   @Param("dataType")IndexDataType dataType,@Param("tenantId") Integer tenantId);

	/**
	 * @describe 统计学员注册数据
	 * @author Joburgess
	 * @date 2021/2/24 0024
	 * @param dayStr:
	 * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
	 */
	List<IndexBaseMonthData> getStudentRegistrationData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

	/**
	 * @describe 统计新增学员注册数据
	 * @author Joburgess
	 * @date 2021/2/24 0024
	 * @param dayStr:
	 * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
	 */
	List<IndexBaseMonthData> getAddStudentRegistrationData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

	/**
	 * @describe 付费转化率
	 * @author Joburgess
	 * @date 2021/2/24 0024
	 * @param dayStr:
	 * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
	 */
	List<IndexBaseMonthData> getChargeStudentChangeData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    /**
     * @describe 统计系统中指定时间段的学员注册数据
     * @author Joburgess
     * @date 2021/1/7 0007
     * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
     */
    List<IndexBaseMonthData> getStudentSignUpData(@Param("dayStr") String dayStr,
                                                  @Param("courseStartDay") String courseStartDay,@Param("tenantId") Integer tenantId);

    /**
     * @describe 统计作业布置数据
     * @author Joburgess
     * @date 2021/1/7 0007
     * @return java.util.List<com.ym.mec.biz.dal.dto.IndexBaseMonthDto>
     */
    List<IndexBaseMonthData> getHomeworkData(@Param("dayStr") String dayStr,
                                             @Param("type") String type,@Param("tenantId") Integer tenantId);

    /**
     * @describe 统计合作单位数据
     * @author Joburgess
     * @date 2021/1/11 0011
     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
     */
    List<IndexBaseMonthData> getSchoolData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    /**
     * @describe 统计乐团数据
     * @author Joburgess
     * @date 2021/1/11 0011
     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
     */
    List<IndexBaseMonthData> getMusicData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    /**
     * @describe 统计乐团学员数据
     * @author Joburgess
     * @date 2021/1/11 0011
     * @return java.util.List<com.ym.mec.biz.dal.entity.IndexBaseMonthData>
     */
    List<IndexBaseMonthData> getMusicStudentData(@Param("dayStr") String dayStr,
                                                 @Param("type") String type,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getMusicGroupPreRegistrationStudentData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getMusicGroupStudentFromPreData(@Param("dayStr") String dayStr,
                                                             @Param("paymentStatus") PaymentStatusEnum paymentStatus,@Param("tenantId") Integer tenantId);

    List<Integer> getMusicGroupStudentIdFromPre(@Param("dayStr") String dayStr,
                                                @Param("paymentStatus") PaymentStatusEnum paymentStatus,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getStudentConversionData(@Param("dayStr") String dayStr,
                                                      @Param("studentIds") List<Integer> studentIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getOtherStudentData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getVipPracticeAddStudentData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getTeacherData(@Param("dayStr") String dayStr,
                                            @Param("jobNature") JobNatureEnum jobNature,
                                            @Param("isDemission") Boolean isDemission,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getGroupCourseData(@Param("dayStr") String dayStr,
                                                @Param("groupType")GroupType groupType,
                                                @Param("courseStatus") CourseStatusEnum courseStatus,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getGroupSurplusCourseData(@Param("dayStr") String dayStr,
                                                @Param("groupType")GroupType groupType,
                                                @Param("courseStatus") CourseStatusEnum courseStatus,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getGroupCourseDataWithGroup(@Param("dayStr") String dayStr,
                                                        @Param("startDate") String startDate,
                                                        @Param("endDate") String endDate,
                                                        @Param("groupType")GroupType groupType,
                                                        @Param("courseStatus") CourseStatusEnum courseStatus,
                                                         @Param("teachMode") TeachModeEnum teachMode,
                                                         @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<OrganVipGroupCategoryCourseNumDto> getVipGroupCategoryCourseData(@Param("dayStr") String dayStr,
                                                                          @Param("startDate") String startDate,
                                                                          @Param("endDate") String endDate,
                                                                          @Param("groupType")GroupType groupType,
                                                                          @Param("courseStatus") CourseStatusEnum courseStatus,
                                                                          @Param("teachMode") TeachModeEnum teachMode,
                                                                          @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    int countLessThenThreeClassGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId,@Param("tenantId") Integer tenantId);


    List<Map<Integer, Integer>> countLessThenThreeClassOrganGroupNum(@Param("organIds") Set<Integer> organIds,
                                                                     @Param("educationUserId") Integer educationUserId,
                                                                     @Param("tenantId") Integer tenantId);

    List<String> getLessThenThreeMusicGroup(@Param("organIds") Set<Integer> organIds,@Param("tenantId") Integer tenantId);

    int queryErrInspection(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime,@Param("tenantId") Integer tenantId);

    List<Map<Integer, Integer>> queryOrganErrInspection(@Param("organIds") Set<Integer> organIds,
                                                        @Param("startTime") String startTime,
                                                        @Param("tenantId") Integer tenantId);

    IndexErrInfoDto getNoClassMusicGroupStudentInfo(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId,@Param("tenantId") Integer tenantId);

    List<Map<Integer, Integer>> getOrganNoClassMusicGroupStudentNum(@Param("organIds") Set<Integer> organIds,
                                                                    @Param("educationUserId") Integer educationUserId,
                                                                    @Param("tenantId") Integer tenantId);

    int countNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds,
                                 @Param("educationUserId") Integer educationUserId,
                                 @Param("noPaymentType") Integer noPaymentType,@Param("tenantId") Integer tenantId);



    List<Map<Integer, Integer>> countOrganNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds,
                                                              @Param("educationUserId") Integer educationUserId,
                                                              @Param("tenantId") Integer tenantId);

    List<String> getNoPaymentMusicGroup(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId,@Param("tenantId") Integer tenantId);

    List<Long> queryApplyForQuitGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId,@Param("tenantId") Integer tenantId);

    List<Map<Integer, Integer>> queryOrganApplyForQuitGroupNum(@Param("organIds") Set<Integer> organIds,
                                                               @Param("educationUserId") Integer educationUserId,
                                                               @Param("tenantId") Integer tenantId);

    int queryStudentAttendanceInfo(@Param("organIds") Set<Integer> organIds,
                                          @Param("type") String type, @Param("startTime") String startTime,@Param("tenantId") Integer tenantId);


    /**
     * 课程时间安排异常
     * @param organIds
     * @return
     */
    int getCourseTimeError(@Param("organIds") Set<Integer> organIds,
                           @Param("classGroupIds") List<Long> classGroupIds,
                           @Param("courseStartTimeError") String courseStartTimeError,
                           @Param("courseEndTimeError") String courseEndTimeError,@Param("tenantId") Integer tenantId);

    List<Map<Integer, Integer>> getOrganCourseTimeError(@Param("organIds") Set<Integer> organIds,
                                                        @Param("classGroupIds") List<Long> classGroupIds,@Param("tenantId") Integer tenantId);

    /**
     * 获取考勤异常编号
     * @param organIds
     * @return
     */
    int getAttendanceError(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds,@Param("tenantId") Integer tenantId);
    List<Map<Integer, Integer>> getOrganAttendanceError(@Param("organIds") Set<Integer> organIds,
                                                        @Param("startTime") String startTime,
                                                        @Param("classGroupIds") List<Long> classGroupIds,
                                                        @Param("tenantId") Integer tenantId);

    /**
     * 获取旷课考勤
     * @param organIds
     * @return
     */
    int getNoAttendance(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds,@Param("tenantId") Integer tenantId);
    List<Map<Integer, Integer>> getOrganNoAttendance(@Param("organIds") Set<Integer> organIds,
                                                     @Param("startTime") String startTime,
                                                     @Param("classGroupIds") List<Long> classGroupIds,
                                                     @Param("tenantId") Integer tenantId);

    /**
     * 获取老师离职申请数
     * @param organIdsStr
     * @return
     */
    int queryTeacherLeave(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime,@Param("tenantId") Integer tenantId);

    /**
     * 获取预计课酬偏低的老师编号
     * @param organIdsStr
     * @param monthStr
     * @return
     */
    int queryLowTeacherSalary(@Param("organIdsStr") String organIdsStr, @Param("monthStr") String monthStr,@Param("tenantId") Integer tenantId);

    /**
     * 获取预计课酬偏低的老师编号
     * @param organIdsStr
     * @param monthStr
     * @return
     */
    List<Map<Integer, Integer>> queryOrganLowTeacherSalary(@Param("organIdsStr") String organIdsStr,
                                                           @Param("monthStr") String monthStr,
                                                           @Param("tenantId") Integer tenantId);

    /**
     * 乐团巡查任务未计划
     * @param organIdsStr
     * @return
     */
    int queryInspectionItem(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime, @Param("userId") Integer userId,@Param("tenantId") Integer tenantId);
    List<Map<Integer, Integer>> queryOrganInspectionItem(@Param("organIdsStr") String organIdsStr,
                                                         @Param("startTime") String startTime,
                                                         @Param("userId") Integer userId,
                                                         @Param("tenantId") Integer tenantId);

    /**
     * 乐团巡查任务未提交
     * @param organIdsStr
     * @return
     */
    int queryInspectionItemPlan(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime,@Param("tenantId") Integer tenantId);
    List<Map<Integer, Integer>> queryOrganInspectionItemPlan(@Param("organIdsStr") String organIdsStr,
                                                             @Param("startTime") String startTime,
                                                             @Param("tenantId") Integer tenantId);

    /**
     * 未完成的回访任务
     * @param organIdsStr
     * @return
     */
    int queryStudentVisit(@Param("organIdsStr") String organIdsStr, @Param("startTime") String startTime, @Param("userId") Integer userId,@Param("tenantId") Integer tenantId);
    List<Map<Integer, Integer>> queryOrganStudentVisit(@Param("organIdsStr") String organIdsStr,
                                                       @Param("startTime") String startTime,
                                                       @Param("userId") Integer userId,
                                                       @Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getFinancePayData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getFinanceBalanceData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getFinanceActualData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getFinancePayDataWithTimely(@Param("startDate") String startDate,
                                                         @Param("endDate") String endDate,
                                                         @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getOrganFinancePayDataWithTimely(@Param("startDate") String startDate,
                                                         @Param("endDate") String endDate,
                                                         @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getFinanceBalanceDataWithTimely(@Param("startDate") String startDate,
                                                             @Param("endDate") String endDate,
                                                             @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getOrganFinanceBalanceDataWithTimely(@Param("startDate") String startDate,
                                                             @Param("endDate") String endDate,
                                                             @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getFinanceActualDataWithTimely(@Param("startDate") String startDate,
                                                            @Param("endDate") String endDate,
                                                            @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getOrganFinanceActualDataWithTimely(@Param("startDate") String startDate,
                                                            @Param("endDate") String endDate,
                                                            @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    /**
     * @describe 各分部教师服务指标异常
     * @author Joburgess
     * @date 2021/4/15 0015
     * @param params:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
     */
    List<Map<Integer, Integer>> countOrganTeacherServeInfo(Map<String, Object> params);

    List<IndexBaseMonthData> getTotalAmountDataWithTimely(@Param("startDate") String startDate,
                                                            @Param("endDate") String endDate,
                                                            @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);
    List<IndexBaseMonthData> getOrganTotalAmountDataWithTimely(@Param("startDate") String startDate,
                                                            @Param("endDate") String endDate,
                                                            @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getTotalAmountDataWithTimelyDetails(@Param("startDate") String startDate,
                                                                 @Param("endDate") String endDate,
                                                                 @Param("organIds") List<Integer> organIds,
                                                                 @Param("orderType") String orderType,
                                                                 @Param("notOrderType") List<String> notOrderType,@Param("tenantId") Integer tenantId);
    List<IndexBaseMonthData> getOrganTotalAmountDataWithTimelyDetails(@Param("startDate") String startDate,
                                                                 @Param("endDate") String endDate,
                                                                 @Param("organIds") List<Integer> organIds,
                                                                 @Param("orderType") String orderType,
                                                                 @Param("notOrderType") List<String> notOrderType,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getVipAmountDataWithTimelyDetails(@Param("startDate") String startDate,
                                                                 @Param("endDate") String endDate,
                                                                 @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);
    List<IndexBaseMonthData> getOrganVipAmountDataWithTimelyDetails(@Param("startDate") String startDate,
                                                                 @Param("endDate") String endDate,
                                                                 @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getOtherAmountDataWithTimelyDetails(@Param("startDate") String startDate,
                                                                 @Param("endDate") String endDate,
                                                                 @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);
    List<IndexBaseMonthData> getOrganOtherAmountDataWithTimelyDetails(@Param("startDate") String startDate,
                                                                 @Param("endDate") String endDate,
                                                                 @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);

    int countStudentErrorLeave(@Param("organIdList") Set<Integer> organIdList,
                               @Param("format") String format,
                               @Param("classGroupIds") List<Long> classGroupIds,
                               @Param("studentErrorLeaveNum") Integer studentErrorLeaveNum,@Param("tenantId") Integer tenantId);

    List<Map<Integer, Integer>> countOrganStudentErrorLeave(@Param("organIds") Set<Integer> organIds,
                                                            @Param("classGroupIds") List<Long> classGroupIds,
                                                            @Param("tenantId") Integer tenantId);

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

    List<StudentErrorLeaveDto> queryStudentErrorLeave(Map<String, Object> params);

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

    List<StudentLeaveCourseDto> queryStudentLeaveCourseList(Map<String, Object> params);

    List<Map<Integer, BigDecimal>> getStudentErrorLeaveNumMap(Map<String, Object> params);

    List<IndexBaseMonthData> getOrgansStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getMemberStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getNewMemberStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getExperienceMemberStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getCloudStudyDayUseStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getCloudStudyLivelyStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    List<IndexBaseMonthData> getCloudStudyNewStudentNumData(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    /**
     * 云教练活动分部统计
     * @param params
     * @return
     */
    List<CloudTeacherActiveTargetDto> countCloudTeacherActive(Map<String, Object> params);

    //获取vip课订单数量
    List<IndexBaseMonthData> getStudentVipOrderNum(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    //获取乐理课订单数量
    List<IndexBaseMonthData> getStudentTheoryOrderNum(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);

    //获取网管课订单数量
    List<IndexBaseMonthData> getStudentPracticeOrderNum(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);
}
