typeName = array('1' => '选择题', '11' => '不定项选择题', '5' => '填空题', '7' => '解答题', '17' => '选做解答题'); } /** * 第三方教学宝 * @throws CException */ public function actionIndex() { set_time_limit(300); ini_set('memory_limit', '300M'); $classId = Req::get("classId"); $examId = (string)Req::get("examId"); $force = (int)Req::get('force'); $viewHtml = (int)Req::get('viewHtml'); $subjectId = $this->subjectId; if ($viewHtml) { $force = 1; } if (!$examId || !is_numeric($examId)) { echo json_encode(array("status" => 1, "error" => "考试ID参数不正确!")); } $examObj = new Exam(); $examInfo = $examObj->getTeachingInfo($examId); if (!$examInfo) { echo json_encode(array("status" => 1, "error" => "没有考试信息!")); exit; } if ($examInfo['subject_id']) { $this->subjectId = $examInfo['subject_id']; } $subjectId = $this->subjectId; $this->logicTypeName = getSubjectTopicType($subjectId); $pdfpath = str_replace("protected", "", Yii::app()->basePath) . $examInfo['academicr_pdf_path']; $pdfurl = $examInfo['academicr_pdf_path']; $res = array();//生成pdf命令结果 if (strpos($examInfo['academicr_pdf_path'], 'http') !== false) { if (!file_get_contents($examInfo['academicr_pdf_path'])) { $force = 1; } } else { $force = 1; } //英语兼容新老标注 $getTopicTypeRelate = $this->getTopicTypeRelate(); $batch_subject_id = $subjectId; if ($batch_subject_id == 8 && $examInfo['qxk_paper_id']) { $batch_subject_id = 0; } if (!$examInfo['academicr_pdf_path'] || $examInfo['is_academicr_pdf'] == 0 || $force) { // if (!$examInfo['academicr_pdf_path'] || $examInfo['is_academicr_pdf'] == 0 || !$this->check_pdf($pdfpath) || $force) { //domain 域名 // if ($subjectId == 8) { // if (isset($_SESSION['myDatebase'])) { // $groupId = $_SESSION['myDatebase']->group_id; // }else{ // $groupId = 0; // } // // $groupServer = new BGroupServer(); // $this->domainUrl = $groupServer->getDomainUrl($groupId); // } $paperObj = new SPaper(); $ptrObj = new SPaperTopicRelation(); $ptlObj = new SPaperTopicLarge(); $sprObj = new SStudentPaperRelation(); $sptRsObj = new SStudentPaperTopicRs(); $tmt = new SThirdMultiTemplate(); $examGroupId = $examInfo['exam_group_id']; $arr = $tmt->getStatusByExamGroupId($examGroupId); if ($subjectId == 8 && $examInfo['is_third'] == 1 && !$examInfo['qxk_paper_id']) { $isUpload = 0; if ($arr) { foreach ($arr as $k => $v) { if ($k == 1 && $v['topic_upload'] == 1) { $isUpload++; } elseif ($k == 2 && $v['answer_upload'] == 1) { $isUpload++; } } } //精品试卷不用上传试题和答案,第三方需要 if ($examInfo['is_fine_paper'] <= 0 && $isUpload != 2) { echo json_encode(array("status" => 1, "error" => "试卷试题或答案没上传!")); exit(); } } $examIds = $examObj->getExamIds($examGroupId); $examGroupObj = new SExamGroup(); $isThird = $examGroupObj->getExamIsTird($examGroupId, $examId); $this->isThird = $isThird; //去除没有上传成绩的学生 $ptrInfo = $stuIdsArr = array(); if ($examIds) { $stuIdsArr = $sptRsObj->getHasScoreStu($examIds); $ptrInfo = $sprObj->getStudentExamInfo($examIds); } if (!$ptrInfo) { echo json_encode(array("status" => 1, "error" => "考试没有数据!")); exit(); } $paperIds = array(); foreach ($ptrInfo as $value) { $paperIds[$value['exam_id']] = $value['paper_id']; } //试卷总分 $paperScore = $paperObj->getPaperScore($paperIds); if (!$paperScore) { echo json_encode(array("status" => 1, "error" => "试卷总分不正确!")); exit(); } /**************************** 一、班级情况分析 ***********************************/ //获取当前考试的上一次考试数据 $cepObj = new SClassExamPrinter(); $preInfo = $cepObj->getPreExamId($examId, $examInfo['subject_id'], $examInfo['class_id']); $preExamId = isset($preInfo['exam_id']) ? $preInfo['exam_id'] : ''; $preExamGroupId = isset($preInfo['exam_group_id']) ? $preInfo['exam_group_id'] : ''; $prePaperScore = 0; $preStuIdsArr = array(); if ($preExamId) { $preExamIds = $examObj->getExamIds($preExamGroupId); //去除没有上传成绩的学生 $prePtrInfo = array(); if ($preExamIds) { $preStuIdsArr = $sptRsObj->getHasScoreStu($preExamIds); $prePtrInfo = $sprObj->getStudentExamInfo($preExamIds); } $prePaperIds = array(); foreach ($prePtrInfo as $value) { $prePaperIds[$value['exam_id']] = $value['paper_id']; } if ($prePaperIds) { $prePaperScore = $paperObj->getPaperScore($prePaperIds); } } else { $prePtrInfo = array(); } if (!$prePaperScore && $prePtrInfo) { echo json_encode(array("status" => 1, "error" => "试卷总分不正确!")); exit(); } if (isset($paperIds[$examId])) { $paperId = $paperIds[$examId]; } else { echo json_encode(array("status" => 1, "error" => "试卷id没有考试信息!")); exit(); } //班级排名得分率人数等数据 $classAnalyData = $this->getClassAnalyse($examId, $ptrInfo, $paperScore, $preExamId, $prePtrInfo, $prePaperScore, $stuIdsArr, $preStuIdsArr); //大幅进步,大幅退步,前5名和后5名 $largeOrderData = $this->getLargeOrder($examId, $ptrInfo, $preExamId, $prePtrInfo, $stuIdsArr, $preStuIdsArr); $sutName = isset($largeOrderData['stu_name']) ? $largeOrderData['stu_name'] : array(); $sutOrder = isset($largeOrderData['stu_order']) ? $largeOrderData['stu_order'] : array(); unset($ptrInfo); unset($prePtrInfo); /**************************** 二、考试情况分析 ***********************************/ //试卷题对应的题号,分数 list($largeTopicType, $largeTopicMethod) = $ptlObj->getPaperLargeTopicInfo($paperId); list($smallTopicScore, $smallTopicNo, $topicScore, $topicNo, $topicType, $topicLogicType, $topicRelLarge, $topicRelMethod, $topicTypeRelNo, $topicRelTopicCount) = $ptrObj->getPaperTopicInfo2($paperId, $largeTopicType, $subjectId, $examInfo); if (!$topicScore) { echo json_encode(array("status" => 1, "error" => "没有试卷题数据!")); exit(); } // // 学生得分 $stuRs = $sptRsObj->getStudentRs($paperIds); if (!$stuRs) { echo json_encode(array("status" => 1, "error" => "没有学生做题数据!")); exit(); } // $examAnalyData = $this->getExamAnalyse($stuRs,$topicScore,$topicNo,$paperId,$topicRelLarge); $typeMasterData = $this->getTopicTypeAnaly($stuRs, $topicScore, $topicNo, $paperId, $topicLogicType, $topicRelLarge, $smallTopicNo); //英语全学科判断 if ($subjectId == 8 && $examInfo['qxk_paper_id']) { $newTopicTypeRelNo = array(); foreach ($topicTypeRelNo as $topic_type => $topic_data) { if (isset($getTopicTypeRelate[$topic_type])) { $newTopicTypeRelNo[$getTopicTypeRelate[$topic_type]] = $topic_data; } else { $newTopicTypeRelNo[$topic_type] = $topic_data; } } $topicTypeRelNo = $newTopicTypeRelNo; } //班级高频错题 统计班级得分率小于50%的题目 $high_rate_wrong_topic = array(); if ($typeMasterData['type_name_arr']) { foreach ($typeMasterData['type_name_arr'] as $large_type => $type_name) { if (isset($topicTypeRelNo[$large_type])) { $high_rate_wrong_topic[$large_type] = array(array(), array(), array(), array(), array()); foreach ($topicTypeRelNo[$large_type] as $topic_id => $topic_no) { $topic_class_rate = isset($typeMasterData['topic_class_rate'][$topic_id]) ? $typeMasterData['topic_class_rate'][$topic_id] : 0; if ($topic_class_rate <= 10) { $high_rate_wrong_topic[$large_type][0][] = $smallTopicNo[$topic_id]; } elseif ($topic_class_rate > 10 && ($topic_class_rate <= 20)) { $high_rate_wrong_topic[$large_type][1][] = $smallTopicNo[$topic_id]; } elseif ($topic_class_rate > 20 && ($topic_class_rate <= 30)) { $high_rate_wrong_topic[$large_type][2][] = $smallTopicNo[$topic_id]; } elseif ($topic_class_rate > 30 && ($topic_class_rate <= 40)) { $high_rate_wrong_topic[$large_type][3][] = $smallTopicNo[$topic_id]; } elseif ($topic_class_rate > 40 && ($topic_class_rate <= 50)) { $high_rate_wrong_topic[$large_type][4][] = $smallTopicNo[$topic_id]; } } } } } $typeMasterData['high_rate_wrong_topic'] = $high_rate_wrong_topic; $typeRateImgUrl = array(); // if($subjectId == 8){ // //题型得分率图片 // $typeRateImgUrl = $this->getTopicTypeRateImg($typeMasterData,$examId,$paperId); // if(!$typeRateImgUrl){ // echo json_encode(array("status" => 1, "error" => "题型得分率图片未生成!")); // exit(); // } // } /**************************** 三、考点掌握情况 ***********************************/ // 15,3,5,2,6,18,13 // $topicNo = array( // '10001190' => 4, // '10000151' => 6, // '10000917' => 7, // '10000166' => 8, // '10001228' => 9, // '10000405' => 10, // '10001172' => 11, // '10001174' => 12, // '10048797' => 14, // '10096054' => 16, // '10095990' => 17, // '10017696' => 18, // '10017824' => 19, // '10096052' => 20, // ); //题信息 $topicIds = array_keys($topicNo); $tplData = array(); if ($examInfo['tpl_data']) { $tplData = $examInfo['tpl_data']; if ($tplData && !is_array($tplData)) { $tplData = json_decode($tplData, true); } } $isNewEnglish = (isset($tplData['isNewEnglish']) && $tplData['isNewEnglish'] == 1) ? 1 : 0; $_params = array('isFormat' => $subjectId == 8 ? 0 : 1, 'isTird' => $isThird, 'isNewEnglish' => $isNewEnglish, 'isNoReplaceLable' => 1); $topicDetails = $this->apiBrainPost('/topic/batchAll', array('topicIds' => $topicIds, 'subjectId' => $batch_subject_id, 'params' => $_params), 25, true); unset($tplData); // unset($examInfo['tpl_data']); // if(($this->subjectId == 8 && !$isThird) || (isset($tplData['isNewEnglish']) && $tplData['isNewEnglish'] == 1 && $isThird)){ // $topicDetails = $this->getEnglishTopic($topicIds); //// $topicDetails = $this->getEnglishTopic(array(20001740)); // }else{ // $topicDetails = $this->aipost('/topic/batchAll', array('topicIds' => $topicIds)); // } //获取考点名称 // $methodName = $this->getMethodName($topicDetails); $methodName = array(); $largeTopicScore = array(); if (!$topicDetails) { echo json_encode(array("status" => 1, "error" => "获取接口batchALL无数据!")); exit(); } elseif (isset($topicDetails['status']) && $topicDetails['status'] == 0) { echo json_encode(array("status" => 1, "error" => $topicDetails['error'][0])); exit(); } else { if ($subjectId == 8) { $tempDetials = array(); if ($examInfo['qxk_paper_id']) { $topicDetails = $this->quanTopicDetail($topicDetails); } foreach ($topicDetails as $detail) { //范文 // $fineArticle = $this->getFineArticle($examId,$topicLogicType); //语篇 $keyWords = array(); if (isset($getTopicTypeRelate[$detail['type_id']])) { $detail['type_id'] = $getTopicTypeRelate[$detail['type_id']]; } if (in_array($detail['type_id'], array(2, 3, 4, 5))) { $wordsIds = array(); $wordInfoArr = array(); if (isset($detail['key_words_levels']) && $detail['key_words_levels']) { $key_words_level = $detail['key_words_levels']; $class = array(); foreach ($key_words_level as $val) { $class[] = $val['level']; } array_multisort($class, SORT_DESC, $key_words_level); $_new_key_words = $key_words_level; $word_content = array(); foreach ($_new_key_words as $item) { $word_content[] = '"' . $item['name'] . '"'; } if ($word_content) { $wordInfoArr = $this->getWord(array('content' => $word_content, 'type_id' => array(1, 2), 'core_words' => 1, 'status' => 1)); $topic_word_level = array(); foreach ($wordInfoArr as $word_id => $word_info) { $level = isset($word_info['levels']) ? $word_info['levels'] : 0; $topic_word_level[$word_id] = $level; } arsort($topic_word_level); foreach ($topic_word_level as $word_id => $level) { if (count($wordsIds) <= 10) { $wordsIds[] = $word_id; } } } } if ($wordsIds) { foreach ($wordsIds as $w_id) { if (isset($wordInfoArr[$w_id])) { $keyWords[] = $wordInfoArr[$w_id]; } } $keyWords = $this->handleWordClass($keyWords); } unset($wordInfoArr); } $detail['key_words'] = $keyWords; if ($examInfo['qxk_paper_id']) { $detail['key_words'] = isset($detail['new_key_words']) ? $detail['new_key_words'] : array(); } //替换序号 // if (in_array($detail['type_id'], array(2,4,5,6,9, 10, 11, 12, 14))) { // $this->replaceTitle($detail['title'],$detail['id'],$topicRelLarge,$smallTopicNo); // } $detail['title'] = str_replace(' ', ' ', $detail['title']); $tempDetials[(string)$detail['id']] = $detail; } $topicDetails = $tempDetials; unset($tempDetials); //大题分数 foreach ($topicRelLarge as $small_id => $large_id) { if (!isset($largeTopicScore[$large_id])) { $largeTopicScore[$large_id] = 0; } $largeTopicScore[$large_id] += $topicScore[$small_id]; } } } $diff_id_arr = array_diff($topicIds, array_keys($topicDetails)); if ($diff_id_arr) { //todo 发送消息到补提 echo json_encode(array("status" => 1, "error" => "没有试题内容!(" . implode(',', $diff_id_arr) . ")")); exit; } //1.薄弱考点统计 //2.薄弱考点掌握较差学生名单 //3.班级排名后25%学生的薄弱考点 $pramas = array($smallTopicScore, $smallTopicNo, $paperId, $topicType, $topicLogicType, $topicRelLarge, $topicRelMethod, $largeTopicMethod, $sutName, $sutOrder, $methodName); // $methodCount = $this->getMethodCount($stuRs,$pramas); $methodCount = array(); //4.考点掌握情况变化趋势 //生成图片 // if($subjectId == 8){ if (false) { $_classRate = array(); $thirdExam = $cepObj->getTirdExamIds($examId, $examInfo['subject_id'], $examInfo['class_id']); if (count($thirdExam) > 3) { $thirdExamIds = array(); $examTime = array(); foreach ($thirdExam as $value) { $thirdExamIds[] = $value['exam_id']; $examTime[$value['exam_id']] = $value['add_time']; } list($paperRelExam, $exmaRelPaper) = $paperObj->getPaperIdsByExamIds($thirdExamIds); $_topicScore = array(); $_topicMethod = array(); $_stuRs = array(); if ($paperRelExam) { $thirdPaperInfo = $ptrObj->getPaperInfos($paperRelExam); foreach ($thirdPaperInfo as $item) { $_topicScore[$item['topic_id']] = $item['score']; $_topicMethod[$item['topic_id']] = explode(',', $item['method_ids']); } $_stuRs = $sptRsObj->getStudentRs($paperRelExam); } $_scoring = $_score = array(); foreach ($_stuRs as $stuId => $stuR) { foreach ($stuR as $tId => $item) { $pId = $item['paper_id']; $eId = isset($exmaRelPaper[$pId]) ? $exmaRelPaper[$pId] : 0; $eTime = isset($examTime[$eId]) ? $examTime[$eId] : 0; if (!$eTime) continue; $_tScore = isset($_topicScore[$tId]) ? $_topicScore[$tId] : 0; if (isset($_topicMethod[$tId]) && $_topicMethod[$tId]) { foreach ($_topicMethod[$tId] as $mId) { if (!$mId) { continue; } if (!isset($_scoring[$eTime])) { $_scoring[$eTime] = array(); } if (!isset($_scoring[$eTime][$mId])) { $_scoring[$eTime][$mId] = 0; } $_scoring[$eTime][$mId] += $item['scoring']; if (!isset($_score[$eTime])) { $_score[$eTime] = array(); } if (!isset($_score[$eTime][$mId])) { $_score[$eTime][$mId] = 0; } $_score[$eTime][$mId] += $_tScore; } } } } foreach ($_scoring as $eTime => $scorings) { if (!isset($_classRate[$eTime])) { $_classRate[$eTime] = array(); } foreach ($scorings as $mId => $scoring) { if (isset($_score[$eTime]) && isset($_score[$eTime][$mId]) && $_score[$eTime][$mId]) { $_classRate[$eTime][$mId] = round($scoring / $_score[$eTime][$mId], 4) * 100; } else { $_classRate[$eTime][$mId] = 0; } } } } ksort($_classRate); //三次考试同一考点的得分率 $timeMethodRate = array(); foreach ($_classRate as $time => $rates) { foreach ($rates as $mId => $rate) { if (!isset($timeMethodRate[$mId])) { $timeMethodRate[$mId] = array(); } $timeMethodRate[$mId][] = $rate; $timeMethodRate[$mId][] = $rate; $timeMethodRate[$mId][] = $rate; } } //取出符合规则的三个考点 $rateCompare = array(); foreach ($timeMethodRate as $mId => $rates) { $rate_1 = $rates[2] - $rates[1]; $rate_2 = $rates[1] - $rates[0]; $rateCompare[$mId] = $rate_1 - $rate_2; } arsort($rateCompare); $rateCompare = array_slice($rateCompare, 0, 3, true); $timeMethodRate = array(); foreach ($_classRate as $time => $rates) { foreach ($rates as $mId => $rate) { if (isset($rateCompare[$mId])) { if (!isset($timeMethodRate[$mId])) { $timeMethodRate[$mId] = array(); } $timeMethodRate[$mId][] = $rate; } } } $imgPath = str_replace("protected", "", Yii::app()->basePath) . 'assets/temp_img/'; $urlPath = Yii::app()->request->hostInfo . '/assets/temp_img/'; $methodRatePath = $imgPath . $examId . "_rate.png"; $methodRateUrl = $urlPath . $examId . "_rate.png"; $this->imgArr[] = $methodRatePath; if (count($timeMethodRate) >= 3) { $this->getImage($methodRatePath, $timeMethodRate); } if (!file_exists($methodRatePath)) { // echo json_encode(array("status" => 1, "error" => "考点得分率图片未生成!")); // exit(); $methodRateUrl = ''; } } else { $methodRateUrl = ''; } /**************************** 四、试卷讲评 ***********************************/ //选择题 $choinceIds = $this->getChoiceIds($topicType, $topicLogicType, $subjectId, $examInfo['tpl_index']); //试题年级和班级得分率,答对和答错人数 $topicRateStu = $this->getTopicRateWrongPerson($stuRs, $topicScore, $paperId, $stuIdsArr, $topicRelLarge, $choinceIds, $sutName, $topicLogicType); $common_practice = array(); $commonTopicDetail = array(); if ($subjectId == 8) { $commonCheck = SProductSetting::model()->getCommonSetting($classId, $subjectId, 6); if ($commonCheck) { if ($examInfo['academicr_common_practice']) { $common_push_all_topics = array(); $common_practice = json_decode($examInfo['academicr_common_practice'], true); foreach ($common_practice as $type => $cp_info) { if ($type == 'min_rate_text' || $type == 'common_extra') { $t_ids = _array_column($cp_info, 'topic_id'); $common_push_all_topics = array_merge($common_push_all_topics, $t_ids); } else { foreach ($cp_info as $topic_type => $t_info) { $t_ids = _array_column($t_info, 'topic_id'); $common_push_all_topics = array_merge($common_push_all_topics, $t_ids); } } } } else { //20211221新逻辑:学生提分宝不生成共性问题的话 教师讲案直接不生成 echo json_encode(array("status" => 1, "error" => "共性题未生成!")); exit; $common_wrong_topic = $this->getCommonPractice($topicDetails, $topicRateStu['large_topic_score'], $stuRs, $largeTopicType, $topicRateStu['large_contain_score']); list($common_practice, $common_push_all_topics) = $common_wrong_topic; $sql = "update exam set academicr_common_practice = '" . json_encode($common_practice) . "' where exam_id={$examId}"; $dbConn = Exam::model()->getDbConnection(); $dbConn->createCommand($sql)->execute(); } if ($common_push_all_topics) { $commonTopicDetail = $this->apiBrainPost('/topic/batchAll', array('topicIds' => array_values($common_push_all_topics), 'subjectId' => $batch_subject_id, 'params' => array('isNoReplaceLable' => 1)), 25, true); if (!$commonTopicDetail) { echo json_encode(array("status" => 1, "error" => "获取接口batchALL无数据!")); exit(); } elseif (isset($commonTopicDetail['status']) && $commonTopicDetail['status'] == 0) { echo json_encode(array("status" => 1, "error" => $commonTopicDetail['error'][0])); exit(); } else { $tempDetials = array(); if ($examInfo['qxk_paper_id']) { $commonTopicDetail = $this->quanTopicDetail($commonTopicDetail); } foreach ($commonTopicDetail as $detail) { if (isset($getTopicTypeRelate[$detail['type_id']])) { $detail['type_id'] = $getTopicTypeRelate[$detail['type_id']]; } $tempDetials[(string)$detail['id']] = $detail; } $commonTopicDetail = $tempDetials; } } } } //echo 111;exit; $topicTypeScore = array(); if ($subjectId == 8) { //题型重新按照组卷顺序排序 $new_type_name_arr = array(); $new_high_rate_wrong_topic = array(); $new_class_rate = array(); $new_type_order = array_keys($topicTypeRelNo); if ($new_type_order) { foreach ($new_type_order as $new_type) { if (isset($this->logicTypeName) && isset($this->logicTypeName[$new_type]) && $this->logicTypeName[$new_type]) { $new_type_name_arr[$new_type] = $this->logicTypeName[$new_type]; } else { $new_type_name_arr[$new_type] = ''; } if (isset($typeMasterData['high_rate_wrong_topic']) && $typeMasterData['high_rate_wrong_topic'] && isset($typeMasterData['high_rate_wrong_topic'][$new_type])) { $new_high_rate_wrong_topic[$new_type] = $typeMasterData['high_rate_wrong_topic'][$new_type]; } if (isset($typeMasterData['class_rate']) && $typeMasterData['class_rate'] && isset($typeMasterData['class_rate'][$new_type])) { $new_class_rate[$new_type] = $typeMasterData['class_rate'][$new_type]; } } } if ($new_type_name_arr) { $typeMasterData['type_name_arr'] = $new_type_name_arr; } if ($new_high_rate_wrong_topic) { $typeMasterData['high_rate_wrong_topic'] = $new_high_rate_wrong_topic; } if ($new_class_rate) { $typeMasterData['class_rate'] = $new_class_rate; } //获取题型对应题目关系 $typeToTopicIds = array(); if ($topicDetails) { foreach ($topicDetails as $topicIdTemp => $topicDetailTemp) { if (isset($topicDetailTemp['type_id']) && $topicDetailTemp['type_id']) { $typeToTopicIds[$topicDetailTemp['type_id']][] = (string)$topicIdTemp; } } } //增加班级题型得分表 if ($topicTypeRelNo) { foreach ($topicTypeRelNo as $typeTemp => $topicNoDataTemp) { if ($topicNoDataTemp) { $topicTypeScore[$typeTemp]['score'] = 0; $topicTypeScore[$typeTemp]['class_score'] = 0; $topicTypeScore[$typeTemp]['grade_score'] = 0; $topicTypeScore[$typeTemp]['diff_score'] = 0; $topicTypeScore[$typeTemp]['no'] = ''; $tempClassScore = $tempGradeScore = $tempClassCount = $tempGradeCount = 0; $tempClassStuIds = $tempGradeStuIds = array(); if (isset($topicRateStu) && $topicRateStu && isset($topicRateStu['large_topic_score']) && $topicRateStu['large_topic_score']) { foreach ($topicRateStu['large_topic_score'] as $stuIdTemp => $stuScoreTemp) { foreach ($stuScoreTemp as $tempTopicIdK => $tempTopicIdV) { if (isset($typeToTopicIds[$typeTemp]) && $typeToTopicIds[$typeTemp] && in_array((string)$tempTopicIdK, $typeToTopicIds[$typeTemp], true)) { if (isset($sutName[$stuIdTemp])) {//本班 $tempClassScore += (isset($tempTopicIdV['scoring']) && $tempTopicIdV['scoring']) ? $tempTopicIdV['scoring'] : 0; // $tempClassCount ++; $tempClassStuIds[] = (string)$stuIdTemp; } $tempGradeScore += (isset($tempTopicIdV['scoring']) && $tempTopicIdV['scoring']) ? $tempTopicIdV['scoring'] : 0; // $tempGradeCount ++; $tempGradeStuIds[] = (string)$stuIdTemp; } } } } if ($tempClassStuIds) { $tempClassCount = count(array_unique($tempClassStuIds)); $topicTypeScore[$typeTemp]['class_score'] = round($tempClassScore / $tempClassCount, 1); } if ($tempGradeStuIds) { $tempGradeCount = count(array_unique($tempGradeStuIds)); $topicTypeScore[$typeTemp]['grade_score'] = round($tempGradeScore / $tempGradeCount, 1); } $topicTypeScore[$typeTemp]['diff_score'] = round($topicTypeScore[$typeTemp]['class_score'] - $topicTypeScore[$typeTemp]['grade_score'], 1); if (isset($typeToTopicIds[$typeTemp]) && $typeToTopicIds[$typeTemp]) { foreach ($typeToTopicIds[$typeTemp] as $bigTopicTemp) { if (isset($largeTopicScore[$bigTopicTemp]) && $largeTopicScore[$bigTopicTemp]) { $topicTypeScore[$typeTemp]['score'] += $largeTopicScore[$bigTopicTemp]; } } } $topicNoValue = array_values($topicNoDataTemp); if (count($topicNoValue) == 1) { $topicTypeScore[$typeTemp]['no'] = $topicNoValue[0]; } else { $topicTypeScore[$typeTemp]['no'] = min($topicNoValue) . '-' . max($topicNoValue); } } } } } $data = array(); $data['examInfo'] = $examInfo; $data['classAnalyData'] = $classAnalyData; $data['largeOrderData'] = $largeOrderData; // $data['examAnalyData'] = $examAnalyData; $data['typeMasterData'] = $typeMasterData; $data['typeRateImg'] = $typeRateImgUrl; $data['methodCount'] = $methodCount; $data['topicDetails'] = $topicDetails; $data['paperTopicNo'] = $topicNo; $data['smallTopicNo'] = $smallTopicNo; $data['topicTypeRelNo'] = $topicTypeRelNo; $data['topicRateStu'] = $topicRateStu; $data['methodRateUrl'] = $methodRateUrl; $data['subjectId'] = $subjectId; $data['isThird'] = $isThird; $data['sutName'] = $sutName; $data['methodName'] = $methodName; $data['logicTypeName'] = $this->logicTypeName; $data['topic_score'] = $largeTopicScore; $data['topic_rel_topic_count'] = $topicRelTopicCount; $data['common_practice'] = $common_practice; $data['common_topic_detail'] = $commonTopicDetail; $data['topicTypeScore'] = $topicTypeScore; //echo json_encode($data);exit; if ($subjectId == 8) { $html_name = 'en_teach'; } else { $html_name = 'teach'; } if ($viewHtml) { $this->renderPartial("teaching/{$html_name}", $data); exit(); } else { $html = $this->renderPartial("teaching/{$html_name}", $data, true); } unset($data); $htmlpath = str_replace("protected", "", Yii::app()->basePath) . '/upload/tmpDir/academicr/'; //存放生成的HTML路径 $pdfpath = str_replace("protected", "", Yii::app()->basePath) . '/upload/tmpDir/academicr/' . $this->schoolId . "/"; //存放生成的PDF路径 $pdfurl = '/upload/tmpDir/academicr/' . $this->schoolId . "/"; if (!is_dir($htmlpath)) { if (!mkdir($htmlpath, 0777, true)) { exit('Create directory fail: ' . $htmlpath); } } if (!is_dir($pdfpath)) { if (!mkdir($pdfpath, 0777, true)) { exit('Create directory fail1: ' . $pdfpath); } } $htmlpath .= $examId . ".html"; $f = fopen($htmlpath, "w"); fwrite($f, $html); fclose($f); $htmlurl = '/upload/tmpDir/academicr/' . $examId . ".html"; //访问HTML的路径 if (Yii::app()->basePath == "E:\wamp64\www\zsyas2\protected") {//本地的basePath $htmlurl = " http://local.zsyas2teaching.com" . '/' . $examId . '.html'; $pdffname = $classId . "-" . $examId . ".pdf"; $pdfpath = $pdfpath . $pdffname; $pdfurl = $pdfurl . $pdffname; $commond = Yii::app()->params['phantomjs'] . " " . Yii::app()->params['html2pdf'] . " " . " {$htmlurl}" . " {$pdfpath}" . " 176mm*250mm ''"; } else { $server = Yii::app()->params['phantomjs_server']; $js = 'html2pdf.js'; if ($subjectId == 8) { $server = Yii::app()->params['phantomjs_server_en']; $js = 'html2pdf_en.js'; } $htmlurl = "http://" . $_SERVER['SERVER_NAME'] . $htmlurl; $pdffname = $classId . "-" . $examId . ".pdf"; $pdfpath = $pdfpath . $pdffname; $pdfurl = $pdfurl . $pdffname; $commond = $server . " " . Yii::app()->basePath . '/../js/' . $js . " " . " {$htmlurl}" . " {$pdfpath}" . " 176mm*250mm ''"; } exec($commond, $res, $code); //删除生成的图片 $this->delCreateImgs(); $ucloud = new Qcloud(); //上传html $rehtml = $examId . ".html"; $rehtmlname = 'zsyas2/math_academicr/' . $this->schoolId . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/' . uniqid() . '.' . $rehtml; $uploadHtmlInfo = $ucloud->putFile($rehtmlname, $htmlpath); if ($uploadHtmlInfo['status'] == 0) { $html_url = "http://" . $_SERVER['SERVER_NAME'] . $htmlurl; } else { $html_url = $uploadHtmlInfo['url']; @unlink($htmlpath); } $this->sConn->createCommand()->update("exam", array("academicr_html_path" => $html_url), "exam_id = '{$examId}'"); if (isset($res[0])) { $isBool = false; foreach ($res as $msg) { if (strpos($msg, 'succeed') !== false) { $isBool = true; } } if ($isBool) {//命令返回成功 if (file_exists($pdfpath)) { // $pdfurl=iconv("GBK", "UTF-8",$pdfurl); $repdf = $examId . ".pdf"; $rename = 'zsyas2/academicr/' . $this->schoolId . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/' . uniqid() . '.' . $repdf; $uploadInfo = $ucloud->putFile($rename, $pdfpath); if ($uploadInfo['status'] == 0) { $pdfurl = "http://" . $_SERVER['SERVER_NAME'] . $pdfurl; $this->sConn->createCommand()->update("exam", array("academicr_pdf_path" => $pdfurl, "academicr_pdf_time" => time(), "is_academicr_pdf" => 1), "exam_id = '{$examId}'"); // if($uploadInfo['msg']){ // exit(json_encode(array("status" => 0, "error" => $uploadInfo['msg']))); // }else{ // exit(json_encode(array("status" => 0, "error" => 'PDF文件上传失败'))); // } //throw new CException("PDF文件上传失败"); } else { $pdfurl = $uploadInfo['url']; $this->sConn->createCommand()->update("exam", array("academicr_pdf_path" => $pdfurl, "academicr_pdf_time" => time(), "is_academicr_pdf" => 1), "exam_id = '{$examId}'"); @unlink($pdfpath); } @unlink($htmlpath); } else { $this->sConn->createCommand()->update("exam", array("academicr_pdf_path" => "", "academicr_pdf_time" => 0, "is_academicr_pdf" => 0), "exam_id = '{$examId}'"); @unlink($htmlpath); echo json_encode(array("status" => 1, "error" => "PDF文件未找到!")); exit; } } else { @unlink($htmlpath); echo json_encode(array("status" => 1, "error" => "PDF创建失败!", 'exec_rs' => json_encode($res))); exit; } } else { Curl::post(Yii::app()->params['handle_log_api'], array( "exam_group_id" => (string)$examGroupId, "operate_project" => 'zsyas2', "school_id" => $this->schoolId, "title" => '下载教师讲案', "operate_account" => Yii::app()->session['coachInfo']['coach_name'], "operate_method" => $this->action, "operate_url" => $this->getRoute(), "operate_sql" => '', "operate_param" => json_encode(array('post' => array("examId" => $examId, "pdf" => array("commond" => $commond, "res" => $res, "code" => $code), "htmlurl" => $htmlurl))), )); echo json_encode(array("status" => 1, "error" => "PDF创建失败!")); exit; } } if (fileGetContents($pdfurl)) { // if ($this->check_pdf($pdfpath)) { echo json_encode(array("status" => 0, "error" => "", "is_create" => 1, 'exec_rs' => json_encode($res))); exit; } else { echo json_encode(array("status" => 1, "error" => "文件尚未生成!!", 'exec_rs' => json_encode($res))); exit; } } //替换序号 private function replaceTitle(&$title, $topicId, $topicRelLarge, $smallTopicNo) { // $str = ''; $topicNoArr = array(); foreach ($topicRelLarge as $small_id => $large_id) { if ($topicId == $large_id && isset($smallTopicNo[$small_id])) { $topicNoArr[] = $smallTopicNo[$small_id]; } } $imgArr = array(); $pattern = "//"; preg_match_all($pattern, $title, $match); if (isset($match[0]) && $match[0]) { foreach ($match[0] as $img) { $pattern = "/data-num=[\"|\'](\d{0,2})[\"|\']/"; preg_match_all($pattern, $img, $match); if (isset($match[0]) && isset($match[1]) && isset($match[1][0])) { $imgArr[$match[1][0]] = $img; } } } if (count($imgArr) == count($topicNoArr)) { asort($topicNoArr); $searchArr = $replaceArr = array(); foreach ($topicNoArr as $key => $no) { $searchArr[] = isset($imgArr[$key]) ? $imgArr[$key] : ''; $replaceArr[] = ' (' . $no . ') '; } $title = str_replace($searchArr, $replaceArr, $title); } } /** * 精品范文 * @return array */ public function getFineArticle($examId, $topicLogicType) { $fineArticle = array(); $studentModelEssay = new SStudentModelEssay(); $stuRsIds = $studentModelEssay->getStuRsId($examId); if (!$stuRsIds) { return $fineArticle; } $sptr = new SStudentPaperTopicRs(); $rsInfo = $sptr->getStuRsByIds($stuRsIds); if ($rsInfo) { foreach ($rsInfo as $v) { $id = $v['id']; $ansUrl = $v['answer_trace']; $topic_id = $v['topic_id']; $type = isset($topicLogicType[$topic_id]) ? $topicLogicType[$topic_id] : 0; if (!$ansUrl) { $ansUrl = $v['simplify_answer_url']; } if (!$ansUrl) { $ansUrl = $v['answer_url']; } $ansUrl = answer_process($this->domainUrl, $ansUrl); if (!isset($fineArticle[$type])) { $fineArticle[$type] = array(); } if ($v['answer_url']) { $fineArticle[$type][$id] = $ansUrl; } else { $fineArticle[$type][$id] = ''; } } } return $fineArticle; } //获取词汇 private function getWord($condition) { $wordsInfo = array(); // $params = array( // '_id' => array('$in' => array_values($word_ids)) // ); // // return IspMongo::selectMongo('english_single',$params); $rs = $this->apiBrainPost('/zsytk2/getIspInfo', array('condition' => $condition, 'table' => 'en_single_word', 'isAll' => 1), 25, true); if (isset($rs['status']) && $rs['status'] == 1 && isset($rs['data']) && $rs['data']) { foreach ($rs['data'] as $v) { $wordsInfo[$v['single_word_id']] = $v; } } return $wordsInfo; } private function check_pdf($pdf_path) { if (substr($pdf_path, strlen($pdf_path) - 4, 4) == ".pdf") { if (file_exists($pdf_path)) { return true; } } return false; } /** * 班级排名得分率人数等数据 * @param $examId * @param $ptrInfo * @param $paperScore * @param $preExamId * @param $prePtrInfo * @param $prePaperScore * @return array */ private function getClassAnalyse($examId, &$ptrInfo, $paperScore, $preExamId, &$prePtrInfo, $prePaperScore, &$stuIdsArr, &$preStuIdsArr) { $result = array(); $gradePerson = $classPerson = 0;//参考人数 $gradeAbsentPerson = $classAbsentPerson = 0;//缺考人数 $gradeOrder = $classOrder = 0; //排名 $gradeAvgScore = $classAvgScore = 0; //平均分 $gradeScoreRate = $classScoreRate = 0; //得分率 $gradeFineRate = $classFineRate = 0; //优秀率 80% $gradePassRate = $classPassRate = 0; //合格率 60% $gradeLowRate = $classLowRate = 0; //低分率 30% $angData = array( 'class_num' => 0,//班级数量 'order' => 0, 'absent_person' => 0, 'exam_person' => 0, 'avg_score' => 0, 'score_rate' => 0, 'fine_rate' => 0, 'pass_rate' => 0, 'low_rate' => 0, ); $result['grade'] = $result['class'] = $angData; $gradeScoring = $classScoring = array(); $gradeScoringSum = array();//年级中每个考试的得分和 // $classScoringSum = 0;//考试得分和 $gradeStuScoringRate = $classStuScoringRate = array();//学生得分率 foreach ($ptrInfo as $value) { $stuIds = isset($stuIdsArr[$value['exam_id']]) ? $stuIdsArr[$value['exam_id']] : array(); if (!isset($gradeScoringSum[$value['exam_id']])) { $gradeScoringSum[$value['exam_id']] = 0; } if (inArray($value['student_id'], $stuIds)) { $gradeScoringSum[$value['exam_id']] += $value['scoring']; $gradeScoring[] = $value['scoring']; $gradeStuScoringRate[] = round($value['scoring'] / $paperScore, 4) * 100; $gradePerson++; } if (!inArray($value['student_id'], $stuIds)) { $gradeAbsentPerson++; } // if($examId == $value['exam_id']){ if (strcmp($examId, $value['exam_id']) == 0) { if (inArray($value['student_id'], $stuIds)) { // $classScoringSum += $value['scoring']; $classScoring[] = $value['scoring']; $classStuScoringRate[] = round($value['scoring'] / $paperScore, 4) * 100; $classPerson++; } if (!inArray($value['student_id'], $stuIds)) { $classAbsentPerson++; } } } unset($ptrInfo); $result['class']['class_num'] = count($gradeScoringSum); $result['grade']['exam_person'] = $gradePerson; $result['grade']['absent_person'] = $gradeAbsentPerson; $result['class']['exam_person'] = $classPerson; $result['class']['absent_person'] = $classAbsentPerson; //排名 if ($gradeScoringSum) { $scoringArr = array(); foreach ($gradeScoringSum as $eId => $scoring) { $stuCount = isset($stuIdsArr[$eId]) ? count($stuIdsArr[$eId]) : 0; if ($stuCount) { $scoringArr[$eId] = round($scoring / $stuCount, 2); } } if (isset($scoringArr[$examId])) { $classOrder = $this->getOrder($scoringArr[$examId], $scoringArr); } else { $classOrder = 0; } } $result['class']['order'] = $classOrder; //平均分,得分率 $count = count($gradeScoring); if ($count > 0) { $gradeAvgScore = round(array_sum($gradeScoring) / $count, 2);//平均分 $gradeScoreRate = round(array_sum($gradeScoring) / ($paperScore * $count), 4) * 100;//得分率 } else { $gradeAvgScore = 0; $gradeScoreRate = 0; } $result['grade']['avg_score'] = $gradeAvgScore; $result['grade']['score_rate'] = $gradeScoreRate; $count = count($classScoring); if ($count > 0) { $classAvgScore = round(array_sum($classScoring) / $count, 2); $classScoreRate = round(array_sum($classScoring) / ($paperScore * $count), 4) * 100;//得分率 } else { $classAvgScore = 0; $classScoreRate = 0; } $result['class']['avg_score'] = $classAvgScore; $result['class']['score_rate'] = $classScoreRate; //优秀率,合格率,低分率 // $gradeFineRate = $classFineRate = 0; //优秀率 85% // $gradePassRate = $classPassRate = 0; //合格率 60% // $gradeLowRate = $classLowRate = 0; //低分率 30% $tempFineNum = $tempPassNum = $tempLowNum = 0; $rateCount = count($gradeStuScoringRate); foreach ($gradeStuScoringRate as $scoringRate) { if ($scoringRate >= 85) { $tempFineNum++; } if ($scoringRate >= 60) { $tempPassNum++; } if ($scoringRate <= 30) { $tempLowNum++; } } $gradeFineRate = round($tempFineNum / $rateCount, 4) * 100; $gradePassRate = round($tempPassNum / $rateCount, 4) * 100; $gradeLowRate = round($tempLowNum / $rateCount, 4) * 100; $result['grade']['fine_rate'] = $gradeFineRate; $result['grade']['pass_rate'] = $gradePassRate; $result['grade']['low_rate'] = $gradeLowRate; $tempFineNum = $tempPassNum = $tempLowNum = 0; $rateCount = count($classStuScoringRate); foreach ($classStuScoringRate as $scoringRate) { if ($scoringRate >= 85) { $tempFineNum++; } if ($scoringRate >= 60) { $tempPassNum++; } if ($scoringRate <= 30) { $tempLowNum++; } } if ($rateCount) { $classFineRate = round($tempFineNum / $rateCount, 4) * 100; $classPassRate = round($tempPassNum / $rateCount, 4) * 100; $classLowRate = round($tempLowNum / $rateCount, 4) * 100; } else { $classFineRate = 0; $classPassRate = 0; $classLowRate = 0; } $result['class']['fine_rate'] = $classFineRate; $result['class']['pass_rate'] = $classPassRate; $result['class']['low_rate'] = $classLowRate; /**************** 提升数据 ******************/ $result['class']['order_increase'] = 0; $result['class']['rate_increase'] = 0; $result['class']['fine_rate_increase'] = 0; if ($prePtrInfo) { $preClassStuScoringRate = array(); $preGradeScoringSum = array(); $preClassScoringSum = 0; $preClassScoring = array(); if ($prePtrInfo) { foreach ($prePtrInfo as $value) { $stuIds = isset($preStuIdsArr[$value['exam_id']]) ? $preStuIdsArr[$value['exam_id']] : array(); if (!isset($preGradeScoringSum[$value['exam_id']])) { $preGradeScoringSum[$value['exam_id']] = 0; } if (inArray($value['student_id'], $stuIds)) { $preGradeScoringSum[$value['exam_id']] += $value['scoring']; } // if($preExamId == $value['exam_id']){ if (strcmp($preExamId, $value['exam_id']) == 0) { if (inArray($value['student_id'], $stuIds)) { $preClassScoringSum += $value['scoring']; $preClassScoring[] = $value['scoring']; $preClassStuScoringRate[] = round($value['scoring'] / $prePaperScore, 4) * 100; } } } } //上一次考试排名 if ($gradeScoringSum) { $scoringArr = array(); foreach ($preGradeScoringSum as $eId => $scoring) { $stuCount = isset($preStuIdsArr[$eId]) ? count($preStuIdsArr[$eId]) : 0; if ($stuCount) { $scoringArr[$eId] = round($scoring / $stuCount, 2); } } if (isset($scoringArr[$preExamId])) { $preClassOrder = $this->getOrder($scoringArr[$preExamId], $scoringArr); } else { $preClassOrder = 0; } $result['class']['order_increase'] = -($classOrder - $preClassOrder); } $count = count($preClassScoring); if ($count > 0) { $preClassScoreRate = round(array_sum($preClassScoring) / ($prePaperScore * $count), 4) * 100;//得分率 $result['class']['rate_increase'] = $classScoreRate - $preClassScoreRate; } $tempFineNum = 0; $rateCount = count($preClassStuScoringRate); foreach ($preClassStuScoringRate as $scoringRate) { if ($scoringRate >= 85) { $tempFineNum++; } } if ($rateCount) { $preClassFineRate = round($tempFineNum / $rateCount, 4) * 100; } else { $preClassFineRate = 0; } $result['class']['fine_rate_increase'] = $classFineRate - $preClassFineRate; } return $result; } /** * 大幅进步,大幅退步,前5名和后5名 * @param $examId * @param $ptrInfo * @param $paperScore * @param $preExamId * @param $prePtrInfo * @param $prePaperScore */ private function getLargeOrder($examId, &$ptrInfo, $preExamId, &$prePtrInfo, &$stuIdsArr, &$preStuIdsArr) { $result = array(); $stuOrderArr = $this->getStudentOrder($examId, $ptrInfo, $stuIdsArr); $diffNum = ceil(count($stuOrderArr) * 0.2); if ($prePtrInfo) { $preStuOrderArr = $this->getStudentOrder($preExamId, $prePtrInfo, $preStuIdsArr); } else { $preStuOrderArr = array(); } if ($preStuOrderArr) { $interOrderArr = array_intersect_key($stuOrderArr, $preStuOrderArr); if (!$interOrderArr) { $interOrderArr = $stuOrderArr; } } else { $interOrderArr = array(); } //大幅进步,退步 $increaseArr = $reduceArr = array(); $stuDiffOrder = array(); if ($interOrderArr) { foreach ($stuOrderArr as $stuId => $order) { if (isset($interOrderArr[$stuId]) && isset($preStuOrderArr[$stuId])) { $stuDiffOrder[$stuId] = -($order - $preStuOrderArr[$stuId]); } else { $stuDiffOrder[$stuId] = 0; } } arsort($stuDiffOrder); foreach ($stuDiffOrder as $stuId => $num) { if ($num >= $diffNum) { $increaseArr[] = $stuId; } } $increaseArr = array_slice($increaseArr, 0, 5, true); asort($stuDiffOrder); foreach ($stuDiffOrder as $stuId => $num) { if ($num <= -$diffNum) { $reduceArr[] = $stuId; } } $reduceArr = array_slice($reduceArr, 0, 5, true); } else { $increaseArr = array_slice($stuOrderArr, 0, 5, true); $reduceArr = array(); } $result['stu_diff_order'] = $stuDiffOrder; $result['stu_order'] = $stuOrderArr; $result['increase_stu'] = $increaseArr; $result['reduce_stu'] = $reduceArr; //前5名和后5名 $font5 = $back5 = array(); $i = 1; $fonrt5_order = array(); foreach ($stuOrderArr as $stuId => $order) { if ($i <= 5) { $font5[] = $stuId; $fonrt5_order[] = $order; } else { break; } $i++; } $result['font_five'] = $font5; $i = 1; //删除前5排名 $_stuOrderArr = $stuOrderArr; foreach ($_stuOrderArr as $k => $order) { if (in_array($order, $fonrt5_order)) { unset($_stuOrderArr[$k]); } } arsort($_stuOrderArr); foreach ($_stuOrderArr as $stuId => $order) { if ($i <= 5) { $back5[] = $stuId; } else { break; } $i++; } $result['back_five'] = $back5; //学生名称 $stuInfoObj = new SStudentInfo(); $stuName = $stuInfoObj->getStudentNames(array_keys($stuOrderArr)); $result['stu_name'] = $stuName; unset($stuOrderArr); return $result; } /** * 考试情况分析 * @param $stuRs * @param $topicScore * @param $topicNo * @return array */ private function getExamAnalyse(&$stuRs, $paperTopicScore, $topicNo, $paperId, $topicRelLarge) { $result = array(); $stuTopicWrong = array();//题答错人数 $topicScoreRate = array();//题得分率 $topicScoring = array();//题得分 $topicScore = array();//题分 foreach ($stuRs as $stuId => $rs) { foreach ($rs as $v) { // if($paperId == $v['paper_id']){ if (strcmp($paperId, $v['paper_id']) == 0) { if (isset($topicRelLarge[$v['topic_id']]) && $topicRelLarge[$v['topic_id']] > 0) { $t_id = $topicRelLarge[$v['topic_id']]; } else { $t_id = $v['topic_id']; } $t_score = isset($paperTopicScore[$t_id]) ? $paperTopicScore[$t_id] : 0; if (!isset($topicScoring[$t_id])) { $topicScoring[$t_id] = 0; } $topicScoring[$t_id] += $v['scoring']; if (!isset($topicScore[$t_id])) { $topicScore[$t_id] = 0; } $topicScore[$t_id] += $t_score; if (!isset($stuTopicWrong[$t_id])) { $stuTopicWrong[$t_id] = array(); } if ($t_score != $v['scoring']) { $stuTopicWrong[$t_id][] = $stuId; } } } } //题得分率 foreach ($topicScoring as $topicId => $scoring) { if (isset($topicScore[$topicId]) && $topicScore[$topicId] > 0) { $topicScoreRate[$topicId] = round($scoring / $topicScore[$topicId], 4) * 100; } else { $topicScoreRate[$topicId] = 0; } } unset($topicScoring); //答错人数 if ($stuTopicWrong) { foreach ($stuTopicWrong as $key => $stuIds) { $stuIds = array_unique($stuIds); $stuTopicWrong[$key] = count($stuIds); } } $result['stu_topic_wrong'] = $stuTopicWrong; $result['topic_score_rate'] = $topicScoreRate; $result['topic_no'] = $topicNo; unset($stuTopicWrong); unset($topicScoreRate); unset($topicNo); unset($topicScore); return $result; } //题类型掌握情况 private function getTopicTypeAnaly(&$stuRs, $topicScore, $topicNo, $paperId, $topicLogicType, $topicRelLarge, $smallTopicNo) { $result = array(); $getTopicTypeRelate = $this->getTopicTypeRelate(); $gradeRate = $classRate = array();//班级和年级得分率 $stuTypeWrong = array();//题型答错人数 $typeTopicNo = array();//题型对应的题号 $typeMasterDegree = array();//题型掌握水平 $typeName = $this->typeName; $logicTypeName = $this->logicTypeName; $gradeScoreArr = $classScoreArr = array(); $gradeScoring = $classScoring = array(); $_gradeScore = $_classScore = array(); $_gradeScoring = $_classScoring = array(); $typeNameArr = array(); $allClassScore = $allClassScoring = array(); $paperScoreSum = array(); //优化strcmp($paperId ,$value['paper_id']) == 0 $paperIndexArr = array(); foreach ($stuRs as $stuId => $rs) { foreach ($rs as $value) { $paperIndexArr[$value['paper_id']] = 0; } } if ($paperIndexArr) { $paperIndexArr = array_keys($paperIndexArr); $paperIndexArr = array_flip($paperIndexArr); } //当前paper_id的索引 $curPaperIndex = isset($paperIndexArr[$paperId]) ? $paperIndexArr[$paperId] : false; foreach ($stuRs as $stuId => $rs) { foreach ($rs as $k => $value) { $tId = $value['topic_id']; $t_score = isset($topicScore[$value['topic_id']]) ? $topicScore[$value['topic_id']] : 0; if (isset($topicLogicType[$value['topic_id']]) && $topicLogicType[$value['topic_id']] > 0) { $type = $topicLogicType[$value['topic_id']]; if ($this->subjectId == 9) { $typeArr = explode('_', $type); if (count($typeArr) > 1) { $type = $typeArr[0]; } } if ($this->subjectId == 8) { if (isset($getTopicTypeRelate[$type])) { $type = $getTopicTypeRelate[$type]; } } $typeNameArr[$type] = isset($logicTypeName[$type]) ? $logicTypeName[$type] : ''; } else { $type = $value['type']; $typeNameArr[$type] = isset($typeName[$type]) ? $typeName[$type] : ''; } if (!isset($gradeScoring[$type])) { $gradeScoring[$type] = array(); } $gradeScoring[$type][] = $value['scoring']; if (!isset($gradeScoreArr[$type])) { $gradeScoreArr[$type] = 0; } $gradeScoreArr[$type] += $t_score; if (!isset($_gradeScoring[$tId])) { $_gradeScoring[$tId] = 0; } $_gradeScoring[$tId] += $value['scoring']; if (!isset($_gradeScore[$tId])) { $_gradeScore[$tId] = 0; } $_gradeScore[$tId] += $t_score; //当前班级 // if(strcmp($paperId ,$value['paper_id']) == 0){ if (isset($paperIndexArr[$value['paper_id']]) && $paperId !== false && $paperIndexArr[$value['paper_id']] == $curPaperIndex) { if (!isset($classScoring[$type])) { $classScoring[$type] = 0; } $classScoring[$type] += $value['scoring']; if (!isset($classScoreArr[$type])) { $classScoreArr[$type] = 0; } $classScoreArr[$type] += $t_score; if (!isset($stuTypeWrong[$type])) { $stuTypeWrong[$type] = array(); } if (!isset($stuTypeWrong[$type][$stuId])) { $stuTypeWrong[$type][$stuId] = array( 'scoring' => 0, 'score' => 0, ); } $stuTypeWrong[$type][$stuId]['scoring'] += $value['scoring']; $stuTypeWrong[$type][$stuId]['score'] += $t_score; if (!isset($typeTopicNo[$type])) { $typeTopicNo[$type] = array(); } //小题得分率 if (!isset($_classScoring[$tId])) { $_classScoring[$tId] = 0; } $_classScoring[$tId] += $value['scoring']; if (!isset($_classScore[$tId])) { $_classScore[$tId] = 0; } $_classScore[$tId] += $t_score; if (!isset($typeTopicNo[$type])) { $typeTopicNo[$type] = array(); } // if(isset($topicNo[$value['topic_id']])){ // $typeTopicNo[$type][] = $topicNo[$value['topic_id']]; // } } //所以班级 $pId = $value['paper_id']; if (!isset($allClassScoring[$pId])) { $allClassScoring[$pId] = array(); } if (!isset($allClassScoring[$pId][$type])) { $allClassScoring[$pId][$type] = 0; } $allClassScoring[$pId][$type] += $value['scoring']; if (!isset($allClassScore[$pId])) { $allClassScore[$pId] = array(); } if (!isset($allClassScore[$pId][$type])) { $allClassScore[$pId][$type] = 0; } $allClassScore[$pId][$type] += $t_score; if (!isset($paperScoreSum[$pId])) { $paperScoreSum[$pId] = 0; } $paperScoreSum[$pId] += $t_score; } } //年级得分率 foreach ($gradeScoring as $type => $scorings) { if (isset($gradeScoreArr[$type]) && $gradeScoreArr[$type]) { $gradeRate[$type] = round(array_sum($scorings) / $gradeScoreArr[$type], 2) * 100; } else { $gradeRate[$type] = 0; } } //班级得分率 foreach ($classScoring as $type => $scoring) { if (isset($classScoreArr[$type]) && $classScoreArr[$type] > 0) { $classRate[$type] = round($scoring / $classScoreArr[$type], 2) * 100; } else { $classRate[$type] = 0; } } //小题 //年级得分率 $_gradeRate = array(); foreach ($_gradeScoring as $tId => $scoring) { if (isset($_gradeScore[$tId]) && $_gradeScore[$tId]) { $_gradeRate[$tId] = round($scoring / $_gradeScore[$tId], 2) * 100; } else { $_gradeRate[$tId] = 0; } } //班级得分率 $_classRate = array(); foreach ($_classScoring as $tId => $scoring) { if (isset($_classScore[$tId]) && $_classScore[$tId] > 0) { $_classRate[$tId] = round($scoring / $_classScore[$tId], 2) * 100; } else { $_classRate[$tId] = 0; } } //题型对应题号排序 foreach ($typeTopicNo as $type => $nos) { asort($nos); $typeTopicNo[$type] = array_unique($nos); } //题型掌握水平: 85%包括85%以上,5星;75%-85%,包括75%,4星。65%-75%,包括65%,3星;55%-65%,包括55%,2星;55%以下1星。 foreach ($classRate as $type => $rate) { if ($rate >= 85) { $typeMasterDegree[$type] = 5; } elseif ($rate < 85 && $rate >= 75) { $typeMasterDegree[$type] = 4; } elseif ($rate < 75 && $rate >= 65) { $typeMasterDegree[$type] = 3; } elseif ($rate < 65 && $rate >= 55) { $typeMasterDegree[$type] = 2; } else { $typeMasterDegree[$type] = 1; } } //所有班级得分率 $allClassRate = array(); foreach ($allClassScoring as $pId => $scoringArr) { foreach ($scoringArr as $type => $scoring) { if (isset($allClassScore[$pId]) && isset($allClassScore[$pId][$type]) && $allClassScore[$pId][$type] > 0) { $allClassRate[$pId][$type] = round($scoring / $allClassScore[$pId][$type], 4) * 100; } else { $allClassRate[$pId][$type] = 0; } } } //班级题型/试卷总分 $typePaperRate = array(); foreach ($allClassScoring as $pId => $scoringArr) { foreach ($scoringArr as $type => $scoring) { $paperScore = isset($paperScoreSum[$pId]) ? $paperScoreSum[$pId] : 0; if ($paperScore > 0) { $typePaperRate[$pId][$type] = round($scoring / $paperScore, 4) * 100; } else { $typePaperRate[$pId][$type] = 0; } } } //题型答错人数 foreach ($stuTypeWrong as $type => $stuScore) { $wrongNum = 0; foreach ($stuScore as $stuId => $score) { if ($score['score'] != $score['scoring']) { $wrongNum++; } } $stuTypeWrong[$type] = $wrongNum; } $result['class_rate'] = $classRate; $result['grade_rate'] = $gradeRate; $result['all_class_rate'] = $allClassRate; $result['type_paper_rate'] = $typePaperRate; $result['stu_type_wrong'] = $stuTypeWrong; $result['type_topic_no'] = $typeTopicNo; $result['type_master_degree'] = $typeMasterDegree; $result['type_name_arr'] = $typeNameArr; $result['topic_grade_rate'] = $_gradeRate; $result['topic_class_rate'] = $_classRate; return $result; } /** * 试题年级和班级得分率,答对和答错人数 * @param $stuRs * @param $topicScore * @param $paperId * @return array */ public function getTopicRateWrongPerson(&$stuRs, $topicScore, $paperId, &$stuIdsArr, $topicRelLarge, $choinceIds, $sutName, $topicLogicType) { $gradeRate = $classRate = array();//班级和年级得分率 $wrongStu = $rightStu = array();//答对答错人数 $isChoiceTopic = array(); $stuNormalIds = array(); foreach ($stuIdsArr as $stuIds) { foreach ($stuIds as $stuId) { $stuNormalIds[$stuId] = 0; } } $gradeScoring = $classScoring = array(); $gradeScore = $classScore = array(); $doneTopicNum = array();//每题做题总人数 $stuScoring = $stuScore = array(); $classTopicScoring = array();//班级题得分 $choiceTopicWrong = array();//单选题答错统计 $stuLargeTopicScore = array();//学生大题得分统计 $largeContainScore = array(); $readingTopicIds = array(); $readingWrongStu = array(); //优化strcmp($paperId ,$value['paper_id']) == 0 $paperIndexArr = array(); foreach ($stuRs as $stuId => $rs) { foreach ($rs as $value) { $paperIndexArr[$value['paper_id']] = 0; } } if ($paperIndexArr) { $paperIndexArr = array_keys($paperIndexArr); $paperIndexArr = array_flip($paperIndexArr); } //当前paper_id的索引 $curPaperIndex = isset($paperIndexArr[$paperId]) ? $paperIndexArr[$paperId] : false; //阅读理解选项显示答错学生姓名 foreach ($topicLogicType as $tId => $logicType) { if ($logicType == 3 || $logicType == 42) { $readingTopicIds[] = $tId; } } foreach ($stuRs as $stuId => $rs) { if (!isset($stuNormalIds[$stuId])) { continue; } foreach ($rs as $k => $value) { if (isset($topicRelLarge[$value['topic_id']]) && $topicRelLarge[$value['topic_id']] > 0) { $t_id = $topicRelLarge[$value['topic_id']]; } else { $t_id = $value['topic_id']; } if (!isset($largeContainScore[$t_id])) { $largeContainScore[$t_id] = array(); } $largeContainScore[$t_id][$value['topic_id']] = $topicScore[$value['topic_id']]; if (!isset($stuLargeTopicScore[$stuId][$t_id])) { $stuLargeTopicScore[$stuId][$t_id] = array('scoring' => 0, 'score' => 0); } $stuLargeTopicScore[$stuId][$t_id]['scoring'] += $value['scoring']; $stuLargeTopicScore[$stuId][$t_id]['score'] += $topicScore[$value['topic_id']]; $t_score = isset($topicScore[$value['topic_id']]) ? $topicScore[$value['topic_id']] : 0; if (!isset($gradeScoring[$t_id])) { $gradeScoring[$t_id] = 0; } $gradeScoring[$t_id] += $value['scoring']; if (!isset($gradeScore[$t_id])) { $gradeScore[$t_id] = 0; } $gradeScore[$t_id] += $t_score; // if(strcmp($paperId,$value['paper_id']) == 0){ if (isset($paperIndexArr[$value['paper_id']]) && $paperId !== false && $paperIndexArr[$value['paper_id']] == $curPaperIndex) { if (!isset($classScoring[$t_id])) { $classScoring[$t_id] = 0; } $classScoring[$t_id] += $value['scoring']; if (!isset($classScore[$t_id])) { $classScore[$t_id] = 0; } $classScore[$t_id] += $t_score; if (!isset($wrongStu[$t_id])) { $wrongStu[$t_id] = array(); } // if($t_score != $value['scoring']){ // $wrongStu[$t_id][] = $stuId; // } if (!isset($doneTopicNum[$t_id])) { $doneTopicNum[$t_id] = array(); } $doneTopicNum[$t_id][] = $stuId; //学生得分率 if (!isset($stuScoring[$stuId])) { $stuScoring[$stuId] = array(); } if (!isset($stuScoring[$stuId][$t_id])) { $stuScoring[$stuId][$t_id] = 0; } $stuScoring[$stuId][$t_id] += $value['scoring']; if (!isset($stuScore[$stuId])) { $stuScore[$stuId] = array(); } if (!isset($stuScore[$stuId][$t_id])) { $stuScore[$stuId][$t_id] = 0; } $stuScore[$stuId][$t_id] += $t_score; //班级平均得分 if (!isset($classTopicScoring[$t_id])) { $classTopicScoring[$t_id] = array(); } $classTopicScoring[$t_id][] = $value['scoring']; //统计单选题答错人数 if (isset($topicLogicType[$t_id]) && $topicLogicType[$t_id] == 1) { if ($value['is_right'] != 1 && in_array($value['answer'], array('A', 'B', 'C', 'D', 'E'))) { if (!isset($choiceTopicWrong[$t_id])) { $choiceTopicWrong[$t_id] = array(); } if (!isset($choiceTopicWrong[$t_id][$value['answer']])) { $choiceTopicWrong[$t_id][$value['answer']] = 0; } $choiceTopicWrong[$t_id][$value['answer']]++; } } } if (in_array($value['topic_id'], $readingTopicIds)) { if (empty($value['is_right']) && $value['answer']) { if (!isset($readingWrongStu[$value['topic_id']])) { $readingWrongStu[$value['topic_id']][$value['answer']] = array(); } if (isset($sutName[$stuId])) { $readingWrongStu[$value['topic_id']][$value['answer']][] = $sutName[$stuId]; } } } } } //年级得分率 foreach ($gradeScoring as $tId => $scorings) { if (isset($gradeScore[$tId]) && $gradeScore[$tId] > 0) { $gradeRate[$tId] = round($scorings / $gradeScore[$tId], 4) * 100; } else { $gradeRate[$tId] = 0; } } //班级得分率 foreach ($classScoring as $tId => $scoring) { if (isset($classScore[$tId]) && $classScore[$tId] > 0) { $classRate[$tId] = round($scoring / $classScore[$tId], 4) * 100; } else { $classRate[$tId] = 0; } } //答错人数 foreach ($stuScore as $stuId => $tScores) { if (isset($stuScoring[$stuId])) { foreach ($tScores as $tId => $score) { $_scoring = isset($stuScoring[$stuId][$tId]) ? $stuScoring[$stuId][$tId] : 0; if ($score != $_scoring) { $wrongStu[$tId][] = $stuId; } } } } if ($wrongStu) { foreach ($wrongStu as $key => $stuIds) { $stuIds = array_unique($stuIds); $wrongStu[$key] = count($stuIds); if (isset($doneTopicNum[$key])) { $_stuIds = array_unique($doneTopicNum[$key]); $rightStu[$key] = count($_stuIds) - $wrongStu[$key]; } } } //题得分率低于70%的学 $rateLess70 = array(); if ($stuScoring) { foreach ($stuScoring as $stuId => $tScoring) { $stuScoreArr = isset($stuScore[$stuId]) ? $stuScore[$stuId] : array(); foreach ($tScoring as $tId => $scoring) { if (!isset($rateLess70[$tId])) { $rateLess70[$tId] = array(); } if (isset($stuScoreArr[$tId]) && $stuScoreArr[$tId] > 0) { $tempRate = round($scoring / $stuScoreArr[$tId], 4) * 100; } else { $tempRate = 0; } if (inArray($tId, $choinceIds)) { if ($tempRate < 100 && !inArray($stuId, $rateLess70[$tId])) { $rateLess70[$tId][] = $stuId; } $isChoiceTopic[] = $tId; } else { if ($tempRate < 70 && !inArray($stuId, $rateLess70[$tId])) { $rateLess70[$tId][] = $stuId; } } } } } foreach ($rateLess70 as $tId => $stuIds) { $nameArr = array(); foreach ($stuIds as $stuId) { $nameArr[] = isset($sutName[$stuId]) ? $sutName[$stuId] : ''; } $rateLess70[$tId] = implode('、', $nameArr); } //大题对应的小题个数 $large_rel_count = array(); foreach ($topicRelLarge as $tId => $ltId) { if (!isset($large_rel_count[$ltId])) { $large_rel_count[$ltId] = 0; } $large_rel_count[$ltId]++; } //班级平均分 $classTopicAvg = array(); foreach ($classTopicScoring as $tId => $scorings) { if ($scorings) { $classTopicAvg[$tId] = round(array_sum($scorings) / (count($scorings) / $large_rel_count[$tId]), 2); } else { $classTopicAvg[$tId] = 0; } } unset($classTopicScoring); //低于班级平均分 $rateLessAvg = array(); if ($stuScoring) { foreach ($stuScoring as $stuId => $tScoring) { foreach ($tScoring as $tId => $scoring) { if (!isset($rateLessAvg[$tId])) { $rateLessAvg[$tId] = array(); } if (isset($classTopicAvg[$tId]) && $scoring < $classTopicAvg[$tId]) { $rateLessAvg[$tId][$stuId] = $scoring; } } } } foreach ($rateLessAvg as $tId => $stuScoring) { if ($stuScoring) { asort($stuScoring); $nameArr = array(); foreach ($stuScoring as $stuId => $scoring) { $nameArr[] = isset($sutName[$stuId]) ? $sutName[$stuId] : ''; } $rateLessAvg[$tId] = implode('、', $nameArr); } else { $rateLessAvg[$tId] = ''; } } foreach ($readingWrongStu as $tId => $val) { foreach ($val as $option => $stuArr) { $readingWrongStu[$tId][$option] = implode('、', $stuArr); } } $result = array(); $result['grade_rate'] = $gradeRate; $result['class_rate'] = $classRate; $result['wrong_stu'] = $wrongStu; $result['right_stu'] = $rightStu; $result['rate_less_70'] = $rateLess70; $result['rate_less_avg'] = $rateLessAvg; $result['is_choice_topic'] = $isChoiceTopic; $result['choice_topic_wrong'] = $choiceTopicWrong; $result['large_topic_score'] = $stuLargeTopicScore; $result['large_contain_score'] = $largeContainScore; $result['reading_wrong_stu'] = $readingWrongStu; $gradeScoring = $classScoring = array(); $gradeScore = $classScore = array(); $doneTopicNum = array();//每题做题总人数 unset($gradeScoring); unset($classScoring); unset($gradeScore); unset($classScore); unset($doneTopicNum); unset($stuScoring); unset($stuScore); return $result; } /** * 获取学生排名 * @param $examId * @param $ptrInfo * @return array */ private function getStudentOrder($examId, &$ptrInfo, &$stuIdsArr) { $stuOrderArr = array(); $stuScoring = array(); foreach ($ptrInfo as $value) { // if($examId == $value['exam_id']){ if (strcmp($examId, $value['exam_id']) == 0) { $stuIds = isset($stuIdsArr[$value['exam_id']]) ? $stuIdsArr[$value['exam_id']] : array(); if (inArray($value['student_id'], $stuIds)) { $stuScoring[$value['student_id']] = $value['scoring']; } } } $scoringArr = array_values($stuScoring); foreach ($stuScoring as $stuId => $scoring) { $stuOrderArr[$stuId] = $this->getOrder($scoring, $scoringArr); } if ($stuOrderArr) { asort($stuOrderArr); } return $stuOrderArr; } /** * 获取排名 * @param $ele * @param $arr * @return false|int|string */ private function getOrder($ele, $arr) { $orderRs = 0; if ($arr) { arsort($arr); $arr = array_values($arr); $index = array_search($ele, $arr); $orderRs = $index + 1; } return $orderRs; } /** * 整理题详情 * @param $allApiInfo * @return mixed * @throws CException */ public function getTopicDetail($topicBatches) { $optionIndex = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'); $topicDetails = array(); foreach ($topicBatches AS $topic) { $topic = (object)$topic; $type = $topic->type_id; 6 == $type && $type = 5; //6表示多空题,多空题也是5 $topic->id = (string)$topic->id; $topicDetails[$topic->id] = array(); $topicDetails[$topic->id]['is_large_topic'] = isset($topic->is_large_topic) ? $topic->is_large_topic : 0; $topicDetails[$topic->id]['type'] = $type; $topicDetails[$topic->id]['subject_id'] = $topic->subject_id; $topicDetails[$topic->id]['methods'] = '';//考点 $topicDetails[$topic->id]['method_id_arr'] = '';//考点id数组 $topicDetails[$topic->id]['kps'] = '';//知识点 $topicDetails[$topic->id]['queBody'] = $this->topicProcess($topic->title);//题目详情 $topicDetails[$topic->id]['options'] = ''; $topicDetails[$topic->id]['parse_video_qrcode'] = isset($topic->parse_video_qrcode) ? $topic->parse_video_qrcode : ''; $topicDetails[$topic->id]['answer'] = ''; //每题的正确答案 $topicDetails[$topic->id]['analysis'] = $this->topicProcess($topic->parse_content);//答题解析 $topicDetails[$topic->id]['teacher_tips'] = $this->topicProcess($topic->teacher_tips);//名师点评 $topicDetails[$topic->id]['difficulty_degree'] = isset($topic->difficulty_degree) ? $topic->difficulty_degree : null; $topicDetails[$topic->id]['difficulty'] = $topic->difficulty; $_methods = array(); $_method_id_arr = array(); $_method_names = array(); if ($topic->specials) { foreach ($topic->specials AS $_method) { $_method = (object)$_method; if ($_method->method_name) { $_methods[] = $_method->method_name; } if (isset($_method->method_id)) { $_method_id_arr[] = $_method->method_id; } if (isset($_method->method_id) && isset($_method->method_name)) { $_method_names[$_method->method_id] = $_method->method_name; } } $topicDetails[$topic->id]['methods'] = implode('|', array_unique($_methods));//考点 $topicDetails[$topic->id]['method_id_arr'] = $_method_id_arr; $topicDetails[$topic->id]['method_names'] = $_method_names; } $_kps = array(); if (isset($topic->kps) && $topic->kps) { foreach ($topic->kps as $_kp) { $_kp = (object)$_kp; if ($_kp->kp_name) { $_kps[$_kp->kp_id] = $_kp->kp_name; } } $topicDetails[$topic->id]['kps'] = $_kps;//考点 } if ($topic->type_id == 1 || $topic->type_id == 11) { //选择题有选项 if ($topic->items) { if (isset($topic->items[0])) { $topic->items[0] = (object)$topic->items[0]; if (isset($topic->items[0]->options)) { $options = $topic->items[0]->options; if ($options) { $_tmp_options = array(); $correct_answer_arr = array(); foreach ($options AS $_optionIndex => $_option) { $_option = (object)$_option; $_tmp_options[$_optionIndex] = $this->topicProcess($_option->option_content); if ($_option->option_correct) { $correct_answer_arr[] = $this->topicProcess($optionIndex[$_optionIndex], true); // $topicDetails[$topic->id]['answer']=topicProcess($optionIndex[$_optionIndex]); } } $topicDetails[$topic->id]['answer'] = implode(',', $correct_answer_arr); $_list_type = (int)$topic->items[0]->list_type; $topicDetails[$topic->id]['options'] = $this->option_process($_tmp_options, $_list_type); } } } } } else { if ($topic->items) { if (isset($topic->items[0])) { $topic->items[0] = (object)$topic->items[0]; if (isset($topic->items[0]->options)) { $options = $topic->items[0]->options; if ($options) { $_answer = ''; foreach ($options as $v) { $_option = (object)$v; if (trim($_answer) != '') { $_answer .= ' ; '; } $_answer .= $_option->option_content; } $topicDetails[$topic->id]['answer'] = $this->topicProcess($_answer, true); } } } } } //大题的小题 $topicDetails[$topic->id]['slave'] = array(); if (isset($topic->slave) && $topic->slave) { $topicDetails[$topic->id]['answer'] = array(); foreach ($topic->slave as $slave) { $slave = (object)$slave; $_slave = array(); $_slave['topic_slave_id'] = (string)$slave->topic_slave_id; $_slave['type'] = $slave->topic_type; $_slave['methods'] = '';//考点 $_slave['method_id_arr'] = '';//考点id数组 $_slave['kps'] = '';//知识点 $_slave['queBody'] = $this->topicProcess($slave->title);//题目详情 $_slave['options'] = ''; $_slave['answer'] = ''; //每题的正确答案 // $_slave['analysis']=topicProcess($slave->parse_content);//答题解析 // $_slave['teacher_tips']=topicProcess($slave->teacher_tips);//名师点评 $_slave['difficulty_degree'] = isset($slave->difficulty_degree) ? $slave->difficulty_degree : null; $_slave['difficulty'] = $slave->difficulty; if ($slave->topic_type == 1 || $slave->topic_type == 11) { //选择题有选项 if ($slave->items) { if (isset($slave->items)) { $slave->items = (object)$slave->items; if (isset($slave->items->options)) { $options = (object)$slave->items->options; if ($options) { $_tmp_options = array(); $correct_answer_arr = array(); foreach ($options AS $_optionIndex => $_option) { $_option = (object)$_option; $_tmp_options[$_optionIndex] = $this->topicProcess($_option->option_content); if ($_option->option_correct) { if (isset($_option->content_is_answer) && $_option->content_is_answer == 1) { $correct_answer_arr[] = $_option->option_content; } else { $correct_answer_arr[] = $this->topicProcess($optionIndex[$_optionIndex]); } } } $_slave['answer'] = implode(',', $correct_answer_arr); $topicDetails[$topic->id]['answer'][(string)$slave->topic_slave_id] = $_slave['answer']; $_list_type = (int)$slave->items->list_type; $_slave['options'] = $this->option_process($_tmp_options, $_list_type); } } } } } else { if ($slave->items) { if (isset($slave->items)) { $slave->items = (object)$slave->items; if (isset($slave->items->options)) { $options = (object)$slave->items->options; if ($options) { $_answer = ''; foreach ($options as $v) { $_option = (object)$v; if (trim($_answer) != '') { $_answer .= ' ; '; } $_answer .= $_option->option_content; } $_slave['answer'] = $this->topicProcess($_answer, true); $topicDetails[$topic->id]['answer'][(string)$slave->topic_slave_id] = $_slave['answer']; } } } } } $topicDetails[$topic->id]['slave'][] = $_slave; } } } return $topicDetails; } /** *对选项的处理 * @param $options * @param $list_type * @return string */ public function option_process($options, $list_type) { $option_index = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'); if ($list_type == 0) { //纵向排列,即1行1个 // $option_str="
/', '', $html);
$html = preg_replace('/<\/p>/', '', $html);
$html = preg_replace('/
/', '', $html);
$html = preg_replace('//', '', $html);
$html = preg_replace('/<\/big>/', '', $html);
$html = str_replace(" ", '', $html);
return $html;
}
public function img_process($img)
{
$widthArr = array();
$heightArr = array();
$width = '';
$height = '';
preg_match('/[\s\'"]width\s*:\s*(\d+\.*\d*)\s*([a-zA-Z]+)*/si', $img, $widthArr);
if ($widthArr) {
$width = $this->length_process($widthArr);
} else {
preg_match('/[\s\'"]width\s*=\s*[\'"]\s*(\d+\.*\d*)\s*([a-zA-Z]+)*;?[\'"]/si', $img, $widthArr);
if ($widthArr) {
$width = $this->length_process($widthArr);
}
}
if ($width) {
$width = "width=" . $width;
}
preg_match('/[\s\'"]height\s*:\s*(\d+\.*\d*)\s*([a-zA-Z]+)*/si', $img, $heightArr);
if ($heightArr) {
$height = $this->length_process($heightArr);
} else {
preg_match('/[\s\'"]height\s*=\s*[\'"]\s*(\d+\.*\d*)\s*([a-zA-Z]+)*;?[\'"]/si', $img, $heightArr);
if ($heightArr) {
$height = $this->length_process($heightArr);
}
}
if ($height) {
$height = "height=" . $height;
}
$return_img = preg_replace('/]*[\s]+(src[\s]*=[\s]*(([\"]([^\"]*)[\"])|([\']([^\']*)[\'])|([^\s]*)))([^>]*>)/si', "", $img);
return $return_img;
}
public function length_process($length_arr)
{
$units = array(
'in' => 96,
'cm' => 28,
'mm' => 2.8,
'pt' => 1.33,
'pc' => 12,
);
$length = 0.6 * $length_arr[1];
$unit_keys = array_keys($units);
if (isset($length_arr[2])) {
//将直接连接单位改为 单位换算
if (in_array($length_arr[2], $unit_keys)) {
$length = $length * $units[$length_arr[2]];
} else {
$length .= $length_arr[2];
}
}
return $length;
}
protected function getTopicTypeRateImg(&$typeMasterData, $examId, $paperId)
{
$imgPath = str_replace("protected", "", Yii::app()->basePath) . 'assets/temp_img/';
$urlPath = Yii::app()->request->hostInfo . '/assets/temp_img/';
if (!is_dir($imgPath)) {
if (!mkdir($imgPath, 0777, true)) {
exit('Create directory fail: ' . $imgPath);
}
}
$data = array();
foreach ($typeMasterData['grade_rate'] as $type => $rate) {
if (!isset($data[$type])) {
$data[$type] = array();
}
$data[$type]['type_name'] = isset($typeMasterData['type_name_arr'][$type]) ? $typeMasterData['type_name_arr'][$type] : array();
$data[$type]['class_rate'] = isset($typeMasterData['class_rate'][$type]) ? $typeMasterData['class_rate'][$type] : array();
//当前班级得分率坐标
$data[$type]['all_class_rate'] = array();
foreach ($typeMasterData['all_class_rate'] as $pId => $rates) {
foreach ($rates as $ty => $_rate) {
if ($ty == $type) {
$data[$type]['all_class_rate'][] = $_rate;
// if($paperId == $pId){
if (strcmp($paperId, $pId) == 0) {
$data[$ty]['curr_rate_x'] = $_rate;
}
}
}
}
$data[$type]['type_paper_rate'] = array();
foreach ($typeMasterData['type_paper_rate'] as $pId => $rates) {
foreach ($rates as $ty => $_rate) {
if ($ty == $type) {
// if($paperId == $pId){
if (strcmp($paperId, $pId) == 0) {
$data[$ty]['curr_rate_y'] = $_rate;
}
$data[$type]['type_paper_rate'][] = $_rate;
}
}
}
}
//复制我班的数据
foreach ($data as $type => $rates) {
foreach ($rates['type_paper_rate'] as $rate) {
$data[$type]['my_class_rate'][] = $rates['curr_rate_x'];
}
}
$typeRateImgPath = array();
$typeRateImgUrl = array();
foreach ($data as $type => $value) {
$tempPath = $imgPath . $examId . "_" . $type . ".png";
$this->imgArr[] = $tempPath;
$bool = $this->getScatterImage($value, $tempPath);
if ($bool) {
$typeRateImgUrl[$type] = $urlPath . $examId . "_" . $type . ".png";
}
}
return $typeRateImgUrl;
}
protected function getScatterImage($data, $imgPath)
{
/* Create the pData object */
$myData = new pData();
/* Create the X axis and the binded series */
// for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 1"); }
// for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 2"); }
foreach ($data['all_class_rate'] as $v) {
$myData->addPoints($v, "Probe 1");
}
foreach ($data['my_class_rate'] as $v) {
$myData->addPoints($v, "Probe 2");
}
$myData->setAxisName(0, "总得分率");
$myData->setAxisXY(0, AXIS_X);
$myData->setAxisPosition(0, AXIS_POSITION_BOTTOM);
/* Create the Y axis and the binded series */
// for ($i=0;$i<=10;$i=$i+1) { $myData->addPoints(rand(1,20),"Probe 3"); }
foreach ($data['type_paper_rate'] as $v) {
$myData->addPoints($v, "Probe 3");
}
foreach ($data['type_paper_rate'] as $v) {
$myData->addPoints($data['curr_rate_y'], "Probe 4");
}
$myData->setSerieOnAxis("Probe 3", 1);
$myData->setAxisName(1, $data['type_name'] . "得分率");
$myData->setAxisXY(1, AXIS_Y);
$myData->setAxisPosition(1, AXIS_POSITION_LEFT);
/* Create the 1st scatter chart binding */
$myData->setScatterSerie("Probe 1", "Probe 3", 0);
$myData->setScatterSerieDescription(0, "其它班级");
$myData->setScatterSerieColor(0, array("R" => 0, "G" => 0, "B" => 0));
// $myData->setScatterSerieColor(0,array("R"=>255,"G"=>255,"B"=>255));
$myData->setScatterSerieShape(0, SERIE_SHAPE_TRIANGLE);
//========================================================
$myData->setSerieOnAxis("Probe 4", 1);
// $myData->setAxisName(1,$data['type_name']."得分率");
// $myData->setAxisXY(1,AXIS_Y);
// $myData->setAxisPosition(1,AXIS_POSITION_LEFT);
/* Create the 2nd scatter chart binding */
$myData->setScatterSerie("Probe 2", "Probe 4", 1);
$myData->setScatterSerieDescription(1, "我班");
$myData->setScatterSerieShape(1, SERIE_SHAPE_FILLEDTRIANGLE);
/* Create the pChart object */
$myPicture = new pImage(800, 400, $myData);
/* Turn of Anti-aliasing */
$myPicture->Antialias = FALSE;
/* Add a border to the picture */
// $myPicture->drawRectangle(0,0,399,399,array("R"=>0,"G"=>0,"B"=>0));
/* Set the default font */
$myPicture->setFontProperties(array("FontName" => str_replace("protected", "", Yii::app()->basePath) . "fonts/pChart/msyh.ttf", "FontSize" => 8));
/* Set the graph area */
$myPicture->setGraphArea(40, 20, 760, 360);
/* Create the Scatter chart object */
$myScatter = new pScatter($myPicture, $myData);
/* Draw the scale */
$scaleSettings = array("XMargin" => 15, "YMargin" => 15, "Floating" => TRUE, "GridR" => 200, "GridG" => 200, "GridB" => 200, "DrawSubTicks" => TRUE, "CycleBackground" => TRUE);
$myScatter->drawScatterScale($scaleSettings);
/* Draw the legend */
$myScatter->drawScatterLegend(650, 388, array("Mode" => LEGEND_HORIZONTAL, "Style" => LEGEND_NOBORDER));
$myPicture->drawText(100, 20, "总分与{$data['type_name']}成绩", array("FontSize" => 10, "Align" => TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->drawText(80, 50, "总分低,", array("FontSize" => 8, "Align" => TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->drawText(80, 60, "{$data['type_name']}高", array("FontSize" => 8, "Align" => TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->drawText(720, 340, "总分高,", array("FontSize" => 8, "Align" => TEXT_ALIGN_BOTTOMMIDDLE));
$myPicture->drawText(720, 350, "{$data['type_name']}低", array("FontSize" => 8, "Align" => TEXT_ALIGN_BOTTOMMIDDLE));
//用例图标
// $myPicture->drawRectangle(250,385,256,391,array("R"=>0,"G"=>0,"B"=>0));
$xNum = 91;
$yNum = 315;
// $myPicture->drawFilledRectangle($xNum,$yNum,$xNum + 6,$yNum + 6,array("R"=>0,"G"=>0,"B"=>0));
// $myPicture->drawFilledCircle($data['curr_rate_x'] + $xNum,$yNum - $data['curr_rate_x'],3,array("R"=>0,"G"=>0,"B"=>0));
//画线
arsort($data['all_class_rate']);
$maxAllRate = round(current($data['all_class_rate']));
arsort($data['type_paper_rate']);
$maxTypePaper = round(current($data['type_paper_rate']));
// $myPicture->drawLine($xNum + $maxAllRate,15,$xNum + $maxAllRate,315,array("R"=>0,"G"=>0,"B"=>0));
$myPicture->drawLine($xNum + $maxAllRate + 5, 35, $xNum + $maxAllRate + 5, 345, array("R" => 0, "G" => 0, "B" => 0));
$myPicture->drawLine($xNum + $maxAllRate - 5, 35, $xNum + $maxAllRate - 5, 345, array("R" => 0, "G" => 0, "B" => 0));
$myPicture->drawLine(55, ($yNum - $maxTypePaper) + 5, 745, ($yNum - $maxTypePaper) + 5, array("R" => 0, "G" => 0, "B" => 0));
$myPicture->drawLine(55, ($yNum - $maxTypePaper) - 5, 745, ($yNum - $maxTypePaper) - 5, array("R" => 0, "G" => 0, "B" => 0));
/* Draw a scatter plot chart */
$myPicture->Antialias = TRUE;
$myScatter->drawScatterPlotChart();
/* Render the picture (choose the best way) */
// $myPicture->autoOutput("pictures/example.example.drawScatterShape.png");
$myPicture->render($imgPath);
// $myPicture->autoOutput($imgPath);die;
return $imgPath;
}
//考点掌握情况
protected function getMethodCount(&$stuRs, &$pramas)
{
list($smallTopicScore, $smallTopicNo, $paperId, $topicType, $topicLogicType, $topicRelLarge, $topicRelMethod, $largeTopicMethod, $sutName, $sutOrder, $methodName) = $pramas;
$gradeScoring = $gradeScore = array();
$classScoring = $classScore = array();
$rightNum = $wrongNum = array();
$methodRelNo = array();
$diffStu = array();//考点较差学生
$classDiffStu = array();//班级排名后25%学生的薄弱考点
$methodRelType = array();//考点对应的题型
$typeNameArr = array();//考点对应的题型
$back25Rate = array();
$reStuOrder = $sutOrder;
$stuCount = count($reStuOrder);
$stuCount = ceil($stuCount * 0.25);
arsort($reStuOrder);
$reStuOrder = array_slice($reStuOrder, 0, $stuCount);
$typeName = $this->typeName;
$logicTypeName = $this->logicTypeName;
foreach ($stuRs as $sId => $value) {
foreach ($value as $tId => $v) {
if (isset($topicRelMethod[$tId]) && $topicRelMethod[$tId]) {
foreach ($topicRelMethod[$tId] as $methodId) {
if (!$methodId) continue;
if (isset($topicLogicType[$tId]) && $topicLogicType[$tId] > 0) {
$type = (int)$topicLogicType[$tId];
$typeNameArr[$type] = isset($logicTypeName[$type]) ? $logicTypeName[$type] : '';
} else {
$type = $v['type'];
$typeNameArr[$type] = isset($typeName[$type]) ? $typeName[$type] : '';
}
$methodRelType[$methodId] = $type;
$tScore = isset($smallTopicScore[$tId]) ? $smallTopicScore[$tId] : 0;
if ($tScore) {
$stuRate = round($v['scoring'] / $tScore, 4) * 100;
} else {
$stuRate = 0;
}
//年级
if (!isset($gradeScoring[$methodId])) {
$gradeScoring[$methodId] = 0;
}
$gradeScoring[$methodId] += $v['scoring'];
if (!isset($gradeScore[$methodId])) {
$gradeScore[$methodId] = 0;
}
$gradeScore[$methodId] += $tScore;
//班级
// if($paperId == $v['paper_id']){
if (strcmp($paperId, $v['paper_id']) == 0) {
if (!isset($classScoring[$methodId])) {
$classScoring[$methodId] = 0;
}
$classScoring[$methodId] += $v['scoring'];
if (!isset($classScore[$methodId])) {
$classScore[$methodId] = 0;
}
$classScore[$methodId] += $tScore;
//对错人数
if ($v['is_right'] == 1) {
if (!isset($rightNum[$methodId])) {
$rightNum[$methodId] = array();
}
$rightNum[$methodId][] = $sId;
} else {
if (!isset($wrongNum[$methodId])) {
$wrongNum[$methodId] = array();
}
$wrongNum[$methodId][] = $sId;
}
//薄弱考点掌握较差学生
if (!isset($diffStu[$methodId])) {
$diffStu[$methodId] = array();
}
if ($stuRate <= 40) {
if (!inArray($sId, $diffStu[$methodId])) {
$diffStu[$methodId][] = $sId;
}
}
}
//班级排名后25%学生的薄弱考点
if (isset($reStuOrder[$sId])) {
if (!isset($classDiffStu[$sId])) {
$classDiffStu[$sId] = array();
}
if ($stuRate <= 40) {
if (!inArray($methodId, $classDiffStu[$sId])) {
$classDiffStu[$sId][] = $methodId;
}
}
}
}
}
}
}
//年级得分率
$gradeRate = array();
if ($gradeScoring) {
foreach ($gradeScoring as $mId => $scoring) {
if (isset($gradeScore[$mId]) && $gradeScore[$mId]) {
$gradeRate[$mId] = round($scoring / $gradeScore[$mId], 4) * 100;
} else {
$gradeRate[$mId] = 0;
}
}
}
//年级得分率
$classRate = array();
if ($classScoring) {
foreach ($classScoring as $mId => $scoring) {
if (isset($classScore[$mId]) && $classScore[$mId]) {
$classRate[$mId] = round($scoring / $classScore[$mId], 4) * 100;
} else {
$classRate[$mId] = 0;
}
}
}
//对错人数
foreach ($rightNum as $mId => $stuIds) {
$rightNum[$mId] = count(array_unique($stuIds));
}
foreach ($wrongNum as $mId => $stuIds) {
$wrongNum[$mId] = count(array_unique($stuIds));
}
//考点对应题号
foreach ($topicRelMethod as $tId => $mIds) {
if (isset($smallTopicNo[$tId]) && $smallTopicNo[$tId]) {
foreach ($mIds as $mId) {
if ($mId) {
if (!isset($methodRelNo[$mId])) {
$methodRelNo[$mId] = array();
}
$methodRelNo[$mId][] = $smallTopicNo[$tId];
}
}
}
}
//题号数组转成字符串
foreach ($methodRelNo as $mId => $nos) {
asort($nos);
$methodRelNo[$mId] = $nos;
}
//题型掌握水平: 85%包括85%以上,5星;75%-85%,包括75%,4星。65%-75%,包括65%,3星;55%-65%,包括55%,2星;55%以下1星。
$masterDegree = array();
foreach ($classRate as $mId => $rate) {
if ($rate >= 85) {
$masterDegree[$mId] = 5;
} elseif ($rate < 85 && $rate >= 75) {
$masterDegree[$mId] = 4;
} elseif ($rate < 75 && $rate >= 65) {
$masterDegree[$mId] = 3;
} elseif ($rate < 65 && $rate >= 55) {
$masterDegree[$mId] = 2;
} else {
$masterDegree[$mId] = 1;
}
}
//薄弱考点掌握较差学生
foreach ($diffStu as $mId => $stuIds) {
$stuNameArr = array();
foreach ($stuIds as $stuId) {
$stuNameArr[$stuId] = isset($sutName[$stuId]) ? $sutName[$stuId] : '';
}
$diffStu[$mId] = implode(',', $stuNameArr);
}
//考点顺序按班级得分率升序进行。
asort($classRate);
$typeRelMethod = array();
foreach ($classRate as $mId => $rate) {
if (isset($methodRelType[$mId])) {
if (!isset($typeRelMethod[$methodRelType[$mId]])) {
$typeRelMethod[$methodRelType[$mId]] = array();
}
$typeRelMethod[$methodRelType[$mId]][] = $mId;
}
}
//班级排名后25%学生的薄弱考点
foreach ($classDiffStu as $stuId => $mIds) {
// asort($mIds);
$mName = array();
foreach ($mIds as $mId) {
if (isset($methodName[$mId]) && $methodName[$mId]) {
$mName[] = $methodName[$mId];
}
}
$classDiffStu[$stuId] = implode('、', $mName);
}
$result = array(
'grade_rate' => $gradeRate,
'class_rate' => $classRate,
'method_rel_no' => $methodRelNo,
'master_degree' => $masterDegree,
'right_num' => $rightNum,
'wrong_num' => $wrongNum,
'diff_stu' => $diffStu,
'class_diff_stu' => $classDiffStu,
'type_rel_method' => $typeRelMethod,
'type_name_arr' => $typeNameArr,
);
return $result;
}
protected function getImage($ratePath, $timeMethodRate)
{
/* Create and populate the pData object */
$MyData = new pData();
$i = 1;
foreach ($timeMethodRate as $arr) {
$MyData->addPoints($arr, "Probe {$i}");
$i++;
if ($i > 3) {
break;
}
}
// $MyData->addPoints(array(4,1,2,12,8,3),"Probe 1");
// $MyData->addPoints(array(3,12,15,8,5,5),"Probe 2");
// $MyData->addPoints(array(2,7,5,18,19,22),"Probe 3");
$MyData->setSerieTicks("Probe 2", 4);
$MyData->setSerieWeight("Probe 3", 2);
$MyData->setAxisName(0, "得分率");
$MyData->addPoints(array("上上次", "上次", "本次"), "Labels");
$MyData->setSerieDescription("Labels", "Months");
$MyData->setAbscissa("Labels");
$MyData->setSerieShape(0, SERIE_SHAPE_TRIANGLE);
/* Create the pChart object */
$myPicture = new pImage(700, 230, $MyData);
/* Turn of Antialiasing */
$myPicture->Antialias = FALSE;
/* Add a border to the picture */
$myPicture->drawRectangle(0, 0, 699, 229, array("R" => 0, "G" => 0, "B" => 0));
/* Write the chart title */
$myPicture->setFontProperties(array("FontName" => str_replace("protected", "", Yii::app()->basePath) . "fonts/pChart/msyh.ttf", "FontSize" => 11));
$myPicture->drawText(150, 35, "考点掌握情况变化趋势", array("FontSize" => 12, "Align" => TEXT_ALIGN_BOTTOMMIDDLE));
/* Set the default font */
$myPicture->setFontProperties(array("FontName" => str_replace("protected", "", Yii::app()->basePath) . "fonts/pChart/msyh.ttf", "FontSize" => 8));
/* Define the chart area */
$myPicture->setGraphArea(60, 40, 650, 200);
/* Draw the scale */
$scaleSettings = array("XMargin" => 10, "YMargin" => 10, "Floating" => TRUE, "GridR" => 200, "GridG" => 200, "GridB" => 200, "DrawSubTicks" => TRUE, "CycleBackground" => TRUE);
$myPicture->drawScale($scaleSettings);
/* Turn on Antialiasing */
$myPicture->Antialias = false;
/* Draw the line chart */
// $myPicture->drawLineChart();
$myPicture->drawLineChart(array("ForceColor" => true, "ForceR" => 0, "ForceG" => 0, "ForceB" => 0, "ForceAlpha" => 80));
$myPicture->drawPlotChart(array("DisplayValues" => TRUE, "PlotBorder" => TRUE, "BorderSize" => 2, "Surrounding" => -60, "BorderAlpha" => 80));
/* Write the chart legend */
$myPicture->drawLegend(510, 20, array("Style" => LEGEND_NOBORDER, "Mode" => LEGEND_HORIZONTAL));
/* Render the picture (choose the best way) */
// $myPicture->autoOutput($ratePath);die;
$myPicture->render($ratePath);
}
/**
* 删除生成的图片
*/
private function delCreateImgs()
{
if ($this->imgArr && is_array($this->imgArr)) {
foreach ($this->imgArr as $path) {
if (file_exists($path)) {
@unlink($path);
}
}
}
}
/**
* 获取试题内容参数
* @param $topicIds
* @return array
*/
private function getEnglishTopic($topicIds)
{
$result = array('status' => 0, 'error' => array('无题'));
// $topicIds = array(1821);
// $topicIds = array(20001908);
$param = array(
'size' => count($topicIds),
'query' => array(
'bool' => array(
'must' => array(
array(
'match' => array(
'status' => array(
'query' => 1,
'type' => 'boolean'
)
)
),
array(
'terms' => array(
'topicId' => $topicIds
)
)
)
)
)
);
$url = Yii::app()->params['english_topic_search_url'];
$rs = $this->aipostEng($url, $param);
if (!$rs) {
return false;
}
if (isset($rs['hits'])) {
if (isset($rs['hits']['hits'])) {
$topicInfos = array();
foreach ($rs['hits']['hits'] as $v) {
if (isset($v['_source']) && $v['_source']) {
$src = $v['_source'];
$temp_info = array(
'id' => $src['topicId'],
'is_large_topic' => isset($src['options']) && $src['options'] ? 0 : 1,
'type_id' => $src['physicalTypeId'],
'title' => $src['content'],
'topic_type' => $src['physicalTypeId'],
'school_id' => 0,
'type_name' => '',
'difficulty' => $src['difficulty'],
'subject_id' => 8,
'create_time' => time(),
'update_time' => time(),
'subject_name' => '英语',
'teacher_tips' => '',
'source' => '',
'relation_topic' => 0,
'teaching_quality' => 0,
'source_title' => '',
'parse_video' => null,
'parse_content' => $src['parse'],
'difficulty_degree' => 0.86,
// 'difficulty_degree' => 0.86,
'kps' => array(),
'specials' => array(),
'uses' => array(),
'total' => 0,
'oneself' => 0,
'items' => array(),
'slave' => array(),
);
//考点
if (isset($src['methods']) && $src['methods']) {
$specials = array();
foreach ($src['methods'] as $method) {
if (isset($method['isLast']) && $method['isLast']) {
$_method = array(
"method_id" => $method['methodId'],
"method_name" => $method['methodName'],
);
$specials[] = $_method;
}
}
$temp_info['specials'] = $specials;
}
//小题
if (isset($src['slaves']) && $src['slaves']) {
foreach ($src['slaves'] as $slave) {
$_slave = array(
'topic_slave_id' => $slave['topicId'],
'topic_type' => $slave['physicalTypeId'],
'type_name' => '',
'difficulty_degree' => 0.86,
// 'difficulty_degree' => float 0.86
'difficulty' => $slave['difficulty'],
'title' => $slave['content'],
'items' => array(),
'kps' => array(),
'specials' => array(),
);
$_items = array(
'type_id' => 1,
'type_name' => '',
'list_type' => 1,
// 'list_type' => int 0
'title' => $slave['content'],
'options' => array(),
);
if (isset($slave['options']) && $slave['options']) {
$_option = array();
foreach ($slave['options'] as $option) {
$_temp_op = array(
'option_id' => 0,
'option_content' => $option['content'],
'option_correct' => $option['isTrue'],
);
$_option[] = $_temp_op;
}
$_items['options'] = $_option;
} elseif (isset($slave['answer']) && $slave['answer']) {
$_option = array();
$_temp_op = array(
'option_id' => 0,
'option_content' => $slave['answer'],
'option_correct' => 1,
);
if ($src['physicalTypeId'] == 11) {
$_temp_op['content_is_answer'] = 1;
}
$_option[] = $_temp_op;
$_items['options'] = $_option;
}
$_slave['items'] = $_items;
if (isset($slave['methods']) && $slave['methods']) {
$_specials = array();
foreach ($slave['methods'] as $method) {
if (isset($method['isLast']) && $method['isLast']) {
$__method = array(
"method_id" => $method['methodId'],
"method_name" => $method['methodName'],
);
$_specials[] = $__method;
}
}
$_slave['specials'] = $_specials;
}
$temp_info['slave'][] = $_slave;
}
} elseif (isset($src['options']) && $src['options']) {//大题单选选择
$temp_info['items'] = array();
$_option = array();
$_items = array(
'type_id' => 1,
'type_name' => '',
'list_type' => 1,
// 'list_type' => int 0
'title' => '',
'options' => array(),
);
foreach ($src['options'] as $option) {
$_temp_op = array(
'option_id' => 0,
'option_content' => $option['content'],
'option_correct' => $option['isTrue'],
);
$_option[] = $_temp_op;
}
$_items['options'] = $_option;
$temp_info['items'][] = $_items;
} elseif (isset($src['answer']) && $src['answer']) {//主题有答案的从题没有的,加一个从题
$_slave = array(
'topic_slave_id' => $src['topicId'],
'topic_type' => $src['physicalTypeId'],
'type_name' => '',
'difficulty_degree' => 0.86,
// 'difficulty_degree' => float 0.86
'difficulty' => $src['difficulty'],
'title' => '',
'items' => array(),
'kps' => array(),
'specials' => array(),
);
$_items = array(
'type_id' => 1,
'type_name' => '',
'list_type' => 1,
// 'list_type' => int 0
'title' => '',
'options' => array(),
);
$_option = array();
$_temp_op = array(
'option_id' => 0,
'option_content' => $src['answer'],
'option_correct' => 1,
);
$_option[] = $_temp_op;
$_items['options'] = $_option;
$_slave['items'] = $_items;
$temp_info['slave'][] = $_slave;
}
$topicInfos[] = $temp_info;
}
}
if ($topicInfos) {
return $topicInfos;
} else {
return $result;
}
}
}
return $result;
}
/**
* 获取试卷选择题id
* @param $topic_type_arr
* @param $topic_logic_type_arr
* @param $is_has_large
*/
protected function getChoiceIds($topic_type_arr, $topic_logic_type_arr, $subject_id, $paper_type)
{
$choice_ids = array();
$type_arr = array();
if (inArray($paper_type, array(0, 1, 2))) {
if ($subject_id == 12) {//物理
$type_arr = array(1, 4, 5, 8, 9);
} elseif ($subject_id == 13) {//化学
$type_arr = array(1);
} elseif ($subject_id == 14) {//生物
$type_arr = array(1, 3, 4);
} elseif ($subject_id == 15) {//政治
$type_arr = array(1, 3, 4, 6, 7);
} elseif ($subject_id == 16) {//历史
$type_arr = array(1);
} elseif ($subject_id == 17) {//地理
$type_arr = array(1, 3, 4);
}
} else {
$type_arr = array(1, 11);
}
foreach ($topic_logic_type_arr as $t_id => $type) {
if (inArray($type, $type_arr)) {
$choice_ids[] = $t_id;
}
}
//
$diff_topic = array_diff(array_keys($topic_logic_type_arr), $choice_ids);
if ($diff_topic) {
foreach ($topic_type_arr as $t_id => $item) {
if (inArray($t_id, $diff_topic) && inArray($item, array(1, 11))) {
$choice_ids[] = $t_id;
}
}
}
return $choice_ids;
}
/**
* 获取考点名称
* @param $topicDetails
* @return array
*/
public function getMethodName(&$topicDetails)
{
$methodName = array();
if (is_array($topicDetails)) {
foreach ($topicDetails as $topicDetail) {
if (isset($topicDetail['specials']) && $topicDetail['specials']) {
foreach ($topicDetail['specials'] as $special) {
$methodName[$special['method_id']] = $special['method_name'];
}
}
if (isset($topicDetail['slave']) && $topicDetail['slave']) {
foreach ($topicDetail['slave'] as $slave) {
if (isset($slave['specials']) && $slave['specials']) {
foreach ($slave['specials'] as $spec) {
$methodName[$spec['method_id']] = $spec['method_name'];
}
}
}
}
}
}
return $methodName;
}
//共性问题变式训练
protected function getCommonPractice($paper_topic_detail, $stu_score_info, $stu_topic_rs, $large_topic_type_arr, $large_contain)
{
$class_wrong_topic = array();
$cls_grammar_topic = array();
$texturl_topic = array();
$common_push_topic = array();
$topic_method_arr = array();
$_push_all_topics = array();
$paper_topics = array_keys($large_topic_type_arr);
foreach ($paper_topic_detail as $topic_id => $detail) {
if (in_array($detail['type_id'], array(2, 3, 4, 5, 6, 7, 18, 19))) {
$topic_method_arr[$topic_id] = isset($detail['specials']) ? _array_column($detail['specials'], 'method_id') : array();
if (isset($detail['slave'])) {
foreach ($detail['slave'] as $slave) {
if (isset($slave['topic_slave_id'])) {
$topic_method_arr[$slave['topic_slave_id']] = isset($slave['method_names']) ? _array_column($slave['method_names'], 'method_id') : array();
}
}
}
}
}
foreach ($stu_score_info as $stu_id => $score_info) {
foreach ($score_info as $large_topic_id => $scoring) {
if (isset($large_topic_type_arr[$large_topic_id])) {
if (in_array($large_topic_type_arr[$large_topic_id], array(2, 3, 4, 5))) {
if (!isset($class_wrong_topic[$large_topic_id])) {
$class_wrong_topic[$large_topic_id] = array('scoring' => 0, 'score' => 0);
}
$_scoring = $class_wrong_topic[$large_topic_id]['scoring'];
$_score = $class_wrong_topic[$large_topic_id]['score'];
$class_wrong_topic[$large_topic_id] = array('scoring' => ($scoring['scoring'] + $_scoring), 'score' => ($scoring['score'] + $_score));
} elseif (in_array($large_topic_type_arr[$large_topic_id], array(18, 19))) {
$small_topic = $large_contain[$large_topic_id];
$stu_topic_info = isset($stu_topic_rs[$stu_id]) ? $stu_topic_rs[$stu_id] : array();
if ($stu_topic_info) {
foreach ($small_topic as $small_topic_id => $score) {
if (!isset($cls_grammar_topic[$large_topic_type_arr[$large_topic_id]][$small_topic_id])) {
$cls_grammar_topic[$large_topic_type_arr[$large_topic_id]][$small_topic_id] = array('scoring' => 0, 'score' => 0);
}
$stu_scoring = $stu_topic_info[$small_topic_id];
$_scoring = $cls_grammar_topic[$large_topic_type_arr[$large_topic_id]][$small_topic_id]['scoring'];
$_score = $cls_grammar_topic[$large_topic_type_arr[$large_topic_id]][$small_topic_id]['score'];
$cls_grammar_topic[$large_topic_type_arr[$large_topic_id]][$small_topic_id] = array('scoring' => ($stu_scoring['scoring'] + $_scoring), 'score' => ($score + $_score));
}
}
} elseif (in_array($large_topic_type_arr[$large_topic_id], array(6, 7))) {
$texturl_topic[] = $large_topic_id;
}
}
}
}
$class_score_rate = array();
foreach ($class_wrong_topic as $large_topic_id => $score_info) {
$score_rate = $this->scoreRate($score_info['scoring'], $score_info['score']);
$class_score_rate[$large_topic_id] = $score_rate;
}
if ($class_score_rate) {
asort($class_score_rate);
reset($class_score_rate);
$push_text_topic = key($class_score_rate);
$text_detail = $paper_topic_detail[$push_text_topic];
$kps = _array_column($text_detail['specials'], 'method_id');
$text_level = isset($text_detail['text_level']) ? $text_detail['text_level'] : 5;
$cloze_type = 0;
if ($text_detail['type_id'] == 2) {
$cloze_type = count($text_detail['slave']) == 15 ? 1 : 2;
}
$rules = array();
$rules[] = array(
'type' => $text_detail['type_id'],
'size' => 600,
'cloze_type' => $cloze_type
);
$params_eng = array();
$params_eng['subjectId'] = 10;
$params_eng['rules'] = $rules;
$params_eng['inMethodIds'] = $kps;
$params_eng['isAudit'] = 2;
$params_eng['notInTopicIds'] = $paper_topics;
$type_topic_arr = $this->apiBrainPost('/relation_english/extract', $params_eng, 25, true);
if (isset($type_topic_arr[$text_detail['type_id']])) {
$all_topic = array();
$extract_topics = $type_topic_arr[$text_detail['type_id']];
while ($text_level > 0) {
if ($extract_topics[$text_level]) {
$all_topic = $extract_topics[$text_level];
break;
}
$text_level--;
}
if ($all_topic) {
$push_topic_key = array_rand($all_topic, 1);
$common_push_topic['min_rate_text'][$text_detail['type_id']] = array('topic_id' => $all_topic[$push_topic_key], 'topic_type' => $text_detail['type_id']);
$_push_all_topics[$all_topic[$push_topic_key]] = $all_topic[$push_topic_key];
}
}
}
$grammar_rules = array();
//班级错误率在50%及以上的
$grammar_score_rate = array();
$grammar_method = array();
foreach ($cls_grammar_topic as $type => $cgt_info) {
foreach ($cgt_info as $small_topic_id => $score_info) {
$score_rate = $this->scoreRate($score_info['scoring'], $score_info['score'], true);
if ($score_rate < 50) {
$grammar_score_rate[$type][$small_topic_id] = isset($topic_method_arr[$small_topic_id]) ? $topic_method_arr[$small_topic_id] : array();
}
}
}
$topic_count = array('19' => 10, '18' => 0);
foreach ($grammar_score_rate as $type => $gsr) {
if ($type == 6 || $type == 19) {
$type = 19;
}
$grammar_rules[$type] = array(
'type' => 19,
'size' => 600
);
if (!isset($grammar_method[$type])) {
$grammar_method[$type] = array();
}
foreach ($gsr as $item) {
if ($type == 18) {
$topic_count[18]++;
}
$grammar_method[$type] = array_merge($grammar_method[$type], $item);
}
}
//$read_base_obj = new ReadBase();
foreach ($grammar_rules as $type => $gr) {
$rules = array();
$rules[] = array(
'type' => $type,
'size' => 600
);
$params_eng = array();
$params_eng['subjectId'] = 10;
$params_eng['rules'] = $rules;
$params_eng['inMethodIds'] = isset($grammar_method[$type]) ? $grammar_method[$type] : array();
$params_eng['notInTopicIds'] = $paper_topics;
$type_topic_arr = $this->apiBrainPost('/relation_english/extract', $params_eng, 25, true);
if ($type_topic_arr) {
if (isset($type_topic_arr[$type]) && $type_topic_arr[$type]) {
$topics = reset($type_topic_arr[$type]);
$push_topic_key = array_rand($topics, $topic_count[$type]);
foreach ($push_topic_key as $key) {
$_push_all_topics[$topics[$key]] = $topics[$key];
$common_push_topic['common_grammar_topic'][$type][] = array('topic_id' => $topics[$key], 'topic_type' => $type);
}
}
}
}
$texturl_topic = array_unique($texturl_topic);
foreach ($texturl_topic as $t_id) {
$rules = array();
$rules[] = array(
'type' => $paper_topic_detail[$t_id]['type_id'],
'size' => 600
);
$params_eng = array();
$params_eng['subjectId'] = 10;
$params_eng['rules'] = $rules;
$params_eng['inMethodIds'] = isset($topic_method_arr[$t_id]) ? $topic_method_arr[$t_id] : array();
$params_eng['notInTopicIds'] = $paper_topics;
$type_topic_arr = $this->apiBrainPost('/relation_english/extract', $params_eng, 25, true);
if ($type_topic_arr) {
if (isset($type_topic_arr[$paper_topic_detail[$t_id]['type_id']]) && $type_topic_arr[$paper_topic_detail[$t_id]['type_id']]) {
$topics = reset($type_topic_arr[$paper_topic_detail[$t_id]['type_id']]);
if ($topics) {
$push_topic_key = array_rand($topics, 1);
$_push_all_topics[$topics[$push_topic_key]] = $topics[$push_topic_key];
$common_push_topic['common_extra'][$paper_topic_detail[$t_id]['type_id']] = array('topic_id' => $topics[$push_topic_key], 'topic_type' => $paper_topic_detail[$t_id]['type_id']);
}
}
}
}
return array($common_push_topic, $_push_all_topics);
}
function scoreRate($scoring, $total_score, $is_per = false)
{
if ($total_score > 0) {
if ($is_per) {
$pre_rate = 100;
$decimal = 4;
} else {
$pre_rate = 1;
$decimal = 2;
}
return round($scoring / $total_score, $decimal) * $pre_rate;
} else {
return 0;
}
}
private function handleWordClass($keyWords)
{
$word_ids = _array_column($keyWords, 'single_word_id');
$rs = $this->apiBrainPost('/zsytk2/getIspInfo', array('condition' => array('single_word_id' => $word_ids), 'table' => 'en_single_word_label', 'isAll' => 1), 25, true);
if (isset($rs['status']) && $rs['status'] == 1 && isset($rs['data']) && $rs['data']) {
$label_ids = array();
$swm_ids = array();
foreach ($rs['data'] as $key => $v) {
if ($v['label_type_id'] == 3) {
unset($rs['data'][$key]);
}
if ($v['label_type_id'] == 7) {
$label_ids[] = $v['label_id'];
$swm_ids[] = $v['swm_id'];
}
}
$rel = array();
if ($label_ids) {
$label_rs = $this->apiBrainPost('/zsytk2/getIspInfo', array('condition' => array('label_id' => $label_ids), 'table' => 'en_label', 'isAll' => 1), 25, true);
if (isset($label_rs['status']) && $label_rs['status'] == 1 && isset($label_rs['data']) && $label_rs['data']) {
$rel = array();
foreach ($label_rs['data'] as $v) {
$rel[$v['label_id']] = $v['content'];
}
}
}
foreach ($rs['data'] as &$item) {
$item['content'] = isset($rel[$item['label_id']]) ? $rel[$item['label_id']] : '';
}
unset($item);
$new_swm_res = array();
if ($swm_ids) {
$swm_rs = $this->apiBrainPost('/zsytk2/getIspInfo', array('condition' => array('swm_id' => $swm_ids), 'table' => 'en_single_word_mean', 'isAll' => 1), 25, true);
if (isset($swm_rs['status']) && $swm_rs['status'] == 1 && isset($swm_rs['data']) && $swm_rs['data']) {
foreach ($swm_rs['data'] as $item) {
$new_swm_res[$item['swm_id']] = $item;
}
}
}
$new_res = array();
$res = $rs['data'];
foreach ($res as $res_val) {
$s_id = $res_val['single_word_id'];
if (!isset($new_res[$s_id])) {
$new_res[$s_id] = array('con_str' => '', 'swm_ids' => array(), 'single_word_id' => $s_id);
}
$new_res[$s_id]['con_str'] .= $res_val['content'];
$new_res[$s_id]['swm_ids'][] = $res_val['swm_id'];
if ($res_val['swm_id']) {
$new_res[$s_id]['swm_con'][$res_val['swm_id']] = $res_val['content'];
}
}
$_tmp_res = array();
foreach ($new_res as $tmp) {
$single_id = $tmp['single_word_id'];
$swm_ids = array_filter($tmp['swm_ids']);
if (!isset($_tmp_res[$single_id])) {
$_tmp_res[$single_id] = '';
}
if ($swm_ids) {
foreach ($swm_ids as $_id) {
if (isset($new_swm_res[$_id])) {
$_tmp_res[$single_id] .= ' ' . $tmp['swm_con'][$_id] . " {$new_swm_res[$_id]['mean']} ";
}
}
}
}
foreach ($keyWords as &$val) {
$val['word_class'] = isset($new_res[$val['single_word_id']]) ? $new_res[$val['single_word_id']]['con_str'] : '';
$val['new_mean'] = isset($_tmp_res[$val['single_word_id']]) ? $_tmp_res[$val['single_word_id']] : '';
}
}
return $keyWords;
}
/**
* 物理教师讲案
* @return array
*/
public function actionPhysics()
{
set_time_limit(300);
ini_set('memory_limit', '300M');
$examId = (string)Req::get("examId");
$viewHtml = (int)Req::get('viewHtml');
$force = (int)Req::get('force');
require_once('TeachingPhysics.php');
$teachingPhysicsObj = new TeachingPhysics($this);
$result = $teachingPhysicsObj->getTeachingPdf($this->schoolId, $examId, $force, $viewHtml);
$result['pdf_path'] = '';
echo json_encode($result);
exit();
}
/**
* 英语题型新转老
*/
public function getTopicTypeRelate()
{
return array(
'553' => '1',
'28' => '1',
'554' => '2',
'41' => '2',
'555' => '3',
'42' => '3',
'281' => '4',
'566' => '4',
'556' => '5',
'44' => '5',
'563' => '6',
'278' => '6',
'286' => '7',
'570' => '7',
'47' => '8',
'557' => '8',
'282' => '9',
'567' => '9',
'279' => '10',
'564' => '10',
'288' => '11',
'572' => '11',
'285' => '12',
'444' => '13',
'741' => '13',
'280' => '14',
'565' => '14',
'287' => '15',
'571' => '15',
'116' => '17',
'562' => '17',
'54' => '18',
'559' => '18',
'55' => '19',
'560' => '19',
'56' => '20',
'561' => '20',
'428' => '21',
'284' => '16'
);
}
//全学科试题详情兼容
public function quanTopicDetail($data)
{
$result = array();
$answer_arr = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J");
$getTopicTypeRelate = $this->getTopicTypeRelate();
if ($data) {
foreach ($data as $k => $v) {
$temp_basic_type_id = isset($v['basic_type_id']) ? $v['basic_type_id'] : 1;
$result[$k]['topic_id'] = $v['id'];
$result[$k]['id'] = $v['id'];
if (isset($v['bank_type']) && $v['bank_type']) {
$temp_type_id = $v['bank_type'];
} else {
$temp_type_id = $v['type_id'];
}
$result[$k]['type'] = $result[$k]['type_id'] = isset($getTopicTypeRelate[$temp_type_id]) ? $getTopicTypeRelate[$temp_type_id] : $temp_type_id;
$result[$k]['queBody'] = $v['title'];
$result[$k]['title'] = $v['title'];
$result[$k]['analysis'] = $v['parse_content'];
$result[$k]['parse_content'] = $v['parse_content'];
$result[$k]['slave'] = array();
$result[$k]['items'] = array();
$result[$k]['answer'] = '';
$result[$k]['answer_str'] = '';
$result[$k]['key_words_levels'] = array();
$result[$k]['key_words'] = array();
$result[$k]['isp_ids'] = array();
$result[$k]['text_level'] = 0;
$result[$k]['method_id_arr'] = array();
$result[$k]['sentences_analysis'] = '';
$result[$k]['topic_solution'] = '';
$result[$k]['model_essay_point'] = '';
$result[$k]['new_key_words'] = array();
if (isset($v['kps']) && $v['kps']) {
foreach ($v['kps'] as $kps) {
$result[$k]['method_id_arr'][] = $kps['kp_id'];
}
}
if (isset($v['affiliate']) && $v['affiliate']) {
foreach ($v['affiliate'] as $aff) {
if (isset($aff['field_key']) && $aff['field_key'] == 'tag_8_118') {
$result[$k]['text_level'] = isset($aff['field_value']) ? $aff['field_value'] : 0;
}
if (isset($aff['field_name']) && $aff['field_name'] == '长难句解析') {
$result[$k]['sentences_analysis'] = $aff['field_value'];
}
if (isset($aff['field_name']) && $aff['field_name'] == '审题思路') {
$result[$k]['topic_solution'] = $aff['field_value'];
}
if (isset($aff['field_name']) && $aff['field_name'] == '范文亮点') {
$result[$k]['model_essay_point'] = $aff['field_value'];
}
if (isset($aff['field_name']) && $aff['field_name'] == '词汇积累') {
if (isset($aff['field_value']) && $aff['field_value']) {
$temp_chjl = strip_tags($aff['field_value']);
$strPattern = "/(?<=\()[^\)]+/";
preg_match_all($strPattern, $temp_chjl, $result_words);
if (isset($result_words[0]) && $result_words[0]) {
$single_word_ids = $result_words[0];
$single_word_data = $this->apiBrainPost('/all_library/getSingleWords', array("single_word_id" => $single_word_ids), 25, true);
if ($single_word_data && $single_word_data['data']) {
$temp_single_word_data = $single_word_data['data'];
foreach ($temp_single_word_data as $temp_single_word_data_k => $temp_single_word_data_v) {
$result[$k]['new_key_words'][] = array(
"content" => isset($temp_single_word_data_v['content']) ? $temp_single_word_data_v['content'] : '',
"phonetic_symbol" => isset($temp_single_word_data_v['phonetic_symbol']) ? $temp_single_word_data_v['phonetic_symbol'] : '',
"new_mean" => isset($temp_single_word_data_v['mean']) ? $temp_single_word_data_v['mean'] : ''
);
}
}
}
}
}
}
}
if (isset($v['slave']) && $v['slave']) {
//七选五特殊处理
if ($result[$k]['type_id'] == 5) {
foreach ($v['slave'] as $slave_k => $slave_v) {
if (isset($slave_v['items']) && isset($slave_v['items']['options']) && $slave_v['items']['options']) {
foreach ($slave_v['items']['options'] as $option_k => $option_v) {
if ($option_v["option_correct"]) {
$v['slave'][$slave_k]['items']['options'][$option_k] = array("option_content" => isset($answer_arr[$option_k]) ? $answer_arr[$option_k] : '');
}
}
}
}
}
$result[$k]['slave'] = $v['slave'];
} else {
$result[$k]['items'] = $v['items'];
$options_arr = array();
if ($v['items'] && isset($v['items'][0]) && isset($v['items'][0]['options'])) {
$options_arr = $v['items'][0]['options'];
if ($v['items'][0]['options'] && count($v['items'][0]['options']) == 1) {
foreach ($v['items'][0]['options'] as $op_v) {
$result[$k]['answer'] = $op_v['option_content'];
}
}
}
$result[$k]['slave'][] = array('topic_slave_id' => $v['id'], 'items' => array('options' => $options_arr));
}
}
}
return $result;
}
}