stanley-king 3 jaren geleden
bovenliggende
commit
fdf07d95cd

+ 7 - 3
helper/refill/RefillBase.php

@@ -46,8 +46,8 @@ class RefillBase
         $this->mPolicy->load();
     }
 
-    public function find_quality($mchid,$spec,$card_type,$org_quality,$times,$period,$pcode = '',$regin_no = -1): array {
-        return $this->mPolicy->find_quality($mchid,$spec,$card_type,$org_quality,$times,$period,$pcode,$regin_no);
+    public function find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$period,$pcode = '',$regin_no = -1): array {
+        return $this->mPolicy->find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$period,$pcode,$regin_no);
     }
 
     public function notify($chname, $input)
@@ -169,16 +169,19 @@ class RefillBase
         $spec  = intval($refill_info['refill_amount']);
         $card_type = intval($refill_info['card_type']);
         $org_quality = intval($refill_info['org_quality']);
+        $cur_quality = intval($refill_info['quality']); //从数据库中读取的字段。
+
         $used_time = time() - intval($refill_info['order_time']);
         $commit_times = intval($refill_info['commit_times']);
         $regin_no = $refill_info['regin_no'];
 
+
         //三方充值,不做重试
         if($card_type == mtopcard\ThirdRefillCard) {
             return [false,null];
         }
 
-        [$org_quality,$quality] = $this->find_quality($mchid,$spec,$card_type,$org_quality,$commit_times,$used_time,"",$regin_no);
+        [$org_quality,$quality] = $this->find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$commit_times,$used_time,"",$regin_no);
         if($quality <= 0) return [false,null];
 
         $params = [ 'mchid' => $refill_info['mchid'],
@@ -188,6 +191,7 @@ class RefillBase
             'card_type' => $refill_info['card_type'],
             'regin_no' => $refill_info['regin_no'],
             'org_quality' => $org_quality,
+            'quality' => $cur_quality,
             'mch_order' =>  $refill_info['mch_order'],
             'notify_url' => $refill_info['notify_url'],
             'idcard' => $refill_info['idcard'] ?? '',

+ 1 - 1
helper/refill/policy/IPolicy.php

@@ -7,7 +7,7 @@ namespace refill;
 interface IPolicy
 {
     //[orgian_quality,current_quality]
-    public function find_quality($mchid, $spec, $card_type, $quality, $times, $used_time, $pcode, $regin_no): array;
+    public function find_quality($mchid, $spec, $card_type, $org_quality,$cur_quality, $times, $used_time, $pcode, $regin_no): array;
 
     public function find_providers(int $mchid, int $spec, int $card_type, int $org_quality, int $quality, $regin_no, $pcode, $order_time, $commit_times): array;
 

+ 2 - 2
helper/refill/policy/lingzh/policy.php

@@ -125,7 +125,7 @@ class policy extends ProviderManager implements IPolicy
         return count($providers);
     }
 
-    public function find_quality($mchid,$spec,$card_type,$org_quality,$times,$used_time,$pcode,$regin_no): array
+    public function find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$used_time,$pcode,$regin_no): array
     {
         if($card_type == mtopcard\SinopecCard || $card_type == mtopcard\PetroChinaCard) {
             $caller = new times_caller($mchid,$spec,$card_type,-1,$this);
@@ -133,7 +133,7 @@ class policy extends ProviderManager implements IPolicy
             $caller = null;
         }
 
-        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$times,$used_time,$caller);
+        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$cur_quality,$times,$used_time,$caller);
         if(empty($qualities)) {
             return [$org_quality,0];
         }

+ 28 - 19
helper/refill/policy/quaility.php

@@ -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;
         };

+ 2 - 2
helper/refill/policy/xyz/policy.php

@@ -161,7 +161,7 @@ class policy extends ProviderManager implements IPolicy
         return count($providers);
     }
 
-    public function find_quality($mchid,$spec,$card_type,$org_quality,$times,$used_time,$pcode,$regin_no): array
+    public function find_quality($mchid,$spec,$card_type,$org_quality,$cur_quality,$times,$used_time,$pcode,$regin_no): array
     {
         if($card_type == mtopcard\SinopecCard || $card_type == mtopcard\PetroChinaCard) {
             $caller = new times_caller($mchid,$spec,$card_type,-1,$this);
@@ -169,7 +169,7 @@ class policy extends ProviderManager implements IPolicy
             $caller = null;
         }
 
-        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$times,$used_time,$caller);
+        [$org_quality,$qualities] = $this->mQuality->find_quality($mchid,$card_type,$org_quality,$cur_quality,$times,$used_time,$caller);
         if(empty($qualities)) {
             return [$org_quality,0];
         }

+ 7 - 3
rdispatcher/proxy.php

@@ -31,6 +31,8 @@ class proxy
         $last_order_id = $params['order_id'] ?? 0;
 
         $org_quality = intval($params['org_quality']) ?? 0;
+        $cur_quality = intval($params['quality']) ?? 0;
+
         $card_type   = intval($params['card_type']) ?? 0;
         $regin_no   = intval($params['regin_no']) ?? -1;
         $quantity = 1;
@@ -50,7 +52,7 @@ class proxy
             $validate = true;
         }
 
-        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$commit_times,time() - $order_time,'',$regin_no);
+        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$cur_quality,$commit_times,time() - $order_time,'',$regin_no);
         if($first_comit) {
             refill\util::incr_user_commit($mchid,$card_type,$amount,$org_quality);
         }
@@ -82,7 +84,7 @@ class proxy
             }
             elseif(($errcode === refill\errcode::MERCHANT_REFILL_ERROR && $neterr) || $errcode == refill\errcode::PROVIDER_OVERLOAD || $errcode == errcode::MERCHANT_PRICE_UNSETTING)
             {
-                [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$commit_times,time() - $order_time,'',$regin_no);
+                [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$cur_quality,$commit_times,time() - $order_time,'',$regin_no);
                 if ($quality > 0)
                 {
                     $fNotify = false;
@@ -137,6 +139,8 @@ class proxy
         $last_order_id = $params['order_id'] ?? 0;
 
         $org_quality = intval($params['org_quality']) ?? 0;
+        $cur_quality = intval($params['quality']) ?? 0;
+
         $card_type   = intval($params['card_type']) ?? 0;
         $regin_no   = intval($params['regin_no']) ?? -1;
         $quantity = 1;
@@ -156,7 +160,7 @@ class proxy
             $validate = true;
         }
 
-        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$commit_times,time() - $order_time,'',$regin_no);
+        [$org_quality,$quality] = refill\RefillFactory::instance()->find_quality($mchid,$amount,$card_type,$org_quality,$cur_quality,$commit_times,time() - $order_time,'',$regin_no);
         if($first_comit) {
             refill\util::incr_user_commit($mchid,$card_type,$amount,$org_quality);
         }