package jnpf.attendance.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.attendance.dto.AttendanceCountAvgHoursVo;
import jnpf.attendance.dto.DateDimensionsRangeDto;
import jnpf.entity.attendance.AttendanceDayStatistics;
import jnpf.model.attendance.dto.*;
import jnpf.model.attendance.vo.attendance.*;
import jnpf.model.common.DateRangeDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import javax.validation.constraints.NotEmpty;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * 考勤日度统计表
 *
 * @author shitou
 * @email shitou@niujiekeji.com
 * @date 2024-06-24 09:33:43
 */
@Mapper
@Component
public interface AttendanceDayStatisticsMapper extends BaseMapper<AttendanceDayStatistics> {
    /**
     * 查询日统计数据
     *
     * @param queryDto 筛选条件
     * @return 日统计数据
     */
    StatisticsDataQueryVo getDayStatisticsDataQuery(@Param("req") StatisticsDataQueryDto queryDto);

    /**
     * 查询日统计分页数据
     *
     * @param req 筛选条件
     * @return 分页数据
     */
    List<DayStatisticsQueryVo> getDayPageList(@Param("req") DayStatisticsDataPageListQueryDto req);

    /**
     * 查询计薪日统计分页数据
     *
     * @param req 筛选条件
     * @return 分页数据
     */
    List<DayPayrollStatisticsQueryVo> getDayPayrollPageList(@Param("req") DayStatisticsDataPageListQueryDto req);

    /**
     * 查询月统计数据
     *
     * @param queryDto 日欺范围
     * @param isGroupBy 是否按照考勤组分组
     * @return 月统计数据
     */
    StatisticsDataQueryVo getMonthStatisticsDataQuery(@Param("req") StatisticsDataQueryDto queryDto, @Param("isGroupBy") Boolean isGroupBy);

    /**
     * 查询月统计分页数据
     *
     * @param req 筛选条件
     * @return 分页数据
     */
    List<MonthStatisticsQueryVo> getMonthPageList(@Param("req") MonthStatisticsDataQueryDto req);

    /**
     * 查询计薪月统计分页数据
     *
     * @param req 筛选条件
     * @return 分页数据
     */
    List<MonthPayrollStatisticsQueryVo> getMonthPayrollPageList(@Param("req") MonthStatisticsDataQueryDto req);

    /**
     * 查询需要提醒的日统计数据
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 日统计数据
     */
    List<DayStatisticsNoticeQueryVo> getDayStatisticsNotice(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 查询需要提醒的月统计数据
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 月统计数据
     */
    List<MonthStatisticsNoticeQueryVo> getMonthStatisticsNotice(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 查询需要提醒的团队统计数据
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 团队统计数据
     */
    List<TeamMonthStatisticsNoticeQueryVo> getStemMonthStatisticsNotice(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取考勤组每月的平均工时
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 每月的平均工时
     */
    List<AttendanceCountAvgHoursVo> getAvgHours(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度统计数据
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 月度统计数据
     */
    MonthStatsDetailsQueryVo getAttendanceAvgHoursDetails(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度人均工时折线图
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 人均工时折线图
     */
    List<MonthStatsPerCapitaQueryVo> getAttendanceMonthPerCapita(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度日常情况
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 月度日常情况
     */
    MonthStatsDailySituationQueryVo getAttendanceDailySituation(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度考勤工时排行
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 考勤工时排行
     */
    List<MonthStatsHoursRankingQueryVo> getAttendanceHoursRanking(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度全勤情况
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 全勤情况
     */
    List<MonthStatsFullSituationQueryVo> getAttendanceFullSituation(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度异常情况
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 异常情况
     */
    MonthStatsAbnormalConditionQueryVo getAttendanceAbnormalCondition(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取多考勤组月度加班情况
     *
     * @param groupIds  考勤组ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 加班情况
     */
    List<MonthStatsOvertimeSituationQueryVo> getAttendanceOvertimeSituation(@Param("groupIds") List<String> groupIds, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 获取当月考勤确认数据
     *
     * @param userIds    用户ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 考勤组月度加班情况
     */
    List<MonthStatisticsQueryVo> getConfirmDetailsInfoByMonth(@Param("userIds") List<String> userIds, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 批量查询用户在指定月份是否封账
     *
     * @param userIdList 用户ID集合
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @return 是否封账
     */
    List<SealUserInfoDataVo> selectUserIsSeal(@Param("userIdList") List<String> userIdList,
                                              @Param("startDate") String startDate,
                                              @Param("endDate") String endDate);

    /**
     * 按天查询用户在日期范围内的封存日期列表(仅返回已封存的日期)
     * 用于跨月查询场景下按天判断每个用户每一天是否被封存
     *
     * @param userIdList 用户ID集合
     * @param startDate  开始时间(含)
     * @param endDate    结束时间(含)
     * @return 用户按天封存记录
     */
    List<UserDailySealVo> selectUserDailySeal(@Param("userIdList") List<String> userIdList,
                                              @Param("startDate") String startDate,
                                              @Param("endDate") String endDate);

    /**
     * 考勤封账-分页列表
     *
     * @param queryDto 考勤封账分页列表参数
     * @param seal 封账状态
     * @return 考勤封账分页列表结果
     */
    List<MonthSealPageListVo> sealPageList(@Param("req") StatisticsDataQueryDto queryDto, @Param("seal") Integer seal);

    /**
     * 薪酬考勤数据支持
     *
     * @param dto 薪酬考勤数据支持参数
     * @return 薪酬考勤数据支持结果
     */
    List<SalaryAttendanceSupportQuery> salaryAttendanceSupport(@Param("req") SalaryAttendanceSupportDto dto);

    /**
     * 获取考勤组维度考勤数据
     *
     * @param groupIds 考勤组ID集合
     * @param dimensions 维度范围
     * @return 考勤组维度考勤数据
     */
    List<AttendanceDimensionVo> getDimensionsAttendanceCountList(@Param("groupIds") List<String> groupIds,
                                                                 @Param("dimensions") List<DateDimensionsRangeDto> dimensions);

    /**
     * 获取考勤组维度考勤数据-日维度
     *
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 考勤组维度考勤数据
     */
    List<AttendanceDimensionDayVo> getDimensionsAttendanceDayCountList(@Param("groupIds") List<String> groupIds,
                                                                       @Param("startDate") Date startDate,
                                                                       @Param("endDate") Date endDate);

    /**
     * 考勤平均工时趋势-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 考勤平均工时趋势-分页列表结果
     */
    Page<AverageTrendPageListVo> averageWorkHoursTrendPageList(@Param("page") Page<AverageTrendPageListVo> page,
                                                               @Param("groupIds") List<String> groupIds,
                                                               @Param("startDate") LocalDate startDate,
                                                               @Param("endDate") LocalDate endDate);

    /**
     * 考勤人均工时趋势-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 考勤人均工时趋势-分页列表结果
     */
    Page<PersonnelTrendPageListVo> personWorkHoursTrendPageList(@Param("page") Page<PersonnelTrendPageListVo> page,
                                                                @Param("groupIds") List<String> groupIds,
                                                                @Param("startDate") LocalDate startDate,
                                                                @Param("endDate") LocalDate endDate);

    /**
     * 考勤日常情况-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 日常情况-分页列表结果
     */
    Page<DailySituationPageListVo> dailySituationPageList(@Param("page") Page<DailySituationPageListVo> page,
                                                          @Param("groupIds") List<String> groupIds,
                                                          @Param("startDate") LocalDate startDate,
                                                          @Param("endDate") LocalDate endDate);

    /**
     * 考勤工时排名-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 考勤组工时排名-分页列表结果
     */
    Page<WorkHoursRankingPageListVo> workHoursRankingPageList(@Param("page") Page<WorkHoursRankingPageListVo> page,
                                                              @Param("groupIds") List<String> groupIds,
                                                              @Param("startDate") LocalDate startDate,
                                                              @Param("endDate") LocalDate endDate);

    /**
     * 考勤全勤情况-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 全勤情况-分页列表结果
     */
    Page<FullAttendanceStatusPageListVo> fullAttendanceStatusPageList(@Param("page") Page<FullAttendanceStatusPageListVo> page,
                                                                      @Param("groupIds") List<String> groupIds,
                                                                      @Param("startDate") LocalDate startDate,
                                                                      @Param("endDate") LocalDate endDate);

    /**
     * 考勤异常情况-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 异常情况-分页列表结果
     */
    Page<ExceptionSituationPageListVo> exceptionSituationPageList(@Param("page") Page<ExceptionSituationPageListVo> page,
                                                                  @Param("groupIds") List<String> groupIds,
                                                                  @Param("startDate") LocalDate startDate,
                                                                  @Param("endDate") LocalDate endDate);

    /**
     * 考勤加班情况-分页列表
     * @param page 分页参数
     * @param groupIds 考勤组ID集合
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 加班情况-分页列表结果
     */
    Page<OvertimeSituationPageListVo> overtimeSituationPageList(@Param("page") Page<OvertimeSituationPageListVo> page,
                                                                @Param("groupIds") List<String> groupIds,
                                                                @Param("startDate") LocalDate startDate,
                                                                @Param("endDate") LocalDate endDate);

    /**
     * 查询用户考勤统计信息
     *
     * @param userId       用户ID
     * @param dateRangeDto 时间范围
     * @return 用户考勤统计信息
     */
    DayStatisticsQueryDbVo queryUserStatisticsInfo(@Param("userId") String userId, @Param("dateRangeDto") DateRangeDto dateRangeDto);

    /**
     * 查询用户加班详情
     *
     * @param userId       用户ID
     * @param dateRangeDto 时间范围
     * @return 用户加班详情
     */
    List<QueryUserOvertimeDetailsDbVo> queryUserOvertime(@Param("userId") String userId, @Param("dateRangeDto") DateRangeDto dateRangeDto);

    /**
     * 查询用户工作状况统计信息
     *
     * @param userIds   用户ID集合
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 用户工作状况统计信息
     */
    List<UserWorkSituationDbVo> queryUserWorkSituation(@Param("userIds") List<String> userIds,
                                                       @Param("startDate") LocalDate startDate,
                                                       @Param("endDate") LocalDate endDate);
}
