stanley-king 4 years atrás
parent
commit
5668f2fa9c

+ 1 - 1
helper/refill/LZRefillFactory.php

@@ -12,7 +12,7 @@ require_once(BASE_HELPER_PATH . '/refill/policy/ctl_item.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/mchctl.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/quaility.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/merchant_price.php');
-
+require_once(BASE_HELPER_PATH . '/refill/policy/mgroup.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/lingzh/quality_ploy.php');
 
 use Log;

+ 1 - 1
helper/refill/ProviderManager.php

@@ -185,7 +185,7 @@ class ProviderManager
         return $result;
     }
 
-    public function find_providers(int $spec, int $card_type,int $quality,$regin_no): array
+    public function find_providers(int $mchid, int $spec, int $card_type, int $quality, $regin_no): array
     {
         $qnames = $this->mSpecTypes[$quality] ?? [];
 

+ 1 - 1
helper/refill/RefillBase.php

@@ -240,7 +240,7 @@ class RefillBase
         if($card_type == 0) {
             $card_type = mtopcard\card_type($card_no,$regin_no);
         }
-        [$providers, $overload] = $this->mPolicy->find_providers($amount, $card_type, $quality, $regin_no);
+        [$providers, $overload] = $this->mPolicy->find_providers($mchid,$amount, $card_type, $quality, $regin_no);
 
         if (empty($providers))
         {

+ 2 - 0
helper/refill/XYZRefillFactory.php

@@ -17,6 +17,8 @@ require_once(BASE_HELPER_PATH . '/refill/policy/merchant_price.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/rlock.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/rstorage.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/xyz/quality_ploy.php');
+require_once(BASE_HELPER_PATH . '/refill/policy/mgroup.php');
+
 
 use Log;
 use StatesHelper;

+ 3 - 3
helper/refill/policy/lingzh/policy.php

@@ -31,9 +31,9 @@ class policy extends ProviderManager implements IPolicy
         $this->mPrices->load();
     }
 
-    public function find_providers(int $spec, int $card_type,int $quality,$regin_no): array
+    public function find_providers(int $mchid, int $spec, int $card_type, int $quality, $regin_no): array
     {
-        $providers = parent::find_providers($spec,$card_type,$quality,$regin_no);
+        $providers = parent::find_providers($mchid,$spec,$card_type,$quality,$regin_no);
 
         if(empty($providers)) {
             return [$providers,false];
@@ -91,7 +91,7 @@ class policy extends ProviderManager implements IPolicy
                 continue;
             }
 
-            [$providers,$overload] = $this->find_providers($spec,$card_type,$quality,-1);
+            [$providers,$overload] = $this->find_providers($mchid,$spec,$card_type,$quality,-1);
             if (!empty($providers))
             {
                 if (!$overload) {

+ 34 - 19
helper/refill/policy/mgroup.php

@@ -16,18 +16,22 @@ class mchannel_item
     public function add_channel($spec,$card_type,$quality,$chname)
     {
         $key = "{$quality}-{$card_type}-{$spec}";
-        if(array_key_exists($key,$this->mChannelMap))
-        {
-            $chanels = $this->mChannelMap[$key];
-            if(!in_array($chname,$chanels)) {
-                $this->mChannelMap[$key][] = $chname;
-            }
+        if(!array_key_exists($key,$this->mChannelMap)) {
+            $this->mChannelMap[$key] = [];
+        }
+        $chanels = $this->mChannelMap[$key];
+        if(!in_array($chname,$chanels)) {
+            $this->mChannelMap[$key][] = $chname;
         }
     }
     public function find($spec,$card_type,$quality)
     {
         $key = "{$quality}-{$card_type}-{$spec}";
-        $chanels = $this->mChannelMap[$key];
+        if(array_key_exists($key,$this->mChannelMap)) {
+            $chanels = $this->mChannelMap[$key];
+        } else {
+            $chanels = [];
+        }
 
         return $chanels;
     }
@@ -109,38 +113,49 @@ class rgroup_ctl
 
     private function load_merchant($groups)
     {
-        $mchitems = Model('')->table('merchant')->limit(1000)->select();//读取数据库,获取机构列表
+        $mchitems = Model('')->table('merchant')->limit(1000)->select();
         foreach ($mchitems as $item)
         {
             $mchid = intval($item['mchid']);
-            $gids = explode(',',$item[]); //通过分析item 通道参数,获取gids
-            if(empty($gids)) continue;
+            $ids_text = $item['group_ids'];
+
+            if (empty($ids_text)) continue;
+            $gids = explode(',', $ids_text);
+            if (empty($gids)) continue;
+
             $mchchannel = new mchannel_item($mchid);
-            $this->mMch2Channel[$mchid] = $mchchannel;
 
+            $has_group = false;
             foreach ($gids as $gid)
             {
-                if(array_key_exists($gid,$groups))
+                if (array_key_exists($gid, $groups))
                 {
-                    $group  = $groups[$gid];
-                    $chitems = $group->infos;
+                    $has_group = true;
+
+                    $group = $groups[$gid];
+                    $chitems = $group->infos();
                     foreach ($chitems as $text) {
-                        [$spec,$card_type,$quality,$chname] = $this->parase($text);
-                        $mchchannel->add_channel($spec,$card_type,$quality,$chname);
+                        [$spec, $card_type, $quality, $chname] = $this->parase($text);
+                        $mchchannel->add_channel($spec, $card_type, $quality, $chname);
                     }
                 }
             }
-        }
 
+            if ($has_group) {
+                $this->mMch2Channel[$mchid] = $mchchannel;
+            }
+        }
     }
 
     private function parase($text)
     {
         $data = explode('-',$text);
-        $spec = $data[3];
-        $card_type = $data[2];
+
         $quality = $data[0];
         $chname = $data[1];
+        $card_type = $data[2];
+        $spec = $data[3];
+
         return [$spec,$card_type,$quality,$chname];
     }
 }

+ 15 - 6
helper/refill/policy/xyz/policy.php

@@ -11,20 +11,20 @@ use mtopcard;
 class policy extends ProviderManager implements IPolicy
 {
     protected $mChannelControl;
-    protected $mMchctl;
     protected $mQuality;
     protected $mPrices;
     protected $mAmountLockTurn;
     protected $mStorageLocker;
+    protected $mGroupCtl;
 
     public function __construct()
     {
         parent::__construct();
         $this->mChannelControl = new chctl();
-        $this->mMchctl = new mchctl();
         $this->mQuality = new quality_ploy();
         $this->mPrices = new merchant_price();
         $this->mStorageLocker = new rstorage();
+        $this->mGroupCtl = new rgroup_ctl();
     }
 
     public function load()
@@ -32,7 +32,6 @@ class policy extends ProviderManager implements IPolicy
         parent::load();
 
         $this->mChannelControl->load();
-        $this->mMchctl->load();
         $this->mQuality->load();
         $this->mPrices->load();
 
@@ -41,22 +40,32 @@ class policy extends ProviderManager implements IPolicy
         Log::record("AmountLockTurn = {$this->mAmountLockTurn}",Log::DEBUG);
 
         $this->mStorageLocker->load();
+        $this->mGroupCtl->load();
     }
 
 
-    public function find_providers(int $spec, int $card_type,int $quality,$regin_no): array
+    public function find_providers(int $mchid, int $spec, int $card_type, int $quality, $regin_no): array
     {
-        $providers = parent::find_providers($spec,$card_type,$quality,$regin_no);
+        $providers = parent::find_providers($mchid,$spec,$card_type,$quality,$regin_no);
 
         if(empty($providers)) {
             return [$providers,false];
         }
 
+        [$hasGroup,$channels] = $this->mGroupCtl->find_providers($mchid, $spec, $card_type, $quality);
         $names = [];
         foreach ($providers as $provider) {
             $names[] = $provider->name();
         }
 
+        if($hasGroup)
+        {
+            $ret = array_intersect($names,$channels);
+            if(!empty($ret)) {
+                $names = $ret;
+            }
+        }
+
         $name_overloads = $this->mChannelControl->match($names,$spec,$card_type,$quality);
         Log::record("policy::find_providers match result=" . implode(',',$names),Log::DEBUG);
 
@@ -104,7 +113,7 @@ class policy extends ProviderManager implements IPolicy
                 continue;
             }
 
-            [$providers,$overload] = $this->find_providers($spec,$card_type,$quality,-1);
+            [$providers,$overload] = $this->find_providers($mchid,$spec,$card_type,$quality,-1);
             if (!empty($providers))
             {
                 if (!$overload) {

+ 11 - 1
test/TestMgroup.php

@@ -7,12 +7,22 @@ define('BASE_ROOT_PATH', str_replace('/test', '', dirname(__FILE__)));
 require_once(BASE_ROOT_PATH . '/global.php');
 require_once(BASE_CORE_PATH . '/lrlz.php');
 require_once(BASE_ROOT_PATH . '/fooder.php');
+
 require_once(BASE_HELPER_PATH . '/refill/policy/mgroup.php');
 
 class TestMgroup extends TestCase
 {
+    public static function setUpBeforeClass(): void
+    {
+        Base::run_util();
+    }
+
     public function testMerchantGroup()
     {
-        $rgroup_ctl = new \refill\rgroup_ctl();
+        $rgroup_ctl = new refill\rgroup_ctl();
+        [$hasGroup,$channels] = $rgroup_ctl->find_providers(1092, 50, 4, 1);
+
+        $names = ['lingzh','yunling','qianqian'];
+        $ret = array_intersect($names,$channels);
     }
 }