package com.engine.organization.mapper.job;

import com.engine.organization.entity.job.dto.JobListDTO;
import com.engine.organization.entity.job.po.JobPO;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author:dxfeng
 * @createTime: 2022/05/24
 * @version: 1.0
 */
public interface JobMapper {

    /**
     * 根据搜索条件查询数据
     *
     * @return
     */
    List<JobListDTO> listByFilter(@Param("jobPO") JobPO jobPO, @Param("orderSql") String orderSql);

    /**
     * 展示所有列表数据
     *
     * @return
     */
    List<JobListDTO> listNoFilter(@Param("orderSql") String orderSql);

    /**
     * 根据搜索条件查询数据
     *
     * @param jobPO
     * @return
     */
    List<JobPO> listPOsByFilter(@Param("jobPO") JobPO jobPO);

    /**
     * 查询所有数据
     *
     * @return
     */
    List<JobPO> listAll();

    /**
     * 根据ID查询元素
     *
     * @param id
     * @return
     */
    JobPO getJobById(@Param("id") Long id);

    List<JobPO> getJobsByIds(@Param("ids") Collection<Long> ids);

    /**
     * 根据父ID查询元素
     *
     * @param pid
     * @return
     */
    List<JobPO> getJobsByPid(@Param("pid") Long pid);

    /**
     * 浏览按钮展示数据用
     *
     * @param ids
     * @return
     */
    List<Map<String, Object>> listJobsByIds(@Param("ids") Collection<Long> ids);

    /**
     * 根据编号查询数据
     *
     * @param jobNo
     * @return
     */
    List<JobPO> listByNo(@Param("jobNo") String jobNo);

    /**
     * 查询是否存在同名岗位
     *
     * @param jobName
     * @param id
     * @return
     */
    List<JobPO> listByNameExceptId(@Param("jobName") String jobName, @Param("id") Long id);

    /**
     * 统计同一层级下是否有重名岗位
     * @param jobName
     * @param id
     * @param parentJob
     * @param ecDepartment
     * @return
     */
    Integer countRepeatNameByPid(@Param("jobName") String jobName, @Param("id") Long id, @Param("parentJob") Long parentJob, @Param("ecDepartment") Long ecDepartment);

    /**
     * 根据所属部门查询数据
     *
     * @param departmentId
     * @return
     */
    List<JobPO> listJobsByDepartmentId(@Param("departmentId") long departmentId);

    /**
     * 添加数据
     *
     * @param jobPO
     * @return
     */
    int insertIgnoreNull(JobPO jobPO);


    /**
     * 更新主表内容
     *
     * @param jobPO
     * @return
     */
    int updateBaseJob(JobPO jobPO);

    /**
     * 更新禁用标识
     *
     * @param id
     * @param forbiddenTag
     * @return
     */
    int updateForbiddenTagById(@Param("id") long id, @Param("forbiddenTag") int forbiddenTag);

    /**
     * 批量删除
     *
     * @param ids
     */
    int deleteByIds(@Param("ids") Collection<Long> ids);

    /**
     * 查询所有被引用的ID
     *
     * @return
     */
    List<String> listUsedId();


    /**
     * 获取最大排序
     *
     * @return
     */
    Integer getMaxShowOrder();

    /**
     * 根据名字和上级查询岗位信息
     *
     * @param jobName
     * @param parentCompany
     * @param parentDepartment
     * @param parentJob
     * @return
     */
    Long getIdByNameAndPid(@Param("jobName") String jobName, @Param("parentCompany") Long parentCompany, @Param("parentDepartment") Long parentDepartment, @Param("parentJob") Long parentJob);

    Long getIdByNameAndEcId(@Param("jobName") String jobName, @Param("ecCompany") String ecCompany, @Param("ecDepartment") String ecDepartment);

    int checkRepeatNo(@Param("jobNo") String jobNo, @Param("id") Long id);

    /**
     * 批量更新岗位的所属分部
     *
     * @param ids
     * @param parentCompany
     * @return
     */
    int updateJobCompany(@Param("ids") Collection<Long> ids, @Param("parentCompany") Long parentCompany, @Param("ecCompany") String ecCompany);

    int isHasResource(@Param("jobId") Long jobId);
}
