package com.qmth.sop.business.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.sop.business.bean.dto.DingSubmitExportDto;
import com.qmth.sop.business.bean.params.DingSubmitParam;
import com.qmth.sop.business.bean.result.DingSubmitResult;
import com.qmth.sop.business.bean.result.DingSubmitSubTotalResult;
import com.qmth.sop.business.entity.TBDingSubmit;

import java.util.List;

/**
 * @Description: 考勤提交服务接口
 * @Author: CaoZixuan
 * @Date: 2023-08-25
 */
public interface TBDingSubmitService extends IService<TBDingSubmit> {
    /**
     * 考勤提交分页查询
     *
     * @param serviceUnitId        服务单元id
     * @param dingSubmitStatusDesc 考勤提交状态
     * @param submitUserId         提交人id
     * @param archivesName         档案名称
     * @param supplierId           供应商id
     * @param customName           客户名
     * @param sopNo                sop号
     * @param violationHoursLimit  违规工时限制
     * @param dingExceptionLimit   需处理异常考勤限制
     * @param remainLimit          补卡限制
     * @param exceptionLimit       异常限制
     * @param pageNumber           分页页数
     * @param pageSize             分页容量
     * @return 考勤提交分页查询结果
     */
    IPage<DingSubmitResult> findDingSubmitPage(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
                                               String archivesName, Long supplierId, String customName, String sopNo,
                                               Integer violationHoursLimit, Integer dingExceptionLimit,
                                               Integer remainLimit, Integer exceptionLimit, Integer pageNumber, Integer pageSize);

    /**
     * 考勤提交小计
     *
     * @param serviceUnitId        服务单元id
     * @param dingSubmitStatusDesc 考勤提交状态
     * @param submitUserId         提交人id
     * @param archivesName         档案名称
     * @param supplierId           供应商id
     * @param customName           客户名
     * @param sopNo                sop号
     * @param violationHoursLimit  违规工时限制
     * @param dingExceptionLimit   需处理异常考勤限制
     * @param remainLimit          补卡限制
     * @param exceptionLimit       异常限制
     * @return 考勤提交小计结果
     */
    DingSubmitSubTotalResult findDingSubmitSubTotal(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
                                                    String archivesName, Long supplierId, String customName, String sopNo,
                                                    Integer violationHoursLimit, Integer dingExceptionLimit,
                                                    Integer remainLimit, Integer exceptionLimit);

    /**
     * 考勤批量提交
     *
     * @param dingSubmitParamList 考勤提交参数
     */
    void submitDingBatch(List<DingSubmitParam> dingSubmitParamList);

    /**
     * 申请考勤撤回
     *
     * @param dingSubmitParam 考勤提交参数
     */
    void applyWithdraw(DingSubmitParam dingSubmitParam);

    /**
     * 取消考勤撤回
     *
     * @param dingSubmitParam 考勤提交参数
     */
    void cancelWithdraw(DingSubmitParam dingSubmitParam);

    /**
     * 同意考勤撤回
     *
     * @param dingSubmitId 考勤提交记录id
     */
    void agreeWithdraw(Long dingSubmitId);

    /**
     * 查询考勤提交导出集合
     *
     * @param serviceUnitId        服务单元id
     * @param dingSubmitStatusDesc 考勤提交状态
     * @param submitUserId         提交人id
     * @param archivesName         档案名称
     * @param supplierId           供应商id
     * @param customName           客户名
     * @param sopNo                sop号
     * @param violationHoursLimit  违规工时限制
     * @param dingExceptionLimit   需处理异常考勤限制
     * @param remainLimit          补卡限制
     * @param exceptionLimit       异常限制
     * @param requestUserId        请求的用户id
     * @return 考勤提交小计结果
     */
    List<DingSubmitExportDto> findDingSubmitExportList(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
                                                       String archivesName, Long supplierId, String customName, String sopNo,
                                                       Integer violationHoursLimit, Integer dingExceptionLimit,
                                                       Integer remainLimit, Integer exceptionLimit, Long requestUserId);
}
