package com.sunxung.factoring.service.sys;

import java.util.List;

import com.sunxung.factoring.dict.impl.OrgLevelDict;
import com.sunxung.factoring.entity.GridPage;
import com.sunxung.factoring.entity.sys.Org;
import com.sunxung.factoring.entity.sys.User;
import com.sunxung.factoring.entity.sys.vo.OrgTreeNode;
import com.sunxung.factoring.entity.sys.vo.SearchOrg;
import com.sunxung.factoring.entity.sys.vo.SysGradationVo;

public interface OrgService {

    /**
     * 间隔符
     */
    String INTERVAL = ".";

    /**
     * 新增组织机构
     *
     * @param org 组织机构对象
     * @return Org 返回组织机构对象
     */
    Org add(Org org);

    Org update(Org org);

    boolean delete(Long id);

    Org get(Long id);

    /**
     * 获取组织且填充所有成员对象实例
     *
     * @param id 组织机构的ID
     * @return 返回组织机构对象
     */
    Org getAll(Long id);

    List<Org> findByParentId(Long parentId);

    Org getByCode(String code);

    /**
     * 查询所有的一级节点
     *
     * @param number 是否显示人数：true显示、false不显示
     * @return List<OrgTreeNode> 所有的一级节点的集合
     */
    List<OrgTreeNode> findRootOrgTreeNode(boolean number);

    /**
     * 根据父ID，查询所有的子节点
     *
     * @param parentId 父ID
     * @param number 是否显示人数：true显示、false不显示
     * @return List<OrgTreeNode> 所有子节点的集合
     */
    List<OrgTreeNode> findOrgTreeNodeByParentId(Long parentId, boolean number);

    GridPage<Org> findListByMapForPage(SearchOrg search);

    List<Org> findByOrgName(String orgName);

    List<Org> getOrgSelectbox(Long orgId, Long nowId);

    /** 判断添加是否有重名 */
    boolean validateAdd(String code);

    /** 判断修改是否有重名 */
    boolean validateUpdate(String code, Long roleId);

    /**
     * 获取所有组织机构信息
     *
     * @return
     */
    List<Org> findAll();

    /**
     * 获取组织机构真实名称（如：中国浙江省杭州市西湖区），但不包含起始组织机构名称； <br>
     * 根据起始组织机构“orgId”查询，直到父级组织机构机构级别与“orgTypeEnum”相等为止；
     *
     * @param orgId 起始组织机构id
     * @param orgTypeEnum 组织机构级别
     * @return
     */
    String getOrgRealNameExcludeSelf(Long orgId, OrgLevelDict.ChildEnum orgTypeEnumss);

    /**
     * 获取组织机构真实名称（如：中国浙江省杭州市西湖区）； <br>
     * 根据起始组织机构“orgId”查询，直到父级组织机构机构级别id与“parentOrgId”相等为止；
     *
     * @param orgId 起始组织机构id
     * @param parentOrgId 组织机构父级id
     * @return
     */
    String getOrgRealName(Long orgId, Long parentOrgId);

    /**
     * 获取组织机构真实名称（如：浙江省杭州市西湖区）
     *
     * @param orgId 起始组织机构id。比如orgId是西湖区的ID
     * @return String 除了最顶级不显示。返回比如浙江省杭州市西湖区
     */
    String getOrgRealNameExceptRoot(Long orgId);

    /**
     * 获取所有的组织机构信息，并填充所属的角色. <br/>
     *
     * @return
     */
    List<Org> findAllByFillRoles();

    /**
     * 删除多条数据 <br/>
     *
     * @param ids
     * @return
     */
    boolean deleteMore(String[] ids);

    /**
     * 判断该父部门下是否有重复的子部门
     *
     * @param parentId 父部门的ID
     * @param name 部门名称
     * @return
     */
    Org getByParentIdAndName(Long parentId, String name);

    /**
     * 调整部门的顺序
     *
     * @param sysVo 部门顺序封装类
     * @return boolean true成功，false 失败
     */
    boolean adjustOrder(SysGradationVo sysVo);

    /**
     * 角色模块-添加成员；当选某一个部门的时候，必须展示该部门下的子部门和该部门下的用户
     *
     * @param parentId 父部门的ID，当为null时查询的时，根节点。当不为空时查询的是下级
     * @param number
     * @return List<OrgTreeNode> 返回部门树对象
     */
    List<OrgTreeNode> findOrgAndUserTreeNode(Long parentId, boolean number);

    /**
     * 角色模块-添加成员；当选某一个部门的时候，必须展示该部门下的子部门和该部门下的用户(包含admin超级管理员)
     *
     * @param parentId 父部门的ID，当为null时查询的时，根节点。当不为空时查询的是下级
     * @param number
     * @return List<OrgTreeNode> 返回部门树对象
     */
    List<OrgTreeNode> findOrgAndUserTreeNodeAndAdmin(Long parentId, boolean number);

    List<OrgTreeNode> findOperationCenterAndUserTreeNode(Long parentId, boolean number);

    /**
     * 根据关键字搜索用户和部门，返回用户和部门的集合
     *
     * @param keyword 关键字
     * @return List<OrgTreeNode>
     */
    List<OrgTreeNode> findOrgUserList(String keyword);

    /**
     * 根据部门code值查询该部门下所有成员及子部门下所有成员（去重复用户）. <br/>
     *
     * @param code
     * @return
     */
    List<Long> findUserIdByOrgCode(String code);

    /**
     * 根据部门名称列表查询
     *
     * @param orgNameList
     * @return
     */
    List<Org> findByNameList(List<String> orgNameList);

    Org findByName(String name);

    /**
     * 查询用户所属部门是否为长安银科
     * @param userId
     * @return
     */
    Org findRootByUseId(Long userId);

    /**
     * 查看用户为部门负责人的所有部门
     * @param userId
     * @return
     */
    List<Org> findIdentityByUseId(Long userId);

    /**
     * 组织机构和用户信息同步
     *
     * @param orgId
     */
    void syncOrgAndUser(Long orgId);

    /**
     * 获取指定部门下所有人员信息
     *
     * @param orgId
     * @return
     */
    List<User> findUserListByOrgId(Long orgId);
}
