<?php /** * 直播对象范围表 * @author: houyingcai * @email: 594609175@qq.com * @date : 2018-01-08 16:06:35 * @version $Id$ */ namespace Common\Service; use Common\Common\Constant; use Common\Common\Department; use Common\Common\Job; use Common\Common\Role; use Common\Common\User; use Common\Common\Tag; use Common\Model\RangeModel; class RangeService extends AbstractService { // 构造方法 public function __construct() { $this->_d = new RangeModel(); parent::__construct(); } /** * 格式化数据库中的权限数据 * @author houyingcai * @param array $ranges 权限数据 * @return array */ public function formatDBData($ranges) { $data = []; // 数据分组 foreach ($ranges as $range) { $data[$range['type']][] = $range['obj_id']; } return $data; } /** * 获取格式化后的权限数据 * @author houyingcai * @param array $conds 权限筛选条件 * @return array * + int is_all 是否全公司(1=否;2=是) * + array dp_list 部门信息 * + string dp_id 部门ID * + string dp_name 部门名称 * + array user_list 人员信息 * + string uid 用户ID * + string username 用户姓名 * + string face 头像 * + array job_list 职位信息 * + string job_id 职位ID * + string job_name 职位名称 * + array role_list 角色信息 * + string role_id 角色ID * + string role_name 角色名称 * + array tag_list 标签信息 * + string tag_id 标签ID * + string tag_name 标签名称 */ public function getData($conds) { $list = $this->_d->list_by_conds($conds); $rights_db = $this->formatDBData($list); $data = [ 'is_all' => Constant::RANGE_IS_ALL_FALSE, 'dp_list' => [], 'user_list' => [], 'job_list' => [], 'role_list' => [], 'tag_list' => [] ]; foreach ($rights_db as $k => $v) { switch ($k) { // 全公司 case Constant::RANGE_TYPE_ALL: $data['is_all'] = Constant::RANGE_IS_ALL_TRUE; break; // 部门 case Constant::RANGE_TYPE_DEPARTMENT: $dpServ = &Department::instance(); $dps = $dpServ->listById($v); foreach ($dps as $dp) { $data['dp_list'][] = [ 'dp_id' => $dp['dpId'], 'dp_name' => $dp['dpName'], ]; } break; // 人员 case Constant::RANGE_TYPE_USER: $userServ = &User::instance(); $users = $userServ->listAll(['memUids' => $v]); foreach ($users as $user) { $data['user_list'][] = [ 'uid' => $user['memUid'], 'username' => $user['memUsername'], 'face' => $user['memFace'], ]; } break; // 职位 case Constant::RANGE_TYPE_JOB: $jobServ = &Job::instance(); $jobs = $jobServ->listById($v); foreach ($jobs as $job) { $data['job_list'][] = [ 'job_id' => $job['jobId'], 'job_name' => $job['jobName'], ]; } break; // 角色 case Constant::RANGE_TYPE_ROLE: $roleServ = &Role::instance(); $roles = $roleServ->listById($v); foreach ($roles as $role) { $data['role_list'][] = [ 'role_id' => $role['roleId'], 'role_name' => $role['roleName'], ]; } break; // 标签 case Constant::RANGE_TYPE_TAG: $tagServ = &Tag::instance(); $tags = $tagServ->listById($v); foreach ($tags as $tag) { $data['tag_list'][] = [ 'tag_id' => $tag['tagId'], 'tag_name' => $tag['tagName'] ]; } break; } } return $data; } /** * 检查用户是否有权限观看直播 * @author houyingcai * @param array $user 用户信息 * @param int $lm_id 直播ID * @return bool */ public function checkUserRange($user, $lm_id) { if (empty($user)) { return false; } $ranges = $this->getUserRight($user); $conds = $this->_buildRightConds($ranges); $conds['lm_id'] = $lm_id; $count = $this->_d->count_by_conds($conds); return $count > 0; } /** * 获取用户权限数据 * @author houyingcai * @param array $user 用户信息 * @return array */ public function getUserRight($user) { $data = []; if (!is_array($user) || empty($user)) { return $data; } // 部门 if (isset($user['dpName']) && !empty($user['dpName'])) { $dp_ids = array_column($user['dpName'], 'dpId'); // 使用缓存 $dpServ = new Department(false); $parent_ids = []; // 取父级部门ID foreach ($dp_ids as $dp_id) { $dpServ->list_parent_cdids($dp_id, $parent_ids); } $dp_ids = array_merge($dp_ids, array_values($parent_ids)); $data[Constant::RANGE_TYPE_DEPARTMENT] = array_unique($dp_ids); } // 全公司 $data[Constant::RANGE_TYPE_ALL] = Constant::RANGE_TYPE_ALL; // 用户 $data[Constant::RANGE_TYPE_USER] = [$user['memUid']]; // 职位 if (isset($user['job']['jobId'])) { $data[Constant::RANGE_TYPE_JOB] = [$user['job']['jobId']]; } // 角色 if (isset($user['role']['roleId'])) { $data[Constant::RANGE_TYPE_ROLE] = [$user['role']['roleId']]; } // 标签 $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)); } $data[Constant::RANGE_TYPE_TAG] = $tagIds; return $data; } /** * 获取直播已观看、未观看、权限范围内人员ID数组 * @author houyingcai * @param int $lm_id 直播ID * @return array [0 => 已观看人员ID, 1 => 未观看人员ID, 2 => 权限范围内人员ID] */ public function getWatchDataUids($lm_id) { $uids_all = []; $uids_watched = []; $uids_unwatch = []; // 查询条件 $conds = ['lm_id' => $lm_id]; // 获取权限数据 $ranges = $this->_d->list_by_conds($conds); $ranges = $this->formatDBData($ranges); if (empty($ranges)) { return [$uids_watched, $uids_unwatch, $uids_all]; } // 获取可观看数据 $uids_all = $this->getUidsByRange($ranges); // 获取已观看数据(包含通讯录中被删除的人员ID) $participateServ = new ParticipateService(); $watched_list = $participateServ->list_by_conds($conds); $uids_watched = array_column($watched_list, 'obj_id'); // 未观看数据 $uids_unwatch = array_values(array_diff($uids_all, $uids_watched)); return [$uids_watched, $uids_unwatch, $uids_all]; } /** * 根据权限数据,获取对应的用户ID * @author houyingcai * @param array $ranges 权限数据 * @return array */ public function getUidsByRange($ranges) { $dp_ids = []; $uids = []; $conds = []; $userServ = &User::instance(); // 全公司 if (isset($ranges[Constant::RANGE_TYPE_ALL])) { // 权限表不存在权限信息,为全公司 $result_user = $userServ->listBasicByConds([], 1, 1); $res_list = $userServ->listBasicByConds([],1, $result_user['total']); // 直接返回 return array_column($res_list['list'], 'memUid'); } // 人员 if (isset($ranges[Constant::RANGE_TYPE_USER])) { $uids = array_merge($uids, $ranges[Constant::RANGE_TYPE_USER]); } // 部门 if (isset($ranges[Constant::RANGE_TYPE_DEPARTMENT])) { $dp_ids = $ranges[Constant::RANGE_TYPE_DEPARTMENT]; } // 标签 $tag_ids = $ranges[Constant::RANGE_TYPE_TAG]; 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 (isset($ranges[Constant::RANGE_TYPE_JOB])) { $conds['jobIdList'] = $ranges[Constant::RANGE_TYPE_JOB]; $job_uids = $userServ->listAll($conds); $job_uids = array_column($job_uids, 'memUid'); } // 角色 $conds = []; $role_uids = []; if (isset($ranges[Constant::RANGE_TYPE_ROLE])) { $conds['roleIdList'] = $ranges[Constant::RANGE_TYPE_ROLE]; $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)); } /** * 根据权限数据构建查询条件 * @author houyingcai * @param array $ranges 权限数据 * @return array */ private function _buildRightConds($ranges) { if (!is_array($ranges) || empty($ranges)) { return []; } $obj_ids = []; foreach ($ranges as $k => $v) { // 全公司 if ($k == Constant::RANGE_TYPE_ALL) { $obj_ids[] = Constant::RANGE_TYPE_ALL; } else { // 部门、人员、职位、角色、标签 $obj_ids = array_merge($obj_ids, $v); } } return empty($obj_ids) ? [] : ['obj_id' => $obj_ids]; } /** * 根据条件读取数据数组 * * @param array $conds 条件数组 * @param string $field 字段信息 * @return array|bool */ public function list_by_rang_conds($conds, $field = '*') { try { return $this->_d->list_by_rang_conds($conds,$field); } catch (\Exception $e) { E($e->getCode() . ":" . $e->getMessage()); return false; } } }