|
@@ -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)
|