예제 #1
0
 public static function getSPMdata($examinee_info)
 {
     $projectdetail = ProjectDetail::findFirst(array('project_id=?1', 'bind' => array(1 => $examinee_info->project_id)));
     $factors = json_decode($projectdetail->factor_names, true);
     if (!isset($factors['SPM'])) {
         return null;
     }
     $ans = array();
     foreach ($factors['SPM'] as $key => $value) {
         $inner_array = array();
         $factor_info = Factor::findFirst($key);
         $inner_array['chs_name'] = $factor_info->chs_name;
         $factor_score_info = FactorAns::findFirst(array('factor_id = ?1 AND examinee_id =?2', 'bind' => array(1 => $key, 2 => $examinee_info->id)));
         $inner_array['std_score'] = intval($factor_score_info->std_score);
         $inner_array['score'] = $factor_score_info->score;
         //$inner_array['name'] = $factor_info->name;
         $ans[$factor_info->name] = $inner_array;
     }
     return $ans;
 }
예제 #2
0
 /**
  * @usage 获取所有涉及到的因子得分数组
  * @param int $examinee_id
  */
 private static function getFactors($examinee_id)
 {
     $factors_ans = FactorAns::find(array("examinee_id = :examinee_id:", 'bind' => array('examinee_id' => $examinee_id)));
     if (count($factors_ans) == 0) {
         throw new Exception(self::$error_state . '-下层因子成绩未写入-' . count($factors_ans));
     }
     if (empty(self::$project_id)) {
         self::getProjectId($examinee_id);
     }
     $project_detail = MemoryCache::getProjectDetail(self::$project_id);
     $factor_needed = json_decode($project_detail->factor_names, true);
     foreach ($factor_needed as $key => $value) {
         if (is_scalar($value)) {
             $factor_detail = MemoryCache::getFactorDetail($value);
             $factor_id = $factor_detail->id;
             $factor_ans = FactorAns::findFirst(array("examinee_id = :examinee_id: AND factor_id = :factor_id:", 'bind' => array('examinee_id' => $examinee_id, 'factor_id' => $factor_id)));
             if (!isset($factor_ans->examinee_id)) {
                 throw new Exception(self::$error_state . '-因子计分未写入-name-' . $value . '-id-' . $factor_id);
             }
             self::$factors_list[$value] = $factor_ans->ans_score;
         } else {
             foreach ($value as $skey => $svalue) {
                 $factor_detail = MemoryCache::getFactorDetail($svalue);
                 $factor_id = $factor_detail->id;
                 $factor_ans = FactorAns::findFirst(array("examinee_id = :examinee_id: AND factor_id = :factor_id:", 'bind' => array('examinee_id' => $examinee_id, 'factor_id' => $factor_id)));
                 if (!isset($factor_ans->examinee_id)) {
                     throw new Exception(self::$error_state . '-因子计分未写入-name-' . $svalue . '-id-' . $factor_id);
                 }
                 self::$factors_list[$svalue] = $factor_ans->ans_score;
             }
         }
     }
     if (isset($factor_needed)) {
         unset($factor_needed);
     }
 }
예제 #3
0
 /**
  * @usage 计算因子得分并写入到库的关键,采取个人按试卷记录插入操作
  * @param int $examinee_id
  * @throws Exception
  * @return boolean
  */
 public static function handleFactors($examinee_id)
 {
     #加载内存表
     if (!self::$memory_state) {
         self::loadMemoryTable();
     }
     if (empty(self::$examinee_info)) {
         #false表示已经写入完成
         if (!self::getExamineeInfo($examinee_id)) {
             return false;
         }
     }
     #读取project_detail
     if (empty(self::$factors_list_all)) {
         self::getFactorsAll($examinee_id);
     }
     #读取questionAns
     $papers_list = self::getPapersByExamineeId($examinee_id);
     foreach ($papers_list as $question_ans_record) {
         $paper_name = $question_ans_record->Paper->name;
         $rtn_array_paper = null;
         switch (strtoupper($paper_name)) {
             case "EPQA":
                 $rtn_array_paper = self::calEPQA($question_ans_record);
                 break;
             case 'EPPS':
                 $rtn_array_paper = self::calEPPS($question_ans_record);
                 break;
             case 'CPI':
                 $rtn_array_paper = self::calCPI($question_ans_record);
                 break;
             case 'SCL':
                 $rtn_array_paper = self::calSCL($question_ans_record);
                 break;
             case '16PF':
                 $rtn_array_paper = self::calKS($question_ans_record);
                 break;
             case 'SPM':
                 $rtn_array_paper = self::calSPM($question_ans_record);
                 break;
             default:
                 throw new Exception(self::$error_state . "-不存在试卷-{$paper_name}");
         }
         if (is_bool($rtn_array_paper) || empty($rtn_array_paper)) {
             continue;
         }
         try {
             $manager = new TxManager();
             $transaction = $manager->get();
             foreach ($rtn_array_paper as $key => $value) {
                 #写入之前先行判断是否已经被写入过
                 $isWrited = FactorAns::findFirst(array("examinee_id=:examinee_id: AND factor_id = :factor_id:", 'bind' => array('examinee_id' => $examinee_id, 'factor_id' => $key)));
                 if (isset($isWrited->factor_id)) {
                     continue;
                 }
                 $factor_ans = new FactorAns();
                 $factor_ans->setTransaction($transaction);
                 $factor_ans->examinee_id = $examinee_id;
                 $factor_ans->factor_id = $key;
                 $factor_ans->score = $value['score'];
                 $factor_ans->std_score = $value['std_score'];
                 $factor_ans->ans_score = $value['ans_score'];
                 if ($factor_ans->save() == false) {
                     $transaction->rollback(self::$error_state . "插入数据失败" . print_r($factor_ans));
                 }
             }
             $transaction->commit();
         } catch (TxFailed $e) {
             throw new Exception($e->getMessage());
         }
     }
     return true;
 }
예제 #4
0
 public function IsHidden($examinee_id)
 {
     $factor_name = 'epqal';
     $project_id = $this->self_check($examinee_id);
     //判断项目是否选中该因子
     $factor_id = '';
     $factor_info = ProjectDetail::findFirst(array("project_id = :project_id:", 'bind' => array('project_id' => $project_id)));
     $factor_names = json_decode($factor_info->factor_names, true);
     if (isset($factor_names['EPQA'])) {
         if (!in_array($factor_name, $factor_names['EPQA'])) {
             return true;
         } else {
             $new_array = array_flip($factor_names['EPQA']);
             $factor_id = $new_array[$factor_name];
         }
     } else {
         return true;
     }
     //存在的情况下进行项目整体判断
     $result = $this->modelsManager->createBuilder()->columns(array('avg(FactorAns.score) as avg'))->from('Examinee')->join('FactorAns', 'Examinee.id = FactorAns.examinee_id and  Examinee.project_id = ' . $project_id)->join('Factor', "Factor.id = FactorAns.factor_id AND Factor.name = '{$factor_name}'")->getQuery()->execute();
     $average = $result->toArray()[0]['avg'];
     $result = FactorAns::findFirst(array('factor_id = ?1 AND examinee_id = ?2', 'bind' => array(1 => $factor_id, 2 => $examinee_id)));
     $person_score = $result->score;
     if ($person_score <= $average) {
         return true;
     } else {
         return false;
     }
 }