ListController.class.php 8.46 KB
<?php
/**
 * 移动端 直播列表
 * User: zoulongbo
 * Date: 2018/7/26
 * Time: 14:55
 */

namespace Api\Controller\VhLiveTotal;

use Common\Common\Constant;
use Common\Common\Department;
use Common\Common\Tag;
use Common\Common\User;
use Common\Common\UserCache;
use Common\Common\Vhall;
use Common\Service\MainService;
use Common\Service\RangeService;
use Common\Service\RoleService;
use Common\Service\VhallService;

class ListController extends AbstractController
{
    public function Index_post()
    {
        $params = I('post.');

        //组装请求数据
        $params['limit'] = empty($params['limit']) ? Constant::PAGING_DEFAULT_LIMIT : $params['limit'];

        $params['memUid'] = $this->uid;

        $data = Vhall::instance()->memberLiveList($params);

        $right = $this->_getUserRight();

        // 权限表
        $rangeService = new RangeService();
        // 全部人员有权限的
        $all_list = $rangeService->list_by_rang_conds($right, 'lm_id');
        $lm_ids = array_unique(array_column($all_list, 'lm_id'));

        $total = 0;
        // 老数据
        $liveMainServ = new MainService();

        if (!empty($lm_ids)) {
            // 查询条件
            $conditions = [
                'live_status > ?' => Constant::LIVE_STATUS_DEAFT,
                'lm_id' => $lm_ids
            ];

            // 获取记录总数
            $total = $liveMainServ->count_by_conds($conditions);
        }

        // 如果存在数据
        if (!empty($data['list']) || !empty($total)) {
            $service = new VhallService();
            $ids = array_column($data['list'], 'id');
            $vh_list = $service->list_by_conds(['vh_id' => $ids]);
            $vh_list = array_combine_by_key($vh_list, 'vh_id');
            $teacher_ids = array_unique(array_filter(array_column($vh_list, 'teacher_id')));
            $user_info_list = UserCache::get_all_user_by_cache_list($teacher_ids);

            foreach ($data['list'] as &$v) {
                $v['is_old'] = Constant::NEW_LIVE_TYPE;
                $v['teacher_id'] = $vh_list[$v['id']]['teacher_id'];
                $v['teacher_type'] = intval($vh_list[$v['id']]['teacher_type']);
                // 如果是内部讲师
                if (Constant::INSIDE_TEACHER_TYPE == $vh_list[$v['id']]['teacher_type']) {
                    $user_info = $user_info_list[$vh_list[$v['id']]['teacher_id']];
                    $v['teacher_name'] = $user_info['memUsername'];
                    $v['teacher_face'] = $user_info['memFace'];
                } else {
                    $v['teacher_name'] = $vh_list[$v['id']]['teacher_name'];
                    $v['teacher_face'] = $vh_list[$v['id']]['teacher_face'];
                }
                $v['teacher_desc'] = $vh_list[$v['id']]['teacher_desc'];
            }
            $uc_total = $data['total'];
            // 计算UC总页码
            $uc_page = ceil($uc_total / $params['limit']);

            if ($total && count($data['list']) < $params['limit']) {
                // 如果当前页码和UC页码一致
                if ($uc_page == $params['page']) {
                    $start = 0;
                    $params['limit'] = $params['limit'] - count($data['list']);
                } else {
                    $start = ($params['page'] - 1) * $params['limit'] - $data['total'];
                }

                // 分页参数
                $pageOption = [$start, $params['limit']];
                // 排序
                $orderOption['live_status'] = 'ASC';
                // 查询字段
                $fields = 'lm_id,name,pic,live_status,start_time,estimated_duration,watched_total';

                // 获取列表数据
                $main_list = $liveMainServ->list_by_conds($conditions, $pageOption, $orderOption, $fields);

                $roleServ = new RoleService();
                // 直播ID列表
                $lmIds = array_column($main_list, 'lm_id');
                // 获取讲师列表
                $roleList = $roleServ->list_by_conds([
                    'lm_id' => $lmIds
                ]);
                // 转换成以直播ID为键的数组
                $roleList = array_combine_by_key($roleList, 'lm_id');

                // 讲师UID列表
                $roleUids = array_column($roleList, 'obj_id');

                // 获取讲师信息
                $userServ = &User::instance();
                $roleInfoList = $userServ->listByUid($roleUids);

                // 格式化列表数据
                foreach ($main_list as &$value) {
                    $value['is_old'] = Constant::OLD_LIVE_TYPE;
                    $lecturer_uid = $roleList[$value['lm_id']]['obj_id'];
                    $value['liveName'] = $value['name'];
                    $value['id'] = $value['lm_id'];

                    if ($roleList[$value['lm_id']]['type'] == Constant::LIVE_ROLE_TYPE_DEFAULT) {
                        $value['lecturer'] = $lecturer_uid;
                        // 系统管理员没有头像
                        $value['teacher_face'] = '';
                    } else {
                        // 获取讲师个人信息
                        $value['teacher_name'] = strval($roleInfoList[$lecturer_uid]['memUsername']);
                        $value['teacher_face'] = $userServ->avatar($lecturer_uid, $roleInfoList[$lecturer_uid]);
                    }
                    // 内部讲师
                    $value['teacher_type'] = Constant::INSIDE_TEACHER_TYPE;
                    $value['liveStartTime'] = $value['start_time'];
                    $value['watchedNum'] = $value['watched_total'];
                    $value['liveTimeLength'] = $value['estimated_duration'];

                    $value['teacher_desc'] = $roleList[$value['lm_id']]['title'];
                    // 封面图URL
                    $value['liveCover'] = $liveMainServ->formatCover($value['pic']);
                    // 转换状态
                    $value['liveType'] = $liveMainServ->live_status($value['live_status'], $value['start_time']) - 1;
                }

                if (!empty($main_list)) {
                    $data['list'] = array_merge($data['list'], $main_list);
                }
            }

            $data['total'] = intval($data['total']) + $total;
        }

        $data['page'] = intval($data['pageNum']);
        $data['limit'] = intval($data['pageSize']);

        $this->_result = $data;
        return true;
    }

    /**
     * 获取当前用户权限数据
     *
     * @author zhonglei
     * @return array
     */
    private function _getUserRight()
    {

        $user = $this->_login->user;
        $data = [];

        // 标签
        $userServ = &User::instance();
        $tags = $userServ->getUserTags($user['memUid']);

        if (!empty($tags)) {
            // 获取标签ID
            $data[Constant::RIGHT_TYPE_TAG] = array_column($tags, 'tagId');

            // 获取标签成员
            $tagServ = &Tag::instance();
            $members = $tagServ->listAllMember(['tagIds' => $data[Constant::RIGHT_TYPE_TAG]]);

            // 获取标签成员中的部门ID
            $dp_ids = array_column($members, 'dpId');

            if (!empty($dp_ids)) {
                $data[Constant::RIGHT_TYPE_DEPARTMENT] = array_filter(array_unique($dp_ids));
            }
        }

        // 部门
        if (isset($user['dpName']) && !empty($user['dpName'])) {

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

            // 合并标签成员中的部门ID
            if (isset($data[Constant::RIGHT_TYPE_DEPARTMENT])) {

                $dp_ids = array_unique(array_merge($data[Constant::RIGHT_TYPE_DEPARTMENT], $dp_ids));
            }

            $dpServ = &Department::instance();
            $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::RIGHT_TYPE_DEPARTMENT] = array_unique($dp_ids);
        }

        // 全公司
        $data[Constant::RIGHT_TYPE_ALL] = Constant::RIGHT_TYPE_ALL;
        // 用户
        $data[Constant::RIGHT_TYPE_USER] = [$user['memUid']];

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

            $data[Constant::RIGHT_TYPE_JOB] = [$user['job']['jobId']];
        }

        // 角色
        if (isset($user['role']['roleId'])) {

            $data[Constant::RIGHT_TYPE_ROLE] = [$user['role']['roleId']];
        }

        return $data;
    }
}