package jnpf.attendance.mapper;

import jnpf.base.mapper.SuperMapper;
import jnpf.entity.attendance.FtbAttendanceClockIn;
import jnpf.model.attendance.model.ClockClassRecord;
import jnpf.model.attendance.vo.*;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 打卡mapper
 *
 * @author yanwenfu
 * @create 2023-11-21
 */
public interface AttendanceClockInMapper extends SuperMapper<FtbAttendanceClockIn> {

    /**
     * 查询用户出勤结果
     * @param list 用户id
     * @return java.util.List<jnpf.model.attendance.vo.ClockInVo>
     */
    List<ClockInVo> getClockInResultByRule(@Param("list") List<RuleUserVo> list);

    /**
     * 查询用户出勤结果
     * @param ruleIdList 出勤规则ids
     * @return java.util.List<jnpf.model.attendance.vo.ClockInVo>
     */
    List<ClockInVo> getClockInResultByRuleList(@Param("list") List<String> ruleIdList);

    /**
     * 查询时间段内的补卡次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param userId 用户id
     * @param groupId 考勤组id
     * @return int
     */
    int getRepairCount(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userId") String userId, @Param("groupId") String groupId);

    /**
     * 查询考勤组本月异常打卡记录
     * @param userId 用户id
     * @param groupId 考勤组id
     * @param monthBeginDate 月初
     * @param monthEndDate 月末
     * @param absenceType 能否补缺勤卡(1: 是, 0: 否)
     * @param queryTypeList 补卡类型(1: 迟到, 2: 早退, 3: 缺卡)
     * @return java.util.List<jnpf.model.attendance.vo.AbnormalClockInVo>
     */
    List<AbnormalClockInVo> getAbnormalClockInList(@Param("userId") String userId, @Param("groupId") String groupId,
                                                   @Param("monthBeginDate") Date monthBeginDate, @Param("monthEndDate") Date monthEndDate,
                                                   @Param("absenceType") Integer absenceType, @Param("list") List<Integer> queryTypeList);

    /**
     * 更新为缺勤
     * @param ruleId 出勤规则id
     * @param userId 用户id
     * @param handleUser 上次操作人
     * @return int
     */
    int updateToAbsence(@Param("ruleId") String ruleId, @Param("userId") String userId, @Param("handleUser") String handleUser);

    /**
     * 更新为不缺勤
     * @param ruleId 出勤规则id
     * @param userId 用户id
     * @param handleUser 上次操作人
     * @return int
     */
    int updateToUnAbsence(@Param("ruleId") String ruleId, @Param("userId") String userId, @Param("handleUser") String handleUser);

    /***
     * 查询当日所有打卡记录
     * @param userId 用户id
     * @param queryDate 日期
     * @return java.util.List<jnpf.model.attendance.vo.DailyClockInVo>
     */
    List<DailyClockInVo> getListByRuleAndDate(@Param("userId") String userId, @Param("queryDate") String queryDate);

    /***
     * 查询当日所有打卡记录
     * @param userId 用户id
     * @param queryDate 日期
     * @return java.util.List<jnpf.model.attendance.vo.DailyClockInVo>
     */
    List<ClockClassRecord> getClockInByStatistics(@Param("userId") String userId, @Param("queryDate") Date queryDate);

    /**
     * 批量查询所有打卡记录
     * @param userIds 用户id集合
     * @param start 开始时间
     * @param end 结束时间
     */
    List<ClockClassRecord> getClockInList(@Param("userIds") List<String> userIds, @Param("start") String start, @Param("end") String end);

    /**
     * 查询打卡记录[批量]
     * @param userDayList 用户日期列表
     * @param approvalStatus 审批状态
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceClockIn>
     */
    List<FtbAttendanceClockIn> selectListBatch(@Param("list") List<UserDayVo> userDayList, @Param("approvalStatus") Integer approvalStatus);

    /**
     * 删除审批中的打卡记录
     * @param userDayList 用户日期列表
     * @param passApproval 审批状态
     */
    void deleteBatchByUserDay(@Param("list") List<UserDayVo> userDayList, @Param("passApproval") Integer passApproval);
}
