<?php
namespace CorporateTrainingBundle\Controller\Admin;
use AppBundle\Common\ArrayToolkit;
use AppBundle\Common\Paginator;
use AppBundle\Controller\Admin\CourseSetController as BaseController;
use Biz\Course\Dao\CourseEssenceFileDao;
use Biz\Course\Dao\EssenceFileDao;
use Biz\Lms\Service\LmsService;
use Symfony\Component\HttpFoundation\Request;
class CourseSetController extends BaseController
{
public function indexAction(Request $request, $filter)
{
$conditions = $request->request->all();
$conditions = $this->filterCourseSetConditions($filter, $conditions);
$paginator = new Paginator(
$request,
$this->getCourseSetService()->countCourseSets($conditions),
20
);
$paginator->setBaseUrl($this->generateUrl('admin_course_set_ajax_list', ['filter' => $filter]));
list($courseSets, $users, $categories, $courseSetStatusNum, $coursesCount) = $this->buildCourseSetListData($conditions, $paginator, $filter);
$leaseCourseCount = $this->getCourseSetService()->countCourseSets(['belong' => 'lease']);
return $this->render(
'admin/course-set/index.html.twig',
[
'courseSets' => $courseSets,
'users' => $users,
'categories' => $categories,
'paginator' => $paginator,
'filter' => 'normal',
'courseSetStatusNum' => $courseSetStatusNum,
'coursesCount' => $coursesCount,
'orgIds' => implode(',', $conditions['orgIds']),
'leaseCourseCount' => $leaseCourseCount,
]
);
}
public function ajaxListAction(Request $request, $filter)
{
$conditions = $request->request->all();
$conditions = $this->filterCourseSetConditions($filter, $conditions);
$paginator = new Paginator(
$request,
$this->getCourseSetService()->countCourseSets($conditions),
20
);
list($courseSets, $users, $categories, $courseSetStatusNum, $coursesCount) = $this->buildCourseSetListData($conditions, $paginator, $filter);
return $this->render(
'admin/course-set/list-table.html.twig',
[
'courseSets' => $courseSets,
'users' => $users,
'categories' => $categories,
'paginator' => $paginator,
'filter' => $filter,
'courseSetStatusNum' => $courseSetStatusNum,
'coursesCount' => $coursesCount,
'orgIds' => implode(',', $conditions['orgIds']),
]
);
}
public function ajaxCourseStatisticsAction(Request $request, $filter)
{
$conditions = $request->request->all();
$conditions = $this->filterCourseSetConditions($filter, $conditions);
$courseSetStatusNum = $this->getDifferentCourseSetsNum($conditions);
return $this->createSuccessJsonResponse($courseSetStatusNum);
}
public function recommendListAction(Request $request)
{
$conditions = $request->request->all();
$conditions['recommended'] = 1;
$conditions['orgIds'] = $this->prepareOrgIds($conditions);
$paginator = new Paginator(
$request,
$this->getCourseSetService()->countCourseSets($conditions),
20
);
$paginator->setBaseUrl($this->generateUrl('admin_course_set_recommend_ajax_list'));
$courseSets = $this->getCourseSetService()->searchCourseSets(
$conditions,
'recommendedSeq',
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($courseSets, 'creator'));
$categories = $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets, 'categoryId'));
return $this->render(
'admin/course-set/course-recommend-list.html.twig',
[
'courseSets' => $courseSets,
'users' => $users,
'paginator' => $paginator,
'categories' => $categories,
'orgIds' => implode(',', $conditions['orgIds']),
]
);
}
public function ajaxRecommendListAction(Request $request)
{
$conditions = $request->request->all();
$conditions['recommended'] = 1;
$conditions['orgIds'] = $this->prepareOrgIds($conditions);
$paginator = new Paginator(
$request,
$this->getCourseSetService()->countCourseSets($conditions),
20
);
$courseSets = $this->getCourseSetService()->searchCourseSets(
$conditions,
'recommendedSeq',
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($courseSets, 'creator'));
$categories = $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets, 'categoryId'));
return $this->render(
'admin/course-set/course-recommend-list-table.html.twig',
[
'courseSets' => $courseSets,
'users' => $users,
'paginator' => $paginator,
'categories' => $categories,
'orgIds' => implode(',', $conditions['orgIds']),
]
);
}
public function dataAction(Request $request, $filter)
{
$conditions = $request->request->all();
$conditions['orgIds'] = $this->prepareOrgIds($conditions);
$conditions['excludeLeaseType'] = 'retail';
$count = $this->getCourseSetService()->countCourseSets($conditions);
$paginator = new Paginator($request, $count, 20);
$paginator->setBaseUrl($this->generateUrl('admin_course_set_data_ajax_list', ['filter' => $filter]));
list($courseSets, $classrooms) = $this->buildDataListCourseSets($conditions, $paginator, $filter);
return $this->render(
'admin/course-set/data.html.twig',
[
'courseSets' => $courseSets,
'paginator' => $paginator,
'filter' => $filter,
'classrooms' => $classrooms,
'orgIds' => implode(',', $conditions['orgIds']),
]
);
}
public function ajaxDataListAction(Request $request, $filter)
{
$conditions = $request->request->all();
$conditions['orgIds'] = $this->prepareOrgIds($conditions);
$conditions['excludeLeaseType'] = 'retail';
$count = $this->getCourseSetService()->countCourseSets($conditions);
$paginator = new Paginator($request, $count, 20);
list($courseSets, $classrooms) = $this->buildDataListCourseSets($conditions, $paginator, $filter);
return $this->render(
'admin/course-set/data-tr.html.twig',
[
'courseSets' => $courseSets,
'paginator' => $paginator,
'filter' => $filter,
'classrooms' => $classrooms,
'orgIds' => implode(',', $conditions['orgIds']),
]
);
}
public function setPostCorrelationAction(Request $request, $id)
{
$courseSet = $this->getCourseSetService()->getCourseSet($id);
if ('POST' == $request->getMethod()) {
$ids = $request->request->get('postNames');
if (!empty($ids)) {
$postIds = explode(',', $ids);
foreach ($postIds as $postId) {
$count = $this->getPostCourseService()->countPostCourses(['postId' => $postId]);
$postCourse = [
'postId' => $postId,
'courseId' => $courseSet['defaultCourseId'],
'courseSetId' => $courseSet['id'],
'seq' => ++$count,
];
$this->getPostCourseService()->createPostCourse($postCourse);
}
}
return $this->redirect($this->generateUrl('admin_course_set'));
}
$postCourses = $this->getPostCourseService()->findPostCoursesByCourseId($courseSet['defaultCourseId']);
$postIds = ArrayToolkit::column($postCourses, 'postId');
$posts = $this->getPostService()->findPostsByIds($postIds);
return $this->render(
'admin/course-set/set-post-correlation-modal.html.twig',
[
'courseSet' => $courseSet,
'posts' => $posts,
]
);
}
public function postMatchAction(Request $request, $courseId)
{
$likeName = $request->query->get('name');
$postCourses = $this->getPostCourseService()->findPostCoursesByCourseId($courseId);
$ids = empty($postCourses) ? [-1] : ArrayToolkit::column($postCourses, 'postId');
$data = [];
$posts = $this->getPostService()->searchPosts(
['excludeIds' => $ids, 'likeName' => $likeName],
['seq' => 'ASC'],
0,
100
);
$posts = ArrayToolkit::group($posts, 'groupId');
foreach ($posts as $post) {
foreach ($post as $value) {
$data[] = [
'id' => $value['id'],
'name' => $value['name'],
];
}
}
return $this->createJsonResponse($data);
}
public function deletePostCorrelationAction(Request $request, $courseId, $postId)
{
$postCourse = $this->getPostCourseService()->getPostCourseByPostIdAndCourseId($postId, $courseId);
if (!empty($postCourse)) {
$this->getPostCourseService()->deletePostCourse($postCourse['id']);
}
return $this->createJsonResponse(['success' => true]);
}
public function leaseCourseAction(Request $request)
{
$filter = 'lease';
$conditions = $request->request->all();
$conditions = $this->filterCourseSetConditions($filter, $conditions);
$paginator = new Paginator(
$request,
$this->getCourseSetService()->countCourseSets($conditions),
20
);
$courseSets = $this->getCourseSetService()->searchCourseSets(
$conditions,
['createdTime' => 'DESC'],
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$categories = $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets, 'categoryId'));
$courseSetStatusNum = $this->getDifferentCourseSetsNum($conditions);
foreach ($courseSets as &$courseSet) {
$courseSet['projectPlanNum'] = $this->getProjectPlanService()->countProjectPlanItems(['targetType' => 'course', 'targetId' => $courseSet['defaultCourseId']]);
$courseSet['classroomNum'] = $this->getClassroomService()->countClassroomCourses(['courseId' => $courseSet['defaultCourseId']]);
}
return $this->render(
'admin/course-set/lease-course.html.twig',
[
'courseSets' => $courseSets,
'categories' => $categories,
'paginator' => $paginator,
'filter' => $filter,
'courseSetStatusNum' => $courseSetStatusNum,
'orgIds' => implode(',', $conditions['orgIds']),
'leaseCourseCount' => $this->getCourseSetService()->countCourseSets(['belong' => 'lease']),
]
);
}
public function useRecordAction(Request $request, $courseId)
{
list($resources, $users, $paginator) = $this->buildClassroomUseRecord($request, $courseId);
return $this->render(
'admin/course-set/course-record-modal.html.twig',
[
'courseId' => $courseId,
'resources' => $resources,
'paginator' => $paginator,
'users' => $users,
'type' => 'classroom',
]
);
}
public function projectUseRecordAction(Request $request, $courseId)
{
list($resources, $users, $paginator) = $this->buildProjectPlanCourseUseRecord($request, $courseId);
return $this->render(
'admin/course-set/course-record-modal.html.twig',
[
'courseId' => $courseId,
'resources' => $resources,
'paginator' => $paginator,
'users' => $users,
'type' => 'projectPlan',
]
);
}
public function useRecordListAction(Request $request, $courseId, $type)
{
if ('projectPlan' == $type) {
list($resources, $users, $paginator) = $this->buildProjectPlanCourseUseRecord($request, $courseId);
} else {
list($resources, $users, $paginator) = $this->buildClassroomUseRecord($request, $courseId);
}
return $this->render(
'admin/course-set/course-record-list.html.twig',
[
'ajax' => true,
'resources' => $resources,
'paginator' => $paginator,
'users' => $users,
'type' => $type,
]
);
}
protected function buildProjectPlanCourseUseRecord($request, $courseId)
{
$items = $this->getProjectPlanService()->findProjectPlanItemsByTargetIdAndTargetType($courseId, 'course');
$projectPlanIds = empty($items) ? [-1] : ArrayToolkit::column($items, 'projectPlanId');
$paginator = new Paginator(
$request,
count($items),
10
);
$resources = $this->getProjectPlanService()->searchProjectPlans(
['ids' => $projectPlanIds],
['id' => 'DESC'],
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($resources, 'createdUserId'));
return [$resources, $users, $paginator];
}
protected function buildClassroomUseRecord($request, $courseId)
{
$items = $this->getClassroomService()->findClassroomIdsByCourseId($courseId);
$classroomIds = empty($items) ? [-1] : ArrayToolkit::column($items, 'classroomId');
$paginator = new Paginator(
$request,
count($classroomIds),
10
);
$resources = $this->getClassroomService()->searchClassrooms(
['classroomIds' => $classroomIds],
['id' => 'DESC'],
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($resources, 'creator'));
return [$resources, $users, $paginator];
}
protected function buildDataListCourseSets($conditions, $paginator, $filter)
{
$courseSets = $this->getCourseSetService()->searchCourseSets(
$conditions,
['id' => 'DESC'],
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$courseSetIds = ArrayToolkit::column($courseSets, 'id');
$classrooms = [];
$courseSetIncomes = $this->getCourseSetService()->findCourseSetIncomesByCourseSetIds($courseSetIds);
$courseSetIncomes = ArrayToolkit::index($courseSetIncomes, 'courseSetId');
$courseIds = ArrayToolkit::column($courseSets, 'defaultCourseId');
$courses = $this->getCourseService()->findCoursesByIds($courseIds);
foreach ($courseSets as $key => &$courseSet) {
$courseSetId = $courseSet['id'];
$defaultCourseId = $courseSet['defaultCourseId'];
$courseCount = $this->getCourseService()->searchCourseCount(['courseSetId' => $courseSetId]);
$isLearnedNum = empty($courses[$defaultCourseId]) ? 0 : $this->getMemberService()->countMembers(
['finishedTime_GT' => 0, 'courseSetId' => $courseSet['id'], 'role' => 'student', 'learnedCompulsoryTaskNumGreaterThan' => $courses[$defaultCourseId]['compulsoryTaskNum']]
);
$taskCount = $this->getTaskService()->countTasks(['fromCourseSetId' => $courseSetId]);
$courseSet['learnedTime'] = $this->getTaskService()->sumCourseSetLearnedTimeByCourseSetId($courseSetId);
$courseSet['learnedTime'] = round($courseSet['learnedTime'] / 60);
if (!empty($courseSetIncomes[$courseSetId])) {
$courseSet['income'] = $courseSetIncomes[$courseSetId]['income'];
} else {
$courseSet['income'] = 0;
}
$courseSet['isLearnedNum'] = $isLearnedNum;
$courseSet['taskCount'] = $taskCount;
$courseSet['courseCount'] = $courseCount;
$courseSet['totalTime'] = $this->getCourseService()->sumCourseTime([$courseSet['defaultCourseId']]);
}
return [$courseSets, $classrooms];
}
protected function buildCourseSetListData($conditions, $paginator, $filter)
{
$courseSets = $this->getCourseSetService()->searchCourseSets(
$conditions,
['createdTime' => 'DESC'],
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
list($courseSets, $coursesCount) = $this->findRelatedOptions($filter, $courseSets);
$categories = $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets, 'categoryId'));
$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($courseSets, 'creator'));
$courseSetStatusNum = $this->getDifferentCourseSetsNum($conditions);
foreach ($courseSets as &$courseSet) {
$courseSet['projectPlanNum'] = $this->getProjectPlanService()->countProjectPlanItems(['targetType' => 'course', 'targetId' => $courseSet['defaultCourseId']]);
$courseSet['classroomNum'] = $this->getClassroomService()->countClassroomCourses(['courseId' => $courseSet['defaultCourseId']]);
}
return [$courseSets, $users, $categories, $courseSetStatusNum, $coursesCount];
}
protected function findRelatedOptions($filter, $courseSets)
{
foreach ($courseSets as &$courseSet) {
$courseSet['studentNum'] = $this->getCourseMemberService()->countMembers(['role' => 'student', 'courseId' => $courseSet['defaultCourseId']]);
}
$courseSetIds = ArrayToolkit::column($courseSets, 'id');
$coursesCount = $this->getCourseService()->countCoursesGroupByCourseSetIds($courseSetIds);
$coursesCount = ArrayToolkit::index($coursesCount, 'courseSetId');
if ($this->getLmsService()->isEnabledLms() && !empty($courseSets)) {
$defaultCourseIds = array_filter(array_column($courseSets, 'defaultCourseId'));
if (!empty($defaultCourseIds)) {
$essenceRows = $this->getCourseEssenceFileDao()->findByCourseIds($defaultCourseIds);
$essenceMap = [];
foreach ($essenceRows as $row) {
$essenceMap[$row['courseId']] = [
'essenceFileId' => $row['essenceFileId'],
'status' => $row['status'],
];
}
$failedEssenceFileIds = [];
foreach ($courseSets as &$courseSet) {
$courseId = $courseSet['defaultCourseId'] ?? 0;
$cef = $essenceMap[$courseId] ?? null;
if ($cef && in_array($cef['status'], ['processing', 'processed', 'failed'], true)) {
$courseSet['status'] = $cef['status'];
$courseSet['essenceFileId'] = $cef['essenceFileId'];
if ('failed' === $cef['status']) {
$failedEssenceFileIds[$courseId] = $cef['essenceFileId'];
}
}
}
unset($courseSet);
if (!empty($failedEssenceFileIds)) {
$failedRows = $this->getEssenceFileDao()->findByIdsAndStatus(array_values($failedEssenceFileIds), 'failed');
$failedReasons = [];
$failedReasonCodes = [];
foreach ($failedRows as $row) {
$failedReasons[$row['id']] = $row['failedReason'] ?? '';
$failedReasonCodes[$row['id']] = $row['failedReasonCode'] ?? 'service_error';
}
foreach ($courseSets as &$courseSet) {
if (isset($courseSet['essenceFileId'], $failedReasons[$courseSet['essenceFileId']])) {
$courseSet['essenceFailedReason'] = $failedReasons[$courseSet['essenceFileId']];
$courseSet['essenceFailedReasonCode'] = $failedReasonCodes[$courseSet['essenceFileId']];
}
}
unset($courseSet);
}
}
}
return [$courseSets, $coursesCount];
}
protected function filterCourseSetConditions($filter, $conditions)
{
$conditions = parent::filterCourseSetConditions($filter, $conditions);
if (!$this->getLmsService()->isEnabledLms()) {
return $conditions;
}
$status = $conditions['status'] ?? '';
if (in_array($status, ['processing', 'processed', 'failed'], true)) {
$courseIds = $this->getCourseEssenceFileDao()->pickCourseIdsByStatus($status);
unset($conditions['status']);
if (empty($courseIds)) {
$conditions['defaultCourseIds'] = [-1];
} else {
$conditions['defaultCourseIds'] = array_slice($courseIds, 0, 1000);
}
}
return $conditions;
}
/**
* @return LmsService
*/
protected function getLmsService()
{
return $this->createService('Lms:LmsService');
}
/**
* @return \CorporateTrainingBundle\Biz\Post\Service\Impl\PostServiceImpl
*/
protected function getPostService()
{
return $this->createService('Post:PostService');
}
/**
* @return \CorporateTrainingBundle\Biz\PostCourse\Service\Impl\PostCourseServiceImpl
*/
protected function getPostCourseService()
{
return $this->createService('PostCourse:PostCourseService');
}
/**
* @return CourseEssenceFileDao
*/
protected function getCourseEssenceFileDao()
{
return $this->getBiz()->dao('Course:CourseEssenceFileDao');
}
/**
* @return EssenceFileDao
*/
protected function getEssenceFileDao()
{
return $this->getBiz()->dao('Course:EssenceFileDao');
}
}