Exemplo n.º 1
0
 /**
  * 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());
         }
     }
 }
Exemplo n.º 2
0
 /**
  * 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;
 }