瀏覽代碼

add all ratios

stanley-king 3 年之前
父節點
當前提交
b70abdbee5
共有 2 個文件被更改,包括 104 次插入9 次删除
  1. 102 4
      helper/refill/policy/mratio_control.php
  2. 2 5
      test/TestBigData.php

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

@@ -130,6 +130,8 @@ class mratio_control
 
             $this->mMchQTS[$mchid][] = [$quality,$card_type,$spec];
         }
+
+        $this->ratio_match(10211,14,1,4,30,[1,2]);
     }
 
     public function setMixedPrice($mchid, $mixed_quality, $card_type, $spec, $prices)
@@ -283,7 +285,7 @@ class mratio_control
         [$_succ, $_fail, $gross_ratio] = $this->gross_ratio($mchid, $period);
         Log::record("{$header} gross_ratio = {$gross_ratio},lower_ratio={$ratio}",Log::DEBUG);
 
-        if($gross_ratio >= $ratio) return true;
+//        if($gross_ratio >= $ratio) return true;
 
         if (!PolicyUtil::mixed_quality($org_quality)) {
             return false;
@@ -291,7 +293,7 @@ class mratio_control
 
         $type = $this->getMerchantSuppleType($mchid);
         if($type === 'all') {
-            return $this->all_checker($mchid, $org_quality, $cur_quality, $card_type, $spec, $qualities, $period, $header, $ratio);
+            return $this->all_checker($mchid, $org_quality, $spec, $qualities, $period, $header, $ratio);
         }
         elseif($type === 'qt') {
 
@@ -301,7 +303,7 @@ class mratio_control
         }
     }
 
-    private function all_checker($mchid, $org_quality,$cur_quality, $card_type, $spec, $qualities,$period,$header,$ratio)
+    private function all_checker($mchid, $org_quality, $spec, $qualities, $period, $header, $low_ratio)
     {
         $qtsex = $this->mMchQTS[$mchid];
         $profit_judger = function ($mchid, $qtsex, $org_quality, $period, $profit_ratio, $header)
@@ -335,10 +337,106 @@ class mratio_control
             return $cur_pratio > $profit_ratio;
         };
 
+        $spec_max = function ($mchid,$qtsex, $org_quality, $qualities, $low_ratio,$period)
+        {
+            $specs = [];
+            $spec_qt = [];
+            foreach ($qtsex as $qts) {
+                [$quality, $card_type, $spec] = $qts;
+                $specs[] = $spec;
+                $spec_qt[$spec][] = [$quality,$card_type];
+            }
+
+            $specs = array_unique($specs);
+            sort($specs);
+
+            $ratio_calc = function ($mchid, $specs, $spec_qt, $max_spec, $org_quality, $qualities, $period)
+            {
+                $all_succ = 0;
+                $all_fail = 0;
+
+                foreach ($specs as $spec)
+                {
+                    $qts = $spec_qt[$spec];
+                    if($max_spec >= $spec) {
+                        $fHigtRatio = true;
+                    } else {
+                        $fHigtRatio = false;
+                    }
+
+                    $card_types = [];
+                    foreach ($qts as $qt)
+                    {
+                        [$quality,$card_type] = $qt;
+                        if($quality === $org_quality) {
+                            continue;
+                        }
+
+                        $card_types[] = $card_type;
+                    }
+
+                    $detail_ratios = $this->detail_ratios($mchid, $qualities,$card_type, $spec, $period);
+                    if($fHigtRatio)
+                    {
+                        $all = 0;
+                        $ratios = [];
+                        foreach ($detail_ratios as $quality => $sfr) {
+                            [$succ,$fail,$ratio] = $sfr;
+                            $ratios[] = $ratio;
+                            $all += $succ;
+                            $all += $fail;
+                        }
+
+                        $max_ratios = max($ratios);
+                        $succs = $max_ratios * $all;
+                        $fails = $all - $succs;
+
+                        $all_succ += $succs;
+                        $all_fail += $fails;
+                    }
+                    else
+                    {
+                        foreach ($detail_ratios as $quality => $sfr)
+                        {
+                            [$succ,$fail,$ratio] = $sfr;
+                            $all_succ += $succ;
+                            $all_fail += $fail;
+                        }
+                    }
+                }
+
+                $ratio = $all_succ / ($all_succ + $all_fail + 0.00001);
+                return round($ratio,4);
+            };
+
+            for ($i = 0; $i < count($specs); $i++)
+            {
+                $max_spec = $specs[$i];
+                $ratio = $ratio_calc($mchid, $specs, $spec_qt, $max_spec, $org_quality, $qualities, $period);
+
+                if($ratio >= $low_ratio) {
+                    break;
+                }
+            }
+
+            return $max_spec;
+        };
+
         $profit_ratio = $this->profit_ratio($mchid);
         $can_next = $profit_judger($mchid, $qtsex, $org_quality, $period, $profit_ratio, $header);
 
-        return !$can_next;
+        if(!$can_next)
+        {
+            $max_spec = $spec_max($mchid,$qtsex, $org_quality, $qualities, $low_ratio,$period);
+            if($max_spec >= $spec) {
+                return false;
+            } else {
+                return true;
+            }
+        }
+        else {
+            return true;
+        }
     }
 
     private function qts_checker($mchid, $org_quality,$cur_quality, $card_type, $spec, $qualities,$period,$header,$ratio)

文件差異過大導致無法顯示
+ 2 - 5
test/TestBigData.php