mirror of
https://github.com/v2board/v2board.git
synced 2024-11-10 09:39:10 +08:00
update: rewrite buy limit
This commit is contained in:
parent
2823f1bd47
commit
838fc7bdba
51
app/Console/Commands/CheckUser.php
Normal file
51
app/Console/Commands/CheckUser.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class CheckUser extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'check:user';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = '用户检查任务';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$this->resetExpiredUserPlan();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function resetExpiredUserPlan($day = 14)
|
||||||
|
{
|
||||||
|
User::where('expired_at', '<', $day * 86400)->update([
|
||||||
|
'plan_id' => NULL,
|
||||||
|
'group_id' => NULL
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -33,6 +33,7 @@ class Kernel extends ConsoleKernel
|
|||||||
$schedule->command('check:order')->everyMinute();
|
$schedule->command('check:order')->everyMinute();
|
||||||
$schedule->command('check:commission')->everyMinute();
|
$schedule->command('check:commission')->everyMinute();
|
||||||
$schedule->command('check:ticket')->everyMinute();
|
$schedule->command('check:ticket')->everyMinute();
|
||||||
|
$schedule->command('check:user')->daily();
|
||||||
// reset
|
// reset
|
||||||
$schedule->command('reset:traffic')->daily();
|
$schedule->command('reset:traffic')->daily();
|
||||||
$schedule->command('reset:log')->daily();
|
$schedule->command('reset:log')->daily();
|
||||||
|
@ -85,7 +85,7 @@ class OrderController extends Controller
|
|||||||
abort(500, __('Subscription plan does not exist'));
|
abort(500, __('Subscription plan does not exist'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($plan->inventory_limit !== NULL && !$plan->inventory_limit) {
|
if (!$planService->haveCapacity()) {
|
||||||
abort(500, __('Current product is sold out'));
|
abort(500, __('Current product is sold out'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,10 +160,6 @@ class OrderController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$planService->decrementInventory()) {
|
|
||||||
abort(500, __('Failed to create order'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$order->save()) {
|
if (!$order->save()) {
|
||||||
DB::rollback();
|
DB::rollback();
|
||||||
abort(500, __('Failed to create order'));
|
abort(500, __('Failed to create order'));
|
||||||
|
@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
|
|||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Models\Plan;
|
use App\Models\Plan;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class PlanController extends Controller
|
class PlanController extends Controller
|
||||||
{
|
{
|
||||||
@ -23,12 +24,32 @@ class PlanController extends Controller
|
|||||||
return response([
|
return response([
|
||||||
'data' => $plan
|
'data' => $plan
|
||||||
]);
|
]);
|
||||||
|
} else {
|
||||||
|
$counts = User::select(
|
||||||
|
DB::raw("plan_id"),
|
||||||
|
DB::raw("count(*) as count")
|
||||||
|
)
|
||||||
|
->where('plan_id', '!=', NULL)
|
||||||
|
->where(function ($query) {
|
||||||
|
$query->where('expired_at', '>=', time())
|
||||||
|
->orWhere('expired_at', NULL);
|
||||||
|
})
|
||||||
|
->groupBy("plan_id")
|
||||||
|
->get()
|
||||||
|
->keyBy('plan_id');
|
||||||
}
|
}
|
||||||
$plan = Plan::where('show', 1)
|
$plans = Plan::where('show', 1)
|
||||||
->orderBy('sort', 'ASC')
|
->orderBy('sort', 'ASC')
|
||||||
->get();
|
->get();
|
||||||
|
if (isset($counts)) {
|
||||||
|
foreach ($plans as $k => $v) {
|
||||||
|
if (isset($counts[$plans[$k]->id])) {
|
||||||
|
$plans[$k]->capacity_limit = $plans[$k]->capacity_limit - $counts[$plans[$k]->id]->count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return response([
|
return response([
|
||||||
'data' => $plan
|
'data' => $plans
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ class PlanSave extends FormRequest
|
|||||||
'onetime_price' => 'nullable|integer',
|
'onetime_price' => 'nullable|integer',
|
||||||
'reset_price' => 'nullable|integer',
|
'reset_price' => 'nullable|integer',
|
||||||
'reset_traffic_method' => 'nullable|integer|in:0,1,2,3,4',
|
'reset_traffic_method' => 'nullable|integer|in:0,1,2,3,4',
|
||||||
'inventory_limit' => 'nullable|integer'
|
'capacity_limit' => 'nullable|integer'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ class PlanSave extends FormRequest
|
|||||||
'reset_price.integer' => '流量重置包金额有误',
|
'reset_price.integer' => '流量重置包金额有误',
|
||||||
'reset_traffic_method.integer' => '流量重置方式格式有误',
|
'reset_traffic_method.integer' => '流量重置方式格式有误',
|
||||||
'reset_traffic_method.in' => '流量重置方式格式有误',
|
'reset_traffic_method.in' => '流量重置方式格式有误',
|
||||||
'inventory_limit.integer' => '库存限制格式有误'
|
'capacity_limit.integer' => '容纳用户量限制格式有误'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -249,11 +249,6 @@ class OrderService
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$planService = new PlanService($order->plan_id);
|
|
||||||
if (!$planService->incrementInventory()) {
|
|
||||||
DB::rollBack();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Services;
|
namespace App\Services;
|
||||||
|
|
||||||
use App\Models\Plan;
|
use App\Models\Plan;
|
||||||
|
use App\Models\User;
|
||||||
|
|
||||||
class PlanService
|
class PlanService
|
||||||
{
|
{
|
||||||
@ -13,15 +14,10 @@ class PlanService
|
|||||||
$this->plan = Plan::lockForUpdate()->find($planId);
|
$this->plan = Plan::lockForUpdate()->find($planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function incrementInventory(): bool
|
public function haveCapacity(): bool
|
||||||
{
|
{
|
||||||
if ($this->plan->inventory_limit === NULL) return true;
|
if ($this->plan->capacity_limit === 0) return true;
|
||||||
return $this->plan->increment('inventory_limit');
|
$count = User::where('plan_id', $this->plan->plan_id)->count();
|
||||||
}
|
return $this->plan->capacity_limit - $count;
|
||||||
|
|
||||||
public function decrementInventory(): bool
|
|
||||||
{
|
|
||||||
if ($this->plan->inventory_limit === NULL) return true;
|
|
||||||
return $this->plan->decrement('inventory_limit');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ CREATE TABLE `v2_plan` (
|
|||||||
`onetime_price` int(11) DEFAULT NULL,
|
`onetime_price` int(11) DEFAULT NULL,
|
||||||
`reset_price` int(11) DEFAULT NULL,
|
`reset_price` int(11) DEFAULT NULL,
|
||||||
`reset_traffic_method` tinyint(1) DEFAULT NULL,
|
`reset_traffic_method` tinyint(1) DEFAULT NULL,
|
||||||
`inventory_limit` int(11) DEFAULT NULL,
|
`capacity_limit` int(11) DEFAULT NULL,
|
||||||
`created_at` int(11) NOT NULL,
|
`created_at` int(11) NOT NULL,
|
||||||
`updated_at` int(11) NOT NULL,
|
`updated_at` int(11) NOT NULL,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
@ -379,4 +379,4 @@ CREATE TABLE `v2_user` (
|
|||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
|
||||||
-- 2022-06-28 18:09:08
|
-- 2022-07-07 18:23:17
|
||||||
|
@ -589,3 +589,6 @@ ALTER TABLE `v2_mail_log`
|
|||||||
|
|
||||||
ALTER TABLE `v2_plan`
|
ALTER TABLE `v2_plan`
|
||||||
ADD `inventory_limit` int(11) NULL AFTER `reset_traffic_method`;
|
ADD `inventory_limit` int(11) NULL AFTER `reset_traffic_method`;
|
||||||
|
|
||||||
|
ALTER TABLE `v2_plan`
|
||||||
|
CHANGE `inventory_limit` `capacity_limit` int(11) NULL AFTER `reset_traffic_method`;
|
||||||
|
2
public/assets/admin/umi.js
vendored
2
public/assets/admin/umi.js
vendored
File diff suppressed because one or more lines are too long
2
public/theme/v2board/assets/umi.js
vendored
2
public/theme/v2board/assets/umi.js
vendored
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user