package com.qmth.sop.business.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.sop.business.bean.dto.*;
import com.qmth.sop.business.entity.TBCrmDetail;
import com.qmth.sop.business.entity.TBDing;
import com.qmth.sop.business.entity.TBDingStatistic;
import com.qmth.sop.common.enums.DingStatisticTypeEnum;

import java.io.IOException;
import java.util.List;

/**
 * <p>
 * 考勤提交统计表 服务类
 * </p>
 *
 * @author CaoZixuan
 * @since 2024-05-22
 */
public interface TBDingStatisticService extends IService<TBDingStatistic> {

    /**
     * 根据sopNo和用户档案id查询sop统计级路
     *
     * @param serviceId      服务单元id
     * @param sopNo          sopNo
     * @param userArchivesId 用户档案id
     * @return 打卡统计记录
     */
    TBDingStatistic findBySopNoAndUserArchivesId(Long serviceId, String sopNo, Long userArchivesId);

    /**
     * 构建考勤统计 (sop计划时间变更 -> 更新打卡统计时间)
     *
     * @param sopNo          sopNo
     * @param userArchivesId 用户档案id
     */
    @Deprecated
    void buildDingStatistic(String sopNo, Long userArchivesId);

    /**
     * 构建考勤统计 (sop计划时间变更 -> 更新打卡统计时间)
     *
     * @param sopNo sopNo
     */
    void buildDingStatistic(String sopNo);

    /**
     * 构建考勤统计 (构建打卡统计信息)
     */
    void buildDingStatistic();

    /**
     * 构建考勤统计 (构建打卡统计信息) -- 正常工程师
     *
     * @param sopNo         sopNo
     * @param datasource    数据源
     * @param requestUserId 创建人
     */
    void buildDingStatisticBySop(String sopNo, List<TBDing> datasource, Long requestUserId);

    /**
     * 构建考勤统计 (构建打卡统计信息) -- 区域协调人身份
     *
     * @param serviceId     服务单元id
     * @param datasource    数据源
     * @param requestUserId 创建人
     */
    void buildDingStatisticByService(Long serviceId, List<TBDing> datasource, Long requestUserId);

    /**
     * 生成统计数据
     */
    void buildStatisticData();

    /**
     * 导出统计数据
     *
     * @param serviceId 服务单元id
     * @param type      类型
     */
    void exportStatisticData(Long serviceId, DingStatisticTypeEnum type) throws IOException;

    /**
     * 查询扫描和阅卷周期
     *
     * @param tbCrmDetail 派单详情
     * @return 结果
     */
    SopPeriodDto findSopPeriod(TBCrmDetail tbCrmDetail);
}
