RightService.class.php 11.1 KB
<?php
/**
 * 试卷-权限表
 * @author: houyingcai
 * @email:  594609175@qq.com
 * @date :  2017-05-19 17:50:52
 */

namespace Common\Service;

use Common\Common\Department;
use Common\Common\Job;
use Common\Common\Role;
use Common\Common\Tag;
use Common\Common\User;
use Common\Model\RightModel;

class RightService extends AbstractService
{

    // 构造方法
    public function __construct()
    {
        $this->_d = new RightModel();

        parent::__construct();
    }

    /**
     * 格式化数据库中的权限数据
     *
     * @author daijun
     *
     * @param array $rights 权限数据
     *
     * @return array
     */
    public function format_db_data($rights)
    {
        $data = [];
        // 数据分组
        $data['uids'] = array_values(array_filter(array_column($rights, 'uid')));
        $data['dp_ids'] = array_values(array_filter(array_column($rights, 'cd_id')));
        $data['job_ids'] = array_values(array_filter(array_column($rights, 'job_id')));
        $data['role_ids'] = array_values(array_filter(array_column($rights, 'role_id')));
        $data['tag_ids'] = array_values(array_filter(array_column($rights, 'tag_id')));

        return $data;
    }

    /**
     * 获取格式化后的权限数据
     *
     * @author daijun
     *
     * @param array $conds 权限筛选条件
     * @param bool $skip_deleted 是否跳过查询删除
     *
     * @return  array $data 组装后权限数组
     *          + array dp_list   部门信息
     *                    + string dp_id   部门ID
     *                    + string dp_name 部门名称
     *          + array user_list 人员信息
     *                    + string uid      用户ID
     *                    + string username 用户姓名
     *                    + string face     头像
     *           array $list 原始权限数组
     */
    public function get_right_data($conds, $skip_deleted = false)
    {

        $list = $this->_d->list_by_conds($conds);

        // 导入类型
        $conds['source_type'] = self::RIGHT_SOURCE_TYPE_IMPORT;
        // 查询导入人员数量
        $import_num = $this->_d->count_by_conds($conds);

        $rights_db = $this->format_db_data($list);

        $data = [
            'user_list' => [],
            'dp_list' => [],
            'job_list' => [],
            'role_list' => [],
            'tag_list' => []
        ];

        $dpServ = &Department::instance();
        $userServ = &User::instance();
        $jobServ = &Job::instance();
        $roleServ = &Role::instance();
        $tagServ = &Tag::instance();

        // 部门
        if (!empty($rights_db['dp_ids'])) {

            sort($rights_db['dp_ids']);
            $dps = $dpServ->listById($rights_db['dp_ids']);
            foreach ($dps as $dp) {
                $data['dp_list'][] = [
                    'dpID' => $dp['dpId'],
                    'dpName' => $dp['dpName'],
                ];
            }
        }

        // 人员
        if (!empty($rights_db['uids'])) {

            sort($rights_db['uids']);
            // 查询
            $users = $userServ->listAll(['memUids' => $rights_db['uids']]);
            // 查询出来的用户UID列表
            $uid_list = array_column($users, 'memUid');

            // 跳过查询删除
            if (!$skip_deleted) {
                // 获取被删除的用户
                $this->user_list($users, $rights_db['uids'], $uid_list);
            }

            foreach ($users as $user) {
                $data['user_list'][] = [
                    'memID' => $user['memUid'],
                    'memUsername' => $user['memUsername'],
                    'memFace' => $user['memFace'],
                ];
            }
        }

        // 岗位
        if (!empty($rights_db['job_ids'])) {

            $jobs = $jobServ->listById($rights_db['job_ids']);
            foreach ($jobs as $job) {
                $data['job_list'][] = [
                    'jobID' => $job['jobId'],
                    'jobName' => $job['jobName'],
                ];
            }
        }

        // 角色
        if (!empty($rights_db['role_ids'])) {

            $roles = $roleServ->listById($rights_db['role_ids']);
            foreach ($roles as $role) {
                $data['role_list'][] = [
                    'roleID' => $role['roleId'],
                    'roleName' => $role['roleName'],
                ];
            }
        }

        // 标签
        if (!empty($rights_db['tag_ids'])) {

            $tags = $tagServ->listById($rights_db['tag_ids']);
            foreach ($tags as $tag) {
                $data['tag_list'][] = [
                    'tagID' => $tag['tagId'],
                    'tagName' => $tag['tagName'],
                ];
            }
        }

        return [$list, $data, $import_num];
    }

    /**
     * 获取权限表中的人员(即应参与人员集合)
     *
     * @author houyingcai
     *
     * @param array $right 权限数据
     *
     * @return array
     */
    public function list_uids_by_right($right)
    {
        $userServ = &User::instance();
        if ($right['is_all'] == self::AUTH_ALL) {
            // 获取全部人员
            $result = $userServ->listBasicByConds([], 1, 1);
            $total = $result['total'];
            $result = $userServ->listBasicByConds([], 1, $total);
            $uids = array_column($result['list'], 'memUid');

            return $uids;
        }

        // 人员UID
        $uids = isset($right['uids']) ? $right['uids'] : [];

        // 部门
        $dp_ids = [];
        if (isset($right['dp_ids'])) {
            $dp_ids = $right['dp_ids'];
        }

        // 标签
        $tag_ids = $right['tag_ids'];
        if (!empty($tag_ids)) {
            $tag_s = new Tag();
            $tag_list = $tag_s->listUserByTagId($tag_ids, 1, 1000);
            $tag_dp_id = array_filter(array_column($tag_list['list'], 'dpId'));
            $tag_uid = array_filter(array_column($tag_list['list'], 'memUid'));
            $uids = array_merge($uids, (array)$tag_uid);
            $dp_ids = array_merge($dp_ids, (array)$tag_dp_id);
        }

        // 部门ID
        $conds = [];
        $dp_uids = [];
        if (!empty($dp_ids)) {
            $conds['dpIdList'] = $dp_ids;
            $conds['departmentChildrenFlag'] = 1;

            $dp_uids = $userServ->listAll($conds);
            $dp_uids = array_column($dp_uids, 'memUid');
        }

        // 岗位
        $conds = [];
        $job_uids = [];
        if (!empty($right['job_ids'])) {
            $conds['jobIdList'] = $right['job_ids'];

            $job_uids = $userServ->listAll($conds);
            $job_uids = array_column($job_uids, 'memUid');

        }

        // 角色
        $conds = [];
        $role_uids = [];
        if (!empty($right['role_ids'])) {
            $conds['roleIdList'] = $right['role_ids'];

            $role_uids = $userServ->listAll($conds);
            $role_uids = array_column($role_uids, 'memUid');
        }

        // 合并所有uid
        $uids = array_merge($uids, $dp_uids, $job_uids, $role_uids);

        return array_filter(array_unique($uids));
    }

    /**
     * 获取当前用户的标签,部门,岗位,用户ID
     *
     * @author 英才
     *
     * @param array $user 传入当前用户信息
     *
     * @return array
     */
    public function get_by_right($user = [])
    {
        // 获取用户所在部门ID以及上级部门ID
        $dpIds = $this->get_user_dp_list($user);

        // 获取用户岗位ID
        $job_ids = [];
        if (!empty($user['job']['jobId'])) {

            $job_ids = $user['job']['jobId'];
        }

        // 获取用户角色ID
        $role_ids = [];
        if (!empty($user['role']['roleId'])) {

            $role_ids = $user['role']['roleId'];
        }

        // 获取用户标签ID
        $tagIds = [];
        $tagsInfo = User::instance()->getTagsByUserId($user['memUid']);
        if (!empty($tagsInfo)) {
            $userTagInfo = isset($tagsInfo['userTagList']) ? array_column($tagsInfo['userTagList'], 'tagId') : [];
            $departTagInfo = isset($tagsInfo['departTagList']) ? array_column($tagsInfo['departTagList'], 'tagId') : [];
            $tagIds = array_unique(array_merge($userTagInfo, $departTagInfo));
        }

        return [
            'memID' => $user['memUid'],
            'dpIds' => $dpIds,
            'jobIds' => $job_ids,
            'roleIds' => $role_ids,
            'tagIds' => $tagIds
        ];
    }

    /**
     * 判断考试权限
     *
     * @author 英才
     *
     * @param array $right 权限数组
     * @param array $user 单个用户信息数组
     *
     * @return bool
     */
    public function check_get_quit($right = [], $user = [])
    {
        $uid = array_filter(array_unique(array_column($right, 'uid')));
        $cd_id = array_filter(array_unique(array_column($right, 'cd_id')));
        $job_id = array_filter(array_unique(array_column($right, 'job_id')));
        $role_id = array_filter(array_unique(array_column($right, 'role_id')));
        $tag_id = array_filter(array_unique(array_column($right, 'tag_id')));

        $arr = array_filter(array_merge($uid, $cd_id, $job_id, $role_id, $tag_id));

        // 部门ID
        $qx_list_ids = [];
        if (!empty($cd_id)) {
            // 获取用户所在部门的ID集合
            $qx_list_ids = $this->get_user_dp_list($user);
        }
        // 用户ID
        $qx_list_ids[] = $user['memUid'];

        // 岗位ID
        if (isset($user['job']['jobId'])) {

            $qx_list_ids[] = $user['job']['jobId'];
        }
        // 角色ID
        if (isset($user['role']['roleId'])) {

            $qx_list_ids[] = $user['role']['roleId'];
        }
        // 获取用户标签ID
        $tagIds = [];
        $tagsInfo = User::instance()->getTagsByUserId($user['memUid']);
        if (!empty($tagsInfo)) {
            $userTagInfo = isset($tagsInfo['userTagList']) ? array_column($tagsInfo['userTagList'], 'tagId') : [];
            $departTagInfo = isset($tagsInfo['departTagList']) ? array_column($tagsInfo['departTagList'], 'tagId') : [];
            $tagIds = array_unique(array_merge($userTagInfo, $departTagInfo));
        }
        $qx_list_ids = array_merge($qx_list_ids, $tagIds);

        // 用试卷权限和用户权限集合取交集
        $ids = array_intersect($arr, $qx_list_ids);
        // 如果交集存在,则有权限,否则无权限
        if (!empty($ids)) {

            return true;
        }

        return false;
    }


    /**
     * 获取用户所在部门以及父级部门的ID集合
     *
     * @param array $user
     *
     * @return array
     */
    private function get_user_dp_list($user = [])
    {
        $dpIds = [];
        // 部门ID
        if (isset($user['dpName']) && !empty($user['dpName'])) {

            $myDpIds = array_column($user['dpName'], 'dpId');

            $dpServ = &Department::instance();
            $parentDpIds = [];

            // 取父级部门ID
            foreach ($myDpIds as $myDpId) {
                $dpServ->list_parent_cdids($myDpId, $parentDpIds);
            }

            $dpIds = array_unique(array_merge($myDpIds, array_values($parentDpIds)));
        }

        return $dpIds;
    }

}