package com.zd.laboratory.mapper;

import com.zd.laboratory.domain.LabSubject;
import com.zd.laboratory.domain.vo.LabClassifiedVo;
import com.zd.laboratory.domain.vo.LabClasstypeVo;
import com.zd.laboratory.domain.vo.LabSubjectDetailVO;
import com.zd.laboratory.domain.vo.LabSubjectVO;
import com.zd.system.api.laboratory.domain.TotalByID;
import com.zd.system.api.laboratory.domain.vo.LabGradeManageWorkVO;
import com.zd.system.api.laboratory.domain.vo.LabSubClassVO;
import org.apache.ibatis.annotations.Param;

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

/**
 * 实验室Mapper接口
 *
 * @author zd
 * @date 2021-08-30
 */
public interface LabSubjectMapper {
    /**
     * 查询实验室
     *
     * @param id 实验室主键
     * @return 实验室
     */
    public LabSubject selectLabSubjectById(Long id);

    /**
     * 查询实验室
     *
     * @param id 实验室主键
     * @return 实验室
     */
    public LabSubjectVO selectLabSubjectVoById(Long id);

    /**
     * 查询实验室
     *
     * @param id 实验室主键
     * @return 实验室
     */
    public LabSubject selectLabSubjectCheckById(Long id);

    /**
     * 查询实验室列表
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubject> selectLabSubjectList(LabSubject labSubject);

    /**
     * 实验室查询
     * @param labSubject
     * @return
     */
    public List<LabSubject> selectLabSubjectListSecurity(LabSubject labSubject);

    String queryUserNameBySafeUserByOnepc(String safeUserId);

    String queryUserNameBySafeUserInfo(String safeUserId);

    String queryUserNameBySafeUserId(String safeUserId);

    String queryUserPhoneBySafeUserId(String safeUserId);

    /***
     * 查询有负责人的实验室
     * @param labSubject
     * @return
     */
    public List<LabSubject> selectLabSubjectListByadminidNotnull(LabSubject labSubject);
    /**
     * 查询实验室列表VO-数据权限
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubjectVO> selectLabSubjectVOList(LabSubject labSubject);

    /**
     * 获取实验室数量
     * @param labSubject
     * @return
     */
    public int myAdminSubCount(LabSubject labSubject);
    /**
     * 查询实验室列表VO-无数据权限
     *
     * @param ids 实验室ids
     * @param hasSafeUserName 是否查询安全负责人用户信息
     * @return 实验室集合
     */
    public List<LabSubjectVO> selectLabSubjectVOListByIds(@Param("ids") List<Long> ids, @Param("hasSafeUserName")Boolean hasSafeUserName);

    /**
     * 查询安全信息
     * @param ids
     * @return
     */
    public List<LabSubjectVO> selectLabSubSafeInfoByIds(@Param("ids") Long... ids);
    /**
     * 新增实验室
     *
     * @param labSubject 实验室
     * @return 结果
     */
    public int insertLabSubject(LabSubject labSubject);

    /**
     * 修改实验室
     *
     * @param labSubject 实验室
     * @return 结果
     */
    public int updateLabSubject(LabSubject labSubject);


    /**
     * 关联实验室负责人
     *
     * @param labSubject 实验室
     * @return 结果
     */
    public int setSubjectAdmin(LabSubject labSubject);


    /**
     * 删除实验室
     *
     * @param id 实验室主键
     * @return 结果
     */
    public int deleteLabSubjectById(Long id);

    /**
     * 批量删除实验室
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteLabSubjectByIds(Long[] ids);


    /**
     * 查询实验室列表
     *
     * @param ids 实验室
     * @return 实验室集合
     */
    public List<LabSubjectVO> selectLabSubjectListByIds(Long[] ids);

    /**
     * 查询实验室列表-根据负责人ids
     *
     * @param ids 实验室
     * @return 实验室集合
     */
    public List<LabSubjectVO> selectLabSubjectListByAdminIds(Long[] ids);


    /**
     * 查询实验室字典表
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubject> getSubjectDict(LabSubject labSubject);

    /**
     * 查询实验室字典表
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubject> getSubjectDictByViolation(LabSubject labSubject);

    /**
     * 查询实验室字典表
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubject> getFilterSubjectDict(LabSubjectVO labSubject);


    /**
     * 查询实验室根据实验室管理员用户权限过滤数据
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubject> getUserRoleBySub(LabSubjectVO labSubject);

    /**
     * 查询实验室根据实验室管理员用户权限过滤数据
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubject> getUserRoleBySubBindRisk(LabSubjectVO labSubject);

    /**
     * 获取实验室及关联信息
     * @param labSubject
     * @return
     */
    public List<LabSubject> getAllSubjectByParame(LabSubjectVO labSubject);

    /**
     * 实验室列表 vo
     *
     * @param labSubjectVo 实验室
     * @return 我的实验室列表
     */
    public List<LabSubjectVO> mySubjectList(LabSubjectVO labSubjectVo);


    /**
     * 根据实验室IDs 查询危险等级
     *
     * @param ids 实验室ids
     * @return 危险等级
     */
    public List<LabSubClassVO> querySubClassesByIds(Long... ids);

    /**
     * 查询实验室数量通过楼栋ID
     *
     * @param ids
     * @return
     */
    public List<TotalByID> queryCountByBuildIds(Long... ids);

    LabSubjectDetailVO queryByLayoutId(Long layoutId);

    @Deprecated
    LabGradeManageWorkVO selectSubInfoByMyGradeManageWork(Long subId);

    List<Long> selectAdminIds(List<Long> subs);

    List<Long> selectSubIdByAdminId(Long adminId);

    List<Map<String, Long>> selectLabAdminByIds(List<Long> subIds);


    /**
     * 查询实验室列表
     *
     * @param ids 实验室
     * @return 实验室集合
     */
    public List<LabSubject> multipleDetpBysubList(Long[] ids);

    List<LabSubject> getByIds(List<Long> ids);


    /**
     * 查询首页分类统计
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabClasstypeVo> getTypeCount(LabSubjectVO labSubject);


    /**
     * 查询首页分类统计
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabClassifiedVo> getFiedCount(LabSubjectVO labSubject);

}
