stanley-king 1 年間 前
コミット
9eebe0e979

+ 7 - 1
admin/config/config.ini.php

@@ -2,7 +2,13 @@
 require_once(BASE_HELPER_PATH . '/refill/RefillFactory.php');
 defined('InShopNC') or exit('Access Invalid!');
 
-require_once (BASE_PATH . '/config' . CONFIG_PREFIX . '/config.ini.php');
+$path = BASE_PATH . '/config' . CONFIG_PREFIX . '/config.ini.php';
+if(file_exists($path)) {
+    require_once ($path);
+}
+else {
+    Log::record("$path is not exist.", Log::DEBUG);
+}
 
 $config['sys_log'] = true;
 $config['oil_quality_text'] = [

+ 1 - 1
admin/index.php

@@ -13,7 +13,7 @@ define('BASE_PATH',str_replace('\\','/',dirname(__FILE__)));
 function handle_error($level, $message, $file, $line)
 {
     if($level == E_NOTICE) return;
-    $trace = "handle_error: level={$level},msg={$message} file={$file},line={$line}\n";
+    $trace = "handle_error: level=$level,msg=$message file=$file,line=$line\n";
     $backtrace = debug_backtrace();
     foreach ($backtrace as $item) {
         $trace .= "{$item['file']}\t{$item['line']}\t{$item['function']}\n";

+ 2 - 2
data/config/dev/base.ini.php

@@ -54,14 +54,14 @@ define('SSH_TUNEL_PROD','local');
 
 if(SSH_TUNEL_PROD ==='local') {
     $config['db'][1]['dbhost']       = MASTER_DBHOST;
-    $config['db'][1]['dbport']       = '3307';
+    $config['db'][1]['dbport']       = '3306';
     $config['db'][1]['dbuser']       = 'root';
     $config['db'][1]['dbpwd']        = '55668899';
     $config['db'][1]['dbname']       = 'xyzshop';
     $config['db'][1]['dbcharset']    = 'UTF-8';
 
     $config['db']['slave'][0]['dbhost']     = SLAVE_DBHOST;
-    $config['db']['slave'][0]['dbport']     = '3307';
+    $config['db']['slave'][0]['dbport']     = '3306';
     $config['db']['slave'][0]['dbuser']     = 'root';
     $config['db']['slave'][0]['dbpwd']      = '55668899';
     $config['db']['slave'][0]['dbname']     = 'xyzshop';

+ 2 - 2
docker/compose/homecuda/admin/docker-compose.yml

@@ -27,7 +27,7 @@ services:
     volumes:
       - ../../../../:${SHOP_ROOT_PATH}
       - ../conf/etc/localtime:/etc/localtime:ro
-      - ../conf/php/php-debug.ini:/usr/local/etc/php/php.ini
+      - ../conf/php/php.ini:/usr/local/etc/php/php.ini
       - ../conf/php/spwan-start:/usr/local/bin/spwan-start
       - ${SHOP_UPLOAD_PATH}:${SHOP_ROOT_PATH}/data/upload
       - ${SHOP_LOG_PATH}:${SHOP_ROOT_PATH}/data/log
@@ -41,7 +41,7 @@ services:
     volumes:
       - ../../../../:${SHOP_ROOT_PATH}
       - ../conf/etc/localtime:/etc/localtime:ro
-      - ../conf/php/php.ini:/usr/local/etc/php/php.ini
+      - ../conf/php/php-debug.ini:/usr/local/etc/php/php.ini
       - ../conf/php-fpm/php-fpm.conf:/usr/local/etc/php-fpm.conf
       - ${SHOP_UPLOAD_PATH}:${SHOP_ROOT_PATH}/data/upload
       - ${SHOP_LOG_PATH}:${SHOP_ROOT_PATH}/data/log

+ 2 - 2
docker/compose/homecuda/conf/php/php-debug.ini

@@ -1945,8 +1945,8 @@ output_buffering = On
 xdebug.default_enable=1
 xdebug.remote_enable=1
 xdebug.remote_handler=dbgp
-xdebug.remote_host=192.168.3.220
-xdebug.remote_port=9300
+xdebug.remote_host=39.99.233.218
+xdebug.remote_port=7002
 xdebug.remote_mode=req
 xdebug.remote_autostart=1
 xdebug.idekey=PHPSTORM

+ 1 - 1
docker/compose/homecuda/cpenv

@@ -3,7 +3,7 @@
 echo "请先手动编辑好当前目录的.env文件"
 
 # shellcheck disable=SC2039
-dest_dirs=("macc" "admin" "vendor" "cli" "cluster" "master" "racc" "slave" "worker" "remote" "capi")
+dest_dirs=("macc" "admin" "vendor" "cli" "cluster" "master" "racc" "slave" "worker" "remote" "capi" "ibaobei")
 src_file=".env"
 
 for dir in "${dest_dirs[@]}"; do

+ 21 - 0
docker/compose/homecuda/ibaobei/docker-compose.yml

@@ -0,0 +1,21 @@
+version: "3.9"
+
+include:
+  - ../docker-compose.networks.yml
+
+#   docker run -d-p 3333:22 --name php_remote_env php-sshd:7.3.18
+
+services:
+  phpcli:
+    image: php-sshd:7.3.18
+    ports:
+      - 3333:22
+    volumes:
+      - ../../../../:${SHOP_ROOT_PATH}
+      - ../conf/etc/localtime:/etc/localtime:ro
+      - ../conf/php/php-ibaobei.ini:/usr/local/etc/php/php.ini
+      - ${SHOP_UPLOAD_PATH}:${SHOP_ROOT_PATH}/data/upload
+      - ${SHOP_LOG_PATH}:${SHOP_ROOT_PATH}/data/log
+    container_name: "${CONTAINER_PREFIX}-ibaobei"
+    networks:
+      - ${DOCKER_NET_NAME}

+ 5 - 2
helper/refill/RefillBase.php

@@ -239,6 +239,9 @@ class RefillBase
                 }
 
                 $order = order::from_db($refill_info, $order_info, $third_info);
+                $ch_filter = $order->filter();
+                $ch_filter->notify($refill_info['quality'], $chname);
+
                 [$can_retry,$params] = $this->retry($order);
                 if ($can_retry)
                 {
@@ -527,7 +530,7 @@ class RefillBase
             if ($state)
             {
                 $commit_time = time();
-                $chfilters->add_channel($cur_quality,$channel_name,true);
+                $chfilters->add($cur_quality,$channel_name,true);
                 util::monitor_commit($channel_name, $spec, $card_type, $channel_amount, $commit_time);
                 util::onEventCommit($order,$channel_name);
 
@@ -565,7 +568,7 @@ class RefillBase
             }
             else
             {
-                $chfilters->add_channel($cur_quality, $channel_name, false);
+                $chfilters->add($cur_quality, $channel_name, false);
                 if(!empty($neterr) && util::need_check($net_errno)) {
                     $mod_refill->partition(util::part_refill($order_time))->edit($order_id, ['commit_time' => time(),'neterr' => 1,'err_msg' => "neterr=$net_errno"]);
                     util::monitor_netchk($channel_name,false);

+ 4 - 0
helper/refill/RefillFactory.php

@@ -9,6 +9,10 @@ else {
     require_once(BASE_HELPER_PATH . '/refill/XYZRefillFactory.php');
 }
 
+require_once(BASE_HELPER_PATH . '/mtopcard/mtopcard.php');
+require_once(BASE_CORE_PATH . '/framework/function/http.php');
+
+
 class RefillFactory
 {
     public static function instance()

+ 1 - 1
helper/refill/api/xyz/bodian_yd/RefillCallBack.php

@@ -59,7 +59,7 @@ class RefillCallBack implements refill\IRefillCallBack
             $mchid = intval($refill_info['mchid']);
             $mch_order = $refill_info['mch_order'];
             $chfilters = new refill\channel_filter($mchid, $mch_order, $card_type);
-            $chfilters->add_channel($quality, 'bodian_yd', $can_commit);
+            $chfilters->add($quality, 'bodian_yd', $can_commit);
         }
     }
 }

+ 71 - 2
helper/refill/policy/channel_filter.php

@@ -22,6 +22,9 @@ class channel_filter
         if($this->mCardType != mtopcard\ThirdRefillCard) {
             $this->mDatas = util::get_order_channels($mchid,$mch_order);
         }
+        else {
+            $this->mDatas = [];
+        }
     }
 
     public function __destruct()
@@ -31,7 +34,7 @@ class channel_filter
         }
     }
 
-    public function add_channel($cur_quality, $name, $succ)
+    public function add($cur_quality, $name, $succ)
     {
         if ($this->mCardType == mtopcard\ThirdRefillCard) {
             return;
@@ -53,10 +56,11 @@ class channel_filter
             } else {
                 $items[$name]['fail'] += 1;
             }
+            $items[$name]['start'] = time();
         }
         else
         {
-            $items[$name] = ['succ' => 0,'fail' => 0];
+            $items[$name] = ['succ' => 0,'fail' => 0,'start' => time(),'used' => 0];
             if($succ) {
                 $items[$name]['succ'] += 1;
             } else {
@@ -65,6 +69,71 @@ class channel_filter
         }
     }
 
+    public function notify($cur_quality, $name)
+    {
+        if ($this->mCardType == mtopcard\ThirdRefillCard) {
+            return;
+        }
+        if ($this->mCardType == mtopcard\SinopecCard || $this->mCardType == mtopcard\PetroChinaCard) {
+            return;
+        }
+
+        $this->mQuality = $cur_quality;
+        if (!array_key_exists($this->mQuality, $this->mDatas)) {
+            $this->mDatas[$this->mQuality] = [];
+        }
+
+        $items = &$this->mDatas[$this->mQuality];
+        if (array_key_exists($name, $items)) {
+            $used_time = time() - $items[$name]['start'];
+            $items[$name]['used'] += $used_time;
+        }
+    }
+
+    public function total($quality = 0)
+    {
+        if ($this->mCardType == mtopcard\ThirdRefillCard) {
+            return [0, 0];
+        }
+        if ($this->mCardType == mtopcard\SinopecCard || $this->mCardType == mtopcard\PetroChinaCard) {
+            return [0, 0];
+        }
+
+        $stater = function ($items)
+        {
+            $times = 0;
+            $used_time = 0;
+
+            foreach ($items as $item) {
+                $times += $item['succ'] + $item['fail'];
+                $used_time += $item['used'];
+            }
+
+            return [$times,$used_time];
+        };
+
+        if($quality === 0)
+        {
+            $times = 0;
+            $used_time = 0;
+
+            foreach ($this->mDatas as $qua => $items) {
+                [$a, $b] = $stater($items);
+                $times += $a;
+                $used_time += $b;
+
+                return [$times, $used_time];
+            }
+        }
+        elseif (array_key_exists($quality, $this->mDatas))
+        {
+            return $stater($this->mDatas[$quality]);
+        }
+        else {
+            return [0, 0];
+        }
+    }
+
     public function getProviders($cur_quality,$inProviders)
     {
         $this->mQuality = $cur_quality;

+ 2 - 1
helper/refill/policy/lingzh/policy.php

@@ -362,7 +362,8 @@ class policy extends ProviderManager implements IPolicy
             $caller = null;
         }
 
-        [$org_quality, $qualities] = $this->mQuality->find_quality($mchid, $card_type, $spec, $org_quality, $cur_quality, $commit_times, $elapse_secs, $caller);
+        $ch_filter = $order->filter();
+        [$org_quality, $qualities] = $this->mQuality->find_quality($mchid, $card_type, $spec, $org_quality, $cur_quality, $commit_times, $elapse_secs, $caller, $ch_filter);
         if(empty($qualities)) {
             return [$org_quality,0];
         }

+ 1 - 1
helper/refill/policy/mratio_control.php

@@ -41,7 +41,7 @@ class mratio_control
             while (true)
             {
                 $start = $i * 100;
-                $items = Model()->table('merchant')->where(['mchid' => ['gt', 0], 'merchant_state' => 1])->field('mchid,retry_times_cfg')->order('mchid asc')->limit("{$start},100")->select();
+                $items = Model()->table('merchant')->where(['mchid' => ['gt', 0], 'merchant_state' => 1])->field('mchid,retry_times_cfg')->order('mchid asc')->limit("$start,100")->select();
                 if(empty($items)) {
                     break;
                 }

+ 71 - 29
helper/refill/policy/quaility.php

@@ -83,13 +83,36 @@ class Quality
         return $this->mMchPhonectl->mechants_quality();
     }
 
-    public function find_quality($mchid, $card_type, $spec, $org_quality, $cur_quality, $used_times, $used_time, $caller): array
+    public function find_quality(order $order, $caller): array
     {
-        if($card_type == mtopcard\ChinaMobileCard || $card_type == mtopcard\ChinaUnicomCard || $card_type == mtopcard\ChinaTelecomCard) {
-            return $this->mobile_quality($mchid, $card_type, $spec, $org_quality, $cur_quality, $used_times, $used_time);
+        $card_type = $order->card_type();
+        $is_phone = function ($card_type)
+        {
+            $types = [mtopcard\ChinaMobileCard, mtopcard\ChinaUnicomCard, mtopcard\ChinaTelecomCard];
+            if (in_array($card_type, $types)) {
+                return true;
+            }
+            else {
+                return false;
+            }
+        };
+
+        $is_oil = function ($card_type)
+        {
+            $types = [mtopcard\PetroChinaCard, mtopcard\SinopecCard];
+            if (in_array($card_type, $types)) {
+                return true;
+            }
+            else {
+                return false;
+            }
+        };
+
+        if($is_phone($card_type)) {
+            return $this->mobile_quality($order);
         }
-        elseif($card_type == mtopcard\PetroChinaCard || $card_type == mtopcard\SinopecCard) {
-            [$org,$qualities] = $this->oil_quality($mchid, $org_quality, $used_times,$used_time,$caller);
+        elseif($is_oil($card_type)) {
+            [$org, $qualities] = $this->oil_quality($order, $caller);
             return [$org,$qualities,false];
         }
         else {
@@ -97,8 +120,13 @@ class Quality
         }
     }
 
-    private function oil_quality($mchid, $quality, $times,$used_time,$caller): array
+    private function oil_quality(order $order, $caller): array
     {
+        $mchid = $order->mchid();
+        $quality = $order->org_quality();
+        $times = $order->commit_times();
+        $used_time = $order->elapse_secs();
+
         Log::record("oil_quality mchid={$mchid},quality={$quality},times={$times}",Log::DEBUG);
         if($quality == 0)
         {
@@ -159,17 +187,19 @@ class Quality
     }
 
 
-    private function mobile_quality($mchid, $card_type, $spec, $org_quality, $cur_quality, $used_times, $used_time): array
+    private function mobile_quality(order $order): array
     {
+        $mchid = $order->mchid();
+        $org_quality = $order->org_quality();
+
         if($org_quality == 0)
         {
             [$success,$setting_quality,$time_out] = $this->mMchPhonectl->getCtls($mchid);
             if($success)
             {
-                if(array_key_exists($setting_quality,$this->mQualities)) {
+                if (array_key_exists($setting_quality, $this->mQualities)) {
                     $org_quality = $setting_quality;
-                }
-                else {
+                } else {
                     $org_quality = $setting_quality;
                 }
             }
@@ -194,23 +224,31 @@ class Quality
         $max_times = $this->max_times($mchid, $org_quality, $qualities);
         if ($this->mRatioCtl->exist($mchid)) {
             Log::record("ratio_phone_quality exist=true",Log::DEBUG);
-            [$qualities,$match_ratio] = $this->ratio_phone_quality($org_quality, $qualities, $cur_quality, $used_times, $used_time, $mchid, $card_type, $spec);
+            [$qualities, $match_ratio] = $this->ratio_phone_quality($order, $qualities);
             return [$org_quality, $qualities,$match_ratio];
         } else {
             $fMixed = PolicyUtil::mixed_quality($org_quality);
-            $qualities = $this->calc_phone_quality($qualities, $fMixed, $cur_quality, $used_times, $used_time, $time_out, $max_times, $mchid);
+            $qualities = $this->calc_phone_quality($order, $qualities, $fMixed, $time_out, $max_times);
             return [$org_quality, $qualities,false];
         }
     }
 
-    private function ratio_phone_quality($org_quality, $all_qualities, $cur_quality, $used_times, $used_time, $mchid, $card_type, $spec)
+    private function ratio_phone_quality(order $order, $all_qualities)
     {
+        $mchid = $order->mchid();
+        $org_quality = $order->org_quality();
+
+        $spec  = $order->spec();
+        $card_type = $order->card_type();
+        $cur_quality = $order->cur_quality();
+        $used_times = $order->commit_times();
+        $used_time = $order->elapse_secs();
+
         [$succ,$max_times,$time_out] = $this->mRatioCtl->total($mchid,$all_qualities);
 
         $left_time = $time_out - $used_time;
-        Log::record("left_time = {$left_time} used_time={$used_time}",Log::DEBUG);
+        Log::record("left_time=$left_time used_time=$used_time max_times=$max_times used_times=$used_times",Log::DEBUG);
         if ($left_time <= 0 || $max_times <= $used_times) {
-            Log::record("max_times=$max_times used_times=$used_times",Log::DEBUG);
             return [[],false];
         }
         
@@ -287,10 +325,11 @@ class Quality
                 $result = [];
 
                 $qualities = array_reverse($qualities);
-                foreach ($qualities as $quality) {
+                foreach ($qualities as $quality)
+                {
                     $per_secs = $this->mSpeeds[$quality]['per_secs'];
                     $qsecs = $this->mRatioCtl->seconds($mchid, $quality);
-                    Log::record("left_time={$left_time} quality={$quality} secs={$qsecs}", Log::DEBUG);
+                    Log::record("left_time=$left_time quality=$quality secs=$qsecs", Log::DEBUG);
 
                     if ($qsecs == false) continue;
 
@@ -339,18 +378,18 @@ class Quality
 
         if($used_times > 0)
         {
-            $qualities_log("ratio_phone_quality {$mchid}-{$card_type}-{$spec} all_qualities", $all_qualities);
+            $qualities_log("ratio_phone_quality $mchid-$card_type-$spec all_qualities", $all_qualities);
             [$match_ratio, $can_last] = $this->mRatioCtl->ratio_match($mchid, $org_quality, $card_type, $spec, $all_qualities);
-            Log::record("ratio_phone_quality mchid={$mchid} must calc next quality match_ratio={$match_ratio} can_last={$can_last}", Log::DEBUG);
+            Log::record("ratio_phone_quality mchid=$mchid must calc next quality match_ratio=$match_ratio can_last=$can_last", Log::DEBUG);
 
             $times_qualities = $times_checker($match_ratio, $all_qualities, $used_times);
-            $qualities_log("ratio_phone_quality {$mchid}-{$card_type}-{$spec} times_qualities", $times_qualities);
+            $qualities_log("ratio_phone_quality $mchid-$card_type-$spec times_qualities", $times_qualities);
 
             $timeout_qualities = $timeout_checker($match_ratio, $all_qualities, $left_time);
-            $qualities_log("ratio_phone_quality {$mchid}-{$card_type}-{$spec} timeout_qualities", $timeout_qualities);
+            $qualities_log("ratio_phone_quality $mchid-$card_type-$spec timeout_qualities", $timeout_qualities);
 
             $pre_qualities = array_intersect($times_qualities, $timeout_qualities, $all_qualities);
-            $qualities_log("ratio_phone_quality {$mchid}-{$card_type}-{$spec} pre_qualities", $pre_qualities);
+            $qualities_log("ratio_phone_quality $mchid-$card_type-$spec pre_qualities", $pre_qualities);
 
 
             if (!$timeing_checker($pre_qualities)) {
@@ -358,7 +397,7 @@ class Quality
                 Log::record("calc_quality timeing_checker result is empty", Log::DEBUG);
             }
 
-            $qualities_log("ratio_phone_quality {$mchid}-{$card_type}-{$spec} after timeing_checker qualities", $pre_qualities);
+            $qualities_log("ratio_phone_quality $mchid-$card_type-$spec after timeing_checker qualities", $pre_qualities);
             $cur_qualities = $pre_qualities;
 
             if (!$can_last) {
@@ -371,9 +410,7 @@ class Quality
             $cur_qualities = $all_qualities;
         }
 
-
         return [$cur_qualities,$match_ratio];
-
     }
 
     private function max_times($mchid,$quality,$qualities)
@@ -387,12 +424,17 @@ class Quality
     }
 
     //通过每种类型通道耗时,倒推当前可用通道,并优先走推荐通道.
-    private function calc_phone_quality($qualities,$fMixed, $cur_quality, $times, $used_time, $time_out, $max_times, $mchid)
+    private function calc_phone_quality(order $order, $qualities,$fMixed,$time_out, $max_times)
     {
+        $mchid = $order->mchid();
+        $cur_quality = $order->cur_quality();
+        $used_times = $order->commit_times();
+        $used_time = $order->elapse_secs();
+
         $left_time = $time_out - $used_time;
         if(!$fMixed)
         {
-            if($left_time <= 0 || $max_times <= $times) {
+            if($left_time <= 0 || $max_times <= $used_times) {
                 return [];
             }
         }
@@ -455,9 +497,9 @@ class Quality
             return true;
         };
 
-        if($times > 0)
+        if($used_times > 0)
         {
-            $qualities = $times_checker($qualities,$times);
+            $qualities = $times_checker($qualities,$used_times);
             Log::record("calc_quality times_checker result = " . implode(',', $qualities), Log::DEBUG);
             $qualities = $timeout_checker($qualities,$left_time);
             Log::record("calc_quality timeout_checker result = " . implode(',', $qualities), Log::DEBUG);

+ 43 - 0
test/refill/TestOrder.php

@@ -0,0 +1,43 @@
+<?php
+/**
+ *   TestOrder.php
+ *   stanley-king
+ *   2023/12/22
+ *   PhpStorm
+ *   PHPProject
+ */
+
+
+define('APP_ID', 'test');
+define('BASE_ROOT_PATH', str_replace('/test/refill', '', 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/XYZRefillFactory.php');
+
+
+use PHPUnit\Framework\TestCase;
+
+use refill\order;
+
+class TestOrder extends TestCase
+{
+    public static function setUpBeforeClass() : void
+    {
+        Base::run_util();
+    }
+
+    public function testOrderEx()
+    {
+        $mod_refill = Model('refill_order');
+        $info = $mod_refill->get_detail(10226,'756868ad50120f2ad4e1827b6eba0785');
+        $params = json_decode($info['params'],true);
+        $order = order::from_parameters($params);
+
+        $filter = $order->filter();
+        $filter->add(1, 'baidu', true);
+        $filter->notify(1, 'baidu');
+
+        [$times, $used_time] = $filter->total();
+    }
+}