fn_b/app/Console/Commands/SyncArticleLikes.php
2026-02-12 12:36:53 +08:00

79 lines
3.0 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Articles;
use Illuminate\Support\Facades\Cache;
class SyncArticleLikes extends Command
{
// 在 Kernel.php 中建议设置 ->everyFiveMinutes()
protected $signature = 'article:sync-likes';
protected $description = '高标准点赞7天自动碎化 + 全年天级随机';
public function handle()
{
$iBurstCount = 0; // 记录本次执行爆发了多少文章
$iYearlyCount = 0; // 记录本次执行有多少文章中了全年奖
// 1. 【7天爆发】碎化注入逻辑
Articles::where('i7like', '>', 0)
->where('iStatus', 1)
->chunkById(100, function ($aArticles) use (&$iBurstCount) {
foreach ($aArticles as $oArticle) {
$iDaysPassed = $oArticle->created_at->diffInDays(now());
if ($iDaysPassed > 6) continue;
$iRemainingSlots = (7 - $iDaysPassed) * 24 * 12;
if ($iRemainingSlots <= 0) continue;
$iBaseAdd = (int)ceil($oArticle->i7like / $iRemainingSlots);
if (mt_rand(1, 100) <= 50) {
$iAdd = mt_rand(1, max(1, $iBaseAdd * 2));
$this->transferLikes($oArticle, 'i7like', $iAdd);
$this->info("ID [{$oArticle->id}] 爆发:注入 {$iAdd} 个赞,剩余库存 {$oArticle->i7like}");
$iBurstCount++;
}
}
});
// 2. 【全年增长】天级随机逻辑
$sLockKey = 'sync_yearly_likes_lock:' . now()->format('Ymd');
if (!Cache::has($sLockKey)) {
$this->warn("检测到今日尚未进行全年随机摇号,开始抽奖...");
Articles::where('i365like', '>', 0)
->where('iStatus', 1)
->chunkById(100, function ($aArticles) use (&$iYearlyCount) {
foreach ($aArticles as $oArticle) {
if (mt_rand(1, 365) <= $oArticle->i365like) {
$oArticle->increment('iLikeCount');
$this->line("ID [{$oArticle->id}] 全年:运气爆发,喜提 1 个赞");
$iYearlyCount++;
}
}
});
Cache::put($sLockKey, 1, now()->addDay());
}
$this->comment("本次任务结束:{$iBurstCount} 篇爆发增长,{$iYearlyCount} 篇全年喜提。");
}
/**
* 核心转移逻辑
*/
private function transferLikes(Articles $oArticle, string $sField, int $iAmount): void
{
$iRealAdd = min($oArticle->$sField, $iAmount);
if ($iRealAdd > 0) {
$oArticle->increment('iLikeCount', $iRealAdd);
// 这里注意increment/decrement 会同步更新 model 对象的内存值
$oArticle->decrement($sField, $iRealAdd);
}
}
}