InfoController.class.php 5.44 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 18/4/27
 * Time: 15:04
 */
namespace Api\Controller\Path;

use Com\PackageValidate;
use Common\Common\Constant;
use Common\Common\MapHelper;
use Common\Common\StudyMap;
use Common\Service\MapService;
use Common\Service\MapPathService;
use Common\Service\PathContentService;
use Common\Service\PathService;
use Common\Service\RightService;
use Common\Service\UserPathContentService;

class InfoController extends \Api\Controller\AbstractController
{
    /**
     * Info
     * @author liyifei
     * @desc 学习路径详情接口
     * @param Int map_id:true 地图ID
     * @param Int path_id:true 路径ID
     * @return mixed
            array(
                'map_url' => '', // 模板详细图片Url
                'path_name' => 'xxx', // 路径名称
                'is_step' => 1, // 是否开启闯关(1=未开启;2=已开启)
                'description' => '', // 介绍
                'path_num' => 3, // 当前路径数
                'study_content_total' => 5, // 已完成内容数
                'content_total' => 10, // 内容总数
                'list' => array( // 列表数据
                    array(
                        'path_id' => 1, // 学习路径ID
                        'path_content_id' => 1, // 学习内容ID
                        'app' => 'course', // 应用
                        'app_data_id' => 1, // 应用数据ID
                        'title' => '新员工岗位学习', // 内容标题
                        'is_learn' => 1, // 是否必学(1=否;2=是)
                        'complete_status' => 1, // 完成状态(1=未完成;2=已完成)
                        'order' => 1, // 排序,
                        'url' => '', // 内容跳转url
                    ),
                ),
            )
     */
    public function Index_post()
    {
        $rules = [
            'map_id' => 'require|integer|gt:0',
            'path_id' => 'require|integer|gt:0',
        ];

        // 参数校验
        $validate = new PackageValidate($rules, [], array_keys($rules));
        $postData = $validate->postData;
        $map_id = $postData['map_id'];
        $path_id = $postData['path_id'];

        // 地图是否存在、已发布
        $mapServ = new MapService();
        $map = $mapServ->get($map_id);
        if (empty($map)) {
            E('_ERR_MAP_NOT_FOUND');
        }
        if ($map['map_status'] == Constant::MAP_IS_STATUS_END) {
            E('_ERR_MAP_STATUS_IS_END');
        }

        // 登录人员是否有权查看地图
        $rightServ = new RightService();
        $isRight = $rightServ->checkUserRight($this->_login->user, $map_id);
        if (!$isRight) {
            E('_ERR_MAP_ACCESS_DENIED');
        }

        // 路径是否被该地图关联
        $mapPathServ = new MapPathService();
        $mapPath = $mapPathServ->get_by_conds(['map_id' => $map_id, 'path_id' => $path_id]);
        if (empty($mapPath)) {
            E('_ERR_PATH_NOT_CONNECT_MAP');
        }

        // 学习路径详情
        $pathServ = new PathService();
        $path = $pathServ->get($path_id);
        if (empty($path)) {
            E('_ERR_PATH_NOT_FOUND');
        }

        // 学习路径关联学习内容
        $contentServ = new PathContentService();
        $contents = $contentServ->list_by_conds(['path_id' => $path_id], null, ['`order`' => 'ASC']);

        // 用户已完成内容列表
        $userContentServ = new UserPathContentService();
        $conds = [
            'uid' => $this->uid,
            'map_id' => $map_id,
            'path_id' => $path_id,
            'complete_status' => Constant::COMPLETE_STATUS_IS_TRUE,
        ];
        $userContents = $userContentServ->list_by_conds($conds);

        // 根据应用,格式化已完成内容列表
        $studyMap = new StudyMap($map_id);
        $formatContent = $studyMap->formatPathContent($userContents);

        // 组合学习内容列表
        $study_content_total = 0;
        foreach ($contents as $k => $content) {
            $app = $content['app'];
            $app_data_id = $content['app_data_id'];
            $studyContents = isset($formatContent[$app]) ? $formatContent[$app] : [];

            // 已完成
            if (isset($studyContents[$app_data_id])) {
                $study_content_total++;
                $contents[$k]['complete_status'] = Constant::COMPLETE_STATUS_IS_TRUE;

            // 未完成
            } else {
                $contents[$k]['complete_status'] = Constant::COMPLETE_STATUS_IS_FALSE;
            }

            // 跳转至相关应用的url
            $params = [
                'map_id' => $map_id,
                'path_id' => $path_id,
                'app_data_id' => $content['app_data_id'],
            ];
            $contents[$k]['url'] = oaUrl('Frontend/Index/StudyMap/Index', $params, '', ucwords($content['app']));
        }

        // 获取模板信息
        $mapHelper = &MapHelper::instance();
        $template = $mapHelper->getTemplate($map['template_id']);

        $this->_result = [
            'map_url' => $template['map_url'],
            'path_name' => $path['path_name'],
            // 排序规则从0开始
            'path_num' => $mapPath['order'] + 1,
            'study_content_total' => $study_content_total,
            'content_total' => count($contents),
            'is_step' => $path['is_step'],
            'description' => $path['description'],
            'list' => $contents,
        ];
    }
}