package com.njcn.user.service;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.system.pojo.dto.AreaTreeDTO;
import com.njcn.system.pojo.po.Area;
import com.njcn.user.pojo.dto.DeptDTO;
import com.njcn.user.pojo.param.DeptParam;
import com.njcn.user.pojo.po.Dept;
import com.njcn.user.pojo.vo.DeptAllTreeVO;
import com.njcn.user.pojo.vo.DeptTreeVO;
import com.njcn.user.pojo.vo.DeptVO;
import com.njcn.user.pojo.vo.PvTerminalTreeVO;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author hongawen
 * @since 2021-12-13
 */
public interface IDeptService extends IService<Dept> {

    /**
     * 根据前台传递参数，分页查询部门信息
     *
     * @param queryParam 查询参数
     * @return 部门列表
     */
    Page<DeptVO> listDept(DeptParam.QueryParam queryParam);

    /**
     * 新增部门
     *
     * @param deptParam 部门信息
     * @return 操作结果
     */
    boolean addDept(DeptParam deptParam);

    /**
     * 修改部门信息
     *
     * @param updateParam 部门数据
     * @return 操作结果
     */
    boolean updateDept(DeptParam.DeptUpdateParam updateParam);

    /**
     * 批量逻辑删除部门数据
     *
     * @param ids 字典id集合
     * @return 操作结果
     */
    boolean deleteDept(List<String> ids);


    /**
     * 部门树
     * @return 结果
     */
    List<DeptTreeVO> deptTree();


    List<DeptTreeVO> existMonitorDeptTree();

    /**
     * 根据登录用户获取区域树
     * @return 结果
     */
    List<DeptAllTreeVO> loginDeptTree();

    /**
     * 已经绑定的区域
     * @return 已经绑定的区域
     */
    List<String> deptArea();

    /**
     * 行政树
     * @param id id
     * @param type type
     * @return 结果
     */
    List<AreaTreeDTO> getAreaTree(String id, Integer type);

    List<AreaTreeDTO> getPidAreaByAreaId(String id, Integer type);


    /**
     * 获取省份ids
     * @param ids ids
     * @return 结果
     */
    boolean selectPid(List<String> ids);

    /**
     * 根据部门id获取部门名称
     * @param id
     * @return java.lang.String
     * @author xy
     */
    String getNameByDeptId(String id);

    /**
     * 根据条件获取后代部门索引
     * @param id 部门id
     * @param type 指定部门类型
     * @return 后代部门索引
     */
    List<DeptDTO> getDeptDescendantIndexes(String id, List<Integer> type);

    /**
     * 根据区域索引获取部门索引
     * @param area
     * @return java.lang.String
     * @author xy
     * @date 2022/2/14 15:08
     */
    String getDeptIdByArea(String area);

    /**
     * 根据部门索引获取区域索引
     * @param deptId
     * @return java.lang.String
     * @author denghuajun
     * @date 2022/2/24 15:08
     */
    String getAreaIdByDeptId(String deptId);

    /**
     * 功能描述: 获取顶层部门的id
     * @param
     * @return java.lang.String
     * @author xy
     * @date 2022/3/28 9:32
     */
    String getTopDeptId();

    /**
     * 获取所有的部门
     * @author cdf
     * @date 2022/7/12
     */
    List<PvTerminalTreeVO> allDeptList();



    /**
     * 根据部门id获取部门详情
     * @author cdf
     * @date 2022/7/13
     */
    Dept getDeptById(String id);

    /**
     * 根据部门code获取部门详情
     * @author cdf
     * @date 2022/7/13
     */
    Dept getDeptByCode(String deptCode);


    /**
     * 根据部门id获取部门详情
     * @author cdf
     * @date 2022/7/13
     */
    List<String> getDepSonIdtByDeptId(String id);

    /**
     * 根据部门id获取部门详情
     * @author cdf
     * @date 2022/7/13
     */
    List<String> getDepSonSelfCodetByDeptId(String id);

    /**
     * 根据部code获取所有子部门以及自身的code
     * @author cdf
     * @date 2022/7/13
     */
    List<String> getDepSonSelfCodetByCode(String code);


    /**
     * 根据部门id获取子部门ids
     * @author dhj
     * @date 2022/7/13
     */
    List<String> getDepSonIdByDeptId(String id);

    /**
     * 根据部门deptId获取直接子部门及自身
     * @param deptId 部门编号
     * @author cdf
     * @date 2022/12/1
     */
    List<Dept> getDirectSonSelf(String deptId);

    /**
     * 获取所有本部
     * @author cdf
     * @date 2022/12/8
     */
    List<Dept> getSpecialDeptList();

    /**
     * 获取根部门
     * @author cdf
     * @date 2023/1/6
     */
    Dept getRootDept();
    /**
    * @Description: 获取当前部门的的下级子部门list，如果没子部门就是返回当前部门
    * @Param: [deptId]
    * @return: java.util.List<com.njcn.user.pojo.dto.DeptDTO>
    * @Author: clam
    * @Date: 2023/1/10
    */
    List<DeptDTO> getDepSonDetailByDeptId(String deptId);

    /**
     * @Description: 向上查询部门信息
     * @param deptId 部门id
     * @Author: wr
     * @Date: 2023/11/9 15:57
     */
    List<String> getUpByDeptIds(String deptId);

    /**
     * @Description: 根据单位集合查询对应部门
     * @param list code集合
     * @Author: xuyang
     * @Date: 2023/12/11 11:36
     */
    List<Dept> getDeptByCodeList(List<String> list);


    List<Dept> getDeptInfoListByIds(List<String> deptIds);

    /**
     * @Description: 获取所有单位
     * @Author: xuyang
     * @Date: 2023/12/11 14:50
     */
    List<Dept> getAllDept();

    List<Tree<String>> orgTreeSelector();

}
