|
@@ -43,12 +43,14 @@ class Quality
|
|
|
protected $mSpeeds;
|
|
|
protected $mQualities;
|
|
|
protected $mTryAdjuster;
|
|
|
+ protected $mRatioCtl;
|
|
|
|
|
|
public function __construct()
|
|
|
{
|
|
|
$this->mMchPhonectl = new mchctl();
|
|
|
$this->mMchoilctl = new mchoilctl();
|
|
|
$this->mTryAdjuster = new try_judge();
|
|
|
+ $this->mRatioCtl = new mratio_control();
|
|
|
}
|
|
|
|
|
|
public function load()
|
|
@@ -56,6 +58,7 @@ class Quality
|
|
|
$this->mMchPhonectl->load();
|
|
|
$this->mMchoilctl->load();
|
|
|
$this->mTryAdjuster->load();
|
|
|
+ $this->mRatioCtl->load();
|
|
|
}
|
|
|
|
|
|
public function find_quality($mchid, $card_type, $org_quality, $cur_quality, $times, $used_time, $caller): array
|
|
@@ -169,22 +172,138 @@ class Quality
|
|
|
}
|
|
|
|
|
|
$max_times = $this->max_times($mchid,$org_quality);
|
|
|
- $fMixed = PolicyUtil::mixed_quality($org_quality);
|
|
|
+ if($this->mRatioCtl->exist($mchid))
|
|
|
+ {
|
|
|
+ $qualities = $this->ratio_phone_quality($qualities,$cur_quality,$times,$used_time,$mchid);
|
|
|
+ return [$org_quality,$qualities];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $fMixed = PolicyUtil::mixed_quality($org_quality);
|
|
|
+ $qualities = $this->calc_phone_quality($qualities,$fMixed,$cur_quality,$times,$used_time,$time_out,$max_times,$mchid);
|
|
|
+ return [$org_quality,$qualities];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private function ratio_phone_quality($qualities,$cur_quality,$times,$used_time,$mchid)
|
|
|
+ {
|
|
|
+ [$succ,$max_times,$time_out] = $this->mRatioCtl->total($mchid);
|
|
|
+
|
|
|
+ $left_time = $time_out - $used_time;
|
|
|
+ if ($left_time <= 0 || $max_times <= $times) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ $match_ratio = $this->mRatioCtl->ratio_match($mchid);
|
|
|
+
|
|
|
+ Log::record("ratio_phone_quality begin qualities= " . implode(',',$qualities),Log::DEBUG);
|
|
|
+ $times_checker = function($qualities, $times) use($match_ratio,$max_times,$mchid)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ $pre_times = 0;
|
|
|
+ foreach ($qualities as $quality)
|
|
|
+ {
|
|
|
+ if ($match_ratio) {
|
|
|
+ $result[] = $quality;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $qtimes = $this->mRatioCtl->times($mchid, $quality);
|
|
|
+ if($qtimes == false) continue;
|
|
|
+
|
|
|
+ $pre_times += $qtimes;
|
|
|
+ if ($times < $pre_times) {
|
|
|
+ $result[] = $quality;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- $qualities = $this->calc_phone_quality($qualities,$fMixed,$cur_quality,$times,$used_time,$time_out,$max_times,$mchid);
|
|
|
+ return $result;
|
|
|
+ };
|
|
|
+
|
|
|
+ $timeout_checker = function ($qualities, $left_time) use($cur_quality,$match_ratio,$mchid)
|
|
|
+ {
|
|
|
+ if($match_ratio)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ foreach ($qualities as $quality)
|
|
|
+ {
|
|
|
+ $per_secs = $this->mSpeeds[$quality]['per_secs'];
|
|
|
+ $left_time -= $per_secs;
|
|
|
+ if($left_time > 0) {
|
|
|
+ $result[] = $quality;
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+
|
|
|
+ $qualities = array_reverse($qualities);
|
|
|
+ foreach ($qualities as $quality)
|
|
|
+ {
|
|
|
+ $per_secs = $this->mSpeeds[$quality]['per_secs'];
|
|
|
+ $qsecs = $this->mRatioCtl->seconds($mchid, $quality);
|
|
|
+ if($qsecs == false) continue;
|
|
|
+
|
|
|
+ if($left_time - $qsecs > 0) {
|
|
|
+ $left_time -= $qsecs;
|
|
|
+ $result[] = $quality;
|
|
|
+ }
|
|
|
+ elseif($left_time - $per_secs > 0) {
|
|
|
+ $left_time -= $per_secs;
|
|
|
+ $result[] = $quality;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $result = array_reverse($result);
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ $pTryAdjuster = $this->mTryAdjuster;
|
|
|
+ $timeing_checker = function ($qualities) use($pTryAdjuster,$mchid)
|
|
|
+ {
|
|
|
+ foreach ($qualities as $quality)
|
|
|
+ {
|
|
|
+ $ret = $pTryAdjuster->can_try($mchid,$quality);
|
|
|
+ if($ret == false) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ };
|
|
|
+
|
|
|
+ if($times > 0)
|
|
|
+ {
|
|
|
+ $qualities = $times_checker($qualities,$times);
|
|
|
+ Log::record("calc_quality times_checker result = " . implode(',', $qualities), Log::DEBUG);
|
|
|
+ $qualities = $timeout_checker($qualities,$left_time);
|
|
|
+ Log::record("calc_quality timeout_checker result = " . implode(',', $qualities), Log::DEBUG);
|
|
|
+
|
|
|
+ if(!$timeing_checker($qualities)) {
|
|
|
+ $qualities = [];
|
|
|
+ Log::record("calc_quality timeing_checker result is empty", Log::DEBUG);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $qualities;
|
|
|
|
|
|
- return [$org_quality,$qualities];
|
|
|
}
|
|
|
|
|
|
private function max_times($mchid,$quality)
|
|
|
{
|
|
|
- global $config;
|
|
|
- $mtimes = $config['merchant_retry_times'] ?? [];
|
|
|
-
|
|
|
- if(array_key_exists($mchid,$mtimes) && array_key_exists($quality,$mtimes[$mchid])) {
|
|
|
- return $mtimes[$mchid][$quality];
|
|
|
- }
|
|
|
- else {
|
|
|
+ [$succ, $times,$secs] = $this->mRatioCtl->total($mchid);
|
|
|
+ if ($succ) {
|
|
|
+ return $times;
|
|
|
+ } else {
|
|
|
return $this->mSpeeds[$quality]['retry_times'];
|
|
|
}
|
|
|
}
|
|
@@ -273,4 +392,7 @@ class Quality
|
|
|
|
|
|
return $qualities;
|
|
|
}
|
|
|
+ public function update_mchratios($ratios) {
|
|
|
+ $this->mRatioCtl->update($ratios);
|
|
|
+ }
|
|
|
}
|