Example #1
0
 /**
  * SPM
  */
 protected static function calSPM(&$resultsets)
 {
     #首先判断是否需要写入SPM相关的因子分数
     if (empty(self::$factors_list_all)) {
         self::getFactorsAll($resultsets->examinee_id);
     }
     if (!isset(self::$factors_list_all['SPM'])) {
         #true 表示不用写入SPM的相关因子
         return true;
     }
     #确保加载内存表
     if (!self::$memory_state) {
         self::loadMemoryTable();
     }
     #确保个人信息
     if (empty(self::$examinee_info)) {
         self::getExamineeInfo($resultsets->examinee_id);
     }
     #整理SPM题目答案
     $question_ans_array = self::getAnswers($resultsets);
     #确定所有涉及的因子,不再进行全局遍历
     $array_all_use = array();
     foreach (self::$factors_list_all['SPM'] 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();
     #简单因子先处理,复杂因子后处理,由于复杂因子使用简单因子的原始分,那么我们次序对其进行运算
     foreach ($array_all_use as $key => $value) {
         $factor_record = MemoryCache::getFactorDetail($value);
         $score = 0;
         if ($factor_record->action == 'sum') {
             #前5项(至多) 简单因子的原始得分
             $factor_record_number_array = explode(',', $factor_record->children);
             foreach ($factor_record_number_array as $skey) {
                 if (isset($question_ans_array[$skey])) {
                     $score += $question_ans_array[$skey];
                 }
             }
             $basic_array[$value] = $score;
         } else {
             #至多2项
             $code = preg_replace('/[a-z]+/', '\\$basic_array[\'$0\']', $factor_record->action);
             $code = "\$score = {$code};";
             eval($code);
             $basic_array[$value] = $score;
         }
     }
     #basic_array >= $factor_list_all['SPM'];
     foreach ($basic_array as $key => $value) {
         if (!in_array($key, self::$factors_list_all['SPM'])) {
             unset($basic_array[$key]);
         }
     }
     #现在的$basic_array为有效数组的原始的分
     $age = self::$examinee_info['age'];
     #spm的年龄区间 5.25~110
     if ($age < 5.25 || $age >= 110) {
         throw new Exception(self::$error_state . "SPM年龄范围越界" . $age);
     }
     foreach ($basic_array as $key => $score) {
         $factor_record = MemoryCache::getFactorDetail($key);
         $array_record = array();
         $std_score = 0;
         $ans_score = 0;
         if ($key == 'spm') {
             $spmmd = SpmmdMemory::findFirst(array('NLH >= :age: AND NLL <= :age:', 'bind' => array('age' => $age)));
             if (!isset($spmmd->NLH)) {
                 throw new Exception(self::$error_state . '-Spmmd不存在记录-' . 'age-' . $age);
             }
             if ($score >= $spmmd->B95) {
                 $std_score = 195;
             } else {
                 if ($score >= $spmmd->B90) {
                     $std_score = 290;
                 } else {
                     if ($score >= $spmmd->B75) {
                         $std_score = 275;
                     } else {
                         if ($score >= $spmmd->B50) {
                             $std_score = 350;
                         } else {
                             if ($score >= $spmmd->B25) {
                                 $std_score = 325;
                             } else {
                                 if ($score >= $spmmd->B10) {
                                     $std_score = 410;
                                 } else {
                                     if ($score >= $spmmd->B5) {
                                         $std_score = 45;
                                     } else {
                                         $std_score = 51;
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
             // std_score 第一位 智力等级  之后位为 百分等级
             $flag = substr($std_score, 0, 1);
             if ($flag == 1) {
                 $ans_score = 9;
             } else {
                 if ($flag == 2) {
                     $ans_score = 7.5;
                 } else {
                     if ($flag == 3) {
                         $ans_score = 6;
                     } else {
                         if ($flag == 4) {
                             $ans_score = 5;
                         } else {
                             if ($flag == 5) {
                                 $ans_score = 4;
                             } else {
                                 $ans_score = 1;
                             }
                         }
                     }
                 }
             }
         } else {
             $std_score = $score;
             if ($key == 'spmabc') {
                 $ans_score = sprintf("%.2f", $std_score / 3.6);
             } else {
                 $ans_score = sprintf("%.2f", $std_score / 1.2);
             }
         }
         $array_record['score'] = floatval($score);
         $array_record['std_score'] = floatval($std_score);
         $array_record['ans_score'] = floatval($ans_score);
         $rt_array[$factor_record->id] = $array_record;
     }
     return $rt_array;
 }
Example #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);
     }
 }