|
@@ -22,85 +22,114 @@ class ProviderManager
|
|
|
protected $mPhoneProvider;
|
|
|
protected $mProviderNames;
|
|
|
|
|
|
+ protected $mAllQMapPTS;
|
|
|
+ protected $mProviders;
|
|
|
+ protected $mSpecTypes;
|
|
|
+
|
|
|
public function __construct()
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- public function load()
|
|
|
+ public function getQPTA()
|
|
|
{
|
|
|
- $this->mOilProvider = [];
|
|
|
- $this->mPhoneProvider = [];
|
|
|
- $this->mProviderNames = [];
|
|
|
-
|
|
|
- global $config;
|
|
|
- $oil_configs = $config['oil_providers'];
|
|
|
+ return $this->mAllQMapPTS;
|
|
|
+ }
|
|
|
|
|
|
- $cfg_table = $this->read_channel();
|
|
|
+ private function map_cfg($cfgs,$refill_type)
|
|
|
+ {
|
|
|
+ $card_types = function ($stypes)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ $types = explode(',',$stypes);
|
|
|
+ foreach ($types as $stype) {
|
|
|
+ $type = mtopcard\topcard_type($stype);
|
|
|
+ $result[] = $type;
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ };
|
|
|
|
|
|
- $names = [];
|
|
|
- foreach ($oil_configs as $item)
|
|
|
+ $result = [];
|
|
|
+ foreach ($cfgs as $item)
|
|
|
{
|
|
|
$name = $item['name'];
|
|
|
$cfg = $item['cfg'];
|
|
|
|
|
|
- if(!array_key_exists($name,$cfg_table)) {
|
|
|
+ $provider = $this->create_provider($name,$cfg,$refill_type);
|
|
|
+ if($provider !== false) {
|
|
|
+ $this->mProviders[$name] = $provider;
|
|
|
+ $this->mProviderNames[] = $name;
|
|
|
+ } else {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- $class = "refill\\{$name}\\RefillOil";
|
|
|
- $table = $cfg_table[$name];
|
|
|
-
|
|
|
- if (class_exists($class, false)) {
|
|
|
- $provider = new $class($cfg);
|
|
|
- $provider->setOpened($table['opened']);
|
|
|
- $provider->setSort($table['sort']);
|
|
|
-
|
|
|
- $names[] = $name;
|
|
|
- $this->mOilProvider[] = $provider;
|
|
|
- } else {
|
|
|
- $error = "Base Error: class {$class} isn't exists!";
|
|
|
- throw new Exception($error);
|
|
|
+ $amounts = $cfg['amount'] ?? [];
|
|
|
+ foreach ($amounts as $spec => $goods)
|
|
|
+ {
|
|
|
+ foreach ($goods as $gitem)
|
|
|
+ {
|
|
|
+ $quality = $gitem['quality'] ?? 1;
|
|
|
+
|
|
|
+ $types = $card_types($gitem['card_type']);
|
|
|
+ foreach ($types as $type) {
|
|
|
+ $this->mAllQMapPTS[$quality]["{$name}-{$type}-{$spec}"] = ['goods_id' => $gitem['goods_id'],'price' => $gitem['price'],'provider' => $provider];
|
|
|
+ $this->mSpecTypes[$quality]["{$type}-{$spec}"][] = $name;
|
|
|
+ }
|
|
|
}
|
|
|
- } catch (Exception $ex) {
|
|
|
- Log::record($ex->getMessage(), Log::ERR);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- $pho_configs = $config['phone_providers'];
|
|
|
- foreach ($pho_configs as $item)
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private function create_provider($name,$cfg,$refill_type)
|
|
|
+ {
|
|
|
+ try
|
|
|
{
|
|
|
- $name = $item['name'];
|
|
|
- $cfg = $item['cfg'];
|
|
|
+ $class = "refill\\{$name}\\{$refill_type}";
|
|
|
|
|
|
- if(!array_key_exists($name,$cfg_table)) {
|
|
|
- continue;
|
|
|
+ if (class_exists($class, false)) {
|
|
|
+ $provider = new $class($cfg);
|
|
|
+ $provider->setOpened(false);
|
|
|
+ return $provider;
|
|
|
+ } else {
|
|
|
+ $error = "Base Error: class {$class} isn't exists!";
|
|
|
+ Log::record(__FUNCTION__ . " {$error}", Log::ERR);
|
|
|
}
|
|
|
+ }
|
|
|
+ catch (Exception $ex) {
|
|
|
+ Log::record($ex->getMessage(), Log::ERR);
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function load()
|
|
|
+ {
|
|
|
+ $this->mProviderNames = [];
|
|
|
+ $this->mAllQMapPTS = [];
|
|
|
+ $this->mProviders = [];
|
|
|
+ $this->mSpecTypes = [];
|
|
|
|
|
|
- try {
|
|
|
- $class = "refill\\{$name}\\RefillPhone";
|
|
|
- $table = $cfg_table[$name];
|
|
|
+ global $config;
|
|
|
+ $this->map_cfg($config['phone_providers'],'RefillPhone');
|
|
|
+ $this->map_cfg($config['oil_providers'],'RefillOil');
|
|
|
+ $this->mProviderNames = array_unique($this->mProviderNames);
|
|
|
|
|
|
- if (class_exists($class, false)) {
|
|
|
- $provider = new $class($cfg);
|
|
|
- $provider->setOpened($table['opened']);
|
|
|
- $provider->setSort($table['sort']);
|
|
|
- $names[] = $name;
|
|
|
+ $channels = $this->read_channel();
|
|
|
|
|
|
- $this->mPhoneProvider[] = $provider;
|
|
|
- } else {
|
|
|
- $error = "Base Error: class {$class} isn't exists!";
|
|
|
- throw new Exception($error);
|
|
|
- }
|
|
|
- } catch (Exception $ex) {
|
|
|
- Log::record($ex->getMessage(), Log::ERR);
|
|
|
+ foreach ($channels as $item)
|
|
|
+ {
|
|
|
+ $name = $item['name'];
|
|
|
+ $opened = $item['opened'] == 1 ? true : false;
|
|
|
+
|
|
|
+ if(array_key_exists($name,$this->mProviders)) {
|
|
|
+ $this->mProviders[$name]->setOpened($opened);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- $this->mProviderNames = array_unique($names);
|
|
|
}
|
|
|
|
|
|
- public function read_channel()
|
|
|
+ private function read_channel()
|
|
|
{
|
|
|
$refill_provider = Model('refill_provider');
|
|
|
$items = $refill_provider->getProviderList([]);
|
|
@@ -117,66 +146,37 @@ class ProviderManager
|
|
|
return $result;
|
|
|
}
|
|
|
|
|
|
- public function find_providers(int $amount, int $card_type,int $quality): array
|
|
|
- {
|
|
|
- if ($card_type == mtopcard\SinopecCard || $card_type == mtopcard\PetroChinaCard) {
|
|
|
- return $this->find_oil($amount, $card_type);
|
|
|
- } elseif ($card_type == mtopcard\ChinaMobileCard || $card_type == mtopcard\ChinaUnicomCard || $card_type == mtopcard\ChinaTelecomCard) {
|
|
|
- return $this->find_phone($amount, $card_type);
|
|
|
- } else {
|
|
|
- return [];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public function provider(string $chname, int $card_type)
|
|
|
+ public function find_providers(int $spec, int $card_type,int $quality): array
|
|
|
{
|
|
|
- if ($card_type == mtopcard\SinopecCard || $card_type == mtopcard\PetroChinaCard) {
|
|
|
- $providers = $this->mOilProvider;
|
|
|
- } elseif ($card_type == mtopcard\ChinaMobileCard || $card_type == mtopcard\ChinaUnicomCard || $card_type == mtopcard\ChinaTelecomCard) {
|
|
|
- $providers = $this->mPhoneProvider;
|
|
|
- } else {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- foreach ($providers as $provider)
|
|
|
- {
|
|
|
- if ($provider->name() == $chname) {
|
|
|
- return $provider;
|
|
|
+ $qnames = $this->mSpecTypes[$quality] ?? [];
|
|
|
+
|
|
|
+ $key = "{$card_type}-{$spec}";
|
|
|
+ if(array_key_exists($key,$qnames)) {
|
|
|
+ $names = $qnames[$key];
|
|
|
+
|
|
|
+ $providers = [];
|
|
|
+ foreach ($names as $name)
|
|
|
+ {
|
|
|
+ $provider = $this->mProviders[$name];
|
|
|
+ if($provider->opened()) {
|
|
|
+ $providers[] = $provider;
|
|
|
+ }
|
|
|
}
|
|
|
+ return $providers;
|
|
|
}
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- private function find_oil(int $amount, int $card_type): array
|
|
|
- {
|
|
|
- $providers = [];
|
|
|
- foreach ($this->mOilProvider as $provider) {
|
|
|
- $name = $provider->name();
|
|
|
- [$success, $err] = $provider->check($amount, $card_type);
|
|
|
- if ($success) {
|
|
|
- $providers[] = $provider;
|
|
|
- } else {
|
|
|
- Log::record("{$name} provider cannot match check,err:{$err}", Log::DEBUG);
|
|
|
- }
|
|
|
+ else {
|
|
|
+ return [];
|
|
|
}
|
|
|
-
|
|
|
- return $providers;
|
|
|
}
|
|
|
|
|
|
- private function find_phone(int $amount, int $card_type): array
|
|
|
+ public function provider(string $chname)
|
|
|
{
|
|
|
- $providers = [];
|
|
|
- foreach ($this->mPhoneProvider as $provider) {
|
|
|
- $name = $provider->name();
|
|
|
- [$success, $err] = $provider->check($amount, $card_type);
|
|
|
- if ($success) {
|
|
|
- $providers[] = $provider;
|
|
|
- } else {
|
|
|
- Log::record("{$name} provider cannot match check,err:{$err}", Log::DEBUG);
|
|
|
- }
|
|
|
+ if(array_key_exists($chname,$this->mProviders)) {
|
|
|
+ return $this->mProviders[$chname];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return null;
|
|
|
}
|
|
|
-
|
|
|
- return $providers;
|
|
|
}
|
|
|
|
|
|
public function combine_goods($configs,$type)
|