zilong 4 éve
szülő
commit
4c43acecbd

+ 42 - 14
app/Http/Controllers/Api/V1/OrderController.php

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -30,7 +30,7 @@ class OrderController extends AuthController
     {
         $req = request()->post();
         $this->validate(request(), [
-            'payment_type' => 'required|in:1,2',
+            'payment_type' => 'required|in:1,2,3',
             'product_type' => 'required|in:1,2',
             'docter_id' => 'required|integer',
             'patient_id' => 'required|integer',
@@ -40,6 +40,7 @@ class OrderController extends AuthController
             'phone_minutes' => 'required_if:product_type,1|integer',
             'symptoms' => 'required_if:product_type,2|max:2000',
             'medical_imgs' => 'required_if:product_type,2|json|max:3000',
+            'order_pack_id' => 'required_if:payment_type,3|integer',
             'pay_password|支付密码' => 'integer',
         ]);
         $user = $this->user;
@@ -61,7 +62,7 @@ class OrderController extends AuthController
         $payment_amount = $req['total_amount'] - $discount_amount;
         $payment_amount = $payment_amount < 0 ? 0 : $payment_amount;
 
-        if ($req['payment_type'] == 2 && $payment_amount > 0 && empty($req['pay_password'])) {
+        if (in_array($req['payment_type'], [2,3]) && $payment_amount > 0 && empty($req['pay_password'])) {
             return out(null, 10011, '请输入支付密码');
         }
 
@@ -71,9 +72,13 @@ class OrderController extends AuthController
             }
         }
 
+        if ($req['payment_type'] == 3) {
+            OrderPack::checkUserServicePack($req['order_pack_id'], $user['id'], $req['payment_type'], $payment_amount);
+        }
+
         $order_status = $payment_status = 1;
         $payment_time = 0;
-        if ($payment_amount == 0 || $req['payment_type'] == 2) {
+        if ($payment_amount == 0 || in_array($req['payment_type'], [2,3])) {
             $order_status = $payment_status = 2;
             $payment_time = time();
         }
@@ -82,7 +87,7 @@ class OrderController extends AuthController
         DB::beginTransaction();
         try {
             //保存订单数据
-            $order = Order::create([
+            $create = [
                 'user_id' => $user['id'],
                 'payment_type' => $req['payment_type'],
                 'product_type' => $req['product_type'],
@@ -94,7 +99,11 @@ class OrderController extends AuthController
                 'order_status' => $order_status,
                 'payment_status' => $payment_status,
                 'payment_time' => $payment_time,
-            ]);
+            ];
+            if ($req['payment_type'] == 3) {
+                $create['pay_order_pack_id'] = $req['order_pack_id'];
+            }
+            $order = Order::create($create);
             $order_sn = build_sn($order['id']);
             Order::where('id', $order['id'])->update(['order_sn' => $order_sn]);
             //保存订单患者信息
@@ -148,11 +157,13 @@ class OrderController extends AuthController
                     //改变用户余额
                     $change_amount = 0 - $payment_amount;
                     User::changeBalance($user['id'], $change_amount, 1, $order['id'], '咨询订单消费');
-
-                    Order::payCompletedHandle($order['id']);
                 }
             }
 
+            if ($payment_amount == 0 || in_array($req['payment_type'], [2, 3])) {
+                Order::payCompletedHandle($order['id']);
+            }
+
             DB::commit();
         } catch (\Exception $e) {
             DB::rollBack();
@@ -166,7 +177,7 @@ class OrderController extends AuthController
     {
         $req = request()->post();
         $this->validate(request(), [
-            'payment_type' => 'required|in:1,2',
+            'payment_type' => 'required|in:1,2,3',
             'product_type' => 'required|in:3,4,5',
             'patient_id' => 'required|integer',
             'organization_id' => 'required|integer',
@@ -177,6 +188,7 @@ class OrderController extends AuthController
             'docter_id' => 'required_if:product_type,3|integer',
             'vaccine_id' => 'required_if:product_type,4|integer',
             'nurse_ids' => 'required_if:product_type,5|json',
+            'order_pack_id' => 'required_if:payment_type,3|integer',
             'pay_password|支付密码' => 'integer',
         ]);
         $user = $this->user;
@@ -209,7 +221,7 @@ class OrderController extends AuthController
         $payment_amount = $req['total_amount'] - $discount_amount;
         $payment_amount = $payment_amount < 0 ? 0 : $payment_amount;
 
-        if ($req['payment_type'] == 2 && $payment_amount > 0 && empty($req['pay_password'])) {
+        if (in_array($req['payment_type'], [2,3]) && $payment_amount > 0 && empty($req['pay_password'])) {
             return out(null, 10011, '请输入支付密码');
         }
 
@@ -219,9 +231,13 @@ class OrderController extends AuthController
             }
         }
 
+        if ($req['payment_type'] == 3) {
+            OrderPack::checkUserServicePack($req['order_pack_id'], $user['id'], $req['payment_type'], $payment_amount);
+        }
+
         $order_status = $payment_status = 1;
         $payment_time = 0;
-        if ($payment_amount == 0 || $req['payment_type'] == 2) {
+        if ($payment_amount == 0 || in_array($req['payment_type'], [2,3])) {
             $order_status = 3;
             $payment_status = 2;
             $payment_time = time();
@@ -231,7 +247,7 @@ class OrderController extends AuthController
         DB::beginTransaction();
         try {
             //保存订单数据
-            $order = Order::create([
+            $create = [
                 'user_id' => $user['id'],
                 'docter_id' => $req['docter_id'] ?? 0,
                 'patient_id' => $req['patient_id'],
@@ -244,7 +260,11 @@ class OrderController extends AuthController
                 'payment_amount' => $payment_amount,
                 'discount_amount' => $discount_amount,
                 'payment_time' => $payment_time,
-            ]);
+            ];
+            if ($req['payment_type'] == 3) {
+                $create['pay_order_pack_id'] = $req['order_pack_id'];
+            }
+            $order = Order::create($create);
             $order_sn = build_sn($order['id']);
             Order::where('id', $order['id'])->update(['order_sn' => $order_sn]);
             //保存订单患者信息
@@ -312,11 +332,13 @@ class OrderController extends AuthController
                     //改变用户余额
                     $change_amount = 0 - $payment_amount;
                     User::changeBalance($user['id'], $change_amount, 1, $order['id'], '预约订单消费');
-
-                    Order::payCompletedHandle($order['id']);
                 }
             }
 
+            if ($payment_amount == 0 || in_array($req['payment_type'], [2, 3])) {
+                Order::payCompletedHandle($order['id']);
+            }
+
             DB::commit();
         } catch (\Exception $e) {
             DB::rollBack();
@@ -407,12 +429,18 @@ class OrderController extends AuthController
             OrderPatient::create($addPatient);
             //保存订单服务包表
             $addPack = ServicePack::select(['id as service_pack_id', 'name as pack_name', 'intro as pack_intro', 'price as pack_price', 'insurance_policy', 'insurance_img_url', 'team_id', 'phone_minutes', 'chat_num', 'appoint_num', 'vaccine_limit_amount', 'nurses_limit_amount', 'effective_days'])->where('id', $req['service_pack_id'])->first()->getOriginal();
+            $addPack['user_id'] = $user['id'];
             $addPack['order_id'] = $order['id'];
             $addPack['is_security'] = $req['is_security'];
             $addPack['guardian_name'] = $req['guardian_name'];
             $addPack['relationship_type'] = $req['relationship_type'];
             $addPack['start_time'] = time();
             $addPack['end_time'] = time() + $addPack['effective_days']*24*3600;
+            $addPack['total_phone_minutes'] = $addPack['phone_minutes'];
+            $addPack['total_chat_num'] = $addPack['chat_num'];
+            $addPack['total_appoint_num'] = $addPack['appoint_num'];
+            $addPack['total_vaccine_limit_amount'] = $addPack['vaccine_limit_amount'];
+            $addPack['total_nurses_limit_amount'] = $addPack['nurses_limit_amount'];
             OrderPack::create($addPack);
 
             //判断是微信支付

+ 6 - 1
app/Models/Order.php

xqd xqd
@@ -72,7 +72,7 @@ class Order extends BaseModel
     //支付完成的处理方法
     public static function payCompletedHandle($order_id)
     {
-        $order = Order::select(['user_id', 'docter_id', 'product_type', 'total_amount', 'payment_type', 'payment_amount', 'order_sn'])->where('id', $order_id)->first();
+        $order = Order::select(['user_id', 'docter_id', 'product_type', 'total_amount', 'payment_type', 'payment_amount', 'order_sn', 'pay_order_pack_id'])->where('id', $order_id)->first();
         //发送下单消息
         if ($order['product_type'] < 6) {
             $product_type_text = config('config.product_type_map')[$order['product_type']];
@@ -96,6 +96,11 @@ class Order extends BaseModel
         //发送医生端消息
         DocterMessage::saveMessage($order['docter_id'], $order['user_id'], 1, $order_id, [$order['order_sn']]);
 
+        //如果是服务包支付的,就扣服务包的次数
+        if ($order['payment_type'] == 3) {
+            OrderPack::deductPackData($order['pay_order_pack_id'], $order['payment_type'], $order['payment_amount']);
+        }
+
         return true;
     }
 

+ 62 - 0
app/Models/OrderPack.php

xqd
@@ -14,11 +14,73 @@ class OrderPack extends BaseModel
     {
         return $this->belongsTo(Team::class);
     }
+
     public function order()
     {
         return $this->belongsTo(Order::class);
     }
+
     public function user(){
         return $this->belongsTo(User::class);
     }
+
+    public static function checkUserServicePack($order_pack_id, $user_id, $product_type, $payment_amount)
+    {
+        $data = self::where('id', $order_pack_id)->where('user_id', $user_id)->first();
+        if (empty($data)) {
+            exit_out(null, 10001, '服务包不存在');
+        }
+        if ($data['end_time'] < time()) {
+            exit_out(null, 10002, '服务包已过期');
+        }
+
+        if ($product_type == 1) {
+            if ($data['phone_minutes'] < 10) {
+                exit_out(null, 10003, '服务包的电话咨询时间不足');
+            }
+        }
+        elseif ($product_type == 2) {
+            if ($data['chat_num'] <= 0) {
+                exit_out(null, 10004, '服务包的图文咨询次数不足');
+            }
+        }
+        elseif ($product_type == 3) {
+            if ($data['appoint_num'] <= 0) {
+                exit_out(null, 10005, '服务包的门诊预约次数不足');
+            }
+        }
+        elseif ($product_type == 4) {
+            if ($data['vaccine_limit_amount'] < $payment_amount) {
+                exit_out(null, 10006, '服务包疫苗金额不足');
+            }
+        }
+        elseif ($product_type == 5) {
+            if ($data['nurses_limit_amount'] < $payment_amount) {
+                exit_out(null, 10007, '服务包儿保金额不足');
+            }
+        }
+
+        return true;
+    }
+
+    public static function deductPackData($order_pack_id, $product_type, $payment_amount)
+    {
+        if ($product_type == 1) {
+            self::where('id', $order_pack_id)->decrement('phone_minutes', 10);
+        }
+        elseif ($product_type == 2) {
+            self::where('id', $order_pack_id)->decrement('chat_num');
+        }
+        elseif ($product_type == 3) {
+            self::where('id', $order_pack_id)->decrement('appoint_num');
+        }
+        elseif ($product_type == 4) {
+            self::where('id', $order_pack_id)->decrement('vaccine_limit_amount', $payment_amount);
+        }
+        elseif ($product_type == 5) {
+            self::where('id', $order_pack_id)->decrement('nurses_limit_amount', $payment_amount);
+        }
+
+        return true;
+    }
 }