<?php /** * Created by PhpStorm. * User: liyifei2012it * Date: 17/10/14 * Time: 14:32 */ namespace Apicp\Controller\UserStudyData; use Com\PackageValidate; use Common\Common\Constant; use Common\Common\CourseHelper; use Common\Common\User; use Common\Model\CourseArticleModel; use Common\Model\CourseCompleteModel; use Common\Model\CourseClassModel; use Common\Model\CourseStudyTimeModel; use Common\Model\CommentModel; class UserListController extends \Apicp\Controller\AbstractController { /** * UserList * @author liyifei * @desc 员工学习数据列表接口 * @param Int page:1 当前页 * @param Int limit:20 当前页条数 * @param Array dp_ids 组织ID * @param Array role_ids 角色ID * @param Array job_ids 岗位ID * @param String username 姓名 * @param Int class_id 课程分类ID * @param String article_title 课程名称 * @param Int is_complete 是否学习完成(1=否;2=是) * @param Array uids 人员UID数组(当以上所有条件参数值{分页除外}无变化时,前端将此接口uids返回值回传过来;当uids有值时,接口会忽略以上{分页除外}所有筛选条件;此参数主要用在分页功能。) * @return array array( 'page' => 1, // 当前页 'limit' => 20, // 当前页条数 'total' => 100, // 总条数 'list' => array( // 列表数据 array( 'uid' => 'B4B3B9D17F00000173E870DA9A855AE7', // 人员UID 'username' => '李四', // 姓名 'dp_names' => array('开发组', '测试组'), // 组织 'job' => '苹果系统工程师', // 岗位 'role' => 'leader', // 角色 'article_title' => '课程001', // 课程名称 'latest_study_time' => '1507953600000', // 最近学习时间 'is_complete' => 1, // 是否完成学习(已学习+测评通过) 'complete_time' => '1507953600000', // 完成学习时间 'comment_total' => 10, // 评论数(需求变更:不返回) ), ), 'uids' => array( // 筛选条件下所有人员UID数组 'B4B3B9D17F00000173E870DA9A855AE7', '5B1AFACC7F0000014D41E650287BAD6F', ), ) */ public function Index_post() { // 验证规则 $rules = [ 'page' => 'integer|gt:0', 'limit' => 'integer|gt:0', 'uids' => 'array', 'dp_ids' => 'array', 'role_ids' => 'array', 'job_ids' => 'array', 'username' => 'max:64', 'class_id' => 'integer|gt:0', 'article_title' => 'max:64', 'is_complete' => 'integer|in:1,2', ]; // 验证请求数据 $postData = I('post.'); $validate = new PackageValidate(); $validate->postData = $postData; $validate->validateParams($rules); // 分页 $page = isset($postData['page']) ? $postData['page'] : Constant::PAGING_DEFAULT_PAGE; $limit = isset($postData['limit']) ? $postData['limit'] : Constant::PAGING_DEFAULT_LIMIT; list($pageSql, $limitSql) = page_limit($page, $limit, 10000); // 人员条件(当uids有值时,则忽略人员其他筛选条件) $userConds = []; if (!empty($postData['uids'])) { $userConds['memUids'] = $postData['uids']; } else { if (isset($postData['dp_ids'])) { $userConds['dpIdList'] = $postData['dp_ids']; $userConds['departmentChildrenFlag'] = 1; } if (isset($postData['role_ids'])) { $userConds['roleIdList'] = $postData['role_ids']; } if (isset($postData['job_ids'])) { $userConds['jobIdList'] = $postData['job_ids']; } if (isset($postData['username'])) { $userConds['memUsername'] = $postData['username']; } } // 课程条件 $articleConds = []; if (isset($postData['article_title'])) { $articleConds['article_title like ?'] = '%' . $postData['article_title'] . '%'; } if (isset($postData['class_id'])) { $classModel = new CourseClassModel(); $classIds = $classModel->getChildClassIds($postData['class_id']); $articleConds['class_id'] = $classIds; } $userList = []; $articleList = []; $courseHelper = &CourseHelper::instance(); // 仅搜索课程 if (!empty($articleConds) && empty($userConds)) { $articleList = $courseHelper->userStudyListByArticle($articleConds); if (empty($articleList)) { $this->_result = []; return ; } } // 仅搜索人员 // if (!empty($userConds) && empty($articleConds)) { $userList = $courseHelper->userStudyListByUser($userConds); if (empty($userList)) { $this->_result = []; return ; } // } // 搜索人员及课程 if (!empty($userConds) && !empty($articleConds)) { list($userList, $articleList) = $courseHelper->userStudyListByUserArticle($userConds, $articleConds); if (empty($userList) || empty($articleList)) { $this->_result = []; return ; } } $uids = []; if (!empty($userList)) { $uids = array_keys($userList); } // 查询常规课程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'); if (!empty($articleList)) { $articleIds = array_keys($articleList); // 对常规课程id 和 搜索课程所获取的课程id取交集 $articleIds = array_intersect($articles,$articleIds); }else{ $articleIds = $articles; } // 获取数据列表 $datas = []; $total = 0; $completeModel = new CourseCompleteModel(); $studyTimeModel = new CourseStudyTimeModel(); if (!empty($postData['is_complete'])) { switch ($postData['is_complete']) { // 是否完成学习:已完成(course_complete) case Constant::COURSE_IS_COMPLETE_TRUE: $datas = $completeModel->list_by_conds(['uid' => $uids, 'article_id' => $articleIds], [$pageSql, $limitSql], ['created' => 'desc']); $total = $completeModel->count_by_conds(['uid' => $uids, 'article_id' => $articleIds]); // 最近学习情况 $studyList = $studyTimeModel->listUserStudy($datas); break; // 是否完成学习:未完成(在course_study_time,但不在course_complete)连表查询 case Constant::COURSE_IS_COMPLETE_FALSE: $datas = $studyTimeModel->listUserUnCompleteCourse(['uids' => $uids, 'article_ids' => $articleIds], [$pageSql, $limitSql]); $total = $studyTimeModel->countUserUnCompleteCourse(['uids' => $uids, 'article_ids' => $articleIds]); break; } } else { // 是否完成学习:全部,已完成+未完成(course_study_time)分表查询 $conds = [ 'uid' => $uids, 'article_id' => $articleIds, ]; $datas = $studyTimeModel->listUserAllowStudy($conds, [$pageSql, $limitSql]); $total = $studyTimeModel->totalUserAllowStudy($conds); // 课程完成情况 $completeList = $completeModel->listUserComplete($datas); } // 获取评论列表 // $commentModel = new CommentModel(); // $commentList = $commentModel->listCommentTotalGroup($uids, Constant::APP_COURSE, $articleIds); // 补全人员信息 $list = []; if (!empty($datas)) { // 获取课程信息 if (empty($articleList)) { $articleIds = array_column($datas, 'article_id'); $articleList = $courseHelper->userStudyListByArticle(['article_id' => $articleIds]); } // 获取人员信息 if (empty($userList)) { $uids = array_column($datas, 'uid'); $userList = $courseHelper->userStudyListByUser(['memUids' => $uids]); } foreach ($datas as $v) { $uid = $v['uid']; $user = $userList[$uid]; if(empty($user)){ // 如果用户被删除,需要重新获取 $user = User::instance()->getByUid($uid); } $articleId = $v['article_id']; // 格式化"已完成"数据时,补全最近学习时间 $completeTime = 0; $latestStudyTime = 0; if (isset($studyList) && !empty($studyList)) { // 当数据列表未课程完成列表时,创建时间即为课程完成时间; $completeTime = $v['created']; foreach ($studyList as $study) { if ($articleId == $study['article_id'] && $uid == $study['uid']) { $latestStudyTime = $study['latest_study_time']; break; } } } // 格式化"全部"数据时,补全课程完成情况 if (isset($completeList) && !empty($completeList)) { foreach ($completeList as $complete) { if ($articleId == $complete['article_id'] && $uid == $complete['uid']) { $completeTime = $complete['complete_time']; break; } } } /* // 评论数据 $commentTotal = 0; if (isset($commentList) && !empty($commentList)) { foreach ($commentList as $comment) { if ($articleId == $comment['app_data_id'] && $uid == $comment['uid']) { $commentTotal = $comment['total']; break; } } } */ // 学习时长 $times = $studyTimeModel->listStudyTime($uid, $articleId); $study_time = $this->secToTime((int)$times[0]['study_time']); $list[] = [ 'uid' => $uid, 'article_id' => $articleId, 'username' => $user['memUsername'], 'dp_names' => isset($user['dpName']) && !empty($user['dpName']) ? array_column($user['dpName'], 'dpName') : [], 'job' => $user['memJob'], 'role' => $user['memRole'], 'article_title' => $articleList[$articleId]['article_title'], 'latest_study_time' => isset($v['latest_study_time']) ? $v['latest_study_time'] : $latestStudyTime, 'is_complete' => (int)$completeTime > 0 ? Constant::COURSE_IS_COMPLETE_TRUE : Constant::COURSE_IS_COMPLETE_FALSE, 'complete_time' => $completeTime, 'study_time' => $study_time // 'comment_total' => (int)$commentTotal, ]; } } $this->_result = [ 'page' => (int)$page, 'limit' => (int)$limit, 'total' => (int)$total, 'list' => $list, 'uids' => $uids, ]; } /** * 把秒数转换为时分秒的格式 * @author liyifei * @param Int $times 时间,单位 秒 * @return String */ private function secToTime($times) { $result = ''; if ($times > 0) { $hour = floor($times / 3600); $minute = floor(($times - 3600 * $hour) / 60); $second = floor((($times - 3600 * $hour) - 60 * $minute) % 60); if ($hour > 0) { $result .= "{$hour}时"; } if ($minute > 0) { $result .= "{$minute}分"; } if ($second > 0) { $result .= "{$second}秒"; } } return empty($result) ? 0 : $result; } }