ListController.class.php 7.31 KB
<?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;
    }
}