77 lines
1.9 KiB
PHP
77 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Endpoint\Api\Http\Controllers;
|
|
|
|
use App\Endpoint\Api\Http\Controllers\Controller;
|
|
use App\Enums\PayWay;
|
|
use App\Models\OfflineOrder;
|
|
use App\Models\OfflineOrderPreview;
|
|
use App\Services\OfflineOrderService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Throwable;
|
|
|
|
class OfflineOrderController extends Controller
|
|
{
|
|
/**
|
|
* 确认订单
|
|
*/
|
|
public function check(Request $request, OfflineOrderService $offlineOrderService)
|
|
{
|
|
$request->validate([
|
|
'order_preview_id' => ['bail', 'required', 'int'],
|
|
]);
|
|
|
|
$preview = OfflineOrderPreview::findOrFail($request->input('order_preview_id'));
|
|
|
|
return $offlineOrderService->check($request->user(), $preview->payload['items']);
|
|
}
|
|
|
|
/**
|
|
* 创建订单
|
|
*/
|
|
public function store(Request $request, OfflineOrderService $offlineOrderService)
|
|
{
|
|
$request->validate([
|
|
'order_preview_id' => ['bail', 'required', 'int'],
|
|
'points' => ['bail', 'nullable', 'numeric', 'min:0'],
|
|
]);
|
|
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$preview = OfflineOrderPreview::findOrFail($request->input('order_preview_id'));
|
|
|
|
$order = $offlineOrderService->create(
|
|
$request->user(),
|
|
$preview,
|
|
bcmul($request->input('points', 0), 100),
|
|
);
|
|
|
|
DB::commit();
|
|
} catch (Throwable $th) {
|
|
report($th);
|
|
|
|
throw $th;
|
|
}
|
|
|
|
return $order;
|
|
}
|
|
|
|
/**
|
|
* 订单付款
|
|
*/
|
|
public function pay($id, Request $request)
|
|
{
|
|
$user = $request->user();
|
|
|
|
return DB::transaction(function () use ($id, $user) {
|
|
$order = OfflineOrder::where('user_id', $user->id)
|
|
->where('id', $id)
|
|
->firstOrFail();
|
|
|
|
return (new OfflineOrderService())->pay($order, PayWay::WxpayMiniProgram);
|
|
});
|
|
}
|
|
}
|