123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- <?php
- namespace refill;
- require_once(BASE_HELPER_PATH . '/mtopcard/mtopcard.php');
- require_once(BASE_HELPER_PATH . '/refill/IRefill.php');
- require_once(BASE_HELPER_PATH . '/refill/IRefillOil.php');
- require_once(BASE_HELPER_PATH . '/refill/IRefillPhone.php');
- require_once(BASE_HELPER_PATH . '/refill/IRefillCallBack.php');
- require_once(BASE_HELPER_PATH . '/refill/CalcMerchantPrice.php');
- require_once(BASE_HELPER_PATH . '/refill/util.php');
- require_once(BASE_HELPER_RAPI_PATH . '/api.php');
- use Log;
- use mtopcard;
- use Exception;
- class ProviderManager
- {
- protected $mOilProvider;
- protected $mPhoneProvider;
- protected $mProviderNames;
- public function __construct()
- {
- }
- public function load()
- {
- $this->mOilProvider = [];
- $this->mPhoneProvider = [];
- $this->mProviderNames = [];
- global $config;
- $oil_configs = $config['oil_providers'];
- $cfg_table = $this->read_channel();
- $names = [];
- foreach ($oil_configs as $item)
- {
- $name = $item['name'];
- $cfg = $item['cfg'];
- if(!array_key_exists($name,$cfg_table)) {
- 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);
- }
- } catch (Exception $ex) {
- Log::record($ex->getMessage(), Log::ERR);
- }
- }
- $pho_configs = $config['phone_providers'];
- foreach ($pho_configs as $item)
- {
- $name = $item['name'];
- $cfg = $item['cfg'];
- if(!array_key_exists($name,$cfg_table)) {
- continue;
- }
- try {
- $class = "refill\\{$name}\\RefillPhone";
- $table = $cfg_table[$name];
- if (class_exists($class, false)) {
- $provider = new $class($cfg);
- $provider->setOpened($table['opened']);
- $provider->setSort($table['sort']);
- $names[] = $name;
- $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);
- }
- }
- $this->mProviderNames = array_unique($names);
- }
- public function read_channel()
- {
- $refill_provider = Model('refill_provider');
- $items = $refill_provider->getProviderList([]);
- $result = [];
- foreach ($items as $item) {
- $name = $item['name'];
- $val = ['type' => intval($item['type']),
- 'opened' => (intval($item['opened']) == 1) ? true : false,
- 'sort' => intval($item['sort'])];
- $result[$name] = $val;
- }
- 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)
- {
- 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;
- }
- }
- 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);
- }
- }
- return $providers;
- }
- private function find_phone(int $amount, int $card_type): array
- {
- $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);
- }
- }
- return $providers;
- }
- public function combine_goods($configs,$type)
- {
- $mod_prov = Model('refill_provider');
- $provider_items = $mod_prov->getProviderList(['type' => $type]);
- foreach ($provider_items as $item) {
- $providers[$item['name']] = $item;
- }
- $result = [];
- foreach ($configs as $item)
- {
- if($providers[$item['name']]['opened'] != 1) {
- continue;
- }
- $cfg = $item['cfg'];
- $card_types = $cfg['card_type'] ?? [];
- $amounts = $cfg['amount'] ?? [];
- foreach ($card_types as $type) {
- if (array_key_exists($type, $result)) {
- $item = $result[$type];
- } else {
- $item = [];
- }
- foreach ($amounts as $amount => $val) {
- $item[] = $amount;
- }
- $item = array_unique($item);
- $result[$type] = $item;
- }
- }
- return $result;
- }
- public function goods()
- {
- global $config;
- $oil = $this->combine_goods($config['oil_providers'], 1);
- $phone = $this->combine_goods($config['phone_providers'], 2);
- return array_merge($oil, $phone);
- }
- public function providers()
- {
- return ['oil' => $this->mOilProvider,'phone' => $this->mPhoneProvider];
- }
- public function getCaller($chname)
- {
- try
- {
- $class_name = "refill\\{$chname}\\RefillCallBack";
- if (class_exists($class_name, false)) {
- $caller = new $class_name();
- return $caller;
- } else {
- $error = "Base Error: class {$class_name} isn't exists!";
- Log::record($error, Log::ERR);
- return false;
- }
- }
- catch (Exception $ex) {
- Log::record($ex->getMessage(), Log::ERR);
- return false;
- }
- }
- }
|