stanley-king před 1 měsícem
rodič
revize
02861beadd

+ 3 - 3
admin/control/merchant.php

@@ -1195,8 +1195,8 @@ class merchantControl extends SystemControl
             $transfer_data = function (){
                 $transfer_cfg['transfer_opened'] = intval($_POST['transfer_opened']) ?? 0;
                 $transfer_cfg['transfer_mchid'] = intval($_POST['transfer_mchid']) ?? 0;
-                $transfer_cfg['transfer_lowertime']  = intval($_POST['transfer_lowertime']) ?? 0;
-                $transfer_cfg['transfer_uppertime']  = intval($_POST['transfer_uppertime']) ?? 0;
+                $transfer_cfg['transfer_lowestratio'] = round($_POST['transfer_lowestratio'] ?? 0, 3);
+
                 if (!empty($_POST['transfer_card_types'])) {
                     foreach ($_POST['transfer_card_types'] as $card_type) {
                         $card_types[] = intval($card_type);
@@ -1362,7 +1362,7 @@ class merchantControl extends SystemControl
     {
         $transfer_cfg = $merchant['transfer_cfg'];
         if (empty($transfer_cfg)) {
-            $transfer_cfg = ['transfer_opened' => 0, 'transfer_mchid' => 0, 'transfer_lowertime' => 0, 'transfer_uppertime' => 0, 'card_types' => []];
+            $transfer_cfg = ['transfer_opened' => 0, 'transfer_mchid' => 0, 'transfer_lowestratio' => 0, 'card_types' => []];
         } else {
             $transfer_cfg = unserialize($transfer_cfg);
         }

+ 5 - 10
admin/templates/default/merchant.ctl.php

@@ -218,25 +218,20 @@
                 </tr>
 
                 <tr class="noborder">
-                    <td colspan="2" class="required mleft"><label style="display: inline-block;" class="mleft" for="name">失败订单转发到机构ID:</label>
-                        <input type="text" name="transfer_mchid" value="<?php echo $output['transfer_cfg']['transfer_mchid']; ?>" /><span style="color:red;">注:该通道需要单独创建,帐号不能给下游。</span>
+                    <td colspan="2" class="required mleft"><label style="display: inline-block;" class="mleft" for="name">成功率低于:</label>
+                        <input type="text" name="transfer_lowestratio" value="<?php echo $output['transfer_cfg']['transfer_lowestratio']; ?>" /> <span>(保留小数点后三位)</span>
                     </td>
                 </tr>
 
                 <tr class="noborder">
-                    <td colspan="2" class="required mleft"><label style="display: inline-block;" class="mleft" for="name">超过多长时间开始转发:</label>
-                        <input type="text" name="transfer_lowertime" value="<?php echo $output['transfer_cfg']['transfer_lowertime']; ?>" /> <span>(秒)</span>
+                    <td colspan="2" class="required mleft"><label style="display: inline-block;" class="mleft" for="name">失败订单转发到机构ID:</label>
+                        <input type="text" name="transfer_mchid" value="<?php echo $output['transfer_cfg']['transfer_mchid']; ?>" /><span style="color:red;">注:该通道需要单独创建,帐号不能给下游。</span>
                     </td>
                 </tr>
 
-                <tr class="noborder">
-                    <td colspan="2" class="required mleft"><label style="display: inline-block;" class="mleft" for="name">超过多长时间停止转发:</label>
-                        <input type="text" name="transfer_uppertime" value="<?php echo $output['transfer_cfg']['transfer_uppertime']; ?>" /> <span>(秒)</span>
-                    </td>
-                </tr>
 
                 <tr class="noborder">
-                    <td colspan="2" class="required"><label class="mleft" style="margin-right: 12px;" for="name">运营商拦截:</label>
+                    <td colspan="2" class="required"><label class="mleft" style="margin-right: 12px;" for="name">不保运营商:</label>
                         <label>
                             <input type="checkbox" name="transfer_card_types[]" value="<?php echo mtopcard\ChinaMobileCard; ?>" <?php if (!empty($output['transfer_cfg']['card_types']) && in_array(mtopcard\ChinaMobileCard, $output['transfer_cfg']['card_types'])) {
                                 echo 'checked';

+ 6 - 0
helper/refill/RefillBase.php

@@ -1210,6 +1210,12 @@ class RefillBase
     {
         $this->mPolicy->update_mchratios($gross, $detail, $types);
     }
+
+    public function merchant_ratio($mchid)
+    {
+        return $this->mPolicy->merchant_ratio($mchid);
+    }
+
     public function UpdateChctl($params)
     {
         $this->mPolicy->update_chctl($params);

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

@@ -23,6 +23,7 @@ interface IPolicy
     public function third_mixed($mchid,$pcode): bool;
 
     public function update_mchratios($all,$detail,$types);
+    public function merchant_ratio($mchid);
     public function update_chctl($speeds);
     public function update_chspeeds($speeds);
     public function update_maxspeeds($speeds);

+ 5 - 0
helper/refill/policy/lingzh/policy.php

@@ -488,6 +488,11 @@ class policy extends ProviderManager implements IPolicy
     {
         $this->mRatioCtl->update($gross,$detail);
     }
+    public function merchant_ratio($mchid)
+    {
+        return 0;
+    }
+
     public function third_retry(order $order): array
     {
         return [false,''];

+ 11 - 0
helper/refill/policy/mratio_controlex.php

@@ -155,6 +155,17 @@ class mratio_controlex
         }
     }
 
+    public function merchant_ratio($mchid)
+    {
+        $mratios = $this->mGrossRatios;
+        if (array_key_exists($mchid, $mratios)) {
+            [$submit_count, $succ_count, $fail_count, $gross_ratio, $profit, $gross_pratio] = $mratios[$mchid];
+            return $gross_ratio;
+        }
+
+        return 1.0;
+    }
+
     public function setMixedPrice($mchid, $mixed_quality, $card_type, $spec, $prices)
     {
         $key = "{$card_type}-{$spec}";

+ 11 - 16
helper/refill/policy/transfer.php

@@ -54,39 +54,34 @@ class transfer
                 $mchid = intval($item['mchid']);
                 $opened = intval($transfer_cfg['transfer_opened']);
                 $tmchid = intval($transfer_cfg['transfer_mchid']);
-                $lower_time = intval($transfer_cfg['transfer_lowertime']);
-                $upper_time = intval($transfer_cfg['transfer_uppertime']);
+                $lowestratio = round($transfer_cfg['transfer_lowestratio'], 3);
+
                 $card_types = $transfer_cfg['card_types'] ?? [];
 
-                if ($opened == 1 && $tmchid > 0 && $tmchid != $mchid && $lower_time > 0 && $upper_time > $lower_time)
+                if ($opened == 1 and $tmchid > 0 and $tmchid != $mchid and $lowestratio > 0.001)
                 {
                     $admin_id = $mch_checker($tmchid);
-                    if($admin_id > 0) {
-                        $this->mMchid2Infos[$mchid] = ['transfer_mchid' => $tmchid, 'admin_id' => $admin_id,
-                            'lower_time' => $lower_time, 'upper_time' => $upper_time,'card_types' => $card_types];
+                    if ($admin_id > 0) {
+                        $this->mMchid2Infos[$mchid] = ['transfer_mchid' => $tmchid,
+                            'admin_id' => $admin_id,
+                            'lowestratio' => $lowestratio,
+                            'card_types' => $card_types];
                     }
                 }
             }
         }
     }
 
-    public function need_transfer($mchid,$order_time,$card_type)
+    public function need_transfer($mchid,$card_type,&$lowestratio)
     {
         if(array_key_exists($mchid,$this->mMchid2Infos))
         {
             $transfer_cfg = $this->mMchid2Infos[$mchid];
-
-            $lower_time = $transfer_cfg['lower_time'];
-            $upper_time = $transfer_cfg['upper_time'];
+            $lowestratio = $transfer_cfg['lowestratio'];
             $card_types = $transfer_cfg['card_types'];
 
-            $elpse_secs = time() - $order_time;
-            if ($elpse_secs >= $lower_time && $elpse_secs < $upper_time) {
+            if (!in_array($card_type, $card_types)) {
                 return true;
-            } elseif (in_array($card_type, $card_types)) {
-                return false;
-            } else {
-                return false;
             }
         }
 

+ 4 - 0
helper/refill/policy/xyz/policy.php

@@ -729,6 +729,10 @@ class policy extends ProviderManager implements IPolicy
     {
         $this->mRatioCtl->update($gross,$detail,$types);
     }
+    public function merchant_ratio($mchid)
+    {
+        return $this->mRatioCtl->merchant_ratio($mchid);
+    }
 
     public function update_chctl($params)
     {

+ 21 - 10
rdispatcher/proxy.php

@@ -70,14 +70,18 @@ class proxy
 
     private function need_transfer(refill\order $order)
     {
-        if($order->match_ratio()) return false;
-
-        $order_time = $order->order_time();
         $mchid = $order->mchid();
         $card_type = $order->card_type();
-        $ret = refill\transfer::instance()->need_transfer($mchid,$order_time,$card_type);
 
-        return $ret;
+        $ret = refill\transfer::instance()->need_transfer($mchid,$card_type,$lowest_ratio);
+        if($ret) {
+            $cur_ratio = refill\RefillFactory::instance()->merchant_ratio($mchid);
+            Log::record("mchid=$mchid cur_ratio=$cur_ratio lowest_ratio=$lowest_ratio",Log::DEBUG);
+
+            return $lowest_ratio > $cur_ratio;
+        }
+
+        return false;
     }
 
     private function need_transfer_timeout(refill\order $order)
@@ -213,8 +217,17 @@ class proxy
         [$org_quality, $quality] = refill\RefillFactory::instance()->find_quality($order, $skip);
         $order->set_quality($org_quality,$quality);
 
-        if($quality == 0) {
-            return $this->onEerror($order, $need_callback,'找不到合适质量的通道');
+        if($quality == 0)
+        {
+            if($order->first_commit()) {
+                return $this->onEerror($order, $need_callback,'找不到合适质量的通道');
+            }
+            elseif ($this->need_transfer($order) && $this->transfer($order)) {
+                return true;
+            }
+            else {
+                return $this->onEerror($order, $need_callback,'再也找不到可用质量的通道');
+            }
         }
 
         if($this->region_intercept($order)) {
@@ -248,9 +261,7 @@ class proxy
                 refill\util::onEventSubmit($order);
             }
         }
-        elseif ($this->need_transfer($order) && $this->transfer($order)) {
-            return true;
-        }
+
 
         $reAdder = function(refill\order $order,$order_id,$order_time,$mod_refill)
         {