where('sSlug', 'shadowrocketids')->lockForUpdate()->sole(); $rows = DB::table('articles')->where('iCategoryId', $category->id)->lockForUpdate()->get(['id', 'sTitle', 'sTitleSub']); $changes = $rows->filter(fn ($r) => ShadowrocketNaming::align($r->sTitle) !== $r->sTitle || ShadowrocketNaming::align($r->sTitleSub ?? '') !== ($r->sTitleSub ?? '')); if (! $this->option('apply')) return $changes->count(); if ($changes->isEmpty() && $category->sName === '免费小火箭ID') return 0; $directory = storage_path('app/private/category-backups'); if (! is_dir($directory)) mkdir($directory, 0700, true); $backup = $directory.'/shadowrocket-naming-'.Str::uuid().'.json'; if (file_put_contents($backup, json_encode(['category' => $category, 'articles' => $rows], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)) === false) throw new \RuntimeException('Backup failed'); chmod($backup, 0600); DB::table('categories')->where('id', $category->id)->update(['sName' => '免费小火箭ID', 'sDescription' => ShadowrocketNaming::align($category->sDescription ?? '')]); foreach ($changes as $row) DB::table('articles')->where('id', $row->id)->update(['sTitle' => ShadowrocketNaming::align($row->sTitle), 'sTitleSub' => ShadowrocketNaming::align($row->sTitleSub ?? '')]); return $changes->count(); }); if ($this->option('apply')) Cache::forget('global_nav_tree'); $this->info(json_encode(['apply' => (bool) $this->option('apply'), 'articles' => $count], JSON_UNESCAPED_UNICODE)); return self::SUCCESS; } }