package jnpf.attendance.mapper;


import jnpf.model.attendance.model.LeaveSituationData;
import jnpf.model.attendance.vo.*;
import jnpf.model.attendance.vo.attendance.BusinessTripVo;
import jnpf.model.attendance.vo.attendance.GoOutVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface AttendanceLeaveApproveMapper {

    /**
     * 获取请假申请详情
     * @param id  审批的唯一id
     * @return jnpf.model.attendance.vo.AttendanceLeaveApproveVo
     * @author hlp
     */
    AttendanceLeaveApproveVo getLeaveDetailById(@Param("id") String id);

    /**
     * 获取请假申请详情
     * @param groupId 考勤组id
     * @param userId  用户id
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @return java.util.List<jnpf.model.attendance.model.LeaveSituationData>
     */
    List<LeaveSituationData> getUserLeaveList(@Param("groupId") String groupId, @Param("userId") String userId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 获取请假申请详情
     * @param applyIds  审批id集合
     * @return java.util.List<jnpf.model.attendance.model.LeaveSituationData>
     */
    List<LeaveSituationData> getUserLeaveListByApplyIds(@Param("applyIds") List<String> applyIds);

    /**
     * 修改请假审批信息
     * @param id  审批的唯一id
     * @param dayNum 未抵扣时间(单位 : 天)
     * @param applicationDurationSecond 请假时长秒
     * @param undeductedTimeSecond 未抵扣时长秒
     * @param leaveName  请假名称
     * @param applicationDuration 请假时长
     * @param applicationDurationDay 半天、天时的请假时长
     * @param notDeductedDay  半天、天时的未抵扣时长
     * @param start 命中的开始时间
     * @param end 命中的结束时间
     * @param leaveDurationJson 请假时长Json
     * @param leaveConsumptionDetailJson 请假消耗详情Json 2.0 新增
     * @author hlp
     */
    void updateLeaveApprove(@Param("id") String id, @Param("dayNum") BigDecimal dayNum, @Param("applicationDuration") BigDecimal applicationDuration, @Param("leaveName") String leaveName, @Param("applicationDurationSecond") Integer applicationDurationSecond, @Param("undeductedTimeSecond") Integer undeductedTimeSecond, @Param("userId") String userId, @Param("userName") String userName, @Param("applicationDurationDay") BigDecimal applicationDurationDay, @Param("notDeductedDay") BigDecimal notDeductedDay, @Param("start") Date start, @Param("end") Date end, @Param("leaveDurationJson") String leaveDurationJson, @Param("leaveConsumptionDetailJson") String leaveConsumptionDetailJson);

    /**
     * 获取用户该类型的请假有多少未抵扣余额
     * @param userId 用户id
     * @param leaveTypeId  请假类型id
     * @return java.math.BigDecimal
     * @author hlp
     */
    BigDecimal getUserUnDeductedTime(@Param("userId") String userId, @Param("leaveTypeId") String leaveTypeId);

    /**
     * 获取用户时间段内审核中和审核通过的请假审批列表
     * @param userId 用户id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return java.util.List<jnpf.model.attendance.vo.AttendanceLeaveApproveVo>
     * @author hlp
     */
    List<AttendanceLeaveApproveVo> getUserLeaveByTimeSlot(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取用户时间段内审核通过的请假审批列表
     * @param userId 用户id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return java.util.List<jnpf.model.attendance.vo.AttendanceLeaveApproveVo>
     * @author hlp
     */
    List<AttendanceLeaveApproveVo> getUserPassLeaveByTime(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     *批量获取用户时间段内审核通过的请假审批列表
     * @param userIds 用户id集合
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return java.util.List<jnpf.model.attendance.vo.AttendanceLeaveApproveVo>
     * @author hlp
     */
    List<LeaveStaVo> getBatchLeaveByUserIds(@Param("userIds") List<String> userIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 通过id获取加班详情
     * @param id  审批的唯一id
     * @author hlp
     */
    AttendanceWorkOverTimeVo getWorkOverTime(@Param("id") String id);

    /**
     * 修改加班审批的审批状态
     * @param id 加班主键id
     * @author hlp
     */
    void updateWorkOverTimeApprove(@Param("id") String id, @Param("status") Integer status, @Param("userId") String userId, @Param("userName") String userName, @Param("json") String json);

    /**
     * 获取待审批的借调审批详情
     * @param id   审批的唯一id
     * @author hlp
     */
    AttendanceSelfApproveVo getSelfApprove(@Param("id") String id);

    /**
     * 获取借调用户集合
     * @param id 借调审批主键id
     * @return java.util.List<java.lang.String>
     * @author hlp
     */
    List<String> getUserList(@Param("id") String id);

    /**
     * 修改借调审批为通过
     * @param id 主键id
     * @author hlp
     */
    void updateSelfApprove(@Param("id") String id, @Param("departureTime") Date departureTime, @Param("backTime") Date backTime, @Param("status") Integer status, @Param("userId") String userId, @Param("userName") String userName);

    /**
     * 将对应审批变为未通过
     * @param id F_UniqueId 审批的唯一id
     * @author hlp
     */
    void updateLeaveApproveStatus(@Param("id") String id, @Param("status") Integer status, @Param("userId") String userId, @Param("userName") String userName);

    /**
     * 获取用户时间段内加班申请数量
     * @param userId 用户id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return java.lang.Integer
     * @author hlp
     */
    Integer getUserWorkByTimeSlot(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取用户时间段内加班申请数量
     * @param userId 用户id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return java.lang.Integer
     * @author hlp
     */
    Integer getUserPassWorkByTime(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 修改外出审批状态
     * @param applyId 主键Id
     * @param status 是否审核通过 0.待审核  1.通过 2.未通过
     */
    void updateGoOutApprove(@Param("applyId") String applyId, @Param("status") Integer status, @Param("userId") String userId, @Param("userName") String userName);

    /**
     * 获取外出审批详情
     * @param applyId 主键Id
     */
    GoOutVo getGoOut(@Param("applyId") String applyId);

    /**
     * 获取出差审批详情
     * @param applyId 主键Id
     */
    BusinessTripVo getBusinessTrip(@Param("applyId") String applyId);

    /**
     * 修改出差审批状态
     * @param applyId 主键Id
     * @param status 是否审核通过 0.待审核  1.通过 2.未通过
     */
    void updateBusinessTripApprove(@Param("applyId") String applyId, @Param("status") Integer status, @Param("userId") String userId, @Param("userName") String userName);

    /**
     * 获取指定用户指定日期的加班申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyWorkOverTimeList(@Param("userId") String userId, @Param("queryDate") String queryDate, @Param("currentGroupId") String currentGroupId, @Param("code") Integer code);

    /**
     * 获取指定用户指定日期的申请中的加班申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyingWorkOverTimeList(@Param("userId") String userId, @Param("queryDate") String queryDate);


    /**
     * 获取指定用户指定日期的外出申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyGoOutList(@Param("userId") String userId, @Param("queryDate") String queryDate, @Param("currentGroupId") String currentGroupId, @Param("code") Integer code);

    /**
     * 获取指定用户指定日期的申请中的外出申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyingGoOutList(@Param("userId") String userId, @Param("queryDate") String queryDate);

    /**
     * 获取指定用户指定日期的请假申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyLeaveList(@Param("userId") String userId, @Param("queryDate") String queryDate, @Param("currentGroupId") String currentGroupId, @Param("code") Integer code);

    /**
     * 获取指定用户指定日期的申请中的请假申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyingLeaveList(@Param("userId") String userId, @Param("queryDate") String queryDate);


    /**
     * 获取指定用户指定日期的借调申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplySelfList(@Param("userId") String userId, @Param("queryDate") String queryDate, @Param("currentGroupId") String currentGroupId, @Param("code") Integer code);

    /**
     * 获取指定用户指定日期的出差申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyBusinessTripList(@Param("userId") String userId, @Param("queryDate") String queryDate, @Param("currentGroupId") String currentGroupId, @Param("code") Integer code);


    /**
     * 获取指定用户指定日期的申请中的出差申请列表
     * @param userId    用户
     * @param queryDate 日期
     */
    List<DailyApprovalVo> getApplyingBusinessTripList(@Param("userId") String userId, @Param("queryDate") String queryDate);


    /**
     * 获取指定用户指定日期的外出申请数量
     * @param userId 用户Id
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    Integer getUserGoOutByTimeSlot(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取指定用户指定日期的出差申请数量
     * @param userId 用户Id
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    Integer getUserBusinessTripByTimeSlot(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取已审批的借调记录
     * @author hlp
     */
    List<AttendanceSelfApproveVo> getSelfApproveList(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 获取指定用户指定日期的出差申请数量除开本次申请
     * @param userId 用户Id
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    Integer getBusinessTripForOa(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("taskId") String taskId);

    /**
     * 获取指定用户指定日期的外出申请数量除开本次申请 小时
     * @param userId 用户Id
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    Integer getUserGoOutForOa(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("taskId") String taskId);


    /**
     * 获取用户时间段内加班申请数量
     * @param userId 用户id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return java.lang.Integer
     * @author hlp
     */
    Integer getUserWorkByTimeSlotForOa(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("taskId") String taskId);

    /**
     * 获取指定用户指定日期的外出申请数量除开本次申请  天
     * @param userId 用户Id
     * @param startTime 开始时间
     * @param endTime 结束时间
     */
    Integer getUserGoOutForDay(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("taskId") String taskId);

    /**
     * 获取用户集合在指定日期范围的借调申请中的用户集合
     * @param userIds 用户Id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param taskId 任务Id
     */
    List<String> checkSelfApprove(@Param("userIds") List<String> userIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("taskId") String taskId);
}