src/CorporateTrainingBundle/Controller/Admin/CourseSetController.php line 15

Open in your IDE?
  1. <?php
  2. namespace CorporateTrainingBundle\Controller\Admin;
  3. use AppBundle\Common\ArrayToolkit;
  4. use AppBundle\Common\Paginator;
  5. use AppBundle\Controller\Admin\CourseSetController as BaseController;
  6. use Biz\Course\Dao\CourseEssenceFileDao;
  7. use Biz\Course\Dao\EssenceFileDao;
  8. use Biz\Lms\Service\LmsService;
  9. use Symfony\Component\HttpFoundation\Request;
  10. class CourseSetController extends BaseController
  11. {
  12.     public function indexAction(Request $request$filter)
  13.     {
  14.         $conditions $request->request->all();
  15.         $conditions $this->filterCourseSetConditions($filter$conditions);
  16.         $paginator = new Paginator(
  17.             $request,
  18.             $this->getCourseSetService()->countCourseSets($conditions),
  19.             20
  20.         );
  21.         $paginator->setBaseUrl($this->generateUrl('admin_course_set_ajax_list', ['filter' => $filter]));
  22.         list($courseSets$users$categories$courseSetStatusNum$coursesCount) = $this->buildCourseSetListData($conditions$paginator$filter);
  23.         $leaseCourseCount $this->getCourseSetService()->countCourseSets(['belong' => 'lease']);
  24.         return $this->render(
  25.             'admin/course-set/index.html.twig',
  26.             [
  27.                 'courseSets' => $courseSets,
  28.                 'users' => $users,
  29.                 'categories' => $categories,
  30.                 'paginator' => $paginator,
  31.                 'filter' => 'normal',
  32.                 'courseSetStatusNum' => $courseSetStatusNum,
  33.                 'coursesCount' => $coursesCount,
  34.                 'orgIds' => implode(','$conditions['orgIds']),
  35.                 'leaseCourseCount' => $leaseCourseCount,
  36.             ]
  37.         );
  38.     }
  39.     public function ajaxListAction(Request $request$filter)
  40.     {
  41.         $conditions $request->request->all();
  42.         $conditions $this->filterCourseSetConditions($filter$conditions);
  43.         $paginator = new Paginator(
  44.             $request,
  45.             $this->getCourseSetService()->countCourseSets($conditions),
  46.             20
  47.         );
  48.         list($courseSets$users$categories$courseSetStatusNum$coursesCount) = $this->buildCourseSetListData($conditions$paginator$filter);
  49.         return $this->render(
  50.             'admin/course-set/list-table.html.twig',
  51.             [
  52.                 'courseSets' => $courseSets,
  53.                 'users' => $users,
  54.                 'categories' => $categories,
  55.                 'paginator' => $paginator,
  56.                 'filter' => $filter,
  57.                 'courseSetStatusNum' => $courseSetStatusNum,
  58.                 'coursesCount' => $coursesCount,
  59.                 'orgIds' => implode(','$conditions['orgIds']),
  60.             ]
  61.         );
  62.     }
  63.     public function ajaxCourseStatisticsAction(Request $request$filter)
  64.     {
  65.         $conditions $request->request->all();
  66.         $conditions $this->filterCourseSetConditions($filter$conditions);
  67.         $courseSetStatusNum $this->getDifferentCourseSetsNum($conditions);
  68.         return $this->createSuccessJsonResponse($courseSetStatusNum);
  69.     }
  70.     public function recommendListAction(Request $request)
  71.     {
  72.         $conditions $request->request->all();
  73.         $conditions['recommended'] = 1;
  74.         $conditions['orgIds'] = $this->prepareOrgIds($conditions);
  75.         $paginator = new Paginator(
  76.             $request,
  77.             $this->getCourseSetService()->countCourseSets($conditions),
  78.             20
  79.         );
  80.         $paginator->setBaseUrl($this->generateUrl('admin_course_set_recommend_ajax_list'));
  81.         $courseSets $this->getCourseSetService()->searchCourseSets(
  82.             $conditions,
  83.             'recommendedSeq',
  84.             $paginator->getOffsetCount(),
  85.             $paginator->getPerPageCount()
  86.         );
  87.         $users $this->getUserService()->findUsersByIds(ArrayToolkit::column($courseSets'creator'));
  88.         $categories $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets'categoryId'));
  89.         return $this->render(
  90.             'admin/course-set/course-recommend-list.html.twig',
  91.             [
  92.                 'courseSets' => $courseSets,
  93.                 'users' => $users,
  94.                 'paginator' => $paginator,
  95.                 'categories' => $categories,
  96.                 'orgIds' => implode(','$conditions['orgIds']),
  97.             ]
  98.         );
  99.     }
  100.     public function ajaxRecommendListAction(Request $request)
  101.     {
  102.         $conditions $request->request->all();
  103.         $conditions['recommended'] = 1;
  104.         $conditions['orgIds'] = $this->prepareOrgIds($conditions);
  105.         $paginator = new Paginator(
  106.             $request,
  107.             $this->getCourseSetService()->countCourseSets($conditions),
  108.             20
  109.         );
  110.         $courseSets $this->getCourseSetService()->searchCourseSets(
  111.             $conditions,
  112.             'recommendedSeq',
  113.             $paginator->getOffsetCount(),
  114.             $paginator->getPerPageCount()
  115.         );
  116.         $users $this->getUserService()->findUsersByIds(ArrayToolkit::column($courseSets'creator'));
  117.         $categories $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets'categoryId'));
  118.         return $this->render(
  119.             'admin/course-set/course-recommend-list-table.html.twig',
  120.             [
  121.                 'courseSets' => $courseSets,
  122.                 'users' => $users,
  123.                 'paginator' => $paginator,
  124.                 'categories' => $categories,
  125.                 'orgIds' => implode(','$conditions['orgIds']),
  126.             ]
  127.         );
  128.     }
  129.     public function dataAction(Request $request$filter)
  130.     {
  131.         $conditions $request->request->all();
  132.         $conditions['orgIds'] = $this->prepareOrgIds($conditions);
  133.         $conditions['excludeLeaseType'] = 'retail';
  134.         $count $this->getCourseSetService()->countCourseSets($conditions);
  135.         $paginator = new Paginator($request$count20);
  136.         $paginator->setBaseUrl($this->generateUrl('admin_course_set_data_ajax_list', ['filter' => $filter]));
  137.         list($courseSets$classrooms) = $this->buildDataListCourseSets($conditions$paginator$filter);
  138.         return $this->render(
  139.             'admin/course-set/data.html.twig',
  140.             [
  141.                 'courseSets' => $courseSets,
  142.                 'paginator' => $paginator,
  143.                 'filter' => $filter,
  144.                 'classrooms' => $classrooms,
  145.                 'orgIds' => implode(','$conditions['orgIds']),
  146.             ]
  147.         );
  148.     }
  149.     public function ajaxDataListAction(Request $request$filter)
  150.     {
  151.         $conditions $request->request->all();
  152.         $conditions['orgIds'] = $this->prepareOrgIds($conditions);
  153.         $conditions['excludeLeaseType'] = 'retail';
  154.         $count $this->getCourseSetService()->countCourseSets($conditions);
  155.         $paginator = new Paginator($request$count20);
  156.         list($courseSets$classrooms) = $this->buildDataListCourseSets($conditions$paginator$filter);
  157.         return $this->render(
  158.             'admin/course-set/data-tr.html.twig',
  159.             [
  160.                 'courseSets' => $courseSets,
  161.                 'paginator' => $paginator,
  162.                 'filter' => $filter,
  163.                 'classrooms' => $classrooms,
  164.                 'orgIds' => implode(','$conditions['orgIds']),
  165.             ]
  166.         );
  167.     }
  168.     public function setPostCorrelationAction(Request $request$id)
  169.     {
  170.         $courseSet $this->getCourseSetService()->getCourseSet($id);
  171.         if ('POST' == $request->getMethod()) {
  172.             $ids $request->request->get('postNames');
  173.             if (!empty($ids)) {
  174.                 $postIds explode(','$ids);
  175.                 foreach ($postIds as $postId) {
  176.                     $count $this->getPostCourseService()->countPostCourses(['postId' => $postId]);
  177.                     $postCourse = [
  178.                         'postId' => $postId,
  179.                         'courseId' => $courseSet['defaultCourseId'],
  180.                         'courseSetId' => $courseSet['id'],
  181.                         'seq' => ++$count,
  182.                     ];
  183.                     $this->getPostCourseService()->createPostCourse($postCourse);
  184.                 }
  185.             }
  186.             return $this->redirect($this->generateUrl('admin_course_set'));
  187.         }
  188.         $postCourses $this->getPostCourseService()->findPostCoursesByCourseId($courseSet['defaultCourseId']);
  189.         $postIds ArrayToolkit::column($postCourses'postId');
  190.         $posts $this->getPostService()->findPostsByIds($postIds);
  191.         return $this->render(
  192.             'admin/course-set/set-post-correlation-modal.html.twig',
  193.             [
  194.                 'courseSet' => $courseSet,
  195.                 'posts' => $posts,
  196.             ]
  197.         );
  198.     }
  199.     public function postMatchAction(Request $request$courseId)
  200.     {
  201.         $likeName $request->query->get('name');
  202.         $postCourses $this->getPostCourseService()->findPostCoursesByCourseId($courseId);
  203.         $ids = empty($postCourses) ? [-1] : ArrayToolkit::column($postCourses'postId');
  204.         $data = [];
  205.         $posts $this->getPostService()->searchPosts(
  206.             ['excludeIds' => $ids'likeName' => $likeName],
  207.             ['seq' => 'ASC'],
  208.             0,
  209.             100
  210.         );
  211.         $posts ArrayToolkit::group($posts'groupId');
  212.         foreach ($posts as $post) {
  213.             foreach ($post as $value) {
  214.                 $data[] = [
  215.                     'id' => $value['id'],
  216.                     'name' => $value['name'],
  217.                 ];
  218.             }
  219.         }
  220.         return $this->createJsonResponse($data);
  221.     }
  222.     public function deletePostCorrelationAction(Request $request$courseId$postId)
  223.     {
  224.         $postCourse $this->getPostCourseService()->getPostCourseByPostIdAndCourseId($postId$courseId);
  225.         if (!empty($postCourse)) {
  226.             $this->getPostCourseService()->deletePostCourse($postCourse['id']);
  227.         }
  228.         return $this->createJsonResponse(['success' => true]);
  229.     }
  230.     public function leaseCourseAction(Request $request)
  231.     {
  232.         $filter 'lease';
  233.         $conditions $request->request->all();
  234.         $conditions $this->filterCourseSetConditions($filter$conditions);
  235.         $paginator = new Paginator(
  236.             $request,
  237.             $this->getCourseSetService()->countCourseSets($conditions),
  238.             20
  239.         );
  240.         $courseSets $this->getCourseSetService()->searchCourseSets(
  241.             $conditions,
  242.             ['createdTime' => 'DESC'],
  243.             $paginator->getOffsetCount(),
  244.             $paginator->getPerPageCount()
  245.         );
  246.         $categories $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets'categoryId'));
  247.         $courseSetStatusNum $this->getDifferentCourseSetsNum($conditions);
  248.         foreach ($courseSets as &$courseSet) {
  249.             $courseSet['projectPlanNum'] = $this->getProjectPlanService()->countProjectPlanItems(['targetType' => 'course''targetId' => $courseSet['defaultCourseId']]);
  250.             $courseSet['classroomNum'] = $this->getClassroomService()->countClassroomCourses(['courseId' => $courseSet['defaultCourseId']]);
  251.         }
  252.         return $this->render(
  253.             'admin/course-set/lease-course.html.twig',
  254.             [
  255.                 'courseSets' => $courseSets,
  256.                 'categories' => $categories,
  257.                 'paginator' => $paginator,
  258.                 'filter' => $filter,
  259.                 'courseSetStatusNum' => $courseSetStatusNum,
  260.                 'orgIds' => implode(','$conditions['orgIds']),
  261.                 'leaseCourseCount' => $this->getCourseSetService()->countCourseSets(['belong' => 'lease']),
  262.             ]
  263.         );
  264.     }
  265.     public function useRecordAction(Request $request$courseId)
  266.     {
  267.         list($resources$users$paginator) = $this->buildClassroomUseRecord($request$courseId);
  268.         return $this->render(
  269.             'admin/course-set/course-record-modal.html.twig',
  270.             [
  271.                 'courseId' => $courseId,
  272.                 'resources' => $resources,
  273.                 'paginator' => $paginator,
  274.                 'users' => $users,
  275.                 'type' => 'classroom',
  276.             ]
  277.         );
  278.     }
  279.     public function projectUseRecordAction(Request $request$courseId)
  280.     {
  281.         list($resources$users$paginator) = $this->buildProjectPlanCourseUseRecord($request$courseId);
  282.         return $this->render(
  283.             'admin/course-set/course-record-modal.html.twig',
  284.             [
  285.                 'courseId' => $courseId,
  286.                 'resources' => $resources,
  287.                 'paginator' => $paginator,
  288.                 'users' => $users,
  289.                 'type' => 'projectPlan',
  290.             ]
  291.         );
  292.     }
  293.     public function useRecordListAction(Request $request$courseId$type)
  294.     {
  295.         if ('projectPlan' == $type) {
  296.             list($resources$users$paginator) = $this->buildProjectPlanCourseUseRecord($request$courseId);
  297.         } else {
  298.             list($resources$users$paginator) = $this->buildClassroomUseRecord($request$courseId);
  299.         }
  300.         return $this->render(
  301.             'admin/course-set/course-record-list.html.twig',
  302.             [
  303.                 'ajax' => true,
  304.                 'resources' => $resources,
  305.                 'paginator' => $paginator,
  306.                 'users' => $users,
  307.                 'type' => $type,
  308.             ]
  309.         );
  310.     }
  311.     protected function buildProjectPlanCourseUseRecord($request$courseId)
  312.     {
  313.         $items $this->getProjectPlanService()->findProjectPlanItemsByTargetIdAndTargetType($courseId'course');
  314.         $projectPlanIds = empty($items) ? [-1] : ArrayToolkit::column($items'projectPlanId');
  315.         $paginator = new Paginator(
  316.             $request,
  317.             count($items),
  318.             10
  319.         );
  320.         $resources $this->getProjectPlanService()->searchProjectPlans(
  321.             ['ids' => $projectPlanIds],
  322.             ['id' => 'DESC'],
  323.             $paginator->getOffsetCount(),
  324.             $paginator->getPerPageCount()
  325.         );
  326.         $users $this->getUserService()->findUsersByIds(ArrayToolkit::column($resources'createdUserId'));
  327.         return [$resources$users$paginator];
  328.     }
  329.     protected function buildClassroomUseRecord($request$courseId)
  330.     {
  331.         $items $this->getClassroomService()->findClassroomIdsByCourseId($courseId);
  332.         $classroomIds = empty($items) ? [-1] : ArrayToolkit::column($items'classroomId');
  333.         $paginator = new Paginator(
  334.             $request,
  335.             count($classroomIds),
  336.             10
  337.         );
  338.         $resources $this->getClassroomService()->searchClassrooms(
  339.             ['classroomIds' => $classroomIds],
  340.             ['id' => 'DESC'],
  341.             $paginator->getOffsetCount(),
  342.             $paginator->getPerPageCount()
  343.         );
  344.         $users $this->getUserService()->findUsersByIds(ArrayToolkit::column($resources'creator'));
  345.         return [$resources$users$paginator];
  346.     }
  347.     protected function buildDataListCourseSets($conditions$paginator$filter)
  348.     {
  349.         $courseSets $this->getCourseSetService()->searchCourseSets(
  350.             $conditions,
  351.             ['id' => 'DESC'],
  352.             $paginator->getOffsetCount(),
  353.             $paginator->getPerPageCount()
  354.         );
  355.         $courseSetIds ArrayToolkit::column($courseSets'id');
  356.         $classrooms = [];
  357.         $courseSetIncomes $this->getCourseSetService()->findCourseSetIncomesByCourseSetIds($courseSetIds);
  358.         $courseSetIncomes ArrayToolkit::index($courseSetIncomes'courseSetId');
  359.         $courseIds ArrayToolkit::column($courseSets'defaultCourseId');
  360.         $courses $this->getCourseService()->findCoursesByIds($courseIds);
  361.         foreach ($courseSets as $key => &$courseSet) {
  362.             $courseSetId $courseSet['id'];
  363.             $defaultCourseId $courseSet['defaultCourseId'];
  364.             $courseCount $this->getCourseService()->searchCourseCount(['courseSetId' => $courseSetId]);
  365.             $isLearnedNum = empty($courses[$defaultCourseId]) ? $this->getMemberService()->countMembers(
  366.                 ['finishedTime_GT' => 0'courseSetId' => $courseSet['id'], 'role' => 'student''learnedCompulsoryTaskNumGreaterThan' => $courses[$defaultCourseId]['compulsoryTaskNum']]
  367.             );
  368.             $taskCount $this->getTaskService()->countTasks(['fromCourseSetId' => $courseSetId]);
  369.             $courseSet['learnedTime'] = $this->getTaskService()->sumCourseSetLearnedTimeByCourseSetId($courseSetId);
  370.             $courseSet['learnedTime'] = round($courseSet['learnedTime'] / 60);
  371.             if (!empty($courseSetIncomes[$courseSetId])) {
  372.                 $courseSet['income'] = $courseSetIncomes[$courseSetId]['income'];
  373.             } else {
  374.                 $courseSet['income'] = 0;
  375.             }
  376.             $courseSet['isLearnedNum'] = $isLearnedNum;
  377.             $courseSet['taskCount'] = $taskCount;
  378.             $courseSet['courseCount'] = $courseCount;
  379.             $courseSet['totalTime'] = $this->getCourseService()->sumCourseTime([$courseSet['defaultCourseId']]);
  380.         }
  381.         return [$courseSets$classrooms];
  382.     }
  383.     protected function buildCourseSetListData($conditions$paginator$filter)
  384.     {
  385.         $courseSets $this->getCourseSetService()->searchCourseSets(
  386.             $conditions,
  387.             ['createdTime' => 'DESC'],
  388.             $paginator->getOffsetCount(),
  389.             $paginator->getPerPageCount()
  390.         );
  391.         list($courseSets$coursesCount) = $this->findRelatedOptions($filter$courseSets);
  392.         $categories $this->getCategoryService()->findCategoriesByIds(ArrayToolkit::column($courseSets'categoryId'));
  393.         $users $this->getUserService()->findUsersByIds(ArrayToolkit::column($courseSets'creator'));
  394.         $courseSetStatusNum $this->getDifferentCourseSetsNum($conditions);
  395.         foreach ($courseSets as &$courseSet) {
  396.             $courseSet['projectPlanNum'] = $this->getProjectPlanService()->countProjectPlanItems(['targetType' => 'course''targetId' => $courseSet['defaultCourseId']]);
  397.             $courseSet['classroomNum'] = $this->getClassroomService()->countClassroomCourses(['courseId' => $courseSet['defaultCourseId']]);
  398.         }
  399.         return [$courseSets$users$categories$courseSetStatusNum$coursesCount];
  400.     }
  401.     protected function findRelatedOptions($filter$courseSets)
  402.     {
  403.         foreach ($courseSets as &$courseSet) {
  404.             $courseSet['studentNum'] = $this->getCourseMemberService()->countMembers(['role' => 'student''courseId' => $courseSet['defaultCourseId']]);
  405.         }
  406.         $courseSetIds ArrayToolkit::column($courseSets'id');
  407.         $coursesCount $this->getCourseService()->countCoursesGroupByCourseSetIds($courseSetIds);
  408.         $coursesCount ArrayToolkit::index($coursesCount'courseSetId');
  409.         if ($this->getLmsService()->isEnabledLms() && !empty($courseSets)) {
  410.             $defaultCourseIds array_filter(array_column($courseSets'defaultCourseId'));
  411.             if (!empty($defaultCourseIds)) {
  412.                 $essenceRows $this->getCourseEssenceFileDao()->findByCourseIds($defaultCourseIds);
  413.                 $essenceMap = [];
  414.                 foreach ($essenceRows as $row) {
  415.                     $essenceMap[$row['courseId']] = [
  416.                         'essenceFileId' => $row['essenceFileId'],
  417.                         'status' => $row['status'],
  418.                     ];
  419.                 }
  420.                 $failedEssenceFileIds = [];
  421.                 foreach ($courseSets as &$courseSet) {
  422.                     $courseId $courseSet['defaultCourseId'] ?? 0;
  423.                     $cef $essenceMap[$courseId] ?? null;
  424.                     if ($cef && in_array($cef['status'], ['processing''processed''failed'], true)) {
  425.                         $courseSet['status'] = $cef['status'];
  426.                         $courseSet['essenceFileId'] = $cef['essenceFileId'];
  427.                         if ('failed' === $cef['status']) {
  428.                             $failedEssenceFileIds[$courseId] = $cef['essenceFileId'];
  429.                         }
  430.                     }
  431.                 }
  432.                 unset($courseSet);
  433.                 if (!empty($failedEssenceFileIds)) {
  434.                     $failedRows $this->getEssenceFileDao()->findByIdsAndStatus(array_values($failedEssenceFileIds), 'failed');
  435.                     $failedReasons = [];
  436.                     $failedReasonCodes = [];
  437.                     foreach ($failedRows as $row) {
  438.                         $failedReasons[$row['id']] = $row['failedReason'] ?? '';
  439.                         $failedReasonCodes[$row['id']] = $row['failedReasonCode'] ?? 'service_error';
  440.                     }
  441.                     foreach ($courseSets as &$courseSet) {
  442.                         if (isset($courseSet['essenceFileId'], $failedReasons[$courseSet['essenceFileId']])) {
  443.                             $courseSet['essenceFailedReason'] = $failedReasons[$courseSet['essenceFileId']];
  444.                             $courseSet['essenceFailedReasonCode'] = $failedReasonCodes[$courseSet['essenceFileId']];
  445.                         }
  446.                     }
  447.                     unset($courseSet);
  448.                 }
  449.             }
  450.         }
  451.         return [$courseSets$coursesCount];
  452.     }
  453.     protected function filterCourseSetConditions($filter$conditions)
  454.     {
  455.         $conditions parent::filterCourseSetConditions($filter$conditions);
  456.         if (!$this->getLmsService()->isEnabledLms()) {
  457.             return $conditions;
  458.         }
  459.         $status $conditions['status'] ?? '';
  460.         if (in_array($status, ['processing''processed''failed'], true)) {
  461.             $courseIds $this->getCourseEssenceFileDao()->pickCourseIdsByStatus($status);
  462.             unset($conditions['status']);
  463.             if (empty($courseIds)) {
  464.                 $conditions['defaultCourseIds'] = [-1];
  465.             } else {
  466.                 $conditions['defaultCourseIds'] = array_slice($courseIds01000);
  467.             }
  468.         }
  469.         return $conditions;
  470.     }
  471.     /**
  472.      * @return LmsService
  473.      */
  474.     protected function getLmsService()
  475.     {
  476.         return $this->createService('Lms:LmsService');
  477.     }
  478.     /**
  479.      * @return \CorporateTrainingBundle\Biz\Post\Service\Impl\PostServiceImpl
  480.      */
  481.     protected function getPostService()
  482.     {
  483.         return $this->createService('Post:PostService');
  484.     }
  485.     /**
  486.      * @return \CorporateTrainingBundle\Biz\PostCourse\Service\Impl\PostCourseServiceImpl
  487.      */
  488.     protected function getPostCourseService()
  489.     {
  490.         return $this->createService('PostCourse:PostCourseService');
  491.     }
  492.     /**
  493.      * @return CourseEssenceFileDao
  494.      */
  495.     protected function getCourseEssenceFileDao()
  496.     {
  497.         return $this->getBiz()->dao('Course:CourseEssenceFileDao');
  498.     }
  499.     /**
  500.      * @return EssenceFileDao
  501.      */
  502.     protected function getEssenceFileDao()
  503.     {
  504.         return $this->getBiz()->dao('Course:EssenceFileDao');
  505.     }
  506. }