Browse Source

总共三处退诊

lizhen_gitee 10 months ago
parent
commit
67faf9b30e

+ 16 - 5
application/api/controller/Wenzhen.php

@@ -6,6 +6,8 @@ use app\common\controller\Api;
 use think\Db;
 use addons\epay\library\Service;
 use app\common\library\Tenim;
+use app\common\model\Wenzhenorder;
+
 /**
  * 问诊订单
  */
@@ -492,15 +494,16 @@ class Wenzhen extends Api
         ];
         Db::startTrans();
 
+        //退款要打折扣
+        $wenzhen_refund_bili = config('site.payorder_userrefund_bili') ?: 70;
+        $refund_price = bcdiv(bcmul($wenzhen_order['total_fee'],$wenzhen_refund_bili,2),100,2);
+
         //余额支付的直接退款
         if($wenzhen_order['pay_type'] == 'wallet'){
 
             //用户加钱
             $logtype = $wenzhen_order['ordertype'] == 1 ? 13 : 14;
 
-            $wenzhen_refund_bili = config('site.payorder_userrefund_bili') ?: 70;
-            $refund_price = bcdiv(bcmul($wenzhen_order['total_fee'],$wenzhen_refund_bili,2),100,2);
-
             $rs_wallet = model('wallet')->lockChangeAccountRemain($wenzhen_order['user_id'],'money',$refund_price,$logtype,$remark='用户问诊退珍','wenzhen_order',$order_id);
             if($rs_wallet['status'] === false){
                 Db::rollback();
@@ -511,8 +514,16 @@ class Wenzhen extends Api
             $update['refund_price']  = $refund_price;
             $update['refund_status'] = 3;
         }else{
-            //订单退款参数
-            $update['refund_status'] = 1; //异步退款
+
+            $update['refund_status'] = 1; //待退款
+
+            //发起退款
+            $Wenzhenorder_model = new Wenzhenorder;
+            $refund_rs = $Wenzhenorder_model->old_refund($wenzhen_order,$refund_price);
+            if($refund_rs === true){
+                $update['refund_status'] = 3; //退款完成
+            }
+
         }
 
         $update_rs = Db::name('wenzhen_order')->where('id',$order_id)->where('status',$wenzhen_order['status'])->update($update);

+ 9 - 2
application/api/controller/doctor/Wenzhen.php

@@ -4,6 +4,7 @@ namespace app\api\controller\doctor;
 
 use app\common\controller\Apic;
 use think\Db;
+use app\common\model\Wenzhenorder;
 /**
  * 问诊订单
  */
@@ -187,8 +188,14 @@ class Wenzhen extends Apic
             $update['refund_price']  = $wenzhen_order['total_fee'];
             $update['refund_status'] = 3;
         }else{
-            //订单退款参数
-            $update['refund_status'] = 1; //异步退款
+            $update['refund_status'] = 1; //待退款
+
+            //发起退款
+            $Wenzhenorder_model = new Wenzhenorder;
+            $refund_rs = $Wenzhenorder_model->old_refund($wenzhen_order,$wenzhen_order['total_fee']);
+            if($refund_rs === true){
+                $update['refund_status'] = 3; //退款完成
+            }
         }
 
         $update_rs = Db::name('wenzhen_order')->where('id',$order_id)->where('status',10)->update($update);

+ 149 - 0
application/common/model/Wenzhenorder.php

@@ -0,0 +1,149 @@
+<?php
+
+namespace app\common\model;
+
+use think\Db;
+use think\Model;
+use addons\epay\library\Service;
+
+/**
+ * 问诊模型
+ */
+class Wenzhenorder extends Model
+{
+
+    // 表名
+    protected $name = 'wenzhen_order';
+    // 开启自动写入时间戳字段
+    protected $autoWriteTimestamp = false;
+    // 定义时间戳字段名
+    protected $createTime = false;
+    protected $updateTime = false;
+
+    // 退款
+    public function old_refund($order, $refund_price)
+    {
+
+        $table = 'wenzhen_order';
+        $remark = '问诊退款';
+
+        // 生成退款单
+        $refund_data = [
+            'order_id' => $order['id'],
+            'out_refund_no'=> createUniqueNo('WR',$order['id']),
+            'pay_fee'  => $order['total_fee'],
+            'refund_price' => $refund_price,
+            'pay_type' => $order['pay_type'],
+            'status' => 0,
+            'createtime' => time(),
+            'updatetime' => time(),
+            'table' => $table,
+            'table_id' => $order['id'],
+        ];
+        $refund_log_id = Db::name('pay_order_refund_log')->insertGetId($refund_data);
+        if(!$refund_log_id){
+            return '退款失败';
+        }
+
+        if ($order['pay_type'] == 'wechat' || $order['pay_type'] == 'alipay') {
+            // 微信|支付宝退款
+
+            // 退款数据
+            $order_data = [
+                'out_trade_no' => $order['pay_out_trade_no']
+            ];
+
+            if ($order['pay_type'] == 'wechat') {
+                $total_fee = $order['total_fee'] * 100;
+                $refund_fee = $refund_price * 100;
+
+                $order_data = array_merge($order_data, [
+                    'out_refund_no' => $refund_data['out_refund_no'],
+                    'total_fee' => $total_fee,
+                    'refund_fee' => $refund_fee,
+                    'refund_desc' => $remark,
+                ]);
+            } else {
+                $order_data = array_merge($order_data, [
+                    'out_request_no' => $refund_data['out_refund_no'],
+                    'refund_amount' => $refund_price,
+                ]);
+            }
+
+            //
+            if ($order['pay_type'] == 'wechat') {
+                $wxpay = new \app\common\library\Wxpay;
+                $result = $wxpay->WxPayRefund($order_data);
+                // 微信通知回调 pay->notifyr
+                if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
+                    Db::name('pay_order_refund_log')->where('id',$refund_log_id)->update(['status'=>1]);
+                    return true;
+                } else {
+                    return $result['return_msg'];
+                }
+            } else {
+
+                $result = Service::submitRefund($order['total_fee'],$refund_price,$order['pay_out_trade_no'],$refund_data['out_refund_no'],$order['pay_type'],$remark,'');
+
+                if($result['code'] == '10000'){
+                    Db::name('pay_order_refund_log')->where('id',$refund_log_id)->update(['status'=>1]);
+                    return true;
+                }else{
+                    return $result['msg'];
+                }
+
+
+
+                /* return 'alipay wrong way';
+                 $alipay = new \app\common\library\AliPay;
+                 $result = $alipay->AliPayRefund($order_data);
+                 // 支付宝通知回调 pay->notifyx
+                 return $result;*/
+
+                /*if ($result['code'] == "10000") {
+                    return true;
+                } else {
+                    throw new \Exception($result['msg']);
+                }*/
+            }
+
+            // {        // 微信返回结果
+            //     "return_code":"SUCCESS",
+            //     "return_msg":"OK",
+            //     "appid":"wx39cd0799d4567dd0",
+            //     "mch_id":"1481069012",
+            //     "nonce_str":"huW9eIAb5BDPn0Ma",
+            //     "sign":"250316740B263FE53F5DFF50AF5A8FA1",
+            //     "result_code":"SUCCESS",
+            //     "transaction_id":"4200000497202004072822298902",
+            //     "out_trade_no":"202010300857029180027000",
+            //     "out_refund_no":"1586241595",
+            //     "refund_id":"50300603862020040700031444448",
+            //     "refund_channel":[],
+            //     "refund_fee":"1",
+            //     "coupon_refund_fee":"0",
+            //     "total_fee":"1",
+            //     "cash_fee":"1",
+            //     "coupon_refund_count":"0",
+            //     "cash_refund_fee":"1
+            // }
+
+            // {        // 支付宝返回结果
+            //     "code": "10000",
+            //     "msg": "Success",
+            //     "buyer_logon_id": "157***@163.com",
+            //     "buyer_user_id": "2088902485164146",
+            //     "fund_change": "Y",
+            //     "gmt_refund_pay": "2020-08-15 16:11:45",
+            //     "out_trade_no": "202002460317545607015300",
+            //     "refund_fee": "0.01",
+            //     "send_back_fee": "0.00",
+            //     "trade_no": "2020081522001464141438570535"
+            // }
+        }
+
+        return true;
+    }
+
+
+}

+ 53 - 7
application/index/controller/Plantask.php

@@ -25,25 +25,71 @@ class Plantask extends Controller
 
     }
 
-    //待接诊订单,医生不操作,支付N分钟后,自动退
+    //待接诊订单,医生不操作,支付N分钟后,自动退
     public function auto_tuizhen_noaccept_order(){
         $nowtime  = time();
         $second   = config('site.payorder_noaccept_autotuizhen_minute') * 60;
         $lasttime = $nowtime - $second;
 
         //dump(datetime($lasttime));exit;
-        $rs = Db::name('wenzhen_order')->where('status',10)->where('pay_time','lt',$lasttime)->update([
+        Db::startTrans();
+
+        $wenzhen_order = Db::name('wenzhen_order')->where('status',10)->where('pay_time','lt',$lasttime)->order('id asc')->lock(true)->find();
+        if(empty($order_list)){
+            Db::rollback();
+            echo 'empty';
+            exit;
+        }
+
+        $order_id = $wenzhen_order['id'];
+
+        //修改订单
+        $update = [
             'status'        => 16,
             'cancel_time'   => $nowtime,
             'cancel_reason' => '超时未接诊',
             'finish_time'   => $nowtime,
-            //待退款
-            'refund_status'   => 1,
-        ]);
+        ];
+
+        //余额支付的直接退款
+        if($wenzhen_order['pay_type'] == 'wallet'){
+
+            //用户加钱
+            $logtype = $wenzhen_order['ordertype'] == 1 ? 13 : 14;
+            $rs_wallet = model('wallet')->lockChangeAccountRemain($wenzhen_order['user_id'],'money',$wenzhen_order['total_fee'],$logtype,$remark='超时未接诊','wenzhen_order',$order_id);
+            if($rs_wallet['status'] === false){
+                Db::rollback();
+                echo $rs_wallet['msg'];
+                exit;
+            }
+
+            //订单退款参数
+            $update['refund_price']  = $wenzhen_order['total_fee'];
+            $update['refund_status'] = 3;
+        }else{
+            $update['refund_status'] = 1; //待退款
+
+            //发起退款
+            $Wenzhenorder_model = new Wenzhenorder;
+            $refund_rs = $Wenzhenorder_model->old_refund($wenzhen_order,$wenzhen_order['total_fee']);
+            if($refund_rs === true){
+                $update['refund_status'] = 3; //退款完成
+            }
+        }
+
+        $update_rs = Db::name('wenzhen_order')->where('id',$order_id)->update($update);
+        if(!$update_rs){
+            Db::rollback();
+            echo '退诊失败';
+            exit;
+        }
+
+
+        Db::commit();
+        echo '退诊成功'.$order_id.'结束';
+        exit;
 
-        echo $rs;
 
-        //不仅改状态,还要自动退款,放到队列处理
     }
 
     //视频订单,已拨打,通话N分钟后,自动结束