package com.sunxung.factoring.service.sys;

import java.util.List;

import com.sunxung.factoring.entity.GridPage;
import com.sunxung.factoring.entity.sys.Role;
import com.sunxung.factoring.entity.sys.UserRoleRel;
import com.sunxung.factoring.entity.sys.vo.SearchRoleanization;
import com.sunxung.factoring.entity.sys.vo.SysGradationVo;

/**
 * @Description 用户角色业务接口
 * @date 2017年3月15日 下午2:52:37
 * @version 1.0
 */
/**
 * @className:RoleService
 * @description:TODO这里用一句话描述这个类的作用
 * @author:杜小姣
 * @e-mail:1261237207@qq.com
 * @date:2018年1月19日 下午2:37:51
 */
public interface RoleService {

    /**
     * 新增角色
     *
     * @param role 角色信息
     * @return role 角色信息
     */
    Role add(Role role);

    /**
     * 修改角色信息
     *
     * @param role 角色信息
     * @return Role 角色信息
     */
    Role update(Role role);

    /**
     * 根据角色ID删除角色信息
     *
     * @param id 角色ID
     * @return boolean 返回true成功、false失败
     */
    boolean delete(Long id);

    /**
     * 批量删除、根据角色ID删除角色信息
     *
     * @param ids 角色ID，String类型的数组
     * @return boolean 返回true成功、false失败
     */
    boolean deletes(String[] ids);

    /**
     * 根据角色ID获取角色信息
     *
     * @param id 角色ID
     * @return Role 返回角色信息
     */
    Role get(Long id);

    /**
     * 根据角色ID获取角色信息
     *
     * @param id 角色ID
     * @return Role 返回角色信息
     */
    Role getDetail(Long id);

    /**
     * 查询全部角色信息
     *
     * @return
     */
    List<Role> findAll();

    /**
     * 按条件分页查询角色信息
     *
     * @param search 查询条件
     * @return
     */
    GridPage<Role> findBySearch(SearchRoleanization search);

    /**
     * 根据角色名获取角色信息
     *
     * @param name 角色名
     * @return
     */
    Role getByRoleName(String name);

    /**
     * 根据角色ID获取角色用户ID列表
     *
     * @param roleId 角色ID
     * @return 返回用户ID列表
     */
    List<Long> getUserIdByRoleId(Long roleId);

    /**
     * 判断添加角色名是否有重名
     *
     * @param name 角色名
     * @return
     */
    boolean validateAdd(String name);

    /**
     * 判断修改角色名是否有重名
     *
     * @param name 角色名
     * @param roleId 角色ID
     * @return
     */
    boolean validateUpdate(String name, Long roleId);

    /**
     * 根据角色ID获取缓存角色信息
     *
     * @param roleId
     * @return
     */
    Role getRedisByRoleId(Long roleId);

    /**
     * 根据组织机构ID获取对应角色列表
     *
     * @param orgId 组机构ID
     * @return
     */
    List<Role> findByOrgId(Long orgId);

    /**
     * 查询角色对应的权限ID列表
     *
     * @param roleId 角色ID
     * @return
     */
    List<Long> findPermissionIdByRoleId(Long roleId);

    /**
     * 获取全部权限ID列表
     *
     * @return
     */
    List<Long> getAllPermissionId();

    /**
     * 根据角色ID获取根权限ID列表
     *
     * @param roleId 角色ID
     * @return
     */
    List<Long> getRootIdByRoleId(Long roleId);

    /**
     * 根据角色ID获取权限节点ID列表
     *
     * @param roleId 角色ID
     * @return
     */
    List<Long> getNodeIdByRoleId(Long roleId);

    /**
     * 判断权限是否被选中
     *
     * @param roleId 角色ID
     * @param permissionId 权限ID
     * @return
     */
    Long isChecked(Long roleId, Long permissionId);

    /**
     * 获取角色对应管理用户ID
     *
     * @param roleId
     * @return
     */
    Long getAdminUserId(Long roleId);

    /**
     * 角色管理员是否存在
     *
     * @param roleId
     * @return
     */
    boolean isRoleAdminExist(Long roleId);

    /**
     * 根据用户ID，获取所有对应的角色
     *
     * @param userId
     * @return
     */
    List<UserRoleRel> getUserRoleByUserId(Long userId);

    /**
     * 查询所有的角色组
     *
     * @return List<Role> 返回角色组列表
     */
    List<Role> findGroupRole();

    /**
     * 给指定的某一个角色添加成员
     *
     * @param roleId 角色ID
     * @param userIds 用户ID
     * @return boolean 返回true表示成功、false表示失败
     */
    boolean addUserRole(Long roleId, String[] userIds);

    /**
     * 移除该角色下的用户
     *
     * @param roleId 角色ID
     * @param userIds 用户ID
     * @return boolean 返回true表示成功、false表示失败
     */
    boolean removeUserRole(Long roleId, String[] userIds);

    /**
     * 根据角色组（父角色）ID、查找父角色下面的所有角色信息
     *
     * @param parentRoleId 父角色ID、角色组的ID
     * @return List<Role> 角色信息的List
     */
    List<Role> findByParentRoleId(Long parentRoleId);

    /**
     * 判断某用户是否是超级管理员角色
     *
     * @param userId 用户ID
     * @return boolean 返回值：true 是超级管理员、false 不是超级管理员。本系统中有且仅有一个超级管理员
     */
    boolean judgmentAdmin(Long userId);

    /**
     * 调整角色内人员的顺序
     *
     * @param sysVo 角色中人员顺序封装类
     * @return boolean true成功，false 失败
     */
    boolean adjustOrder(SysGradationVo sysVo);

    /**
     * 查询当前用户的角色列表
     *
     * @return
     */
    List<Role> getRoleListByUseId();
}
