mirror of
https://github.com/lkddi/Xboard.git
synced 2026-04-24 03:57:27 +08:00
feat: add tags to plans, refactor order service, adn fix ticket lock
This commit is contained in:
@@ -43,7 +43,7 @@ class OrderController extends Controller
|
||||
$request->validate([
|
||||
'trade_no' => 'required|string',
|
||||
]);
|
||||
$order = Order::with(['payment','plan'])
|
||||
$order = Order::with(['payment', 'plan'])
|
||||
->where('user_id', $request->user()->id)
|
||||
->where('trade_no', $request->input('trade_no'))
|
||||
->first();
|
||||
@@ -77,45 +77,16 @@ class OrderController extends Controller
|
||||
$plan = Plan::findOrFail($request->input('plan_id'));
|
||||
$planService = new PlanService($plan);
|
||||
|
||||
// Validate plan purchase
|
||||
$planService->validatePurchase($user, $request->input('period'));
|
||||
|
||||
return DB::transaction(function () use ($request, $plan, $user, $userService) {
|
||||
$period = $request->input('period');
|
||||
$newPeriod = PlanService::getPeriodKey($period);
|
||||
$order = OrderService::createFromRequest(
|
||||
$user,
|
||||
$plan,
|
||||
$request->input('period'),
|
||||
$request->input('coupon_code')
|
||||
);
|
||||
|
||||
// Create order
|
||||
$order = new Order([
|
||||
'user_id' => $user->id,
|
||||
'plan_id' => $plan->id,
|
||||
'period' => $newPeriod,
|
||||
'trade_no' => Helper::generateOrderNo(),
|
||||
'total_amount' => optional($plan->prices)[$newPeriod] * 100
|
||||
]);
|
||||
|
||||
// Apply coupon if provided
|
||||
if ($request->input('coupon_code')) {
|
||||
$this->applyCoupon($order, $request->input('coupon_code'));
|
||||
}
|
||||
|
||||
// Set order attributes
|
||||
$orderService = new OrderService($order);
|
||||
$orderService->setVipDiscount($user);
|
||||
$orderService->setOrderType($user);
|
||||
$orderService->setInvite($user);
|
||||
|
||||
// Handle user balance
|
||||
if ($user->balance && $order->total_amount > 0) {
|
||||
$this->handleUserBalance($order, $user, $userService);
|
||||
}
|
||||
|
||||
if (!$order->save()) {
|
||||
throw new ApiException(__('Failed to create order'));
|
||||
}
|
||||
HookManager::call('order.after_create', $order);
|
||||
|
||||
return $this->success($order->trade_no);
|
||||
});
|
||||
return $this->success($order->trade_no);
|
||||
}
|
||||
|
||||
protected function applyCoupon(Order $order, string $couponCode): void
|
||||
|
||||
@@ -43,8 +43,9 @@ class TicketController extends Controller
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
if ((int)Ticket::where('status', 0)->where('user_id', $request->user()->id)->lockForUpdate()->count()) {
|
||||
throw new \Exception(__('There are other unresolved tickets'));
|
||||
if (Ticket::where('status', 0)->where('user_id', $request->user()->id)->lockForUpdate()->first()) {
|
||||
DB::rollBack();
|
||||
return $this->fail([400, '存在未关闭的工单']);
|
||||
}
|
||||
$ticket = Ticket::create(array_merge($request->only([
|
||||
'subject',
|
||||
|
||||
@@ -17,7 +17,8 @@ class KnowledgeSave extends FormRequest
|
||||
'category' => 'required',
|
||||
'language' => 'required',
|
||||
'title' => 'required',
|
||||
'body' => 'required'
|
||||
'body' => 'required',
|
||||
'show' => 'nullable|boolean'
|
||||
];
|
||||
}
|
||||
|
||||
@@ -27,7 +28,8 @@ class KnowledgeSave extends FormRequest
|
||||
'title.required' => '标题不能为空',
|
||||
'category.required' => '分类不能为空',
|
||||
'body.required' => '内容不能为空',
|
||||
'language.required' => '语言不能为空'
|
||||
'language.required' => '语言不能为空',
|
||||
'show.boolean' => '显示状态必须为布尔值'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ class PlanSave extends FormRequest
|
||||
'speed_limit' => 'integer|nullable|min:0',
|
||||
'device_limit' => 'integer|nullable|min:0',
|
||||
'capacity_limit' => 'integer|nullable|min:0',
|
||||
'tags' => 'array|nullable',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -136,6 +137,7 @@ class PlanSave extends FormRequest
|
||||
'device_limit.min' => '设备限制不能为负数',
|
||||
'capacity_limit.integer' => '容量限制必须是整数',
|
||||
'capacity_limit.min' => '容量限制不能为负数',
|
||||
'tags.array' => '标签格式必须是数组',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ class PlanResource extends JsonResource
|
||||
'id' => $this->resource['id'],
|
||||
'group_id' => $this->resource['group_id'],
|
||||
'name' => $this->resource['name'],
|
||||
'tags' => $this->resource['tags'],
|
||||
'content' => $this->formatContent(),
|
||||
...$this->getPeriodPrices(),
|
||||
'capacity_limit' => $this->getFormattedCapacityLimit(),
|
||||
|
||||
Reference in New Issue
Block a user