/** * 获取大学录取概率 * @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]); }
public static function _singleton() { if (!self::$_singleton instanceof Formula) { self::$_singleton = new self(); } return self::$_singleton; }