Browse Source

修复OMS推送失败,定时任务重新推送的bug

stanley-king 8 years ago
parent
commit
ac1fb0ec7b
2 changed files with 58 additions and 64 deletions
  1. 10 13
      crontab/control/hour.php
  2. 48 51
      data/logic/delivery.logic.php

+ 10 - 13
crontab/control/hour.php

@@ -28,6 +28,7 @@ class hourControl extends BaseCronControl
      * 默认方法
      */
     public function indexOp() {
+        $this->reput_oms();
         //更新全文搜索内容
         $this->_xs_update();
     }
@@ -224,22 +225,18 @@ class hourControl extends BaseCronControl
     }
 
     /**
-     * 定时推送异常订单(正常每半小时一次)
+     * 重新推送失败订单
      */
-    public function putExceptionOrderOp(){
-        $condition = array();
-        $condition['exception_state'] = 0;
-        // 查询异常订单(注意, 可能出现异常订单非常多的情况, 到时候用limit限制一下处理, 我写的时候就不做限制了)
-        $order_data = Model('order_exception_push')->where($condition)->select();
-
-        // 推送异常订单
-        $update_data['exception_state'] = 1;
-        foreach ($order_data as $value) {
+    private function reput_oms()
+    {
+        $order_data = Model('omsfail')->field('*')->where(array('order_status' => 0))->limit(false)->select();
+        foreach ($order_data as $value)
+        {
+            $fail_id = $value['fail_id'];
             $logic_delivery = Logic('delivery');
-            $ret = $logic_delivery->putOrder($value['pay_sn'], $value['pay_sn']);
+            $ret = $logic_delivery->putOrder($value['pay_sn'], $value['pay_sn'],false);
             if ($ret) {
-                // 更新订单状态
-                Model('order_exception_push')->where($condition)->update($update_data);
+                Model('omsfail')->where(array('fail_id' => $fail_id))->update(array('order_status' => 1));
             }
         }
     }

+ 48 - 51
data/logic/delivery.logic.php

@@ -23,7 +23,7 @@ class deliveryLogic
         return md5(self::$appkey . self::$appPassWord . $data);
     }
 
-    public function putOrder($pay_sn, $trade_no)
+    public function putOrder($pay_sn, $trade_no,$log_fail = true)
     {
         // 调试模式下不能推送到oms
         if(defined('OMS_PUSH_OFF') && OMS_PUSH_OFF == true) {
@@ -107,13 +107,45 @@ class deliveryLogic
         $headers = array('v_appkey: '.self::$appkey, 'v_sign: '.$sign, 'Content-Type: application/json');
         $resp = http_post_data(self::oms_url,urlencode($body),$headers);
 
-        if($resp === false) {
-            //todo 需要放到定时任务去推送
+        if($resp === false)
+        { //网络出现异常时,后台重新推送
+            if($log_fail) {
+                $log = array();
+
+                $log['pay_sn'] = $pay_sn;
+                $log['order_sn']  = $order_sn;
+                $log['trade_no'] = $trade_no;
+                $log['push_time'] = time();
+                $log['order_status'] = 0;
+
+                Model('omsfail')->insert($log);
+            }
+
             return false;
         }
 
-        Log::record("post data={$resp}",Log::DEBUG);
-        return $this->check($pay_sn, $trade_no, $order_sn,$resp);
+        $success = $this->check($resp,$err_state,$reson);
+        if($success == false)
+        {
+            Log::record("post data={$resp}",Log::ERR);
+
+            if($log_fail) {
+                $log = array();
+
+                $log['pay_sn'] = $pay_sn;
+                $log['order_sn']  = $order_sn;
+                $log['trade_no'] = $trade_no;
+                $log['push_time'] = time();
+                $log['reson'] = $reson;
+                $log['order_status'] = $err_state;
+                $log['oms_response'] = $resp;
+
+                Model('omsfail')->insert($log);
+            }
+            return false;
+        } else {
+            return true;
+        }
     }
 
     public function handleCallback($param)
@@ -141,16 +173,10 @@ class deliveryLogic
      * @param $order_sn
      * @return mixed
      */
-    private function check($pay_sn,$trade_no,$order_sn,$resp)
+    private function check($resp,&$err_state,&$reson)
     {
-        $data = array();
-        $data_log = array();
-        $data['pay_sn'] = $pay_sn;
-        $data['order_sn'] = $order_sn;
-        $data_log['pay_sn'] = $pay_sn;
-        $data_log['order_sn']  = $order_sn;
-        $data_log['exception_time'] = time();
-        $data_log['exception_state'] = 0;
+
+        $err_state = 0;
 
         //1:成功 0 :失败
         // 1:新订单 2:等待仓库处理 99:已拦截 90:库存不足 7:已发货
@@ -163,53 +189,24 @@ class deliveryLogic
                 if (!empty($result['data']) && is_array($result['data']) && count($result['data']) > 0)
                 {
                     // 填充错误理由
-                    $data_log['exception_reason'] = $result['data'][0]['errorMessge'];
-                    if (!empty($result['data'][0]['status']))
-                    {
+                    $reson = $result['data'][0]['errorMessge'];
+                    if (!empty($result['data'][0]['status'])) {
                         $status = intval($result['data'][0]['status']);
-                        if($status == 1 || $status == 2 || $status == 3 || $status == 7 || $status == 99) {
+                        if ($status == 1 || $status == 2 || $status == 3 || $status == 7 || $status == 99) {
                             return true;
-                        } else {
-                            Log::record("PUSHOMS ERR has status: order_sn = {$order_sn},pay_sn={$pay_sn},trade_no = {$trade_no}", Log::WAIT_HANDLE);
-                            Model('order_exception_push')->insert($data);
-                            Model('order_exception_log')->insert($data_log);
-                            return false;
                         }
-                    }
-                    else
-                    {
+                    } else {
                         $msg = $result['data'][0]['errorMessge'];
-                        if(strstr($msg,'订单已存在')) {
+                        if (strstr($msg, '订单已存在')) {
                             return true;
                         } else {
-                            // 技术债务, 未知问题, 不放入推送表, 确认后再放
-                            //Model('order_exception_push')->insert($data);
-                            Model('order_exception_log')->insert($data_log);
-                            return false;
+                            $err_state = 2;
                         }
                     }
                 }
-                else
-                {
-                    // 填充错误理由
-                    $data_log['exception_reason'] = "$resp order_sn = {$order_sn},pay_sn={$pay_sn},trade_no = {$trade_no}";
-                    Log::record("$resp order_sn = {$order_sn},pay_sn={$pay_sn},trade_no = {$trade_no}", Log::WAIT_HANDLE);
-                    Model('order_exception_push')->insert($data);
-                    Model('order_exception_log')->insert($data_log);
-                    return false;
-                }
-
-            } else {
-                Log::record("PUSHOMS ERR have not data: order_sn = {$order_sn},pay_sn={$pay_sn},trade_no = {$trade_no}", Log::WAIT_HANDLE);
-                Model('order_exception_push')->insert($data);
-                Model('order_exception_log')->insert($data_log);
-                return false;
             }
-        } else {
-            Log::record("PUSHOMS ERR empty result: order_sn = {$order_sn},pay_sn={$pay_sn},trade_no = {$trade_no}", Log::WAIT_HANDLE);
-            Model('order_exception_push')->insert($data);
-            Model('order_exception_log')->insert($data_log);
-            return false;
         }
+
+        return false;
     }
 }