/** * public $DM; * public $YZ; * public $QSF; * public $ZZF; * public $BZF; * @throws Exception * @return boolean */ private static function startMysqlKsmdMemory() { $ksmd_first = KsmdMemory::findFirst(); if (isset($ksmd_first->YZ)) { return true; } else { try { $manager = new TxManager(); $transaction = $manager->get(); $ksmd_data = Ksmd::find(); foreach ($ksmd_data as $ksmd_record) { $ksmd_memory = new KsmdMemory(); $ksmd_memory->setTransaction($transaction); $ksmd_memory->DM = $ksmd_record->DM; $ksmd_memory->YZ = $ksmd_record->YZ; $ksmd_memory->QSF = $ksmd_record->QSF; $ksmd_memory->ZZF = $ksmd_record->ZZF; $ksmd_memory->BZF = $ksmd_record->BZF; if ($ksmd_memory->create() == false) { unset($ksmd_data); $transaction->rollback("KSMD DATA INSERT INTO MEMORY TABLE ERROR!"); } } if (isset($ksmd_data)) { unset($ksmd_data); } $transaction->commit(); return true; } catch (TxFailed $e) { throw new Exception("Failed, reason: " . $e->getMessage()); } } }
/** * 16PF */ protected static function calKS(&$resultsets) { #首先判断是否需要写入16PF相关的因子分数 if (empty(self::$factors_list_all)) { self::getFactorsAll($resultsets->examinee_id); } if (!isset(self::$factors_list_all['16PF'])) { #true 表示不用写入16PF的相关因子 return true; } #确保加载内存表 if (!self::$memory_state) { self::loadMemoryTable(); } #确保个人信息 if (empty(self::$examinee_info)) { self::getExamineeInfo($resultsets->examinee_id); } //来自wjz,edit by brucew 男 8 女 9 // Case "一般成人" // If sex = "男" Then // cmdm = "8" // Else // cmdm = "9" // End If // wjz 中人员的类别不仅仅有一般成人,还有其他多种类型 $dm = self::$examinee_info['sex'] == 1 ? 8 : 9; #整理16PF题目答案 $question_ans_array = self::getAnswers($resultsets); #确定所有涉及的因子,不再进行全局遍历 $array_all_use = array(); foreach (self::$factors_list_all['16PF'] as $key => $value) { $factor_detail = MemoryCache::getFactorDetail($value); if ($factor_detail->action == 'sum') { if (!in_array($value, $array_all_use)) { $array_all_use[$key] = $value; } } else { if (!in_array($value, $array_all_use)) { $array_all_use[$key] = $value; } $child_factor_str = $factor_detail->children; $child_factor_array = explode(',', $child_factor_str); foreach ($child_factor_array as $fvalue) { if (!in_array($fvalue, $array_all_use)) { $fvalue_tmp = MemoryCache::getFactorDetail($fvalue); $fkey = $fvalue_tmp->id; $array_all_use[$fkey] = $fvalue; } } } } ksort($array_all_use); #得到一个完全有效数组 #返回数组 $rt_array = array(); #保存基础数组 $basic_array = array(); #前16项简单因子处理完毕 foreach ($array_all_use as $key => $value) { $factor_record = MemoryCache::getFactorDetail($value); if ($factor_record->action == 'sum') { $array_record = array(); #前16项(至多) 简单因子的原始得分,标准分,及最终得分 $factor_record_number_array = explode(',', $factor_record->children); $score = 0; foreach ($factor_record_number_array as $skey) { if (isset($question_ans_array[$skey])) { $score += $question_ans_array[$skey]; } } $std_score = 0; $ans_score = 0; $ksmd = KsmdMemory::findFirst(array('DM=:dm: AND YZ=:yz: AND QSF <= :score: AND ZZF >= :score:', 'bind' => array('dm' => $dm, 'yz' => $value, 'score' => $score))); if (!isset($ksmd->BZF)) { throw new Exception(self::$error_state . '-Ksmd 不存在记录-' . 'DM-' . $dm . '-YZ-' . $value . '-QSF-' . $score); } $std_score = $ksmd->BZF; if ($value != 'Q4') { $ans_score = $std_score; } else { $ans_score = 10 - $std_score; } $basic_array[$value] = $std_score; $array_record['score'] = $score; $array_record['std_score'] = $std_score; $array_record['ans_score'] = $ans_score; $rt_array[$key] = $array_record; } } #后8项(至多)复杂因子计算 foreach ($array_all_use as $key => $value) { $factor_record = MemoryCache::getFactorDetail($value); if ($factor_record->action != 'sum') { $array_record = array(); $std_score = 0; $ans_score = 0; $score = 0; $code = preg_replace('/[A-Z][0-9]?/', '\\$basic_array[\'$0\']', $factor_record->action); $code = "\$score = sprintf(\"%.2f\",{$code});"; eval($code); $score = floatval($score); if ($value != 'Y3') { $std_score = $score; } else { $ksmd = KsmdMemory::findFirst(array('YZ=:yz: AND QSF <= :score: AND ZZF >= :score:', 'bind' => array('yz' => $value, 'score' => $score))); if (!isset($ksmd->BZF)) { throw new Exception(self::$error_state . '-Ksmd不存在记录-' . 'YZ-' . $value . '-QSF-' . $score); } $std_score = $ksmd->BZF; } if ($value == 'X1') { $ans_score = 10 - $std_score; } else { if ($value == 'Y1' || $value == 'Y4') { $ans_score = sprintf("%.2f", $std_score / 4); } else { if ($value == 'Y2') { $ans_score = sprintf("%.2f", $std_score / 7.5); } else { $ans_score = $std_score; } } } $array_record['score'] = floatval($score); $array_record['std_score'] = floatval($std_score); $array_record['ans_score'] = floatval($ans_score); $rt_array[$key] = $array_record; } } #对简单因子的再处理,由于之前出现的简单因子可能在总体需要的因子表中并不存在,我们现在需要对照project_detail取出需要的简单因子,而复杂因子只要出现了,那么就肯定要包含 #rt_array >= $factor_list_all['16PF']; foreach ($rt_array as $key => $value) { if (!array_key_exists($key, self::$factors_list_all['16PF'])) { unset($rt_array[$key]); } } return $rt_array; }