改进 用户生日时自动设置用户组

This commit is contained in:
iVampireSP.com 2022-12-30 19:36:57 +08:00
parent fae674b8f2
commit c2bbe7ab0f
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
9 changed files with 161 additions and 67 deletions

View File

@ -97,3 +97,5 @@ MQTT_AUTO_RECONNECT_ENABLED=false
EMQX_API_URL=http://localhost:18083/api/v5
EMQX_API_KEY=
EMQX_API_SECRET_KEY=
USER_GROUP_BIRTHDAY=1

View File

@ -10,7 +10,9 @@
use App\Jobs\HostCostJob;
use App\Jobs\Module\FetchModuleJob;
use App\Jobs\Module\PushWorkOrderJob;
use App\Jobs\RollbackUserTempGroupJob;
use App\Jobs\SendModuleEarningsJob;
use App\Jobs\SetBirthdayGroupJob;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@ -23,7 +25,7 @@ class Kernel extends ConsoleKernel
*
* @return void
*/
protected function schedule(Schedule $schedule)
protected function schedule(Schedule $schedule): void
{
// 清理过期的 Token
$schedule->command('sanctum:prune-expired --hours=24')->daily();
@ -54,6 +56,11 @@ protected function schedule(Schedule $schedule)
// 发送模块收益
$schedule->job(new SendModuleEarningsJob())->dailyAt('20:00');
// 回滚临时用户组
$schedule->job(new RollbackUserTempGroupJob())->everyMinute()->onOneServer();
// 设置生日用户组
$schedule->job(new SetBirthdayGroupJob())->dailyAt('00:00');
}
/**

View File

@ -19,9 +19,7 @@ public function index(): JsonResponse
public function birthdays(): JsonResponse
{
// 获取今天过生日的用户,每页显示 20 个,使用 carbon
$users = User::select(['id', 'name', 'birthday_at', 'email', 'created_at'])->whereMonth('birthday_at', now()->month)
->whereDay('birthday_at', now()->day)
->simplePaginate(20);
$users = User::birthday()->simplePaginate(20);
return $this->success($users);
}

View File

@ -0,0 +1,49 @@
<?php
namespace App\Jobs;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Cache;
class RollbackUserTempGroupJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle(): void
{
//
$temp_groups = Cache::get('users_temp_groups', []);
foreach ($temp_groups as $user_id => $temp_group) {
if (now()->gt($temp_group['expired_at'])) {
$user = User::find($user_id);
$user->user_group_id = $temp_group['user_group_id'];
$user->save();
unset($temp_groups[$user_id]);
}
}
Cache::forever('users_temp_groups', $temp_groups);
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace App\Jobs;
use App\Models\User;
use App\Models\UserGroup;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SetBirthdayGroupJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle(): void
{
$birthday_group = UserGroup::find(config('settings.user_groups.birthday_group_id'));
if (!$birthday_group) {
return;
}
User::birthday()->chunk(100, function ($users) use ($birthday_group) {
foreach ($users as $user) {
$birthday_group->setTempGroup($user, $birthday_group, now()->addDay());
}
});
}
}

View File

@ -3,8 +3,6 @@
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Exceptions\CommonException;
use App\Exceptions\User\BalanceNotEnoughException;
use Database\Factories\UserFactory;
use Eloquent;
use GeneaLabs\LaravelModelCaching\CachedBuilder;
@ -158,61 +156,9 @@ public function user_group(): BelongsTo
return $this->belongsTo(UserGroup::class);
}
/**
* @throws CommonException
* @throws BalanceNotEnoughException
*/
// public function toDrops($amount = 1)
// {
//
// $cache_key = 'user_drops_' . $this->id;
//
// if ($amount === 0 || $amount === null) {
// return $this;
// }
//
// $rate = config('drops.rate');
//
//
// $transactions = new Transaction();
//
// $drops = $transactions->getDrops($this->id);
//
// $total = 0;
//
// if ($drops < 0) {
// $amount += abs($drops) / $rate;
// }
//
// $total += $amount * $rate;
//
//
// // amount 保留两位小数
// $amount = round($amount, 2);
//
// $lock = Cache::lock("lock_" . $cache_key, 5);
// try {
// $lock->block(5);
//
// $this->balance -= $amount;
// $this->save();
//
// $transactions->increaseDrops($this->id, $total);
//
// // $transactions
//
// $transactions->addPayoutBalance($this->id, $amount, '自动转换为 Drops');
//
// // if user balance <= 0
// if ($this->balance < $amount) {
// throw new BalanceNotEnoughException('余额不足');
// }
// } catch (LockTimeoutException) {
// throw new CommonException('暂时无法处理此请求,请稍后再试。');
// } finally {
// optional($lock)->release();
// }
//
// return $this;
// }
public function scopeBirthday()
{
return $this->select(['id', 'name', 'birthday_at', 'email', 'created_at'])->whereMonth('birthday_at', now()->month)
->whereDay('birthday_at', now()->day);
}
}

View File

@ -2,14 +2,14 @@
namespace App\Models;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Facades\Cache;
class UserGroup extends Model
{
use HasFactory;
public $fillable = [
'name',
'color',
@ -27,4 +27,38 @@ public function users(): HasMany
return $this->hasMany(User::class);
}
/**
* 设置临时用户组
*
* @param User $user
* @param UserGroup $group
* @param Carbon $expired_at
*
* @return User
*/
public function setTempGroup(User $user, self $group, Carbon $expired_at): User
{
$temp_groups = Cache::get('users_temp_groups', []);
// 检测是否存在,存在则更新(更新过期时间,但是不更新 user_group_id
if (isset($temp_groups[$user->id])) {
$temp_groups[$user->id]['expired_at'] = $expired_at;
} else {
$temp_groups[$user->id] = [
'user_group_id' => $user->user_group_id,
'expired_at' => $expired_at,
];
}
// 保存到缓存
Cache::forever('users_temp_groups', $temp_groups);
// 设置新的用户组
$user->user_group_id = $group->id;
$user->save();
return $user;
}
}

View File

@ -4,6 +4,7 @@
use App\Models\PersonalAccessToken;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;
@ -25,7 +26,7 @@ public function register()
*
* @return void
*/
public function boot()
public function boot(): void
{
//
@ -43,5 +44,11 @@ public function boot()
'version' => 2,
])->baseUrl($url);
});
// Carbon setTestNow
// Carbon::setTestNow(now()->addDays(1));
}
}

View File

@ -7,5 +7,8 @@
'billing' => env('WECOM_ROBOT_HOOK_BILLING', ''),
'cluster_ready' => env('WECOM_ROBOT_HOOK_CLUSTER_READY', ''),
],
]
],
'user_groups' => [
'birthday_group_id' => env('USER_GROUP_BIRTHDAY', 1),
],
];