stanley-king 3 лет назад
Родитель
Сommit
9acd3b56a3
2 измененных файлов с 87 добавлено и 6 удалено
  1. 77 4
      helper/refill/policy/mratio_control.php
  2. 10 2
      test/TestBigData.php

+ 77 - 4
helper/refill/policy/mratio_control.php

@@ -10,6 +10,7 @@ class mratio_control
     private $mInterceptConfig;
     private $mGrossRatios;
     private $mDetailRatios;
+    private $mMchQTS;
     private $mMixedPrices;
 
 
@@ -116,6 +117,19 @@ class mratio_control
         if (!empty($detail_ratios)) {
             $this->mDetailRatios = $detail_ratios;
         }
+
+        $this->mMchQTS = [];
+        foreach ($detail_ratios as $key=>$val)
+        {
+            [$mchid,$quality,$card_type,$spec] = explode('-',$key);
+
+            $mchid = intval($mchid);
+            $quality = intval($quality);
+            $card_type = intval($card_type);
+            $spec = intval($spec);
+
+            $this->mMchQTS[$mchid][] = [$quality,$card_type,$spec];
+        }
     }
 
     public function setMixedPrice($mchid, $mixed_quality, $card_type, $spec, $prices)
@@ -253,6 +267,10 @@ class mratio_control
         return $result;
     }
 
+    private function getMerchantSuppleType($mchid) {
+        return 'all';
+    }
+
     //return true 表示不可以补充。
     public function ratio_match($mchid, $org_quality, $cur_quality, $card_type, $spec, $qualities)
     {
@@ -266,15 +284,70 @@ class mratio_control
         Log::record("{$header} gross_ratio = {$gross_ratio},lower_ratio={$ratio}",Log::DEBUG);
 
         if($gross_ratio >= $ratio) return true;
-        [$_succ, $_fail, $cur_ratio] = $this->detail_ratio($mchid, $cur_quality, $card_type, $spec, $period);
-        Log::record("{$header} cur_ratio = {$cur_ratio},lower_ratio={$ratio}",Log::DEBUG);
-
-        if($cur_ratio >= $ratio) return true;
 
         if (!PolicyUtil::mixed_quality($org_quality)) {
             return false;
         }
 
+        $type = $this->getMerchantSuppleType($mchid);
+        if($type === 'all') {
+            return $this->all_checker($mchid, $org_quality, $cur_quality, $card_type, $spec, $qualities, $period, $header, $ratio);
+        }
+        elseif($type === 'qt') {
+
+        }
+        else {
+            return $this->qts_checker($mchid, $org_quality,$cur_quality, $card_type, $spec, $qualities,$period,$header,$ratio);
+        }
+    }
+
+    private function all_checker($mchid, $org_quality,$cur_quality, $card_type, $spec, $qualities,$period,$header,$ratio)
+    {
+        $qtsex = $this->mMchQTS[$mchid];
+        $profit_judger = function ($mchid, $qtsex, $org_quality, $period, $profit_ratio, $header)
+        {
+            $profit = 0;
+            $amount = 0;
+
+            foreach ($qtsex as $qts)
+            {
+                [$quality,$card_type,$spec] = $qts;
+                if($quality == $org_quality) {
+                    continue;
+                }
+
+                $prices = $this->getPrice($mchid, $org_quality, $card_type, $spec);
+                $out_price = $prices[$org_quality];
+                $in_price = $prices[$quality] ?? false;
+                if ($in_price === false) continue;
+
+                [$succ, $fail, $ratio] = $this->detail_ratio($mchid, $quality,$card_type, $spec, $period);
+                $profit += $succ * ($out_price - $in_price);
+                $amount += $succ * $spec;
+            }
+
+            $cur_pratio = round(($profit + 0.00001) / ($amount + 0.00001),4);
+            $profit_ratio = round($profit_ratio,4);
+            $profit_ratio = round($profit_ratio,4);
+
+            Log::record("{$header} cur_pratio = {$cur_pratio},profit_ratio={$profit_ratio}",Log::DEBUG);
+
+            return $cur_pratio > $profit_ratio;
+        };
+
+        $profit_ratio = $this->profit_ratio($mchid);
+        $can_next = $profit_judger($mchid, $qtsex, $org_quality, $period, $profit_ratio, $header);
+
+        return !$can_next;
+    }
+
+    private function qts_checker($mchid, $org_quality,$cur_quality, $card_type, $spec, $qualities,$period,$header,$ratio)
+    {
+        [$_succ, $_fail, $cur_ratio] = $this->detail_ratio($mchid, $cur_quality, $card_type, $spec, $period);
+        Log::record("{$header} cur_ratio = {$cur_ratio},lower_ratio={$ratio}",Log::DEBUG);
+
+        if($cur_ratio >= $ratio) return true;
+
         $prices = $this->getPrice($mchid, $org_quality, $card_type, $spec);
         if ($prices === false) {
             return false;

Разница между файлами не показана из-за своего большого размера
+ 10 - 2
test/TestBigData.php