package com.yida.data.attendance.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yida.data.attendance.dto.ListStudentResultDTO;
import com.yida.data.attendance.vo.*;
import com.yida.data.common.core.entity.attendance.EduAttendanceResult;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 考勤结果 Mapper
 *
 * @author wjm
 * @date 2021-09-15 09:56:24
 */
public interface EduAttendanceResultMapper extends BaseMapper<EduAttendanceResult> {

    /**
     * 查询宿舍楼异常状态人数
     *
     * @param dormId 宿舍楼id
     * @param date   日期
     * @param time   0-中午，1-晚上
     * @param time   0-中午，1-晚上
     */
    StasticDormResultVO countDormLate(@Param("dormId") Long dormId,
        @Param("date") String date,
        @Param("time") Integer time);


    /**
     * 统计寝室在寝人数
     *
     * @param roomId 寝室id
     * @param date   日期
     */
    Integer countDormStay(@Param("roomId") Long roomId,
        @Param("date") String date);

    /**
     * 查询考勤记录
     *
     * @param roomIds    寝室id
     * @param studentIds 学生id
     * @param date       日期
     * @param schoolId   学校
     * @param campusId   校区
     * @param gradeId    年级
     * @param classId    班级
     * @param timeId     考勤时段id
     * @param time       1-中午，2-晚上
     * @param type       0-走读，1-住宿
     * @return
     */
    List<EduAttendanceResult> listStudentResult(@Param("roomIds") List<Long> roomIds,
        @Param("studentIds") List<Long> studentIds,
        @Param("date") LocalDate date,
        @Param("schoolId") Long schoolId,
        @Param("campusId") Long campusId,
        @Param("gradeId") Long gradeId,
        @Param("classId") Long classId,
        @Param("timeId") Long timeId,
        @Param("time") Integer time,
        @Param("type") Integer type,
        @Param("status") Integer status);

    /**
     * 该寝室是否已核查
     *
     * @param roomId
     * @param date
     * @param time
     * @return 1已核查，0未核查
     */
    Integer isVerify(@Param("roomId") Long roomId,
        @Param("date") LocalDate date,
        @Param("time") Integer time);

    List<AttendanceResultDormVO> listAttendanceResult(Page page,
        @Param("studentIds") List<Long> studentIds,
        @Param("ruleId") Long ruleId,
        @Param("startDate") LocalDate startDate,
        @Param("endDate") LocalDate endDate);


    /**
     * 查询是否存在记录
     *
     * @param userId
     * @param date
     * @param timeId
     * @return 1存在，null不存在
     */
    Integer existResult(@Param("userId") Long userId,
        @Param("date") LocalDate date,
        @Param("timeId") Long timeId);


    List<ResultDetailVO> findResult(@Param("userId") Long userId,
        @Param("date") LocalDate date,
        @Param("timeId") Long timeId);

    /**
     * 查询需要推送的未到记录
     *
     * @param compareTime 用来比较的时间
     * @param schoolId    学校id
     * @return
     */
    List<EduAttendanceResult> listPushNotArrive(@Param("compareTime") LocalDateTime compareTime,
        @Param("schoolId") Long schoolId);

    /**
     * 查询校门年级某天 考勤时间段
     *
     * @param gradeId
     * @param date
     * @return
     */
    List<RuleTimeVO> listGradeResultTime(@Param("gradeId") Long gradeId,
        @Param("date") String date);

    /**
     * 统计各考勤结果数量
     */
    CountVO countStudentAttendance(@Param("studentId") Long studentId,
        @Param("schoolIds") List<Long> schoolIds,
        @Param("startDate") LocalDate startDate,
        @Param("endDate") LocalDate endDate);

    /**
     * 查询学生考勤记录
     *
     * @param dto
     * @return
     */
    List<ResultDetailVO> listStudentResultDetail(@Param("dto") ListStudentResultDTO dto,
        @Param("studentIds") List<Long> studentIds);

    /**
     * 查询学生考勤次数
     *
     * @param studentIds 学生id
     * @param timeId     时段id
     * @param date       日期
     * @param type       考勤结果类型
     * @return 符合条件的学生id列表  为去重 大小为考勤次数
     */
    List<ResultDetailVO> listResultStudent(@Param("studentIds") List<Long> studentIds,
        @Param("timeId") Long timeId,
        @Param("date") String date,
        @Param("month") String month,
        @Param("type") Integer type);

    /**
     * 查询学生中的到校人数
     */
    Integer countRealStudentNum(@Param("studentIds") List<Long> studentIds,
        @Param("timeId") Long timeId,
        @Param("date") String date);

    /**
     * 查询需要推送给管理员的记录
     *
     * @param compareTime 用来比较的时间
     * @param schoolId    学校id
     * @param status      管理员重复推送状态
     * @return java.util.List<com.yida.data.common.core.entity.attendance.EduAttendanceResult>
     * @author ZYJ
     * @date 2022/7/14 16:41
     */
    List<EduAttendanceResult> listManagePushNotArrive(@Param("compareTime") LocalDateTime compareTime,
        @Param("schoolId") Long schoolId,
        @Param("status") String status);
}
