<?php /** * Created by PhpStorm. * User: liyifei2012it * Date: 16/11/14 * Time: 17:14 */ namespace Apicp\Controller\Department; use Common\Common\AdminerRole; use Common\Common\User; use VcySDK\Department; use VcySDK\Member; use VcySDK\Service; class ListController extends AbstractController { // TODO 2017-11-15 15:49:29 接口需要优化 有查询所有部门的情况 效率很差 zhoutao /** * VcySDK 附件操作类 * @type Department */ protected $_department; /** * VcySDK 用户操作类 * @type Member */ protected $_mem; public function before_action($action = '') { if (!parent::before_action($action)) { return false; } $serv = &Service::instance(); $this->_department = new Department($serv); $this->_mem = new Member($serv); return true; } /** * 【通讯录】部门列表 * @author liyifei * @return bool */ public function Index_post() { $search = I("post.search"); $dpParentId = I("post.dpId"); $limit = I("post.limit", 30); $page = I("post.page", 1); // 如果特殊处理存在 if (!empty($search)) { $data = $this->select($search, $page, $limit); // 返回部门列表 $this->_result = $data; return false; } // 如果上级部门ID为空 if (empty($dpParentId)) { // 获取顶级部门 $dpParentIds = $this->maxDpId(); // 获取部门列表 $data = $this->maxList($dpParentIds, $page, $limit); // 返回部门列表 $this->_result = $data; return false; } // 查询部分指定部门 list($departments, $data) = $this->partdp($dpParentId, $page, $limit); $this->_result = array( 'list' => $departments, 'total' => (int)$data['total'], 'limit' => (int)$data['pageSize'], 'page' => (int)$data['pageNum'], ); return true; } /** * 获取部门列表 * @param string $dpParentId 上级部门ID * @param int $page 页码 * @param int $limit 每页条数 * @return array */ private function partdp($dpParentId, $page, $limit) { // 获取部门详情 $list = $this->_department->listAll(['dpId' => $dpParentId], $page, $limit, ['dpDisplayorder' => 'ASC'], true); $departments = array_combine_by_key($list['list'], 'dpId'); // 处理扩展 \Common\Common\Department::parseExt($departments, $list['extList']); $adminerRoleUtil = new AdminerRole(); foreach ($departments as $k => &$v) { // 获取部门管理员权限 if (false === ($auth = $adminerRoleUtil->childrenDepInAuth($this->_login->role, $v['dpId']))) { // 部门 以及 部门所有子部门 没有权限, 直接不显示 unset($departments[$k]); continue; }; // 管理员是否有可读权限 $v['read'] = $auth[0]; // 管理员是否有管理权限 $v['write'] = $auth[1]; $v['order'] = $v['dpDisplayorder']; $v['user_total'] = $v['departmentMemberCount']; $v['dept_level'] = $v['dpLevel']; } return array(array_values($departments), $list); } /** * 获取顶级部门ID * @return array */ private function maxDpId() { \Common\Common\Department::instance()->get_top_dpId($topId); return $topId; } /** * 获取顶级部门列表 * @param array $list 部门IDS * @param int $page 页码 * @param int $limit 条数 * @return array */ private function maxList($list, $page, $limit) { // 实例化数据 $data = array(); // 获取所有部门列表 $dpList = $this->_formatDpList(); if (empty($dpList)) { return [ 'list' => [], 'total' => 0, 'limit' => $limit, 'page' => $page, ]; } // 获取部门信息 $adminerRoleUtil = new AdminerRole(); foreach ($list as $key => $dpId) { $tmp = $dpList[$dpId]; // 获取部门管理员权限 if (false === ($auth = $adminerRoleUtil->childrenDepInAuth($this->_login->role, $dpId))) { // 部门 以及 部门所有子部门 没有权限, 直接不显示 continue; }; $tmp['read'] = $auth[0]; $tmp['write'] = $auth[1]; $tmp['order'] = $tmp['dpDisplayorder']; $tmp['user_total'] = $tmp['departmentMemberCount']; $tmp['dept_level'] = $tmp['dpLevel']; $data[] = $tmp; } // 返回参数 $result = array( 'list' => $data, 'total' => (int)count($data), 'limit' => $limit, 'page' => $page, ); return $result; } /** * 特殊处理方式 * @param array $select 参数 * +array dpIds 部门IDS * +array uids 人员UIDS * +array tagIds 标签IDS * @param int $page 页码 * @param int $limit 条数 * @return array */ private function select($select = array(), $page, $limit) { // 去除数组中的空值 array_filter($select['uids']); array_filter($select['dpIds']); // 初始化 $data = array(); // 实例化User类 $User = User::instance(); //$User->sync(); // 遍历用户UIDS foreach ($select['uids'] as $key => $v) { // 获取人员对应部门 $info = $User->listDepartment(array('memUid' => $v)); foreach ($info as $item) { $data[] = $item; } } // 遍历部门IDS写入返回值中 foreach ($select['dpIds'] as $dpId) { $data[] = $dpId; } $data = array_unique($data); $Department = \Common\Common\Department::instance(); // 获取部门IDS $dps = $data; // 遍历部门 foreach ($data as $key => $v) { // 获取所有子部门 $dpIds = $Department->list_childrens_by_cdid($v); // 遍历获取到的所有部门 foreach ($dps as $k => $item) { if (in_array($item, $dpIds)) { // 去除子部门 unset($dps[$k]); } } } // 重新排序 sort($dps); $list = $this->maxList($dps, $page, $limit); return $list; } /** * 以部门ID为键,格式化部门列表 * @author liyifei * @return array */ private function _formatDpList() { $list = $this->_department->listAll([], 1, 99999, [], true); // 处理扩展属性 $list['list'] = array_combine_by_key($list['list'], 'dpId'); \Common\Common\Department::parseExt($list['list'], $list['extList']); $newList = []; foreach ($list['list'] as $v) { $newList[$v['dpId']] = $v; } return $newList; } }