package jnpf.attendance.mapper;

import jnpf.base.mapper.SuperMapper;
import jnpf.entity.attendance.AttendanceClockInResult;
import jnpf.model.attendance.vo.ChangeInfoVo;
import jnpf.model.attendance.vo.ConditionVo;
import jnpf.model.attendance.vo.RuleDayVo;
import org.apache.ibatis.annotations.Param;

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

/**
 * 打卡结果mapper
 *
 * @author yanwenfu
 * @create 2023-11-27
 */
public interface AttendanceClockInResultMapper extends SuperMapper<AttendanceClockInResult> {

    /**
     * 根据出勤规则删除用户的打卡结果
     * @param userId 用户id
     * @param updateUserId 操作人
     * @return int
     */
    int deleteRecordByRule(@Param("userId") String userId, @Param("updateUserId") String updateUserId);

    /**
     * 根据出勤规则删除用户的打卡结果[批量]
     * @param userIds 用户id列表
     * @param updateUserId 操作人
     * @return int
     */
    int deleteRecordByRuleBatch(@Param("list") List<String> userIds, @Param("updateUserId") String updateUserId);

    /**
     * 根据条件查询用户打卡记录
     * @param dateStr 日期
     * @return java.util.List<jnpf.entity.attendance.AttendanceClockInResult>
     */
    List<AttendanceClockInResult> selectUserClockInHistory(String dateStr);


    /**
     * 根据考勤组id,用户id及时间范围查询打卡结果记录
     */
    List<ChangeInfoVo> selectUserClockInResult(@Param("groupId") String groupId, @Param("userId") String userId, @Param("start") Date start, @Param("end") Date end);
    /**
     * 批量更新记录为删除
     * @param delList 删除列表
     * @return int
     */
    int updateBatchToDel(@Param("list") List<String> delList);

    /**
     * 更新申请信息为空
     * @param clockInId 打卡id
     * @param applyId 审批id
     * @return int
     */
    int updateReplyToNull(@Param("clockInId") String clockInId, @Param("applyId") String applyId);

    /**
     * 判断是否缺勤
     * @param ruleId 出勤规则
     * @param userId 用户id
     * @return int
     */
    int countAbsence(@Param("ruleId") String ruleId, @Param("userId") String userId);

    /**
     * 更新审批为空
     * @param id 结果id
     * @param dealUser 处理人
     * @return int
     */
    int updateResultReplyToNull(@Param("id") String id, @Param("dealUser") String dealUser);

    /**
     * 查询已存在的打卡结果
     * @param list 打卡结果列表
     * @param containsType 包含打卡类型(上/下班) 1: 是, 0: 否
     * @return java.util.List<jnpf.entity.attendance.AttendanceClockInResult>
     */
    List<AttendanceClockInResult> selectExistRecord(@Param("list") List<AttendanceClockInResult> list, @Param("containsType") Integer containsType);

    /**
     * 根据出勤规则删除打卡结果
     * @param list 出勤规则列表
     * @param updateUserId 更新用户id
     * @return int
     */
    int updateToDelByRule(@Param("list") List<String> list, @Param("updateUserId") String updateUserId);

    /**
     * 查询跨天的打卡id
     * @param ruleIds 出勤规则ids
     * @param day 日期
     * @return java.util.List<java.lang.String>
     */
    List<String> getCrossDayClockInIdList(@Param("list") List<String> ruleIds, @Param("day") Date day);
    /**
     * 查询跨天的打卡id[批量]
     * @param ruleDayList 规则日期列表
     * @return java.util.List<java.lang.String>
     */
    List<String> getCrossDayClockInIdListBatch(@Param("list") List<RuleDayVo> ruleDayList);

    /**
     * 查询打卡结果是否在审批中
     * @param clockInResultId 打卡结果id
     * @return int
     */
    int getReplyingCount(String clockInResultId);

    /**
     * 更新缺勤为正常
     * @param id 结果id
     * @return int
     */
    int updateAbsenceToNormal(String id);
    /**
     * 更新为缺勤
     * @param id 结果id
     * @return int
     */
    int updateToAbsence(String id);

    /**
     * 根据用户和日期查询打卡结果
     * @param userId 用户id
     * @param date 日期
     * @return java.util.List<java.lang.String>
     */
    List<String> getByUserAndDay(@Param("userId") String userId, @Param("date") Date date);

    /**
     * 根据出勤规则删除打卡结果
     * @param ruleIdList 出勤规则列表
     * @return int
     */
    int removeClockInResultByRule(@Param("list") List<String> ruleIdList);

    /**
     * 获取用户打卡天数
     */
    Integer getClockInDayNum(String userId);

    /**
     * 获取用户迟到次数
     */
    Integer getLateClockInNum(@Param("dayRuleIds") List<String> dayRuleIds);

    /**
     * 查询补卡审批中次数
     * @param userId 用户id
     * @param groupId 考勤组id
     * @return int
     */
    int selectRepairApplyCount(@Param("userId") String userId, @Param("groupId") String groupId, @Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 根据打卡ids查询打卡结果
     * @param clockInIds 打卡ids
     * @return java.util.List<jnpf.entity.attendance.AttendanceClockInResult>
     */
    List<AttendanceClockInResult> selectBatchByClockInIds(@Param("list") List<String> clockInIds);

    /**
     * 变更打卡结果绑定的rule
     * @param resultId 打卡结果id
     * @param ruleId 出勤规则id
     */
    void updateResultRelation(@Param("resultId") String resultId, @Param("ruleId") String ruleId);

    /**
     * 查询需要更新为缺勤的打卡结果
     * @param conditionList 缺勤条件
     * @return java.util.List<jnpf.model.attendance.vo.ConditionVo>
     */
    List<ConditionVo> selectRuleIdsForAbsence(@Param("list") List<ConditionVo> conditionList);

    /**
     * 更新为缺勤[批量]
     * @param updateResultIds 打卡结果ids
     */
    void updateToAbsenceBatch(@Param("list") List<String> updateResultIds);
}
