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; }
/** * @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); } }
/** * @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; }
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; } }