package com.xzx.gc.role.service;  
 | 
  
 | 
  
 | 
import com.xzx.gc.common.HttpRequestLocal;  
 | 
import com.xzx.gc.common.exception.PlatformException;  
 | 
import com.xzx.gc.common.exception.RestException;  
 | 
import com.xzx.gc.entity.*;  
 | 
import com.xzx.gc.role.mapper.*;  
 | 
import com.xzx.gc.role.rbac.tree.FunctionItem;  
 | 
import com.xzx.gc.role.rbac.tree.MenuItem;  
 | 
import com.xzx.gc.role.rbac.tree.OrgItem;  
 | 
import com.xzx.gc.role.util.FunctionBuildUtil;  
 | 
import com.xzx.gc.role.util.MenuBuildUtil;  
 | 
import com.xzx.gc.role.util.OrgBuildUtil;  
 | 
import com.xzx.gc.util.enums.DelFlagEnum;  
 | 
import org.springframework.beans.factory.annotation.Autowired;  
 | 
import org.springframework.stereotype.Service;  
 | 
import org.springframework.transaction.annotation.Transactional;  
 | 
  
 | 
import javax.annotation.PostConstruct;  
 | 
import java.lang.reflect.Field;  
 | 
import java.util.*;  
 | 
  
 | 
/**  
 | 
 * 系统平台功能访问入口,所有方法应该支持缓存或者快速访问  
 | 
 * @author xiandafu  
 | 
 */  
 | 
@Service  
 | 
@Transactional  
 | 
public class CorePlatformService {  
 | 
  
 | 
    //菜单树,组织机构树,功能树缓存标记  
 | 
    public static final String MENU_TREE_CACHE = "cache:core:menuTree";  
 | 
    public static final String ORG_TREE_CACHE = "cache:core:orgTree";  
 | 
    public static final String FUNCTION_TREE_CACHE = "cache:core:functionTree";  
 | 
    //字典列表  
 | 
    public static final String DICT_CACHE_TYPE = "cache:core:dictType";  
 | 
    public static final String DICT_CACHE_VALUE = "cache:core:dictValue";  
 | 
    public static final String DICT_CACHE_SAME_LEVEL = "cache:core:ditcSameLevel";  
 | 
    public static final String DICT_CACHE_CHILDREN = "cache:core:dictChildren";  
 | 
    public static final String USER_FUNCTION_ACCESS_CACHE = "cache:core:userFunctionAccess";  
 | 
    public static final String USER_FUNCTION_CHIDREN_CACHE = "ccache:core:functionChildren";  
 | 
    public static final String FUNCTION_CACHE = "cache:core:function";  
 | 
  
 | 
    public static final String USER_DATA_ACCESS_CACHE = "cache:core:userDataAccess";  
 | 
    public static final String USER_MENU_CACHE = "cache:core:userMenu";  
 | 
  
 | 
    /*当前用户会话*/  
 | 
    public static final String ACCESS_CURRENT_USER = "core:user";  
 | 
    /*当前登录用户所在部门*/  
 | 
    public static final String ACCESS_CURRENT_ORG = "core:currentOrg";  
 | 
    /*用户可选部门*/  
 | 
    public static final String ACCESS_USER_ORGS = "core:orgs";  
 | 
  
 | 
    public static final String ACCESS_SUPPER_ADMIN = "admin";  
 | 
      
 | 
    @Autowired  
 | 
    HttpRequestLocal httpRequestLocal;  
 | 
  
 | 
  
 | 
  
 | 
    @Autowired  
 | 
     CoreRoleFunctionMapper roleFunctionMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CoreRoleMenuMapper sysRoleMenuMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CoreOrgMapper sysOrgMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CoreRoleFunctionMapper sysRoleFunctionMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CoreMenuMapper sysMenuMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CoreUserMapper sysUserMapper;  
 | 
    @Autowired  
 | 
     CityPartnerMapper cityPartnerMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CoreFunctionMapper sysFunctionMapper;  
 | 
  
 | 
    @Autowired  
 | 
     CorePlatformService self;  
 | 
    /*@Autowired  
 | 
    private DataAccessFactory dataAccessFactory;*/  
 | 
  
 | 
    @PostConstruct  
 | 
    @SuppressWarnings("unchecked")  
 | 
    public void init() {  
 | 
        //SQLPlaceholderST.textFunList.add("function");  
 | 
        //sql语句里带有此函数来判断数据权限  
 | 
        //sqlManager.getBeetl().getGroupTemplate().registerFunction("function", dataAccessFunction);  
 | 
        //sqlManager.getBeetl().getGroupTemplate().registerFunction("nextDay", new NextDayFunction());  
 | 
    }  
 | 
  
 | 
  
 | 
    public CoreUser getCurrentUser() {  
 | 
        CoreUser user =  (CoreUser) httpRequestLocal.getSessionValue(ACCESS_CURRENT_USER);  
 | 
        return user;  
 | 
  
 | 
    }  
 | 
      
 | 
    public void changeOrg(Long orgId) {  
 | 
            List<CoreOrg> orgs = this.getCurrentOrgs();  
 | 
            for(CoreOrg org:orgs) {  
 | 
                if(org.getId().equals(orgId)) {  
 | 
                     httpRequestLocal.setSessionValue(CorePlatformService.ACCESS_CURRENT_ORG, org);  
 | 
                }  
 | 
            }  
 | 
    }  
 | 
  
 | 
  
 | 
    public Long getCurrentOrgId() {  
 | 
  
 | 
        CoreOrg org = (CoreOrg) httpRequestLocal.getSessionValue(ACCESS_CURRENT_ORG);  
 | 
        return org.getId();  
 | 
  
 | 
    }  
 | 
      
 | 
    public CoreOrg getCurrentOrg() {  
 | 
  
 | 
        CoreOrg org = (CoreOrg) httpRequestLocal.getSessionValue(ACCESS_CURRENT_ORG);  
 | 
        return org;  
 | 
  
 | 
    }  
 | 
  
 | 
    public List<CoreOrg> getCurrentOrgs() {  
 | 
        List<CoreOrg> orgs = (List<CoreOrg>) httpRequestLocal.getSessionValue(ACCESS_USER_ORGS);  
 | 
        return orgs;  
 | 
  
 | 
    }  
 | 
      
 | 
  
 | 
    public void setLoginUser(CoreUser user, CoreOrg currentOrg, List<CoreOrg> orgs) {  
 | 
        httpRequestLocal.setSessionValue(CorePlatformService.ACCESS_CURRENT_USER, user);  
 | 
        httpRequestLocal.setSessionValue(CorePlatformService.ACCESS_CURRENT_ORG, currentOrg);  
 | 
        httpRequestLocal.setSessionValue(CorePlatformService.ACCESS_USER_ORGS, orgs);  
 | 
  
 | 
    }  
 | 
  
 | 
  
 | 
    public MenuItem getMenuItem(long userId, long orgId) {  
 | 
        MenuItem menu = buildMenu();  
 | 
        CoreUser user = this.sysUserMapper.selectByPrimaryKey(userId);  
 | 
        if (this.isSupperAdmin(user)) {  
 | 
            return menu;  
 | 
        }  
 | 
        Set<Long> allows = self.getCurrentMenuIds(userId, orgId);  
 | 
        menu.filter(allows);  
 | 
        return menu;  
 | 
    }  
 | 
  
 | 
    public MenuItem getPartnerMenuItem(long userId, long orgId) {  
 | 
        Set<Long> allows = self.getCurrentMenuIds(userId, orgId);  
 | 
        MenuItem menu = this.buildMenu();  
 | 
        menu.filter(allows);  
 | 
        return menu;  
 | 
    }  
 | 
  
 | 
    public MenuItem getAllMenuItem() {  
 | 
            return self.buildMenu();  
 | 
    }  
 | 
  
 | 
    public OrgItem getUserOrgTree() {  
 | 
        if (this.isCurrentSupperAdmin()) {  
 | 
            OrgItem root = self.buildOrg();  
 | 
            return root;  
 | 
        }  
 | 
        OrgItem current = getCurrentOrgItem();  
 | 
        //OrgItem item= dataAccessFactory.getUserOrgTree(current);  
 | 
        return null;  
 | 
    }  
 | 
  
 | 
    public static Map<String, Object> getObjectToMap(Object obj) throws IllegalAccessException {  
 | 
        Map<String, Object> map = new LinkedHashMap<String, Object>();  
 | 
        Class<?> clazz = obj.getClass();  
 | 
        System.out.println(clazz);  
 | 
        for (Field field : clazz.getDeclaredFields()) {  
 | 
            field.setAccessible(true);  
 | 
            String fieldName = field.getName();  
 | 
            Object value = field.get(obj);  
 | 
            if (value == null){  
 | 
                value = "";  
 | 
            }  
 | 
            map.put(fieldName, value);  
 | 
        }  
 | 
        return map;  
 | 
    }  
 | 
  
 | 
  
 | 
    public OrgItem getUserOrgTreeByCus() {  
 | 
        OrgItem current = getCurrentOrgItem();  
 | 
        //OrgItem item= dataAccessFactory.getUserOrgTree(current);  
 | 
        return null;  
 | 
  
 | 
    }  
 | 
  
 | 
     
 | 
  
 | 
  
 | 
    //@Cacheable(FUNCTION_CACHE)  
 | 
    public CoreFunction getFunction(String functionCode) {  
 | 
  
 | 
        return sysFunctionMapper.getFunctionByCode(functionCode);  
 | 
    }  
 | 
  
 | 
  
 | 
    public OrgItem getCurrentOrgItem() {  
 | 
        OrgItem root = buildOrg();  
 | 
        OrgItem item = root.findChild(getCurrentOrgId());  
 | 
        if (item == null) {  
 | 
            throw new RestException("未找到组织机构");  
 | 
        }  
 | 
        return item;  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 判断用户是否是超级管理员  
 | 
     * @param user  
 | 
     * @return  
 | 
     */  
 | 
    public boolean isSupperAdmin(CoreUser user) {  
 | 
        return user.getCode().startsWith(ACCESS_SUPPER_ADMIN);  
 | 
    }  
 | 
  
 | 
    public boolean isCurrentSupperAdmin() {  
 | 
        CoreUser user = this.getCurrentUser();  
 | 
        return isSupperAdmin(user);  
 | 
    }  
 | 
  
 | 
    public boolean isAllowUserName(String name){  
 | 
        return !name.startsWith(ACCESS_SUPPER_ADMIN);  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 获取用户在指定功能点的数据权限配置,如果没有,返回空集合  
 | 
     * @param userId  
 | 
     * @param orgId  
 | 
     * @param fucntionCode  
 | 
     * @return  
 | 
     */  
 | 
    //@Cacheable(USER_DATA_ACCESS_CACHE)  
 | 
    public List<CoreRoleFunction> getRoleFunction(Long userId, Long orgId, String fucntionCode) {  
 | 
        List<CoreRoleFunction> list = sysRoleFunctionMapper.getRoleFunction(userId, orgId, fucntionCode);  
 | 
        return list;  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 当前用户是否能访问功能,用于后台功能验证,functionCode 目前只支持二级域名方式,不支持更多级别  
 | 
     * @param functionCode "user.add","user"  
 | 
     * @return  
 | 
     */  
 | 
      
 | 
      
 | 
  
 | 
    //@Cacheable(USER_FUNCTION_ACCESS_CACHE)  
 | 
    public boolean canAcessFunction(Long userId, Long orgId, String functionCode) {  
 | 
  
 | 
        CoreUser user = getCurrentUser();  
 | 
        if (user.getId() == userId && isSupperAdmin(user)) {  
 | 
            return true;  
 | 
        }  
 | 
        String str = functionCode;  
 | 
        List<CoreRoleFunction> list = sysRoleFunctionMapper.getRoleFunction(userId, orgId, str);  
 | 
        boolean canAccess = !list.isEmpty();  
 | 
        if (canAccess) {  
 | 
            return true;  
 | 
        }else{  
 | 
            return false;  
 | 
        }  
 | 
  
 | 
          
 | 
  
 | 
  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 当前功能的子功能,如果有,则页面需要做按钮级别的过滤  
 | 
     * @param userId  
 | 
     * @param orgId  
 | 
     * @param parentFunction 菜单对应的function  
 | 
     * @return  
 | 
     */  
 | 
    //@Cacheable(USER_FUNCTION_CHIDREN_CACHE)  
 | 
    public List<String> getChildrenFunction(Long userId, Long orgId, String parentFunction) {  
 | 
        CoreFunction template = new CoreFunction();  
 | 
        template.setCode(parentFunction);  
 | 
        List<CoreFunction> list = sysFunctionMapper.select(template);  
 | 
        if (list.size() != 1) {  
 | 
            throw new RestException("访问权限未配置");  
 | 
        }  
 | 
  
 | 
        Long id = list.get(0).getId();  
 | 
        return sysRoleFunctionMapper.getRoleChildrenFunction(userId, orgId, id);  
 | 
  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 查询当前用户有用的菜单项目,可以在随后验证是否能显示某项菜单  
 | 
     * @return  
 | 
     */  
 | 
    //@Cacheable(USER_MENU_CACHE)  
 | 
    public Set<Long> getCurrentMenuIds(Long userId, Long orgId) {  
 | 
        List<Long> list = sysRoleMenuMapper.queryMenuByUser(userId, orgId);  
 | 
        return new HashSet<Long>(list);  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 验证菜单是否能被显示  
 | 
     * @param item  
 | 
     * @param allows  
 | 
     * @return  
 | 
     */  
 | 
    public boolean canShowMenu(CoreUser user, MenuItem item, Set<Long> allows) {  
 | 
        if (isSupperAdmin(user)) {  
 | 
            return true;  
 | 
        }  
 | 
        return allows.contains(item.getData().getId());  
 | 
    }  
 | 
  
 | 
    //@Cacheable(MENU_TREE_CACHE)  
 | 
    public MenuItem buildMenu() {  
 | 
        List<CoreMenu> list = sysMenuMapper.allMenuWithURL();  
 | 
        return MenuBuildUtil.buildMenuTree(list);  
 | 
  
 | 
    }  
 | 
  
 | 
    //@Cacheable(ORG_TREE_CACHE)  
 | 
    public OrgItem buildOrg() {  
 | 
  
 | 
  
 | 
        CoreOrg root = sysOrgMapper.getRoot();  
 | 
        OrgItem rootItem = new OrgItem(root);  
 | 
        CoreOrg org = new CoreOrg();  
 | 
        org.setDelFlag(DelFlagEnum.NORMAL.getValue());  
 | 
        List<CoreOrg> list = sysOrgMapper.select(org);  
 | 
        OrgBuildUtil.buildTreeNode(rootItem,list);  
 | 
        //集团  
 | 
        return rootItem;  
 | 
  
 | 
    }  
 | 
  
 | 
    //@Cacheable(FUNCTION_TREE_CACHE)  
 | 
    public FunctionItem buildFunction() {  
 | 
        List<CoreFunction> list = sysFunctionMapper.selectAll();  
 | 
        return FunctionBuildUtil.buildOrgTree(list);  
 | 
  
 | 
    }  
 | 
    /**  
 | 
     * 用户信息被管理员修改,重置会话,让用户操作重新登录  
 | 
     * @param name  
 | 
     */  
 | 
    public void restUserSession(String name){  
 | 
    }  
 | 
  
 | 
  
 | 
    //@CacheEvict(cacheNames = {FUNCTION_CACHE, FUNCTION_TREE_CACHE, /*功能点本身缓存*/  
 | 
            //MENU_TREE_CACHE, USER_MENU_CACHE,/*功能点关联菜单缓存*/  
 | 
            //USER_FUNCTION_ACCESS_CACHE, USER_FUNCTION_CHIDREN_CACHE, USER_DATA_ACCESS_CACHE,/*功能点相关权限缓存*/}, allEntries = true)  
 | 
    public void clearFunctionCache() {  
 | 
        //没有做任何事情,交给spring cache来处理了  
 | 
    }  
 | 
  
 | 
  
 | 
    //@CacheEvict(cacheNames = {CorePlatformService.MENU_TREE_CACHE, CorePlatformService.USER_MENU_CACHE}, allEntries = true)  
 | 
    public void clearMenuCache() {  
 | 
        //没有做任何事情,交给spring cache来处理了  
 | 
    }  
 | 
  
 | 
    //@CacheEvict(cacheNames = {CorePlatformService.DICT_CACHE_CHILDREN,CorePlatformService.DICT_CACHE_SAME_LEVEL,CorePlatformService.DICT_CACHE_TYPE,CorePlatformService.DICT_CACHE_VALUE}, allEntries = true)  
 | 
    public void clearDictCache() {  
 | 
    }  
 | 
      
 | 
    //@CacheEvict(cacheNames = {CorePlatformService.ORG_TREE_CACHE}, allEntries = true)  
 | 
    public void clearOrgCache() {  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 得到类型为系统的菜单,通常就是根菜单下面  
 | 
     * @return  
 | 
     */  
 | 
    public List<MenuItem> getSysMenu() {  
 | 
        MenuItem root = buildMenu();  
 | 
        List<MenuItem> list = root.getChildren();  
 | 
        for (MenuItem item : list) {  
 | 
            if (!item.getData().getType() .equals(CoreMenu.TYPE_SYSTEM)) {  
 | 
                throw new IllegalArgumentException("本系统没有系统模块");  
 | 
            }  
 | 
        }  
 | 
        return list;  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 得到菜单的子菜单  
 | 
     * @param menuId  
 | 
     * @return  
 | 
     */  
 | 
    public List<MenuItem> getChildMenu(Long menuId) {  
 | 
        MenuItem root = buildMenu();  
 | 
        List<MenuItem> list = root.findChild(menuId).getChildren();  
 | 
        return list;  
 | 
    }  
 | 
      
 | 
      
 | 
    
 | 
  
 | 
  
 | 
}  
 |