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