stanley-king 4 years ago
parent
commit
0ec15b2a63
3 changed files with 106 additions and 84 deletions
  1. 4 2
      data/model/refill_order.model.php
  2. 2 2
      data/model/vr_order.model.php
  3. 100 80
      helper/refill/RefillBase.php

+ 4 - 2
data/model/refill_order.model.php

@@ -9,9 +9,9 @@ defined('InShopNC') or exit('Access Invalid!');
 
 class refill_orderModel extends Model
 {
-	public function getOrderInfo($condition = [], $fields = '*', $master = false)
+    public function getOrderInfo($condition = [], $fields = '*', $master = false, $lock = false)
     {
-        $order_info = $this->table('refill_order')->field($fields)->where($condition)->order('')->master($master)->find();
+        $order_info = $this->table('refill_order')->field($fields)->where($condition)->order('')->master($master)->lock($lock)->find();
         if (empty($order_info)) {
             return [];
         }
@@ -22,10 +22,12 @@ class refill_orderModel extends Model
     {
         return $this->table('refill_order')->insert($params);
     }
+
     public function edit($order_id,$data)
     {
         return $this->table('refill_order')->where(['order_id' => $order_id])->update($data);
     }
+
     public function getMerchantOrderList($condition, $pagesize = '', $field = '*', $order = 'refill_order.order_id desc', $limit = '')
     {
         $list = $this->table('refill_order,vr_order')->field($field)

+ 2 - 2
data/model/vr_order.model.php

@@ -18,9 +18,9 @@ class vr_orderModel extends Model
      * @param array $condition
      * @return unknown
      */
-    public function getOrderInfo($condition = array(), $fields = '*', $master = false)
+    public function getOrderInfo($condition = array(), $fields = '*', $master = false,$lock=false)
     {
-        $order_info = $this->table('vr_order')->field($fields)->where($condition)->master($master)->find();
+        $order_info = $this->table('vr_order')->field($fields)->where($condition)->master($master)->lock($lock)->find();
         if (empty($order_info)) {
             return array();
         }

+ 100 - 80
helper/refill/RefillBase.php

@@ -57,65 +57,71 @@ class RefillBase
                 return true;
             }
 
-            if ($order_id !== false)
-            {
-                $mod_order = Model('vr_order');
-                $order_info = $mod_order->getOrderInfo(['order_id' => $order_id]);
-                $order_state = intval($order_info['order_state']);
-                if ($order_state != ORDER_STATE_SEND) {
-                    return false;
-                }
+            if ($order_id !== false) {
+                return $this->proc_notify($order_id, $success, $can_try, $chname);
+            } else {
+                Log::record("系统无此订单ID:{$order_id}", Log::ERR);
+            }
+        }
+        else {
+            Log::record("{$chname} 签名失败.");
+        }
 
-                $logic_vr_order = Logic("vr_order");
-                $mod_refill = Model('refill_order');
+        return true;
+    }
+
+    private function proc_notify($order_id,$success, $can_try,$chname)
+    {
+        $mod_order = Model('vr_order');
+        $order_info = $mod_order->getOrderInfo(['order_id' => $order_id]);
+        $order_state = intval($order_info['order_state']);
+        if ($order_state != ORDER_STATE_SEND) {
+            return false;
+        }
 
-                try
+        $logic_vr_order = Logic("vr_order");
+        $mod_refill = Model('refill_order');
+
+        try
+        {
+            $tran = new trans_wapper($mod_order,'notify change order state trans');
+
+            $order_info = $mod_order->getOrderInfo(['order_id' => $order_id],'*',true,true);
+            $order_state = intval($order_info['order_state']);
+            if ($order_state != ORDER_STATE_SEND) {
+                $tran->commit();
+                return false;
+            }
+
+            if ($success) {
+                $logic_vr_order->changeOrderStateSuccess($order_id);
+            }
+            elseif ($can_try)
+            {
+                $refill_info = $mod_refill->getOrderInfo(['order_id' => $order_id,'inner_status' => 0]);
+                if(!empty($refill_info))
                 {
-                    $tran = new trans_wapper($mod_order,'notify change order state trans');
-                    $order_info = $mod_order->getOrderInfo(['order_id' => $order_id]);
-                    $order_state = intval($order_info['order_state']);
-                    if ($order_state != ORDER_STATE_SEND) {
+                    $logic_vr_order->changeOrderStateCancel($order_info, '', "{$chname}接口回调通知失败,正在重试");
+                    if ($this->retry($refill_info, $order_info)) {
+                        $mod_refill->edit($order_id, ['is_retrying' => 1]);
                         $tran->commit();
-                        return false;
-                    }
-
-                    if ($success) {
-                        $logic_vr_order->changeOrderStateSuccess($order_id);
+                        return true;
                     }
-                    elseif ($can_try)
-                    {
-                        $refill_info = $mod_refill->getOrderInfo(['order_id' => $order_id,'inner_status' => 0]);
-                        if(!empty($refill_info))
-                        {
-                            $logic_vr_order->changeOrderStateCancel($order_info, '', "{$chname}接口回调通知失败,正在重试");
-                            if ($this->retry($refill_info, $order_info)) {
-                                $mod_refill->edit($order_id, ['is_retrying' => 1]);
-                                $tran->commit();
-                                return true;
-                            }
-                        }
-                    }
-                    else {
-                        $logic_vr_order->changeOrderStateCancel($order_info, '', "{$chname}接口回调通知失败,不可重试.");
-                    }
-                    $tran->commit();
                 }
-                catch (Exception $ex) {
-                    $tran->rollback();
-                    Log::record("Error:" . $ex->getMessage(), Log::ERR);
-                }
-
-                $mod_refill->edit($order_id, ['notify_time' => time(), 'notify_state' => 1]);
-                QueueClient::push("NotifyMerchantComplete", ['order_id' => $order_id,'manual' => false]);
             }
             else {
-                Log::record("系统无此订单ID:{$order_id}", Log::ERR);
+                $logic_vr_order->changeOrderStateCancel($order_info, '', "{$chname}接口回调通知失败,不可重试.");
             }
+            $tran->commit();
         }
-        else {
-            Log::record("{$chname} 签名失败.");
+        catch (Exception $ex) {
+            $tran->rollback();
+            Log::record("Error:" . $ex->getMessage(), Log::ERR);
         }
 
+        $mod_refill->edit($order_id, ['notify_time' => time(), 'notify_state' => 1]);
+        QueueClient::push("NotifyMerchantComplete", ['order_id' => $order_id,'manual' => false]);
+
         return true;
     }
 
@@ -405,52 +411,66 @@ class RefillBase
 
     public function query($order_id)
     {
+        $mod_order = Model('vr_order');
+        $order_info = $mod_order->getOrderInfo(['order_id' => $order_id,'inner_status' => 0]);
+
+        if(empty($order_info)) return false;
+        if($order_info['order_state'] != ORDER_STATE_SEND || $order_info['is_retrying'] == 1) {
+            return true;
+        }
+
         $mod_refill = Model('refill_order');
         $refill_info = $mod_refill->getOrderInfo(['order_id' => $order_id,'inner_status' => 0]);
         $chname = $refill_info['channel_name'];
 
-        if(empty($chname)) {
-            return false;
+        if($refill_info['notify_state'] == 1) {
+            QueueClient::push("NotifyMerchantComplete", ['order_id' => $order_id,'manual' => false]);
+            return true;
         }
 
-        Log::record(__FUNCTION__ . " channel {$chname} 1",Log::DEBUG);
-        $provider = $this->mPolicy->provider($chname);
-
-        Log::record(__FUNCTION__ . " channel {$chname}",Log::DEBUG);
-        if(empty($provider)) {
-            Log::record(__FUNCTION__ . " provider is null",Log::DEBUG);
-            return false;
+        try
+        {
+            $tran = new trans_wapper($mod_order,'query order state trans');
+            $order_info = $mod_order->getOrderInfo(['order_id' => $order_id],'*',true,true);
+            if($order_info['is_retrying'] == 1) {
+                $query_able = false;
+            }
+            elseif($order_info['order_state'] == ORDER_STATE_SEND) {
+                $query_able = true;
+            }
+            else {
+                $query_able = false;
+            }
+            $tran->commit();
         }
-        [$state, $order_state] = $provider->query($refill_info);
-
-        if(!$state) {
-            QueueClient::async_push("QueryRefillState",['order_id' => $order_id],180);
-            return false;
+        catch (Exception $ex) {
+            $tran->rollback();
+            Log::record($ex->getMessage(),Log::ERR);
         }
 
-        $mod_order = Model('vr_order');
-        $order_info = $mod_order->getOrderInfo(['order_id' => $order_id]);
-        $org_state = $order_info['order_state'];
-
-        $modify_able = true;
-        if($org_state == ORDER_STATE_SEND)
+        if($query_able)
         {
-            $logic_vr_order = Logic("vr_order");
-            if ($order_state == ORDER_STATE_SUCCESS) {
-                $logic_vr_order->changeOrderStateSuccess($order_id);
-            } elseif ($order_state == ORDER_STATE_CANCEL) {
-                $logic_vr_order->changeOrderStateCancel($order_info, '', "{$chname}接口查询失败,不再重试.");
-            } else {
-                $modify_able = false;
+            if(empty($chname)) return false;
+
+            $provider = $this->mPolicy->provider($chname);
+            if(empty($provider)) return false;
+
+            [$state, $order_state] = $provider->query($refill_info);
+            if(!$state) {
+                QueueClient::async_push("QueryRefillState",['order_id' => $order_id],180);
+                return false;
+            }
+            elseif($order_state == ORDER_STATE_SUCCESS) {
+                $this->proc_notify($order_id,true,false,$chname);
+            }
+            elseif($order_state == ORDER_STATE_CANCEL) {
+                $this->proc_notify($order_id,false,true,$chname);
+            }
+            else {
                 QueueClient::async_push("QueryRefillState",['order_id' => $order_id],180);
             }
         }
-
-        if($modify_able) {
-            $mod_refill->edit($order_id, ['notify_time' => time(), 'notify_state' => 1]);
-            QueueClient::push("NotifyMerchantComplete", ['order_id' => $order_id,'manual' => true]);
-        }
-
+        
         return true;
     }
 }