package com.zd.laboratory.service;

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.LabSubjectVO;
import com.zd.system.api.laboratory.domain.TotalByID;
import com.zd.system.api.laboratory.domain.vo.LabSubClassVO;

import java.util.List;

/**
 * 实验室Service接口
 *
 * @author zd
 * @date 2021-08-30
 */
public interface ILabSubjectService {
    /**
     * 查询实验室
     *
     * @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 boolean isadmin(LabSubject labSubject);


    /**
     * 查询实验室列表-应用数据权限和实验室负责人权限
     *
     * @param labSubject 实验室
     * @return 实验室集合
     */
    public List<LabSubjectVO> selectLabSubjectListAUTH(LabSubject labSubject);

    /**
     * 我管理的实验室数量 应用数据权限和实验室负责人权限
     *
     * @param labSubject 实验室
     * @return 实验室
     */
    public int myAdminSubCount(LabSubject labSubject);
    /**
     * 查询实验室列表-只是应用数据权限
     *
     * @param labSubject 实验室
     * @return 实验室
     */
    public List<LabSubjectVO> selectLabSubjectListDataScope(LabSubject labSubject);

    /**
     * 批量查询负责人负责的实验室
     *
     * @param ids
     * @return
     */
    public List<LabSubjectVO> selectLabSubjectListByAdminIds(Long... ids);

    /**
     * 新增实验室
     *
     * @param labSubject 实验室
     * @return 结果
     */
    public int insertLabSubject(LabSubject labSubject);

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

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

    /**
     * 关联实验室负责人
     *
     * @param userID
     * @param subId
     * @return
     */
    public int setSubjectAdmin(Long userID, Long subId);

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

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


    /**
     * 查询实验室字典表
     *
     * @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 labSubjectVo 实验室
     * @return 我的实验室列表
     */
    public List<LabSubjectVO> mySubjectList(LabSubjectVO labSubjectVo);

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

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

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

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

    /***
     * 查询有负责人的实验室
     * @param labSubject
     * @return
     */
    public List<LabSubject> selectLabSubjectListByadminidNotnull(LabSubject labSubject);



    /**
     * 查询实验室列表
     *
     * @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);
}
