|
@@ -1,18 +1,21 @@
|
|
|
<?php
|
|
|
|
|
|
namespace refill;
|
|
|
+
|
|
|
use Log;
|
|
|
|
|
|
class mratio_control
|
|
|
{
|
|
|
private $mTimesConfig; //对应refill.ini 配置文件数据
|
|
|
- private $mCurRatios;
|
|
|
+ private $mGrossRatios;
|
|
|
+ private $mDetailRatios;
|
|
|
private $mMixedPrices;
|
|
|
|
|
|
public function __construct()
|
|
|
{
|
|
|
$this->mTimesConfig = [];
|
|
|
- $this->mCurRatios = [];
|
|
|
+ $this->mGrossRatios = [];
|
|
|
+ $this->mDetailRatios = [];
|
|
|
$this->mMixedPrices = [];
|
|
|
}
|
|
|
|
|
@@ -22,18 +25,45 @@ class mratio_control
|
|
|
$this->mTimesConfig = $config['merchant_retry_times'] ?? [];
|
|
|
}
|
|
|
|
|
|
- public function setMixedPrice($mchid,$mixed_quality,$card_type,$spec,$out_price,$qprices)
|
|
|
+ public function update($gross_ratios, $detail_ratios)
|
|
|
+ {
|
|
|
+ if (!empty($gross_ratios)) {
|
|
|
+ $this->mGrossRatios = $gross_ratios;
|
|
|
+ }
|
|
|
+ if (!empty($detail_ratios)) {
|
|
|
+ $this->mDetailRatios = $detail_ratios;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function setMixedPrice($mchid, $mixed_quality, $card_type, $spec, $prices)
|
|
|
{
|
|
|
$key = "{$card_type}-{$spec}";
|
|
|
- $this->mMixedPrices[$mchid][$mixed_quality][$key]['out_price'] = $out_price;
|
|
|
- $this->mMixedPrices[$mchid][$mixed_quality][$key]['qprices'] = $qprices;
|
|
|
+ $this->mMixedPrices[$mchid][$mixed_quality][$key] = $prices;
|
|
|
}
|
|
|
|
|
|
+ //获取售价和进价
|
|
|
+ private function getPrice($mchid, $mixed_quality, $card_type, $spec)
|
|
|
+ {
|
|
|
+ $key = "{$card_type}-{$spec}";
|
|
|
+ if (array_key_exists($mchid, $this->mMixedPrices))
|
|
|
+ {
|
|
|
+ $prices = $this->mMixedPrices[$mchid];
|
|
|
+ if (array_key_exists($mixed_quality, $prices))
|
|
|
+ {
|
|
|
+ $qprices = $prices[$mixed_quality];
|
|
|
+ if (array_key_exists($key, $qprices)) {
|
|
|
+ $price = $qprices[$key];
|
|
|
+ return $price;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
public function total($mchid)
|
|
|
{
|
|
|
- if(array_key_exists($mchid,$this->mTimesConfig))
|
|
|
- {
|
|
|
+ if (array_key_exists($mchid, $this->mTimesConfig)) {
|
|
|
$items = $this->mTimesConfig[$mchid]['qualities'];
|
|
|
|
|
|
$times = 0;
|
|
@@ -42,18 +72,17 @@ class mratio_control
|
|
|
$times += $val['times'] ?? 1;
|
|
|
$secs += $val['secs'] ?? 180;
|
|
|
}
|
|
|
- return [true,$times,$secs];
|
|
|
+ return [true, $times, $secs];
|
|
|
} else {
|
|
|
- return [false,0,0];
|
|
|
+ return [false, 0, 0];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public function times($mchid,$quality)
|
|
|
+ public function times($mchid, $quality)
|
|
|
{
|
|
|
- if(array_key_exists($mchid,$this->mTimesConfig))
|
|
|
- {
|
|
|
+ if (array_key_exists($mchid, $this->mTimesConfig)) {
|
|
|
$items = $this->mTimesConfig[$mchid]['qualities'] ?? [];
|
|
|
- if(array_key_exists($quality,$items)) {
|
|
|
+ if (array_key_exists($quality, $items)) {
|
|
|
return $items[$quality]['times'];
|
|
|
}
|
|
|
}
|
|
@@ -61,12 +90,11 @@ class mratio_control
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- public function seconds($mchid,$quality)
|
|
|
+ public function seconds($mchid, $quality)
|
|
|
{
|
|
|
- if(array_key_exists($mchid,$this->mTimesConfig))
|
|
|
- {
|
|
|
+ if (array_key_exists($mchid, $this->mTimesConfig)) {
|
|
|
$items = $this->mTimesConfig[$mchid]['qualities'] ?? [];
|
|
|
- if(array_key_exists($quality,$items)) {
|
|
|
+ if (array_key_exists($quality, $items)) {
|
|
|
return $items[$quality]['secs'];
|
|
|
}
|
|
|
}
|
|
@@ -83,38 +111,96 @@ class mratio_control
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public function update($ratios)
|
|
|
- {
|
|
|
- if(!empty($ratios)) {
|
|
|
- $this->mCurRatios = $ratios;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private function lower_ratio($mchid)
|
|
|
{
|
|
|
$lower_ratio = $this->mTimesConfig[$mchid]['lower_ratio'] ?? [];
|
|
|
- return [$lower_ratio['ratio'],$lower_ratio['period']];
|
|
|
+ return [$lower_ratio['ratio'], $lower_ratio['period']];
|
|
|
}
|
|
|
|
|
|
- private function cur_ratio($mchid,$period)
|
|
|
+ private function profit_ratio($mchid) {
|
|
|
+ $profit_ratio = $this->mTimesConfig[$mchid]['profit_ratio'] ?? 0.0;
|
|
|
+ return $profit_ratio;
|
|
|
+ }
|
|
|
+
|
|
|
+ private function gross_ratio($mchid, $period)
|
|
|
{
|
|
|
- $mratios = $this->mCurRatios;
|
|
|
- if(array_key_exists($mchid,$mratios)) {
|
|
|
+ $mratios = $this->mGrossRatios;
|
|
|
+ if (array_key_exists($mchid, $mratios)) {
|
|
|
$mratios = $mratios[$mchid];
|
|
|
- if(array_key_exists($period,$mratios)) {
|
|
|
+ if (array_key_exists($period, $mratios)) {
|
|
|
return $mratios[$period];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return 1.0;
|
|
|
+ return [0, 0, 1.0];
|
|
|
+ }
|
|
|
+ private function detail_ratio($mchid, $quality, $card_type, $spec, $period)
|
|
|
+ {
|
|
|
+ $key = "{$mchid}-{$quality}-{$card_type}-{$spec}";
|
|
|
+ if(array_key_exists($key,$this->mDetailRatios)) {
|
|
|
+ $ratios = $this->mDetailRatios[$key];
|
|
|
+ if(array_key_exists($period,$ratios)) {
|
|
|
+ return $ratios[$period];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return [0, 0, 1.0];
|
|
|
+ }
|
|
|
+
|
|
|
+ private function detail_ratios($mchid,$qualities,$card_type, $spec,$period)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ foreach ($qualities as $quality) {
|
|
|
+ $ret = $this->detail_ratio($mchid,$quality,$card_type,$spec,$period);
|
|
|
+ $result[$quality] = $ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $result;
|
|
|
}
|
|
|
|
|
|
- public function ratio_match($mchid)
|
|
|
+ public function ratio_match($mchid, $org_quality, $cur_quality, $card_type, $spec,$qualities)
|
|
|
{
|
|
|
- [$ratio,$period] = $this->lower_ratio($mchid);
|
|
|
- $cur_ratio = $this->cur_ratio($mchid,$period);
|
|
|
- Log::record("ratio_match mchid={$mchid} cur_ratio={$cur_ratio}",Log::DEBUG);
|
|
|
+ [$ratio, $period] = $this->lower_ratio($mchid);
|
|
|
+ [$_succ, $_fail, $gross_ratio] = $this->gross_ratio($mchid, $period);
|
|
|
+
|
|
|
+ if($gross_ratio >= $ratio) return true;
|
|
|
+ [$_succ, $_fail, $cur_ratio] = $this->detail_ratio($mchid, $cur_quality, $card_type, $spec, $period);
|
|
|
+ if($cur_ratio >= $ratio) return true;
|
|
|
+
|
|
|
+ if (!PolicyUtil::mixed_quality($org_quality)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $prices = $this->getPrice($mchid, $org_quality, $card_type, $spec);
|
|
|
+ if ($prices === false) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $dratios = $this->detail_ratios($mchid, $qualities,$card_type, $spec, $period);
|
|
|
+ $profit_ratio = $this->profit_ratio($mchid);
|
|
|
+
|
|
|
+ $judger = function ($org_quality,$qualities,$prices,$dratios,$profit_ratio)
|
|
|
+ {
|
|
|
+ $sale = $prices[$org_quality];
|
|
|
+
|
|
|
+ $profit = 0;
|
|
|
+ $amount = 0;
|
|
|
+ foreach ($qualities as $quality)
|
|
|
+ {
|
|
|
+ $inprice = $prices[$quality] ?? false;
|
|
|
+ if($inprice === false) continue;
|
|
|
+
|
|
|
+ [$succ,$fail,$ratio] = $dratios[$quality];
|
|
|
+ $profit += $succ * ($sale - $inprice);
|
|
|
+ $amount += $succ * $inprice;
|
|
|
+ }
|
|
|
+
|
|
|
+ $cur_pratio = round(($profit + 0.00001) / ($amount + 0.00001),4);
|
|
|
+ $profit_ratio = round($profit_ratio,4);
|
|
|
+
|
|
|
+ return $cur_pratio > $profit_ratio;
|
|
|
+ };
|
|
|
|
|
|
- return $cur_ratio >= $ratio;
|
|
|
+ $fMatch = $judger($org_quality,$qualities,$prices,$dratios,$profit_ratio);
|
|
|
+ return $fMatch;
|
|
|
}
|
|
|
}
|