AuthorityService.class.php 4.52 KB
<?php

namespace Common\Service;

use Common\Common\Job;
use Common\Common\Role;
use Common\Model\AuthorityMainModel;
use Common\Model\AuthorityModel;
use Common\Model\SettingModel;

class AuthorityService extends \Com\Service
{
    // 构造方法
    public function __construct()
    {

        parent::__construct();
        $this->_d = new AuthorityModel();
    }

    /**
     * 人员在各个应用标识下的可见范围 (会根据 过滤筛选类型 筛选)
     * @param array  $userInfo 人员详情 $this->_login->user
     * @param string $pluginKey 应用标识
     * @return array
     */
    public function userPermissionScope($userInfo, $pluginKey = '')
    {
        // 获取应用信息
        $pluginConds = [];
        if (!empty($pluginKey)) {
            $pluginConds = ['ap_key' => $pluginKey];
        }
        $pluginServ = new PluginService();
        $pluginList = $pluginServ->list_by_conds($pluginConds);
        $pluginList = array_combine_by_key($pluginList, 'ap_id');
        $apIds = array_column($pluginList, 'ap_id');

        // 获取人员 角色 岗位
        $auth = [$userInfo['memUid']];
        $auth[] = $userInfo['job']['jobId'];
        $auth[] = $userInfo['role']['roleId'];

        // 当前排名筛选类型
        $rankFilter = $this->getRankFilter();

        // 获取对应的可见范围
        $permissionScope = $this->_d->getPermissionScopeWithAuthorityId($auth, $apIds, $rankFilter);
        // 应用标识 对应 可见范围
        $result = [];
        // 跳过的应用标识
        $skipApKey = [];
        foreach ($permissionScope as $item) {
            // 应用标识
            $apKey = $pluginList[$item['ap_id']]['ap_key'];
            // 因为已经获取过人员类型的可见范围, 并且人员可见范围优先级最高, 所以跳过
            if (in_array($apKey, $skipApKey)) {
                continue;
            }
            // 人员类型 可见范围优先级最高
            if ($item['authority_id_type'] == AuthorityModel::AUTHORITY_ID_TYPE_MEMBER) {
                // 获取可见范围 ID
                $result[$apKey] = explode(',', $item['visible_range']);
                // 标记 不在处理 改应用标识下的可见范围
                $skipApKey[] = $apKey;
            }
            // 获取可见范围 ID
            $resultKeyList = $result[$apKey];
            // 如果是所有人的情况
            if ($item['visible_range'] == AuthorityMainModel::VISIBLE_RANGE_ALL) {
                $resultKeyList = $this->getAllJobIdOrRoleId($rankFilter);
            }
            // 过滤筛选类型
            if (!in_array($item['visible_range_type'], [$rankFilter, AuthorityMainModel::VISIBLE_RANGE_TYPE_DEFAULT])) {
                continue;
            }

            $result[$apKey] = array_merge(
                empty($resultKeyList) ? [] : $resultKeyList,
                explode(',', $item['visible_range']));
        }

        return $result;
    }

    /**
     * 获取 排名筛选条件
     * @return int
     */
    public function getRankFilter()
    {
        $cache = \Common\Common\Cache::instance();
        $settingList = $cache->get('Common.AppSetting');
        // 排名筛选条件:角色,岗位; (默认角色)
        $rank_filter = \Common\Model\SettingModel::FILTER_ROLE;
        // 如果缓存中有数据,直接获取
        if (!empty($settingList) && array_key_exists(SettingModel::SETTING_KEY_RANK_FILTER, $settingList)) {
            $rank_filter = $settingList[SettingModel::SETTING_KEY_RANK_FILTER]['value'];
        } else {
            // 初始化最新数据
            $serv = new \Common\Service\SettingService();
            $serv->initSetting();
        }

        return $rank_filter;
    }

    /**
     * 根据当前 排名筛选类型 查询权限对象
     * @param $authorityId
     * @param $visibleRangeType
     * @return mixed
     */
    public function listAuthorityWithVisibleRangeType($authorityId, $visibleRangeType)
    {

        return $this->_d->listAuthorityWithVisibleRangeType($authorityId, $visibleRangeType);
    }

    /**
     * 获取所有 岗位ID 或者 角色ID
     * @param $rankFilter
     * @return array
     */
    public function getAllJobIdOrRoleId($rankFilter)
    {
        if ($rankFilter == AuthorityMainModel::VISIBLE_RANGE_TYPE_ROLE) {
            return array_column((new Role())->listAll(), 'roleId');
        } elseif ($rankFilter == AuthorityMainModel::VISIBLE_RANGE_TYPE_JOB) {
            return array_column((new Job())->listAll(), 'jobId');
        }

        return [];
    }
}