wupengfei 2 years ago
parent
commit
4ea40570a6

+ 48 - 19
application/common/service/OrderCallback.php

@@ -13,7 +13,10 @@ use app\common\model\User;
 use app\common\model\UserMessage;
 use app\common\model\UserMoneyInfo;
 use app\common\model\UserWallet;
+use EasyWeChat\Factory;
 use think\Db;
+use think\Exception;
+
 /**
  * 订单回调逻辑
  * Class OrderCallback
@@ -179,33 +182,59 @@ class OrderCallback
     }
 
     // 订单金额退款
-    public static function refundMoney($order_id)
+    public static function refundMoney($refund_info =[],$order_info=[],$order_id = 0)
     {
-        $order_info = GoodsOrder::where('id',$order_id)->find()->toArray();
-        $refund_info = GoodsOrderRefund::where(['order_id'=>$order_id])->find()->toArray();
-        if($order_info['refund_state'] != 2) return ['code'=>201,'订单退款审核状态有误'];
-        if($refund_info['refund_money'] <= 0 || $refund_info['refund_money'] > $order_info['price_total'])return ['code'=>202,'订单退款金额有误'];
-        switch ($order_info['pay_type']){
-            case 1:
-                break;
-            case 2:
-                break;
-            case 3:
-                break;
-            case 4:
-                break;
-            case 5:
-                break;
-            case 6:
-                break;
+        $ret = ['code'=>200,'msg'=>'退款成功'];
+        if(empty($order_info)) $order_info = GoodsOrder::where('id',$order_id)->find()->toArray();
+        if(empty($refund_info)) $refund_info = GoodsOrderRefund::where(['order_id'=>$order_id])->find()->toArray();
+        if(!in_array($order_info['refund_state'],[2,3])) return ['code'=>201,'订单退款审核状态有误'];
+        if($refund_info['refund_money'] <= 0 || $refund_info['refund_money'] > $order_info['price_total'])return ['code'=>201,'订单退款金额有误'];
+        $refund_no = $refund_info['refund_no'] ? $refund_info['refund_no'] : get_order_sn();
+        Db::startTrans();
+        try {
+            switch ($order_info['pay_type']){
+                case 1:
+                    $app = Factory::payment(config('app.wx_pay'));
+                    $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['price_total']*100, $refund_info['refund_money']*100, ['refund_desc' => '订单退款']);
+                    if($result['return_code'] != 'SUCCESS')  throw new Exception('退款异常');
+                    if($result['result_code'] != 'SUCCESS')  throw new Exception($result['err_code_des']);
+                    // 修改退款记录状态
+                    GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]);
+                    // 修改订单状态
+                    GoodsOrder::where('id',$refund_info['order_id'])->update(['status'=>8]);
+                    // 积分退回
+                    if($order_info['integral']) UserWallet::userIntegralChange($order_info['user_id'],$order_info['integral'],'订单退款退回',9,1,$order_info['id']);
+                    // 余额退回
+                    if($order_info['balance']) UserWallet::userMoneyChange($order_info['user_id'],$order_info['balance'],'订单退款退回',2, 1,$order_info['id']);
+                    // 券暂不出来
+                    break;
+                case 2:
+                    break;
+                case 3:
+                    break;
+                case 4:
+                    break;
+                case 5:
+                    break;
+                case 6:
+                    break;
+            }
+            // 订单相关返利追回
+            self::goodsOrderRefundBack($order_info , $order_id);
+            Db::commit();
+        }catch (\Exception $e){
+            $ret['code'] = 201;
+            $ret['msg'] = $e->getMessage();
+            Db::rollback();
         }
+        return  $ret;
 
     }
     // 商城订单退款(相关返利追回)
     public static function goodsOrderRefundBack($order_info , $order_id)
     {
         if(empty($order_info)) $order_info = GoodsOrder::where('id',$order_id)->find()->toArray();
-        if($order_info['rebate_refund'] == 1) return false;
+        if($order_info['rebate_refund'] == 1) return true;
         $where = [];
         $where[] = ['order_id','=',$order_info['id']];
         $where[] = ['type','in',[7,8,9]];

+ 9 - 30
application/order/controller/RefundOrder.php

@@ -6,6 +6,7 @@ use app\common\model\GoodsOrderItem;
 use app\common\model\GoodsOrderRefund;
 use app\common\model\StoreGoods;
 use app\common\model\StoreOrderRefund;
+use app\common\service\OrderCallback;
 use EasyWeChat\Factory;
 use library\Controller;
 use think\Db;
@@ -118,6 +119,11 @@ class RefundOrder extends Controller
                     break;
             }
             if($sh_status > 1) GoodsOrder::where('id',$refund_info['order_id'])->update(['refund_state'=>$sh_status]);
+            if($status == 3) {
+                $res = OrderCallback::refundMoney($refund_info,[],$refund_info['order_id']);
+                if($res['code'] != 200) StoreOrderRefund::where('id',$id)->update(['status'=>2]);
+                $this->error($res['msg']);
+            }
         }
     }
 
@@ -129,36 +135,9 @@ class RefundOrder extends Controller
             $order_info = GoodsOrder::where('id',$refund_info['order_id'])->find()->toArray();
             if($refund_info['status'] == 3) $this->error('已退款');
             if($refund_info['status'] == 5) $this->error('申请已取消');
-            if ($order_info['price_total'] < $refund_info['refund_money']) $this->error('退款金额错误');
-            $refund_no = $refund_info['refund_no'] ? $refund_info['refund_no'] : get_order_sn();
-            switch ($order_info['pay_type']) {
-                case 1:// 微信小程序
-                    $app = Factory::payment(config('app.wx_pay'));
-                    $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['price_total']*100, $refund_info['refund_money']*100, ['refund_desc' => '订单退款']);
-                    if($result['return_code'] == 'SUCCESS'){
-                        if($result['result_code']=='SUCCESS'){
-                            GoodsOrderRefund::where(['id'=>$id])->update(['refund_no'=>$refund_no,'status'=>3]);
-                            GoodsOrder::where('id',$refund_info['goods_id'])->update(['status'=>8]);
-                            return $this->success('退款成功');
-                        }else{
-                            GoodsOrderRefund::where(['id'=>$id])->update(['refund_no'=>$refund_no,'status'=>4]);
-                            return$this->error($result['err_code_des']);
-                        }
-                    }else{
-                        GoodsOrderRefund::where(['id'=>$id])->update(['refund_no'=>$refund_no,'status'=>4]);
-                        return $this->error('退款异常');
-                    }
-                    break;
-                case 2:
-                    break;
-                case 3:
-                    break;
-                case 4:
-                    break;
-                case 5:
-                    break;
-            }
-            return $this->success('退款成功'.$id);
+            if ($order_info['price_total'] < $refund_info['refund_money'])return $this->error('退款金额错误');
+            $res = OrderCallback::refundMoney($refund_info,$order_info,$refund_info['order_id']);
+            return $res['code'] == 200 ? $this->success($res['msg']):$this->error($res['msg']);
         }
     }