StudyChartController.class.php 4.76 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 17/10/14
 * Time: 11:00
 */

namespace Apicp\Controller\UserStudyData;

use Com\PackageValidate;
use Common\Common\Constant;
use Common\Model\CourseArticleModel;
use Common\Model\CourseCountModel;
use Common\Model\CourseStudyTimeModel;
use Common\Common\DataHelper;

class StudyChartController extends \Apicp\Controller\AbstractController
{
    /**
     * StudyChart
     * @author liyifei
     * @desc 员工学习数据报表接口
     *
     * @param Int starttime:true 开始时间戳(仅能选择数据中心上线之后的时间,前端进行控制)
     * @param Int endtime:true 结束时间戳
     *
     * @return array
        array(
              'last_update_time' => 1507957200000, // 学习完成率最后更新时间
              'study_complete_rate' => 80.12, // 学习完成率(和时间筛选条件无关,统计数据中心上线后,截止到当天0点的数据)
              'hours' => array(   // 学习时段(毫秒级时间戳);X轴数据;
                  1507953600000,
                  1507957200000
              ),
              'study_time_solt_uv' => array(  // 员工学习时段:学习人数;Y轴数据;
                  100,
                  200,
              ),
              'study_time_solt_pv' => array(  // 员工学习时段:学习次数;Y轴数据;
                  300,
                  400,
              ),
          )
     */
    public function Index_post()
    {
        // 验证规则
        $rules = [
            'starttime' => 'require|integer|gt:0',
            'endtime' => 'require|integer|gt:0',
        ];

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

        $dataHelper = &DataHelper::instance();
        $startTime = $dataHelper->formatStarttime($postData['starttime']);
        $endTime = $dataHelper->formatEndtime($postData['endtime']);

        // 时间区间是否正确
        if ($endTime - $startTime <= 0) {
            E('时间区间错误');
        }

        // 学习完成率
        $study_complete_rate = 0;
//        $countModel = new CourseCountModel();
//        $totalList = $countModel->listTotal();
//        if (!empty($totalList)) {
//            // 所有课程完成率之和
//            $completeRate = 0;
//            foreach ($totalList as $v) {
//                $completeRate += round($v['complete_total'] / $v['user_total'] * 100, 2);
//            }
//            // 课程总数
//            $total = count($totalList);
//            // 平均学习完成率
//            $study_complete_rate = round($completeRate / $total, 2);
//        }

        // 以小时进行时间分段
        $solt = 60 * 60 * 1000;

        // 查询常规课程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');

        // 学习数据
        $studyTimeModel = new CourseStudyTimeModel();
        // 学习人数(人员去重)
        $uvList = $studyTimeModel->listStudyUserTotal($startTime, $endTime, 2, $articles);
        // 学习次数
        $pvList = $studyTimeModel->listStudyUserCount($startTime, $endTime, $articles);
        if (!empty($uvList)) {
            $uvList = array_combine_by_key($uvList, 'hours');
        }
        if (!empty($pvList)) {
            $pvList = array_combine_by_key($pvList, 'hours');
        }

        $hours = [];
        $study_time_solt_uv = [];
        $study_time_solt_pv = [];

        while ($endTime > $startTime) {
            $hours[] = (int)$startTime;
            $formatDate = rgmdate($startTime, 'Y-m-d H:00:00');

            // 时间区间的学习人数
            if (!empty($uvList) && isset($uvList[$formatDate])) {
                $study_time_solt_uv[] = (int)$uvList[$formatDate]['total'];
            } else {
                $study_time_solt_uv[] = 0;
            }

            // 时间区间的学习次数
            if (!empty($pvList) && isset($pvList[$formatDate])) {
                $study_time_solt_pv[] = (int)$pvList[$formatDate]['total'];
            } else {
                $study_time_solt_pv[] = 0;
            }

            $startTime += $solt;
        }

        $this->_result = [
            'last_update_time' => rstrtotime(rgmdate(MILLI_TIME, 'Y-m-d 00:00:00')),
            'study_complete_rate' => $study_complete_rate,
            'hours' => $hours,
            'study_time_solt_uv' => $study_time_solt_uv,
            'study_time_solt_pv' => $study_time_solt_pv,
        ];
    }
}