106 lines
2.9 KiB
PHP
106 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Endpoint\Api\Http\Controllers;
|
|
|
|
use App\Endpoint\Api\Http\Controllers\Controller;
|
|
use App\Endpoint\Api\Http\Resources\OfflineOrderResource;
|
|
use App\Enums\PayWay;
|
|
use App\Exceptions\BizException;
|
|
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 index(Request $request)
|
|
{
|
|
$user = $request->user();
|
|
|
|
$query = OfflineOrder::query()->with(['store'])->filter($request->all())->orderBy('created_at', 'desc');
|
|
// 员工身份, 查询我创建的订单
|
|
if ($request->input('use_staff')) {
|
|
$query->where('staff_id', $user->id);
|
|
}
|
|
// 用户身份, 查询我支付的订单
|
|
if ($request->input('use_user')) {
|
|
$query->where('user_id', $user->id);
|
|
}
|
|
$list = $query->paginate($request->input('per_page'));
|
|
return OfflineOrderResource::collection($list);
|
|
}
|
|
|
|
public function show(string $id)
|
|
{
|
|
$info = OfflineOrder::find($id);
|
|
if (!$info) {
|
|
throw new BizException("记录不存在");
|
|
}
|
|
return OfflineOrderResource::make($info);
|
|
}
|
|
|
|
/**
|
|
* 确认订单
|
|
*/
|
|
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);
|
|
}
|
|
|
|
/**
|
|
* 创建订单
|
|
*/
|
|
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),
|
|
['user_remark' => $request->input('user_remark'), 'coupon_id' => $preview->coupon_id]
|
|
);
|
|
|
|
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);
|
|
});
|
|
}
|
|
}
|