package jnpf.attendance.service;

import com.github.pagehelper.PageInfo;
import jnpf.base.ActionResult;
import jnpf.entity.attendance.AttendanceApprovalAdminVo;
import jnpf.exception.ApproveException;
import jnpf.exception.HandleException;
import jnpf.exception.WorkFlowException;
import jnpf.model.attendance.dto.*;
import jnpf.model.attendance.vo.*;
import jnpf.model.attendance.vo.attendance.AttendanceToThousandsFacesVo;
import jnpf.model.attendance.vo.attendance.LeaveConsumptionDetailVo;
import jnpf.model.doclibrary.vo.UseDetailVo;
import jnpf.model.workflow.dto.AttendanceBusinessTripApproveOaDto;
import jnpf.model.workflow.dto.AttendanceWorkOvertimeApproveDto;

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

public interface AttendanceApproveService {




    /**
     * 劵使用记录
     * @param id 劵id
     * @param balanceQueryDto 参数
     * @return com.github.pagehelper.PageInfo<jnpf.model.doclibrary.vo.UseDetailVo>
     * @author hlp
     */
    PageInfo<UseDetailVo> getUseDetail(String id, BalanceQueryDto balanceQueryDto);



    /**
     * 定时失效劵
     * @param tenantId  租户id
     * @return java.lang.Boolean
     * @author hlp
     */
    Boolean invalidationCoupons(String tenantId);

    /**
     * 加班--开始日期选择后触发接口返回当天及后一天的排班信息
     * @param balanceQueryDto  参数
     * @return java.util.List<jnpf.model.attendance.vo.UserClassesVo>
     * @author hlp
     */
    List<UserClassesVo> getClasses(BalanceQueryDto balanceQueryDto);

    /**
     * 获取加班期间的班次信息
     * 此方法旨在根据查询条件获取员工在加班时间段内的班次信息，以便进行相应的考勤和工时计算
     * 它通常用于处理加班申请、工时统计等场景，确保加班时间得到正确记录和处理
     *
     * @param balanceQueryDto 查询条件对象，包含需要查询的员工信息、时间范围等条件
     * @return LeaveShiftVo 返回加班期间的班次信息对象，包括班次时间、员工ID等关键信息
     * @throws HandleException 当查询过程中发生错误时抛出此异常，调用者需要处理该异常
     */
    LeaveShiftVo getWorkOverTimeShifts(BalanceQueryDto balanceQueryDto) throws HandleException;


    /**
     * 获取请假申请时长及设计班次(请假时选择了开始和结束时间后请求该接口)
     * @param leaveQueryDto 参数
     * @return jnpf.base.ActionResult<jnpf.model.attendance.vo.LeaveShiftVo>
     * @author hlp
     */

    LeaveShiftVo getLeaveDuration(LeaveQueryDto leaveQueryDto) throws HandleException;

    /**
     * 请假审批通过后的触发接口
     * @param id  审批的唯一id
     * @author hlp
     */
    void leaveApprove(String id, Integer status, String tenantId, String userId, String userName) throws ApproveException;

    /**
     * 审核第二个任务项
     * 该方法用于执行第二个任务项的检查操作，确保任务符合预期标准
     *
     * @param taskId 任务项的唯一标识符，用于指定需要检查的任务
     * @throws HandleException 如果检查过程中遇到错误或异常情况，则抛出此异常
     */
    void checkSeconded(String taskId) throws HandleException;



    /**
     * 检查工作任务项
     * 该方法用于对工作任务项进行检查，以确保其符合既定的工作标准或流程
     *
     * @param taskId 工作任务项的唯一标识符，用于指定需要检查的任务
     * @throws HandleException 如果检查过程中发现异常或错误，则抛出此异常
     */
    void checkWork(String taskId) throws HandleException;

    /**
     * 借调审批
     * 该方法用于获取借调审批的管理员信息
     *
     * @param groupId 组ID，标识一个特定的组
     * @param type    审批类型，用于区分不同的审批情况
     * @return 返回一个包含审批管理员信息的对象
     */
    AttendanceApprovalAdminVo getApproveUser(String groupId, Integer type);

    /**
     * 请假审批
     * 该方法用于获取请假审批的管理员信息
     *
     * @param body 包含审批所需信息的字符串
     * @return 返回一个包含审批管理员信息的对象
     * @throws HandleException 当处理过程中遇到错误时抛出
     * @throws WorkFlowException 当工作流执行过程中遇到错误时抛出
     */
    AttendanceApprovalAdminVo getLeaveApproveUser(String body) throws HandleException, WorkFlowException;

    /**
     * 加班审批
     * 该方法用于获取加班审批的管理员信息
     *
     * @param body 包含审批所需信息的字符串
     * @return 返回一个包含审批管理员信息的对象
     * @throws Exception 当审批过程中遇到任何错误时抛出
     */
    AttendanceApprovalAdminVo getOvertimeApproveUser(String body) throws Exception;

    /**
     * 补卡审批
     * 该方法用于获取补卡审批的管理员信息
     *
     * @param body 包含审批所需信息的字符串
     * @return 返回一个包含审批管理员信息的对象
     * @throws Exception 当审批过程中遇到任何错误时抛出
     */
    AttendanceApprovalAdminVo getReplacementCardApproveUser(String body) throws Exception;

    /**
     * 考勤结果变更
     * 该方法用于处理考勤结果的变更审批
     *
     * @param body 包含变更审批所需信息的字符串
     * @return 返回一个包含审批管理员信息的对象
     * @throws Exception 当审批过程中遇到任何错误时抛出
     */
    AttendanceApprovalAdminVo getAttendanceAlter(String body) throws Exception;

    /**
     * 外勤审批
     * 该方法用于获取外勤审批的管理员信息
     *
     * @return 返回一个包含审批管理员信息的对象
     */
    AttendanceApprovalAdminVo getFieldApproval();

    /**
     * 借调审批
     * 该方法用于获取借调审批的管理员列表
     *
     * @param body 包含审批所需信息的字符串
     * @return 返回一个包含审批管理员ID的列表
     * @throws Exception 当审批过程中遇到任何错误时抛出
     */
    List<String> secondedApproval(String body) throws Exception;


    /**
     * 2.0已重构 选择了请假类型和请假时间后请求接口
     * @param leaveQueryDto 参数
     * @return jnpf.model.attendance.vo.UserBalanceVo
     * @author hlp
     */
    LeaveConsumptionDetailVo getResidueBalance(LeaveQueryDto leaveQueryDto) throws ParseException, HandleException, ApproveException;

    /**
     * 加班审批通过后请求接口
     * @param id  审批的唯一id
     * @param status 是否审核通过 0.待审核 2.未通过 1.通过
     * @author hlp
     */
    void workApprove(String id, Integer status, String tenantId, String userId, String userName) throws ApproveException;

    /**
     * 借调审批通过后的触发的接口
     * @param id   审批的唯一id
     * @param departureTime 离岗实际  2023-11-10 10:10
     * @param backTime 回岗时间   2023-11-10 10:10
     * @param status 是否审核通过 0.待审核 2.未通过 1.通过
     * @param tenantId 租户id
     * @author hlp
     */
    void selfApprove(String id, String departureTime, String backTime, Integer status, String userId, String userName, String tenantId) throws ApproveException, HandleException;


    /**
     * 审批校验接口
     * @param taskId 任务id
     * @param type 类型 1.常规补卡审批 2.调整出勤结果审批 3.外勤审批 4.请假审批 5.加班审批 6.借调审批
     * @return jnpf.base.ActionResult<java.lang.Object>
     * @author hlp
     */
    ActionResult<Object> getApprovalAdmin(String taskId, String type);

    /**
     * 提交时审批校验接口
     * @param body 参数
     * @param type 类型
     */
    ActionResult<Object> submitValidation(String body, String type);

    /**
     * 提交检查工作的请求给OA系统
     * 此方法用于将加班审批的信息提交到OA系统进行处理
     *
     * @param workOverTime 加班审批的详细信息，包含申请人、加班时间、理由等
     * @throws HandleException 当提交过程中发生错误时抛出此异常
     */
    void submitCheckWorkForOa(AttendanceWorkOvertimeApproveDto workOverTime) throws HandleException;

    /**
     * 获取考勤组管理员信息
     * @param type  类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 考勤组管理员信息
     */
    AttendanceApprovalAdminVo getGroupAdminInfo(Integer type, Date startTime, Date endTime, String clockInResultId, String selfGroupId) throws HandleException;

    /**
     * 获取考勤组用户余额
     * @param groupId 考勤组
     * @param month 年月（2024-5-13）
     * @return jnpf.base.ActionResult<jnpf.model.attendance.vo.UserBalanceVo>
     * @author hlp
     */
    List<UserBalanceVo> getBalanceDetailS(String groupId, String month);

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

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

    /**
     * 获取指定优惠余额
     * @param userIds 用户id
     * @return List<UserBalanceVo>
     */
    List<UserBalanceVo> getUsersBalance(List<String> userIds);



    /**
     * 外出审批
     */
    AttendanceApprovalAdminVo getGoOutApproval();

    /**
     * 出差审批
     */
    AttendanceApprovalAdminVo getBusinessTripApproval();

    /**
     * 每月定时计算用户存休
     * @param tenantId 租户id
     * @return java.lang.Boolean
     */
    Boolean storageRest(String tenantId);

    /**
     * 发消息通知下一节点审核人 发送Im消息
     */
    void sendIm(WorkflowImQueryDto workflowImQueryDto);





    /**
     * 保存出差审批及校验
     */
    ActionResult<Void> createBusinessTrip(AttendanceBusinessTripApproveOaDto approveOaDto);

    /**
     * 外出审批校验及保存
     */
    ActionResult<Void> createGoOutForOa(GoOutApproveForOaDto dto);

    /**
     * 通过传入的开始结束时间及单位获取时长
     */
    ActionResult<Void> getDurationForOa(DurationForOaDto dto);

    /**
     * 请假审批校验及保存
     */
    ActionResult<Void> createLeaveForOa(LeaveApproveForOaDto dto);

    /**
     * 获取用户所选时间段所在考勤组
     */
    ActionResult getUserGroupByTime(GroupOaDto groupOaDto);

    /**
     * 获取当前分组信息
     * 此方法用于获取当前系统或用户所在的分组信息，用于界面展示或其他业务逻辑处理
     *
     * @return ActionResult 返回一个包含分组信息的操作结果对象
     */
    ActionResult getNowGroup();

    /**
     * 获取出勤到千人面信息
     * 此方法用于获取出勤记录中与千人面相关的数据，可能包括出勤时间、地点、人员等信息
     *
     * @return AttendanceToThousandsFacesVo 返回一个出勤到千人面信息对象，包含详细的出勤和千人面数据
     */
    AttendanceToThousandsFacesVo attendanceToThousandsFaces();

    /**
     * v2.0.1 补丁版本请假审批未排班或休变为排班时触发扣劵的补偿逻辑
     */
    void leaveCompensation(String applyId, String userId,String day, BigDecimal balance) throws ApproveException;
}
