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.UserArchivesImportDto;
import com.qmth.sop.business.bean.params.UserArchivesParam;
import com.qmth.sop.business.bean.result.ArchivesSourceResult;
import com.qmth.sop.business.bean.result.UserArchivesResult;
import com.qmth.sop.business.bean.result.UserArchivesSubTotalResult;
import com.qmth.sop.business.entity.SysUser;
import com.qmth.sop.business.entity.TBUserArchives;
import com.qmth.sop.common.enums.RoleTypeEnum;

import java.util.List;

/**
 * <p>
 * 人员档案表 服务类
 * </p>
 *
 * @author wangliang
 * @since 2023-08-01
 */
public interface TBUserArchivesService extends IService<TBUserArchives> {

    /**
     * 人员档案管理分页查询
     *
     * @param city                 城市
     * @param supplierId           供应桑id
     * @param archivesName         档案名称
     * @param roleType             认证橘色
     * @param authenticationStatus 认证状态
     * @param archivesTimeStart    入档时间-起始
     * @param archivesTimeEnd      入档时间-终止
     * @param remainValidDay       剩余有效天
     * @param pageNumber           分页页数
     * @param pageSize             分页容量
     * @return 结果
     */
    IPage<UserArchivesResult> findUserArchivesPage(String city, Long supplierId, String archivesName, RoleTypeEnum roleType,
                                                   Boolean authenticationStatus, Long archivesTimeStart, Long archivesTimeEnd,
                                                   Integer remainValidDay, Integer pageNumber, Integer pageSize) throws Exception;

    /**
     * 编辑用户档案
     *
     * @param userArchivesParam 人员档案参数
     * @param requestUser       请求的用户
     * @return 档案id
     */
    Long editUserArchives(UserArchivesParam userArchivesParam, SysUser requestUser) throws InterruptedException;

    /**
     * 查询人员档案小计
     *
     * @return 档案小计情况
     */
    UserArchivesSubTotalResult findUserArchivesSubTotal(String city, Long supplierId, String archivesName, RoleTypeEnum roleType,
                                                        Boolean authenticationStatus, Long archivesTimeStart, Long archivesTimeEnd,
                                                        Integer remainValidDay);

    /**
     * 人员档案管理分页查询
     *
     * @param city                 城市
     * @param supplierId           供应桑id
     * @param archivesName         档案名称
     * @param roleType             认证橘色
     * @param authenticationStatus 认证状态
     * @param archivesTimeStart    入档时间-起始
     * @param archivesTimeEnd      入档时间-终止
     * @param remainValidDay       剩余有效天
     * @return 结果
     */
    List<UserArchivesImportDto> findExportData(String city, Long supplierId, String archivesName, RoleTypeEnum roleType, Boolean authenticationStatus,
                                               Long archivesTimeStart, Long archivesTimeEnd, Integer remainValidDay);

    /**
     * 作废人员档案
     *
     * @param userArchivesIdList 人员档案id集合
     */
    void cancelUserArchives(List<Long> userArchivesIdList);

    /**
     * 根据用户id查询档案信息
     *
     * @param userId 用户id
     * @return 档案
     */
    TBUserArchives findByUserId(Long userId);

    /**
     * 根据用户id或档案id查询档案详情
     *
     * @param archivesId 档案id
     * @param userId     用户id
     * @return 档案详情
     */
    UserArchivesResult findUserArchivesByArchivesIdORUserId(Long archivesId, Long userId);

    /**
     * 查询空闲的工程师档案资源
     *
     * @param roleType 角色类型
     * @param crmNo    派单号（调配选人列表的特殊查询）
     * @return 档案资源
     */
    List<ArchivesSourceResult> findFreeEngineerSourceByType(RoleTypeEnum roleType, String crmNo);

    /**
     * 根据服务单元id查询可用的区域负责人
     *
     * @param serviceUnitId 服务单元id
     * @param crmNo         派单号（调配选人列表的特殊查询）
     * @param verifyRate    校验服务单元区域配比
     * @return 区域负责人
     */
    List<ArchivesSourceResult> findFreeCoordinatorByServiceId(Long serviceUnitId, String crmNo, boolean verifyRate);
}
