OrderController.php 4.35 KB
<?php

namespace App\Http\Controllers\V1;

use App\Http\Controllers\Controller;
use App\Jobs\CancelUnpaidOrder;
use App\Models\MembershipGood;
use App\Models\Order;
use App\Models\OrderGood;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Jiannei\Response\Laravel\Support\Facades\Response;

class OrderController extends Controller
{
    public function index(Request $request)
    {
        $user_id = Auth::user()->getAuthIdentifier();

        $orders = Order::query()->where('user_id',$user_id)->paginate(10);

        return Response::success($orders);
    }

    public function store(Request $request)
    {
        $data = $request->all();

        $validator = Validator::make($data,[
            'goods_id' => 'required|integer',
        ]);

        if ($validator->fails()) return Response::fail('缺少参数',500,$validator->errors());

        $user_id = Auth::user()->getAuthIdentifier();

        $order = $this->build($user_id, $data['goods_id'], $this->getClientTerminal());

        if (!$order) return Response::fail('', 500,$order);

        return Response::success(['order_sn' => $order]);
    }

    public function show($id)
    {
        $user_id = Auth::user()->getAuthIdentifier();

        $order = Order::query()->where('order_sn',$id)->where('user_id',$user_id)->first();

        if (!$order) return Response::fail('order_sn fail',500);

        return Response::success($order);
    }

    /**
     * 创建订单
     * @param $user_id
     * @param $member_id
     * @param $source
     * @param $number = 1
     * @return string $order_sn
     */
    public function build($user_id, $member_id, $source, $number = 1)
    {
        try{
            return DB::transaction(function ()use ($user_id, $member_id, $source, $number){
                // 获取商品信息
                $membership_good = MembershipGood::query()->where('id',$member_id)->first();
                if (!$membership_good) throw new \Exception('没有此商品');

                $membership = $membership_good->membership()->first();

                // 实付金额 = 商品金额
                $pay_amount = $membership_good->price * $number;

                // 创建订单
                $order = new Order();
                $order_sn = $order::get_sn('osn');
                $order->order_sn = $order_sn;
                $order->user_id = $user_id;
                $order->pay_amount = $pay_amount;
                $order->description = $membership_good->name . $membership_good->limit_days . $membership_good->limit_unit;
                $order->goods_amount = $membership_good->price;
                $order->status = Order::UNPAID;
                $order->source = $source;
                $order->thumbnail = $membership->getSingleImage();
                $order->cancel_time = Carbon::now()->addSeconds(Order::TIMEOUT);

                $order->save();

                $order_good = new OrderGood();
                $order_good->order_sn = $order_sn;
                $order_good->goods_id = $member_id;
                $order_good->goods_type = OrderGood::MemberShip;
                $order_good->goods_name = $membership_good->name;
                $order_good->goods_image = $membership->getSingleImage();
                $order_good->goods_price = $membership_good->price;
                $order_good->goods_number = $number;

                $order_good->save();

                $order->goods = $order_good;

                CancelUnpaidOrder::dispatch($order)->delay(Order::TIMEOUT);

                if ($pay_amount == 0) {         //0元购就不执行回调了
                    $this->freePay($order);
                }
                return $order_sn;
            });
        }catch (\Exception $exception){
            Log::error($exception->getMessage());
            return $exception->getMessage();
        }
    }

    public function freePay($order)
    {
        $order = Order::query()->find($order->id);

        if ($order->status < Order::PAID){
            $order->status = Order::PAID;
            $order->pay_type = '';
            $order->pay_time = Carbon::now();
            if ($order->save()){
                // 执行一些本来属于回调的逻辑

                return true;
            }
        }
        return false;
    }

}