Jelajahi Sumber

up - 随机出题答案

liugc 1 tahun lalu
induk
melakukan
bb0b91619a

+ 6 - 5
app/workerapi/controller/TrainingController.php

@@ -185,19 +185,20 @@ class TrainingController extends BaseApiController
         return $this->data($result);
     }
 
-
-
     /**
-     * 获取某类目课程列表
+     * 获取某类目课程列表任务ID
      * @return \think\response\Json
      */
-    public function getCategoryCourse()
+    public function getCategoryTaskId()
     {
         $params  = request()->get();
         $params['user_id']  = $this->userId;
         $params['user_info']  = $this->userInfo;
         $result = TrainingLogic::getCategoryCourse($params);
-        return $this->data($result);
+        if($result === false){
+            return $this->fail(TrainingLogic::getError());
+        }
+        return $this->success('', ['training_task_id'=>$result], 1, 1);
     }
 
 

+ 152 - 50
app/workerapi/logic/TrainingLogic.php

@@ -208,7 +208,7 @@ class TrainingLogic extends  BaseLogic
      * @return
      */
     public static function submitExam($params){
-        //Db::startTrans();
+        Db::startTrans();
         try {
 
             // 课程试卷详情
@@ -246,22 +246,56 @@ class TrainingLogic extends  BaseLogic
                 ['id' => $params['worker_course_id']]
             );
 
-            // 该工程师的课程全部完成,更新任务状态
-            $workerCourseCount = TrainingWorkerCourse::where('master_worker_id',$exam_paper_details['master_worker_id'])
-                ->where('training_task_id',$exam_paper_details['training_task_id'])
-                ->where('study_status','<',5)
-                ->count();
-            if($workerCourseCount == 0){
-                TrainingWorkerTask::where('master_worker_id',$exam_paper_details['master_worker_id'])
+            // 判断是否为服务类目考试
+            if($exam_paper_details['subclass'] > 0){
+                if($study_status === 5){
+                    TrainingCategory::where('master_worker_id',$exam_paper_details['master_worker_id'])
+                        ->where('training_task_id',$exam_paper_details['training_task_id'])
+                        ->where('category_id',$exam_paper_details['subclass'])
+                        ->update(['is_must' => 1]);
+
+                    $masterWorker = MasterWorker::where('id',$exam_paper_details['master_worker_id'])->findOrEmpty();
+                    $category_ids = explode(',',$masterWorker->category_ids);
+                    $category_ids[] = $exam_paper_details['subclass'];
+                    $category_ids = array_unique($category_ids);
+                    // 更新工程师服务类目
+                    MasterWorker::update(['category_ids' => implode(',',$category_ids)],['id'=>$exam_paper_details['master_worker_id']]);
+                }else{
+                    // 考试不合格则删除考试任务和考试记录,下次重新选题考试
+                    $is_random_course = false; // 配置随机课程
+                    if($is_random_course){
+                        TrainingTask::where('master_worker_id',$exam_paper_details['master_worker_id'])
+                            ->where('subclass',$exam_paper_details['subclass'])->delete();
+                    }
+                    TrainingCategory::where('master_worker_id',$exam_paper_details['master_worker_id'])
+                        ->where('training_task_id',$exam_paper_details['training_task_id'])
+                        ->where('category_id',$exam_paper_details['subclass'])
+                        ->update(['training_task_id' => 0,'is_must' => 0]);
+                    TrainingWorkerCourse::where('master_worker_id',$exam_paper_details['master_worker_id'])
+                        ->where('subclass',$exam_paper_details['subclass'])
+                        ->delete();
+                    TrainingWorkerQuestion::where('master_worker_id',$exam_paper_details['master_worker_id'])
+                        ->where('subclass',$exam_paper_details['subclass'])
+                        ->delete();
+                }
+            }else{
+                // 该工程师的课程全部完成,更新任务状态
+                $workerCourseCount = TrainingWorkerCourse::where('master_worker_id',$exam_paper_details['master_worker_id'])
                     ->where('training_task_id',$exam_paper_details['training_task_id'])
-                    ->where('training_status',1)
-                    ->update(['training_status'=>2]);
+                    ->where('study_status','<',5)
+                    ->count();
+                if($workerCourseCount == 0){
+                    TrainingWorkerTask::where('master_worker_id',$exam_paper_details['master_worker_id'])
+                        ->where('training_task_id',$exam_paper_details['training_task_id'])
+                        ->where('training_status',1)
+                        ->update(['training_status'=>2]);
+                }
             }
 
-            //Db::commit();
+            Db::commit();
             return true;
         }catch(\Exception $e){
-            //Db::rollback();
+            Db::rollback();
             self::setError($e->getMessage());
             return false;
         }
@@ -275,9 +309,10 @@ class TrainingLogic extends  BaseLogic
             // 课程详情
             $course = TrainingCourse::where('id',$workerCourse['training_course_id'])->findOrEmpty()->toArray();
 
-            // 若$workerCourse['course_question_setting']存在 则 替换最新试题配置
-
-
+            // 若$workerCourse['course_question_setting']存在说明随机题 则 替换最新试题配置
+            if($workerCourse['course_question_setting']){
+                $course['course_question_setting'] = json_decode($workerCourse['course_question_setting'],true);
+            }
 
             // 该课程所有试题 答案、分数
             $question_ids = array_column($course['course_question_setting'],'select_value')??[];
@@ -357,19 +392,27 @@ class TrainingLogic extends  BaseLogic
 
 
     /**
-     * 提交分类并获取培训课程
+     * 提交分类
      * @param  array
      * @return bool
      */
     public static function submitCategory($params){
 
         try {
-            $trainingCategory = TrainingCategory::where('master_worker_id',$params['user_id'])->where('category_id',$params['category_id'])->findOrEmpty();
-            if($trainingCategory->isEmpty()){
-                TrainingCategory::create([
-                    'master_worker_id' => $params['user_id'],
-                    'category_id' => $params['category_id']
-                ]);
+            if(!isset($params['category_ids']) || empty($params['category_ids'])){
+                throw new \Exception('分类不能为空');
+            }
+            $category_ids = explode(',',$params['category_ids']);
+            foreach ($category_ids as $category_id) {
+                // 检查该分类下是否存在该分类的培训任务以及课程?
+
+                $trainingCategory = TrainingCategory::where('master_worker_id',$params['user_id'])->where('category_id',$category_id)->findOrEmpty();
+                if($trainingCategory->isEmpty()){
+                    TrainingCategory::create([
+                        'master_worker_id' => $params['user_id'],
+                        'category_id' => $params['category_id']
+                    ]);
+                }
             }
             return true;
         }catch(\Exception $e){
@@ -394,36 +437,72 @@ class TrainingLogic extends  BaseLogic
     }
 
     /**
-     * 获取某类目所有课程
+     * 获取某类目所有课程任务ID
      * @param  array
-     * @return array
+     * @return int
      */
     public static function getCategoryCourse($params){
         try {
             $trainingCategory = TrainingCategory::where('id',$params['id'])->findOrEmpty();
 
-/*
-            // 为每个类目建立一个培训任务
-            $trainingTask = TrainingTask::create([
-                'subclass' => $params['category_id'],
-                'task_name' => '分类ID-'.$params['category_id'],
-                'training_course_id' => array_map('intval', $training_course_id)
-            ]);
-
-
-
+            // 获取该类目 $trainingCategory->category_id 下随机课程|固定任务(固定课程)  (随机数由配置决定)
+            /*看配置 随机课程 0  固定任务  1 ( 那么就是每个分类对应一个任务即课程组)
+            随机---先补充需要添加任务 - 返回任务ID
+            固定---不需要添加任务 - 直接返回任务ID*/
+            if($trainingCategory->training_task_id){ //存在
+                    $trainingTask = TrainingTask::where('id',$trainingCategory->training_task_id)->findOrEmpty();
+            }else{ //不存在
+                // 获取该类目下任务ID
+                $trainingTask = TrainingTask::where('subclass',$params['category_id'])->findOrEmpty();
+                if($trainingTask->isEmpty()){
+                    // 获取该类目 随机课程
+                    $fixed_course_ids = [1,2,3];
+                    $trainingTask = TrainingTask::create([
+                        'task_name' => '分类ID-'.$params['category_id'],
+                        'training_course_id' => array_map('intval', $fixed_course_ids),
+                        'subclass' => $params['category_id'],
+                        'master_worker_id' => $params['user_id'],
+                    ]);
+                }
 
+                /*$is_random_course = false; // 配置随机课程
+                if($is_random_course){
+                    // 获取该类目配置 随机课程或类目下无任务则随机
+                    $fixed_course_ids = [1,2,3];
+                    $trainingTask = TrainingTask::create([
+                        'task_name' => '分类ID-'.$params['category_id'],
+                        'training_course_id' => array_map('intval', $fixed_course_ids),
+                        'subclass' => $params['category_id'],
+                        'master_worker_id' => $params['user_id'],
+                    ]);
+                }else{
+                    // 获取该类目下任务ID
+                    $trainingTask = TrainingTask::where('subclass',$params['category_id'])->findOrEmpty();
+                    if($trainingTask->isEmpty()){
+                        throw new \Exception('该类目下不存在培训任务,请联系客服配置');
+                    }
+                }*/
+
+                $trainingCategory->training_task_id = $trainingTask->id;
+                $trainingCategory->save();
+            }
 
-            $free_course = TrainingWorkerCourse::where('master_worker_id',$params['user_id'])
-                ->where('training_task_id',0)
-                ->where('subclass',$trainingCategory->category_id)
-                ->where('training_course_id',$free_course_id)->findOrEmpty();
-            if($free_course->isEmpty()){
-                $free_course = TrainingWorkerCourse::create([
+            // 保证用户进来后该分类都是新课程记录 新试题记录 即原来的记录被删除
+            TrainingWorkerCourse::where('master_worker_id',$params['user_id'])
+                ->where('subclass',$params['category_id'])
+                ->delete();
+            TrainingWorkerQuestion::where('master_worker_id',$params['user_id'])
+                ->where('subclass',$params['category_id'])
+                ->delete();
+
+            $training_course_ids  = json_decode(TrainingTask::where('id',$trainingTask->id)->value('training_course_id')??'[]',true);
+            // 添加该工程师的所有培训课程初始化记录
+            foreach ($training_course_ids as $course_id) {
+                $workerCourse = TrainingWorkerCourse::create([
                     'master_worker_id' => $params['user_id'],
-                    'training_task_id' => 0,
+                    'training_task_id' => $trainingTask->id,
+                    'training_course_id' => $course_id,
                     'subclass' => $params['category_id'],
-                    'training_course_id' => $free_course_id,
                     'play_time' => 0,
                     'exam_start_time' => 0,
                     'exam_end_time' => 0,
@@ -431,26 +510,49 @@ class TrainingLogic extends  BaseLogic
                     'exam_score' => 0,
                 ]);
 
+                $trainingCourse = TrainingCourse::where('id',$course_id)->findOrEmpty();
+                // 配置是否随机出题? 0 1
+                //$trainingCourse->randomly_question = true;
+                if($trainingCourse->randomly_question){
+                    // 随机出题 随机x个试题 x由该课程配置决定 比如10个试题
+                    $trainingQuestions = TrainingQuestions::where('subclass',$trainingCourse->subclass)->order(Db::raw('rand()'))->limit($trainingCourse->randomly_num)->select()->toArray();
+                    //每题多少分(按总分100分计算)
+                    $score = 100 / count($trainingQuestions);
+                    $course_question = [];
+                    foreach ($trainingQuestions as $block_key => $trainingQuestion) {
+                        //[{"block_key":1,"select_value":1,"score":"20"},{"block_key":2,"select_value":2,"score":"10"},{"block_key":3,"select_value":3,"score":"70"}]
+                        $course_question[] = [
+                            'block_key' => $block_key+1,
+                            'select_value' => $trainingQuestion->id,
+                            'score' => $score
+                        ];
+                    }
+
+                    $workerCourse->course_question_setting = json_encode($course_question);
+                    $workerCourse->save();
+                }else{
+                    $course_question = json_decode($trainingCourse->course_question_setting,true);
+                }
+
                 // 添加该工程师该课程的所有试题初始化记录
-                //[{"block_key":1,"select_value":1,"score":"20"},{"block_key":2,"select_value":2,"score":"10"},{"block_key":3,"select_value":3,"score":"70"}]
-                $course_question = json_decode(TrainingCourse::where('id',$free_course_id)->value('course_question_setting'),true);
                 $course_question_ids = array_column($course_question,'select_value');
                 foreach ($course_question_ids as $question_id) {
                     $workerQuestion = TrainingWorkerQuestion::create([
-                        'worker_course_id' => $free_course->id,
+                        'master_worker_id' => $params['user_id'],
+                        'subclass' => $params['category_id'],
+                        'worker_course_id' => $workerCourse->id,
                         'questions_id' => $question_id,
                         'worker_answer' => '',
                         'exam_score' => 0
                     ]);
                 }
-            }*/
-
-
-
+            }
 
+            //return self::getCourseList($params['user_id'],['training_task_id'=>$trainingTask->id]);
+            return $trainingTask->id;
         }catch(\Exception $e){
             self::setError($e->getMessage());
-            return [];
+            return false;
         }
     }