/** * public $DM; * public $YZ; * public $M; * public $SD; * @throws Exception * @return boolean */ private static function startMysqlCpimdMemory() { $cpimd_first = CpimdMemory::findFirst(); if (isset($cpimd_first->DM)) { return true; } else { try { $manager = new TxManager(); $transaction = $manager->get(); $cpimd_data = Cpimd::find(); foreach ($cpimd_data as $cpimd_record) { $cpimd_memory = new CpimdMemory(); $cpimd_memory->setTransaction($transaction); $cpimd_memory->DM = $cpimd_record->DM; $cpimd_memory->YZ = $cpimd_record->YZ; $cpimd_memory->M = $cpimd_record->M; $cpimd_memory->SD = $cpimd_record->SD; if ($cpimd_memory->create() == false) { unset($cpimd_data); $transaction->rollback("CPIMD DATA INSERT INTO MEMORY TABLE ERROR!"); } } if (isset($cpimd_data)) { unset($cpimd_data); } $transaction->commit(); return true; } catch (TxFailed $e) { throw new Exception("Failed, reason: " . $e->getMessage()); } } }
/** * CPI 匹配 sum */ protected static function calCPI(&$resultsets) { #首先判断是否需要写入cpi相关的因子分数 if (empty(self::$factors_list_all)) { self::getFactorsAll($resultsets->examinee_id); } if (!isset(self::$factors_list_all['CPI'])) { #true 表示不用写入CPI的相关因子 return true; } $string = str_replace('-', '|', $resultsets->score); $score_array = explode('|', $string); $score_array = array_count_values($score_array); unset($score_array['']); #确保加载内存表 if (!self::$memory_state) { self::loadMemoryTable(); } if (empty(self::$examinee_info)) { self::getExamineeInfo($resultsets->examinee_id); } $dm = self::$examinee_info['sex'] == 1 ? 1 : 2; $rt_array = array(); foreach (self::$factors_list_all['CPI'] as $key => $value) { $rt_array_record = array(); #判断要写入的因子是否存在于之前的结果集中,若不存在,则置为0 $score = 0; if (isset($score_array[$value])) { $score = $score_array[$value]; } $m = 0; $sd = 0; $std_score = 0; $ans_score = 0; #标准分 $cpimd = CpimdMemory::findFirst(array("DM = :dm: AND YZ = :yz:", 'bind' => array('dm' => $dm, 'yz' => strtoupper($value)))); if (!isset($cpimd->DM)) { throw new Exception(self::$error_state . '-CPI不存在记录-' . '-DM-' . $dm . '-YZ-' . $value); } $m = $cpimd->M; $sd = $cpimd->SD; if ($m != 0 && $sd != 0) { $std_score = sprintf("%.2f", 50 + 10 * ($score - $m) / $sd); } #最终分 if ($value != 'fx') { $ans_score = sprintf("%.2f", $std_score / 10); } else { if ($std_score == 100) { $ans_score = 10; } else { if ($std_score > 80) { $ans_score = 9; } else { if ($std_score > 65) { $ans_score = 8; } else { if ($std_score > 30) { $ans_score = 5; } else { if ($std_score > 10) { $ans_score = 2; } else { $ans_score = 1; } } } } } } $array_record['score'] = floatval($score); $array_record['std_score'] = floatval($std_score); $array_record['ans_score'] = floatval($ans_score); $rt_array[$key] = $array_record; } return $rt_array; }