update: rewrite buy limit

This commit is contained in:
tokumeikoi 2022-07-08 02:36:33 +08:00
parent 2823f1bd47
commit 838fc7bdba
11 changed files with 90 additions and 27 deletions

View 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
]);
}
}

View File

@ -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();

View File

@ -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'));

View File

@ -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
]); ]);
} }
} }

View File

@ -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' => '容纳用户量限制格式有误'
]; ];
} }
} }

View File

@ -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;
} }

View File

@ -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');
} }
} }

View File

@ -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

View File

@ -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`;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long