Example #1
0
 /**
  * 获取大学录取概率
  * @param int $pro_code 省份code
  * @param int $line_wl 文理
  * @param int $score 考分
  * @return array
  */
 public function getChance($pro_code, $line_wl, $score, $col_id)
 {
     //获取当前年份的省控线
     $year = date('Y');
     $sql = 'select line_batch,line_score from line where line_year=? and line_wl=? and pro_code=?';
     $line = $this->fetchAll($sql, [$year, $line_wl, $pro_code]);
     if (!$line) {
         return json_encode(['status' => 404, 'message' => '并无当前省份省控线']);
     }
     //选择批次
     if ($score >= $line[0]['line_score'] + 20) {
         $batch = ' p1.col_sco_batch=1';
     } elseif ($score < $line[0]['line_score'] + 20 && $score >= $line[0]['line_score'] - 10) {
         $batch = ' p1.col_sco_batch<=2 and col_sco_batch>=1';
     } elseif ($score < $line[0]['line_score'] - 10 && $score >= $line[1]['line_score'] + 10) {
         $batch = ' p1.col_sco_batch=2';
     } else {
         $batch = ' p1.col_sco_batch>2';
     }
     //获取大学线差,平均分,难度,最高分,最低分
     $year -= 6;
     $sql = "select p1.col_sco_batch,p1.col_sco_year,p1.col_sco_diff,p1.col_sco_avg,p1.col_sco_max,p1.col_sco_min,p2.col_degree\r\n                from college_score p1\r\n                inner join college p2 on p1.col_id=p2.col_id\r\n                where p1.col_sco_avg>0 and p1.col_sco_diff>=0 and {$batch} and p1.col_sco_wl=? and p1.pro_code=? and p1.col_id=? and p1.col_sco_year>{$year} order by col_sco_batch asc";
     $original = $this->fetchAll($sql, [$line_wl, $pro_code, $col_id]);
     if (!$original) {
         return json_encode(['status' => 404, 'message' => '无当前学校数据']);
     }
     //格式化数据,将平均分,最高分,最低分,线差,年份单独组成数组,以批次划分
     $info = [];
     foreach ($original as $val) {
         if ($val['col_sco_batch'] > 2) {
             $val['col_sco_batch'] = 2;
         }
         $info[$val['col_sco_batch']]['avg'][] = $val['col_sco_avg'];
         //平均分
         $info[$val['col_sco_batch']]['max'][] = $val['col_sco_max'];
         //最高分
         $info[$val['col_sco_batch']]['min'][] = $val['col_sco_min'];
         //最低分
         $info[$val['col_sco_batch']]['diff'][] = $val['col_sco_diff'];
         //线差
         $info[$val['col_sco_batch']]['year'][] = $val['col_sco_year'];
         //年份
     }
     //计算概率
     $data = ['score' => $info];
     foreach ($info as $key => $val) {
         foreach ($line as $v) {
             if ($key == $v['line_batch']) {
                 $diff = \Formula::_singleton()->probability($score, $v['line_score'], $original[0]['col_degree'], $val['diff']);
                 //差值概率
                 $avg = \Formula::_singleton()->probability($score, $v['line_score'], $original[0]['col_degree'], $val['avg'], false);
                 //平均数概率
                 $probable = number_format(($diff * 0.9 + $avg * 0.1) * 100, 2, '.', '');
                 //总概率
                 $data['probable'][] = $probable > 100 ? 100 : $probable;
             }
         }
     }
     return json_encode(['status' => 200, 'data' => $data]);
 }
Example #2
0
 public static function _singleton()
 {
     if (!self::$_singleton instanceof Formula) {
         self::$_singleton = new self();
     }
     return self::$_singleton;
 }