<?php
namespace CorporateTrainingBundle\Controller;
use AppBundle\Common\ArrayToolkit;
use AppBundle\Controller\Admin\BaseController;
use CorporateTrainingBundle\Biz\DataStatistics\Service\DataStatisticsService;
use CorporateTrainingBundle\Biz\User\Service\UserOrgService;
use CorporateTrainingBundle\Biz\User\Service\UserService;
use CorporateTrainingBundle\Common\DateToolkit;
use Symfony\Component\HttpFoundation\Request;
class LearnRankController extends BaseController
{
public function userLearnRankListAction(Request $request, $orgIds = '', $sourceFrom = '')
{
$fields['type'] = $request->query->get('type', 'week');
if ('total' != $fields['type']) {
list($fields['startDateTime'], $fields['endDateTime']) = $this->generateStartDateAndEndDate($fields['type']);
}
$sourceFrom = $request->query->get('sourceFrom', $sourceFrom);
if ($sourceFrom) {
$conditions = 'total' != $fields['type'] ? [
'startDateTime' => strtotime($fields['startDateTime']),
'endDateTime' => strtotime($fields['endDateTime']),
] : [];
$conditions = 'admin' === $sourceFrom ? $this->fillOrgCode($conditions) : $conditions;
} else {
$conditions = $this->prepareSearchConditions($fields);
}
$ranks = $this->getDataStatisticsService()->statisticsPersonOnlineLearnTimeRankingList($conditions);
$user = $this->getCurrentUser();
$userRank = $this->getDataStatisticsService()->statisticsPersonOnlineLearnTimeRankingNum($conditions, $user['id']);
$learnTime = $this->getDataStatisticsService()->statisticsOnlineCourseLearnTime(array_merge($conditions, ['userIds' => [$user['id']]]));
return $this->render('data-report/widgets/user-learn-rank-list.html.twig', [
'studyRanks' => ['personStudyRanks' => $ranks, 'sourceFrom' => $sourceFrom],
'userRank' => $userRank,
'learnTime' => $learnTime,
]);
}
public function orgLearnRankListAction(Request $request, $sourceFrom = '')
{
$fields = $request->query->all();
$fields['type'] = empty($fields['type']) ? 'week' : $fields['type'];
if ('total' != $fields['type']) {
list($fields['startDateTime'], $fields['endDateTime']) = $this->generateStartDateAndEndDate($fields['type']);
}
$conditions = $this->prepareSearchConditions($fields);
unset($conditions['userIds']);
$sourceFrom = $request->query->get('sourceFrom', $sourceFrom);
$conditions = 'admin' === $sourceFrom ? $this->fillOrgCode($conditions) : $conditions;
$ranks = $this->getDataStatisticsService()->statisticsOrgLearnTimeRankingList($conditions);
$orgUsers = $this->getUserService()->statisticsOrgUserNumGroupByOrgId();
$orgUsers = ArrayToolkit::index($orgUsers, 'orgId');
if ('admin' == $sourceFrom) {
$ranks = $this->buildAdminOrgLearnRankListData($ranks, $orgUsers);
}
return $this->render('data-report/widgets/org-learn-rank-list.html.twig', [
'studyRanks' => ['orgStudyRanks' => $ranks, 'orgUsers' => $orgUsers, 'sourceFrom' => $sourceFrom],
]);
}
protected function buildAdminOrgLearnRankListData($ranks, $orgUsers)
{
foreach ($ranks as &$rank) {
if (!empty($orgUsers[$rank['orgId']]) && !empty($orgUsers[$rank['orgId']]['count'])) {
$rank['totalLearnTime'] = $rank['totalLearnTime'] / $orgUsers[$rank['orgId']]['count'];
$rank['totalLearnTime'] = round($rank['totalLearnTime'], 1);
}
}
if (!empty($ranks)) {
foreach ($ranks as $key => &$array) {
if ($array['totalLearnTime'] > 0) {
$key_arrays[] = $array['totalLearnTime'];
} else {
unset($ranks[$key]);
}
}
if (!empty($key_arrays)) {
array_multisort($key_arrays, SORT_DESC, SORT_NUMERIC, $ranks);
}
}
return $ranks;
}
protected function generateStartDateAndEndDate($timeType)
{
if ('lastMonth' == $timeType) {
return DateToolkit::generateStartDateAndEndDate('month', -1);
}
return DateToolkit::generateStartDateAndEndDate($timeType);
}
protected function prepareSearchConditions($conditions)
{
if (!empty($conditions['startDateTime'])) {
$conditions['startDateTime'] = strtotime($conditions['startDateTime']);
}
if (!empty($conditions['endDateTime'])) {
$conditions['endDateTime'] = strtotime($conditions['endDateTime']);
}
if (isset($conditions['orgIds']) && empty($conditions['orgIds'])) {
$userIds = -1;
} else {
$orgIds = $this->prepareOrgIds($conditions);
$userIds = $this->getUserOrgService()->findUserIdsByConditions(['orgIds' => $orgIds]);
$userIds = empty($userIds) ? -1 : $userIds;
}
$keywordUserIds = [];
if (isset($conditions['keywordType']) && !empty($conditions['keyword'])) {
$users = $this->getUserService()->searchUsers(
[
$conditions['keywordType'] => $conditions['keyword'],
],
['id' => 'DESC'],
0,
PHP_INT_MAX,
['id']
);
$keywordUserIds = empty($users) ? [-1] : ArrayToolkit::column($users, 'id');
unset($conditions['keywordType']);
unset($conditions['keyword']);
}
if (-1 == $keywordUserIds || -1 == $userIds) {
$conditions['userIds'] = [-1];
} elseif (empty($keywordUserIds)) {
$conditions['userIds'] = $userIds;
} else {
$conditions['userIds'] = array_intersect($userIds, $keywordUserIds);
}
unset($conditions['orgIds']);
return $conditions;
}
/**
* @return DataStatisticsService
*/
protected function getDataStatisticsService()
{
return $this->createService('CorporateTrainingBundle:DataStatistics:DataStatisticsService');
}
/**
* @return UserService
*/
protected function getUserService()
{
return $this->createService('CorporateTrainingBundle:User:UserService');
}
/**
* @return UserOrgService
*/
protected function getUserOrgService()
{
return $this->createService('CorporateTrainingBundle:User:UserOrgService');
}
}