stanley-king преди 3 години
родител
ревизия
d129a15f21
променени са 4 файла, в които са добавени 250 реда и са изтрити 1 реда
  1. 48 0
      helper/refill/RefillBase.php
  2. 107 0
      helper/refill/policy/transfer.php
  3. 69 1
      rdispatcher/proxy.php
  4. 26 0
      test/TestRefillTransfer.php

+ 48 - 0
helper/refill/RefillBase.php

@@ -195,6 +195,54 @@ class RefillBase
         }
     }
 
+    public function success_order(order $order) : array
+    {
+        $last_orderid = $order->last_order_id();
+
+        $mchid = $order->mchid();
+        $mch_order = $order->mch_order();
+
+        try
+        {
+            $minfo = new member_info($order->buyer_id());
+            $org_quality = $order->org_quality();
+            if(PolicyUtil::mixed_quality($org_quality)) {
+                $calc = new CalcMerchantPrice($mchid, $order->spec(), $order->card_type(),$org_quality,$this->mPolicy,$order->thrid_params());
+            }
+            else {
+                $calc = new CalcMerchantPrice($mchid, $order->spec(), $order->card_type(),$order->cur_quality(),$this->mPolicy,$order->thrid_params());
+            }
+            $mch_price = $calc->calc_vgoods_price([]);
+            $mch_amount = $mch_price * $order->quantity();
+        }
+        catch (Exception $ex) {
+            return [false,$last_orderid,'没有协商商品价格'];
+        }
+
+        $available = $minfo->available_predeposit();
+        if ($mch_amount > $available) {
+            return [false, $last_orderid,"余额不足支付订单"];
+        }
+
+        $goods_id = ZERO_GOODS_ID;
+        $channel_name = 'cbproxy';
+        $channel_amount = 0.00;
+
+        $mod_refill = Model('refill_order');
+        [$order_success, $order_id, $order_sn] = $this->create_order($order, $goods_id, $minfo, $calc, $channel_name, $channel_amount, $mch_amount);
+
+        if(!$order_success) {
+            return [false,$last_orderid,'订单创建失败'];
+        }
+        else {
+            $logic_vr_order = Logic("vr_order");
+            $logic_vr_order->changeOrderStateSuccess($order_id,true);
+            $data = ['commit_time' => time(), 'notify_time' => time()];
+            $mod_refill->edit($order_id, $data);
+            return [true,$order_id,''];
+        }
+    }
+
     public function zero_order(order $order,$errmsg='')
     {
         $buyer_id = $order->buyer_id();

+ 107 - 0
helper/refill/policy/transfer.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace refill;
+
+class transfer
+{
+    private $mMchid2Infos;
+    public function __construct()
+    {
+        $this->load();
+    }
+
+    private static $stInstance = null;
+    public static function instance()
+    {
+        if (self::$stInstance == null) {
+            self::$stInstance = new transfer();
+        }
+
+        return self::$stInstance;
+    }
+
+    public function load()
+    {
+        $mch_checker = function ($mchid) {
+            $item = Model()->table('merchant')->field('mchid,admin_id')->where(['mchid' => $mchid])->find();
+            return intval($item['admin_id']);
+        };
+
+        $this->mMchid2Infos = [];
+        $i = 0;
+        while (true)
+        {
+            $start = $i * 1000;
+            $items = Model()->table('merchant')->field('mchid,transfer_cfg')->order('mchid asc')->limit("{$start},1000")->select();
+            if(empty($items)) {
+                return;
+            }
+            $i++;
+
+            foreach ($items as $item)
+            {
+                $transfer_cfg = $item['transfer_cfg'];
+
+                if(empty($transfer_cfg)) {
+                    continue;
+                }
+
+                $transfer_cfg = unserialize($transfer_cfg);
+                if($transfer_cfg === false) {
+                    continue;
+                }
+
+                $mchid = intval($item['mchid']);
+                $opened = intval($transfer_cfg['transfer_opened']);
+                $tmchid = intval($transfer_cfg['transfer_mchid']);
+                $lower_time = intval($transfer_cfg['transfer_lowertime']);
+                $upper_time = intval($transfer_cfg['transfer_uppertime']);
+
+                if ($opened == 1 && $tmchid > 0 && $tmchid != $mchid && $lower_time > 0 && $upper_time > $lower_time)
+                {
+                    $admin_id = $mch_checker($tmchid);
+                    if($admin_id > 0) {
+                        $this->mMchid2Infos[$mchid] = ['transfer_mchid' => $tmchid, 'admin_id' => $admin_id,
+                            'lower_time' => $lower_time, 'upper_time' => $upper_time];
+                    }
+
+                }
+            }
+        }
+    }
+
+    public function need_transfer($mchid,$order_time)
+    {
+        if(array_key_exists($mchid,$this->mMchid2Infos))
+        {
+            $transfer_cfg = $this->mMchid2Infos[$mchid];
+
+            $lower_time = $transfer_cfg['lower_time'];
+            $upper_time = $transfer_cfg['upper_time'];
+
+            $elpse_secs = time() - $order_time;
+            if($lower_time <= $elpse_secs && $upper_time > $elpse_secs) {
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+
+        return false;
+    }
+
+    public function transfer_mchid($mchid)
+    {
+        if(array_key_exists($mchid,$this->mMchid2Infos))
+        {
+            $transfer_cfg = $this->mMchid2Infos[$mchid];
+            $transfer_mchid = $transfer_cfg['transfer_mchid'];
+            $admin_id = $transfer_cfg['admin_id'];
+
+            return [$transfer_mchid,$admin_id];
+        }
+
+        return [0,0];
+    }
+}

+ 69 - 1
rdispatcher/proxy.php

@@ -1,7 +1,10 @@
 <?php
 declare(strict_types=0);
 
-require_once (BASE_ROOT_PATH . '/helper/model_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
+require_once(BASE_HELPER_PATH . '/refill/policy/transfer.php');
+
+use refill;
 
 class proxy
 {
@@ -26,6 +29,68 @@ class proxy
         return true;
     }
 
+    private function need_transfer(refill\order $order)
+    {
+        $order_time = $order->order_time();
+        $mchid = $order->mchid();
+        $ret = refill\transfer::instance()->need_transfer($mchid,$order_time);
+
+        return $ret;
+    }
+
+    private function transfer(refill\order $order) : bool
+    {
+        $add_success = function (refill\order $order)
+        {
+            $mchid = $order->mchid();
+            $mch_order = $order->mch_order();
+            [$success,$order_id,$errmsg] = refill\RefillFactory::instance()->success_order($order);
+
+            if($success) {
+                refill\util::pop_queue_order($mchid, $mch_order);
+                QueueClient::push("NotifyMerchantComplete", ['order_id' => $order_id, 'manual' => false]);
+            }
+
+            return $success;
+        };
+
+        $transfer_params = function (refill\order $order)
+        {
+            $mchid = $order->mchid();
+            $trans_mchid = refill\transfer::instance()->transfer_mchid($mchid);
+
+
+            $params = ['mchid' => $trans_mchid,
+                'buyer_id' => $this->adminid(),
+                'amount' => $order->spec(),
+                'card_no' => $order->card_no(),
+                'mch_order' => $order->mch_order(),
+                'notify_url' => $notify_url,
+                'org_quality' => 0,
+                'order_time' => time()
+            ];
+
+            refill\util::push_queue_order($this->mchid(),$mch_order,ORDER_STATE_QUEUE);
+            Model('refill_order')->add_detail($this->mchid(),$mch_order,$params,ORDER_STATE_QUEUE);
+
+            [$can_refill, $period] = refill\util::can_commit($card_no, $card_type);
+            if ($can_refill === false) {
+                $state = refill\util::async_add($params, $period);
+            } else {
+                $state = refill\util::push_add($params);
+            }
+
+
+        };
+
+        if($add_success($order)) {
+            $params = $transfer_params($order);
+
+        }
+
+        return true;
+    }
+
     public function add($params)
     {
         $order = refill\order::from_parameters($params);
@@ -67,6 +132,9 @@ class proxy
         if($order->first_commit()) {
             refill\util::incr_user_commit($mchid,$order->card_type(),$order->spec(),$org_quality);
         }
+        elseif($this->need_transfer($order)) {
+            return $this->transfer($order);
+        }
 
         [$errcode, $errmsg, $order_id, $neterr,$net_errno] = refill\RefillFactory::instance()->add($order);
         if($errcode !== true)

+ 26 - 0
test/TestRefillTransfer.php

@@ -0,0 +1,26 @@
+<?php
+
+
+use PHPUnit\Framework\TestCase;
+
+define('APP_ID', 'test');
+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/transfer.php');
+
+class TestRefillTransfer extends TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        Base::run_util();
+    }
+
+    public function testLoad()
+    {
+        refill\transfer::instance()->need_transfer(1088,strtotime('1022-04-27 14:00:00'));
+
+    }
+}