ListController.class.php 5.4 KB
<?php
/*
 * 直播-列表
 * 2018.07.19
 *
 */

namespace Apicp\Controller\VhLiveTotal;


use Common\Common\Constant;
use Common\Common\User;
use Common\Common\Vhall;
use Common\Service\MainService;
use Common\Service\StudioPlaybackService;

class ListController extends AbstractController
{

    public function Index_post()
    {
        $params = I('post.');

        $data = Vhall::instance()->listByBasic($params, $params['page'], $params['limit'], ['createTime'=>'DESC']);
        $data['page'] = $data['pageNum'];
        $data['limit'] = $data['pageSize'];

        // 兼容老数据
        // 组合搜索条件
        $conds = $this->assemble_where($params);

        // 获取记录总数
        $mainService = new MainService();
        $total = $mainService->count_by_conds($conds);

        $uc_total = $data['total'];
        // 计算UC总页码
        $uc_page = ceil($uc_total / $params['limit']);

        $list = [];
        // 记录总数不为空:有数据
        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 = [
                'updated' => 'DESC',
                'created' => 'DESC',
            ];
            // 查询字段
            $fields = 'lm_id,name,pic,live_status,start_time,watched_total,range_total,updated,created';
            // 获取列表数据
            $list = $mainService->list_by_conds($conds, $pageOption, $orderOption, $fields);

            // 获取对应的回放地址
            $studioPlaybackServ = new StudioPlaybackService();
            $playBackList = $studioPlaybackServ->list_by_conds(['lm_id' => array_column($list, 'lm_id')]);
            $lmIdWithPlayBack = [];
            foreach ($playBackList as $item) {
                // 根据 lm_id 归总 并把序号作为 key 后面再拿来排序用
                $lmIdWithPlayBack[$item['lm_id']][$item['number']] = $item['sd'];
            }

            // 格式化列表数据
            foreach ($list as &$v) {
                $v['id'] = $v['lm_id'];
                $v['liveName'] = $v['name'];
                $v['liveStartTime'] = $v['start_time'];
                $v['watchedNum'] = $v['watched_total'];
                $v['totalNum'] = $v['range_total'];
                // 封面图URL
                $v['liveCover'] = $mainService->formatCover($v['pic']);
                // 转换状态
                $v['liveType'] = $mainService->live_status($v['live_status'], $v['start_time'])-1;
                // 最后更新时间
                $v['updateTime'] = $v['updated'] ? $v['updated'] : $v['created'];
                // 视频回放地址
                ksort($lmIdWithPlayBack[$v['lm_id']]);
                $v['video_url'] = !empty($lmIdWithPlayBack[$v['lm_id']]) ?
                    array_values($lmIdWithPlayBack[$v['lm_id']]) : [];
                // 是否有视频回放
                $v['has_playback'] = !empty($lmIdWithPlayBack);
            }
        }

        // 判断是否还有一条直播活动
        $hasAnotherLive = $mainService->get_by_conds(['live_status' => Constant::LIVE_STATUS_PUBLISHED]);

        $data['can_create'] = empty($hasAnotherLive);
        $data['total'] = $data['total'] + $total;
        unset($list['pageNum'], $list['pageSize']);
        if(!empty($list)){
            $data['list'] = array_merge($data['list'], $list);
        }

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

    /**
     * @desc 组合搜索条件
     * @param array $postData 搜索条件
     * @return array
     */
    private function assemble_where($postData)
    {
        $conds = [];
        if (isset($postData['keyword'])) {

            $postData['name'] = str_replace("%", '\%', $postData['keyword']);
            $conds['name like ?'] = '%' . $postData['name'] . '%';
        }

        if (isset($postData['startTime']) && isset($postData['endTime'])) {

            $conds['start_time >= ?'] = $postData['startTime'];
            $conds['start_time <= ?'] = $postData['endTime'];
        }

        // 直播状态不为空
        if ($postData['liveType']!='') {
            switch ($postData['liveType']) {
                // 草稿
                case Constant::LIVE_WEB_STATUS_DRAFT_TYPE:
                    $conds['live_status'] = Constant::LIVE_STATUS_DEAFT;
                    break;
                // 未开始
                case Constant::LIVE_WEB_STATUS_NOT_START_TYPE:
                    $conds['start_time > ?'] = MILLI_TIME;
                    $conds['live_status'] = Constant::LIVE_STATUS_PUBLISHED;
                    break;
                // 进行中
                case Constant::LIVE_WEB_STATUS_ING_TYPE:
                    $conds['live_status'] = Constant::LIVE_STATUS_PUBLISHED;
                    $conds['start_time < ?'] = MILLI_TIME;
                    break;
                //  已结束
                case Constant::LIVE_WEB_STATUS_END_TYPE:
                    $conds['live_status'] = Constant::LIVE_STATUS_OVER;
                    break;
                default:
            }
        }

        return $conds;
    }
}