|
@@ -56,13 +56,13 @@ class Quality
|
|
|
$this->mTryAdjuster->load();
|
|
|
}
|
|
|
|
|
|
- public function find_quality($mchid, $card_type, $quality, $times, $used_time, $caller): array
|
|
|
+ public function find_quality($mchid, $card_type, $org_quality, $cur_quality, $times, $used_time, $caller): array
|
|
|
{
|
|
|
if($card_type == mtopcard\ChinaMobileCard || $card_type == mtopcard\ChinaUnicomCard || $card_type == mtopcard\ChinaTelecomCard) {
|
|
|
- return $this->mobile_quality($mchid, $quality, $times, $used_time);
|
|
|
+ return $this->mobile_quality($mchid, $org_quality, $cur_quality, $times, $used_time);
|
|
|
}
|
|
|
elseif($card_type == mtopcard\PetroChinaCard || $card_type == mtopcard\SinopecCard) {
|
|
|
- return $this->oil_quality($mchid, $quality, $times,$used_time,$caller);
|
|
|
+ return $this->oil_quality($mchid, $org_quality, $times,$used_time,$caller);
|
|
|
}
|
|
|
else {
|
|
|
return [0, []];
|
|
@@ -131,31 +131,30 @@ class Quality
|
|
|
}
|
|
|
|
|
|
|
|
|
- private function mobile_quality($mchid,$quality,$times,$used_time): array
|
|
|
+ private function mobile_quality($mchid, $org_quality, $cur_quality, $times, $used_time): array
|
|
|
{
|
|
|
- if($quality == 0)
|
|
|
+ if($org_quality == 0)
|
|
|
{
|
|
|
[$success,$setting_quality,$time_out] = $this->mMchPhonectl->getCtls($mchid);
|
|
|
if($success)
|
|
|
{
|
|
|
if(array_key_exists($setting_quality,$this->mQualities)) {
|
|
|
- $org = $setting_quality;
|
|
|
+ $org_quality = $setting_quality;
|
|
|
$qualities = $this->mQualities[$setting_quality];
|
|
|
}
|
|
|
else {
|
|
|
- $org = $setting_quality;
|
|
|
+ $org_quality = $setting_quality;
|
|
|
$qualities = [$setting_quality];
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- $org = self::Normal; //如果没设置质量,默认为普通
|
|
|
- $qualities = $this->mQualities[$org];
|
|
|
- $time_out = $this->mSpeeds[$org]['retry_timeout'];
|
|
|
+ $org_quality = self::Normal; //如果没设置质量,默认为普通
|
|
|
+ $qualities = $this->mQualities[$org_quality];
|
|
|
+ $time_out = $this->mSpeeds[$org_quality]['retry_timeout'];
|
|
|
}
|
|
|
}
|
|
|
- elseif(array_key_exists($quality,$this->mQualities)) {
|
|
|
- $org = $quality;
|
|
|
- $qualities = $this->mQualities[$quality];
|
|
|
+ elseif(array_key_exists($org_quality,$this->mQualities)) {
|
|
|
+ $qualities = $this->mQualities[$org_quality];
|
|
|
[$success, $setting_quality, $time_out] = $this->mMchPhonectl->getCtls($mchid);
|
|
|
}
|
|
|
else {
|
|
@@ -164,17 +163,18 @@ class Quality
|
|
|
}
|
|
|
|
|
|
if($time_out <= 0) {
|
|
|
- $time_out = $this->mSpeeds[$org]['retry_timeout'];
|
|
|
+ $time_out = $this->mSpeeds[$org_quality]['retry_timeout'];
|
|
|
}
|
|
|
|
|
|
- $max_times = $this->mSpeeds[$org]['retry_times'];
|
|
|
- $qualities = $this->calc_phone_quality($qualities,$times,$used_time,$time_out,$max_times,$mchid);
|
|
|
+ $max_times = $this->mSpeeds[$org_quality]['retry_times'];
|
|
|
+ $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,$qualities];
|
|
|
+ return [$org_quality,$qualities];
|
|
|
}
|
|
|
|
|
|
//通过每种类型通道耗时,倒推当前可用通道,并优先走推荐通道.
|
|
|
- private function calc_phone_quality($qualities, $times, $used_time, $time_out, $max_times,$mchid)
|
|
|
+ private function calc_phone_quality($qualities,$fMixed, $cur_quality, $times, $used_time, $time_out, $max_times, $mchid)
|
|
|
{
|
|
|
$left_time = $time_out - $used_time;
|
|
|
if($left_time <= 0 || $max_times <= $times) return [];
|
|
@@ -195,9 +195,15 @@ class Quality
|
|
|
return $result;
|
|
|
};
|
|
|
|
|
|
- $timeout_checker = function ($qualities, $left_time)
|
|
|
+ $timeout_checker = function ($qualities, $left_time) use($fMixed,$cur_quality)
|
|
|
{
|
|
|
$qualities = array_reverse($qualities);
|
|
|
+ if ($fMixed) {
|
|
|
+ $fLasted = $cur_quality != $qualities[0];
|
|
|
+ } else {
|
|
|
+ $fLasted = false;
|
|
|
+ }
|
|
|
+
|
|
|
$result = [];
|
|
|
foreach ($qualities as $quality)
|
|
|
{
|
|
@@ -210,6 +216,9 @@ class Quality
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if(empty($result) && $fLasted) {
|
|
|
+ $result[] = $qualities[0];
|
|
|
+ }
|
|
|
$result = array_reverse($result);
|
|
|
return $result;
|
|
|
};
|