DataRankController.class.php 4.98 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhonglei
 * Date: 17/10/13
 * Time: 17:31
 */

namespace Apicp\Controller\AllData;

use Com\PackageValidate;
use Common\Common\User;
use Common\Common\Constant;
use Common\Common\DataHelper;
use Common\Common\ExamHelper;
use Common\Model\CourseArticleModel;

class DataRankController extends \Apicp\Controller\AbstractController
{
    /**
     * DataRank
     * @author zhonglei
     * @desc 数据排行统计接口
     * @param Int starttime:true 开始时间戳
     * @param Int endtime:true 结束时间戳
     * @return array
            array(
                'study_time' => array( // 学习时长排行
                    array(
                        'uid' => 'A', // 用户ID
                        'username' => '宇宙超级无敌小霸王', // 用户姓名
                        'face' => '', // 头像
                        'dp_names' => array( // 部门
                            '部门1', '部门2'
                        ),
                        'total' => 100, // 学习时长(单位:秒)
                    ),
                ),
                'study_complete' => array( // 学习完成排行
                    array(
                        'uid' => 'A', // 用户ID
                        'username' => '宇宙超级无敌小霸王', // 用户姓名
                        'face' => '', // 头像
                        'dp_names' => array( // 部门
                            '部门1', '部门2'
                        ),
                        'total' => 100, // 学习完成门数
                    ),
                ),
                'exam' => array( // 学霸排行
                    array(
                        'uid' => 'A', // 用户ID
                        'username' => '宇宙超级无敌小霸王', // 用户姓名
                        'face' => '', // 头像
                        'dp_names' => array( // 部门
                            '部门1', '部门2'
                        ),
                        'total' => 100, // 考试平均分
                    ),
                ),
            )
     */
    public function Index_post()
    {
        // 请求数据
        $post_data = I('post.');

        // 验证规则
        $rules = [
            'dp_ids' => 'array',
            'starttime' => 'require|integer',
            'endtime' => 'require|integer',
        ];

        // 验证请求数据
        $validate = new PackageValidate();
        $validate->postData = $post_data;
        $validate->validateParams($rules);

        $dataHelper = &DataHelper::instance();
        $examHelper = &ExamHelper::instance();

        $starttime = $dataHelper->formatStarttime($post_data['starttime']);
        $endtime = $dataHelper->formatEndtime($post_data['endtime']);
        $limit = Constant::DATARANK_SHOW_TOTAL * 30;

        // 查询常规课程id集合
        $course_article = new CourseArticleModel();
        $course_article_list = $course_article->list_by_conds(['course_type' => Constant::COURSE_TYPE_NORMAL], null, [], 'article_id,data_id,article_type');
        $articles = array_column($course_article_list,'article_id');

        // 获取学习时长排行
        $studytime_rank = $dataHelper->listUserCourseStudyTimeRank($starttime, $endtime, $limit,$articles);
        // 获取完成课程门数排行
        $complete_rank = $dataHelper->listUserCourseCompleteRank($starttime, $endtime, $limit,$articles);
        // 获取学霸排行
        $exam_rank = $examHelper->recursion_rank($starttime, $endtime, $limit);

        // 格式化学霸排行
        foreach ($exam_rank as $k => $v) {
            $exam_rank[$k]['total'] = round($v['avg_score'], 2);
        }

        $rank_list = [
            'study_time' => $studytime_rank,
            'study_complete' => $complete_rank,
            'exam' => $exam_rank
        ];

        $uids = [];
        $users = [];

        // 获取用户ID
        foreach ($rank_list as $rank) {
            $uids = array_merge($uids, array_column($rank, 'uid'));
        }

        // 获取用户
        if (!empty($uids)) {
            $uids = array_values(array_unique($uids));
            $userServ = &User::instance();
            $users = $userServ->listByUid($uids);
        }

        // 遍历排行榜
        foreach ($rank_list as $k => $rank) {
            $data = [];

            // 整合数据
            foreach ($rank as $v) {
                $uid = $v['uid'];

                if (!isset($users[$uid])) {
                    continue;
                }

                $data[] = [
                    'uid' => $uid,
                    'username' => $users[$uid]['memUsername'],
                    'face' => $users[$uid]['memFace'],
                    'dp_names' => array_column($users[$uid]['dpName'], 'dpName'),
                    'total' => $v['total'],
                ];

                if (count($data) == Constant::DATARANK_SHOW_TOTAL) {
                    break;
                }
            }

            $this->_result[$k] = $data;
        }
    }
}