package jnpf.personnels.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.model.personnels.dto.emp.FtbEmpEntryDTO;
import jnpf.model.personnels.dto.emp.FtbEmpQueryDTO;
import jnpf.model.personnels.dto.staff.employment.FtbPersonnelsEmployApplyDto;
import jnpf.model.personnels.dto.staff.employment.FtbPersonnelsStaffEmploymentApplyDto;
import jnpf.model.personnels.dto.staff.roster.FtbPersonnelsStaffRosterDto;
import jnpf.model.personnels.po.FtbPersonnelsStaffEmploymentApply;
import jnpf.model.personnels.req.employment.QueryAppStaffEmploymentApplyListReq;
import jnpf.model.personnels.req.employment.QueryStaffEmploymentApplyListReq;
import jnpf.model.personnels.vo.emp.FtbEmpEntryVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface FtbPersonnelsStaffEmploymentApplyMapper extends BaseMapper<FtbPersonnelsStaffEmploymentApply> {
    /**
     * 预入职审批列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> expectPagingQuery(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page
            , @Param("params") QueryStaffEmploymentApplyListReq params);


    /**
     * 入职审批列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> checkPagingQuery(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page
            , @Param("params") QueryStaffEmploymentApplyListReq params);

    /**
     * 入职审批列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> myCheckPagingQuery(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page
            , @Param("params") QueryStaffEmploymentApplyListReq params, @Param("checkUserId") String loginUserId);

    /**
     * 预入职审批列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> expectAppPagingQuery(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page
            , @Param("params") QueryAppStaffEmploymentApplyListReq params);

    /**
     * 根据常规条件分页查询员工招聘申请列表（用于APP）
     *
     * @param page        分页对象，包含页码、页面大小等信息
     * @param checkUserId 审核用户ID，用于过滤需要该用户检查的申请
     * @param configType  配置类型，用于区分不同的查询条件
     * @return 返回分页查询结果，包含招聘申请的DTO列表
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> getListByRegularForApp(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page,
                                                                          @Param("checkUserId") String checkUserId,
                                                                          @Param("configType")Integer configType);

    /**
     * 根据用户ID和审核状态分页查询员工招聘申请列表（用于APP）
     *
     * @param page        分页对象，包含页码、页面大小等信息
     * @param checkUserId 审核用户ID，用于过滤需要该用户检查的申请
     * @param checkStatus 审核状态，用于过滤特定审核状态的申请
     * @return 返回分页查询结果，包含招聘申请的DTO列表
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> getListForApp(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page,
                                                                 @Param("checkUserId") String checkUserId, @Param("checkStatus")Integer checkStatus);

    /**
     * 分页查询用户自己的待审核员工招聘申请列表
     *
     * @param page        分页对象，包含页码、页面大小等信息
     * @param userId      用户ID，用于查询特定用户提交的申请
     * @param configType  配置类型，用于区分不同的查询条件
     * @return 返回分页查询结果，包含招聘申请的DTO列表
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> pagingQueryWebMyCheckList(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page
                                                                             , @Param("userId") String userId,
                                                                             @Param("configType")   Integer configType);

    /**
     * 根据用户ID和审批状态分页查询已审批的员工招聘申请列表
     *
     * @param page           分页对象，包含页码、页面大小等信息
     * @param userId         用户ID，用于查询特定用户提交的申请
     * @param configType     配置类型，用于区分不同的查询条件
     * @param approvalStatus 审批状态，用于过滤特定审批状态的申请
     * @return 返回分页查询结果，包含招聘申请的DTO列表
     */
    Page<FtbPersonnelsStaffEmploymentApplyDto> getApprovedList(@Param("page") Page<FtbPersonnelsStaffEmploymentApply> page,
                                                                   @Param("userId") String userId,
                                                                   @Param("configType")  Integer configType,
                                                                   @Param("approvalStatus") Integer approvalStatus);

    /**
     * 分页查询入职流程中的员工招聘申请列表
     *
     * @param page 分页对象，包含页码、页面大小等信息
     * @param req  查询条件对象，包含过滤和排序等信息
     * @return 返回分页查询结果，包含招聘申请的DTO列表
     */
    Page<FtbPersonnelsEmployApplyDto> onboardingList(@Param("page") Page<FtbPersonnelsEmployApplyDto> page,
                                                        @Param("req") QueryStaffEmploymentApplyListReq req);

    Integer checkPhoneForEmploymentApply(@Param("phone") String phone);

    Page<FtbEmpEntryVO> pageLists(@Param("page")Page<FtbEmpEntryVO> page,@Param("dto") FtbEmpEntryDTO empEntryDTO);

    List<FtbPersonnelsStaffEmploymentApply> getOnboardingPostDimension(@Param("startDate") String startDate,@Param("endDate")  String endDate, @Param("userIds") List<String> userIds);

    List<FtbEmpEntryVO> onboardingListOA(@Param("phone")String phone,@Param("userIds") List<String> userIds);

    Long queryNumberOfOnboardedEmployees(@Param("orgIds") List<String> orgIds);

    List<FtbPersonnelsStaffRosterDto> searchPhoneName(@Param("dto") FtbEmpQueryDTO dto);

    List<FtbPersonnelsStaffEmploymentApply> ListOfOnboardingPositions(@Param("startDate") String startDate,@Param("endDate")  String endDate, @Param("userIds") List<String> userIds);

    /**
     * 查询已提交登记表但未办理入职的人员
     * @return 已提交登记表但未办理入职的人员列表
     */
    List<FtbPersonnelsStaffEmploymentApply> getSubmittedButNotOnboarded( @Param("userIds")  List<String> userIds);

    /**
     * 在指定时间段内入职管理表新增的记录数（按 F_CreatorTime）
     *
     * @param startTime 开始时间（格式：yyyy-MM-dd），为空时默认本月第一天
     * @param endTime   结束时间（格式：yyyy-MM-dd），为空时默认本月最后一天
     * @param userIds
     */
    Long getCountEmploymentApplyCreatedInPeriod(@Param("startTime") String startTime, @Param("endTime") String endTime,@Param("userIds") List<String> userIds);

    /**
     * 在指定时间段内统计办理入职并已进入花名册的人数（入职表与花名册关联）
     *
     * @param startTime 开始时间（格式：yyyy-MM-dd），为空时默认本月第一天
     * @param endTime   结束时间（格式：yyyy-MM-dd），为空时默认本月最后一天
     * @param userIds
     */
    Long getCountEmploymentApplyToRosterInPeriod(@Param("startTime") String startTime, @Param("endTime") String endTime,@Param("userIds") List<String> userIds);

    /**
     * 查询未提交登记表的员工列表
     * @return 未提交登记表的员工列表
     */
    List<FtbPersonnelsStaffEmploymentApply> getListOfNotSubmittedForm(@Param("userIds") List<String> userIds);
}