| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <?php
- namespace App\Module\Pet\AdminControllers\Tools;
- use App\Module\Game\DCache\PetConfigJsonConfig;
- use App\Module\Game\DCache\PetLevelJsonConfig;
- use App\Module\Game\DCache\PetSkillJsonConfig;
- use App\Module\Pet\Models\PetConfig;
- use App\Module\Pet\Models\PetLevelConfig;
- use App\Module\Pet\Models\PetSkill;
- use Carbon\CarbonInterface;
- use Dcat\Admin\Grid\Tools\AbstractTool;
- use Illuminate\Support\Facades\Log;
- /**
- * 宠物配置表状态检查工具
- *
- * 用于检查宠物配置表的同步状态
- */
- class RefreshCheckTool extends AbstractTool
- {
- protected $shouldDisplay;
- protected $style = 'btn btn-default waves-effect';
- public function __construct(bool $shouldDisplay = true)
- {
- $this->shouldDisplay = $shouldDisplay;
- }
- public function title()
- {
- return '检查状态';
- }
- public function render()
- {
- if (!$this->shouldDisplay) {
- return '';
- }
- return parent::render();
- }
- /**
- * 检查配置表同步状态
- *
- * @param string $type 配置表类型,可选值:config, level, skill, all
- * @return array
- */
- public static function checkSyncStatus(string $type = 'all'): array
- {
- if ($type === 'config') {
- return self::checkPetConfigStatus();
- } elseif ($type === 'level') {
- return self::checkPetLevelStatus();
- } elseif ($type === 'skill') {
- return self::checkPetSkillStatus();
- } else {
- // 检查所有配置表
- $configStatus = self::checkPetConfigStatus();
- $levelStatus = self::checkPetLevelStatus();
- $skillStatus = self::checkPetSkillStatus();
- // 如果都已同步,返回成功状态
- if ($configStatus['is_synced'] && $levelStatus['is_synced'] && $skillStatus['is_synced']) {
- return [
- 'is_synced' => true,
- 'message' => '【宠物配置】所有配置表已同步',
- 'should_display' => false
- ];
- }
- // 否则返回需要同步的状态
- $message = '【宠物配置】';
- if (!$configStatus['is_synced']) {
- $message .= '宠物基础配置表需要更新; ';
- }
- if (!$levelStatus['is_synced']) {
- $message .= '宠物等级配置表需要更新; ';
- }
- if (!$skillStatus['is_synced']) {
- $message .= '宠物技能配置表需要更新; ';
- }
- return [
- 'is_synced' => false,
- 'message' => $message,
- 'should_display' => true
- ];
- }
- }
- /**
- * 检查宠物基础配置表状态
- *
- * @return array
- */
- private static function checkPetConfigStatus(): array
- {
- try {
- $json = PetConfigJsonConfig::getData();
-
- // 如果没有生成时间戳,说明需要生成
- if (!isset($json['generated_ts'])) {
- return [
- 'is_synced' => false,
- 'message' => '【宠物基础配置表】需要生成,尚未找到配置数据',
- 'should_display' => true
- ];
- }
-
- $generatedAt = \Carbon\Carbon::createFromTimestamp($json['generated_ts']);
- $lastUpdated = \Carbon\Carbon::parse(PetConfig::max('updated_at') ?: '2000-01-01');
- // 使用绝对时间差,避免相对时间导致的"X小时后"这样的显示问题
- $options = ['syntax' => CarbonInterface::DIFF_ABSOLUTE];
-
- if ($generatedAt->lt($lastUpdated)) {
- return [
- 'is_synced' => false,
- 'message' => "【宠物基础配置表】需要更新,生成于 {$generatedAt->diffForHumans(null, $options)},数据库最后更新于 {$lastUpdated->diffForHumans(null, $options)}",
- 'should_display' => true
- ];
- } else {
- return [
- 'is_synced' => true,
- 'message' => "【宠物基础配置表】已同步,生成于 {$generatedAt->diffForHumans(null, $options)}",
- 'should_display' => false
- ];
- }
- } catch (\Exception $e) {
- Log::error('Check pet config sync status failed: '.$e->getMessage());
- return [
- 'is_synced' => false,
- 'message' => '【宠物基础配置表】检查状态失败:'.$e->getMessage(),
- 'should_display' => true
- ];
- }
- }
- /**
- * 检查宠物等级配置表状态
- *
- * @return array
- */
- private static function checkPetLevelStatus(): array
- {
- try {
- $json = PetLevelJsonConfig::getData();
-
- // 如果没有生成时间戳,说明需要生成
- if (!isset($json['generated_ts'])) {
- return [
- 'is_synced' => false,
- 'message' => '【宠物等级配置表】需要生成,尚未找到配置数据',
- 'should_display' => true
- ];
- }
-
- $generatedAt = \Carbon\Carbon::createFromTimestamp($json['generated_ts']);
- $lastUpdated = \Carbon\Carbon::parse(PetLevelConfig::max('updated_at') ?: '2000-01-01');
- // 使用绝对时间差,避免相对时间导致的"X小时后"这样的显示问题
- $options = ['syntax' => CarbonInterface::DIFF_ABSOLUTE];
-
- if ($generatedAt->lt($lastUpdated)) {
- return [
- 'is_synced' => false,
- 'message' => "【宠物等级配置表】需要更新,生成于 {$generatedAt->diffForHumans(null, $options)},数据库最后更新于 {$lastUpdated->diffForHumans(null, $options)}",
- 'should_display' => true
- ];
- } else {
- return [
- 'is_synced' => true,
- 'message' => "【宠物等级配置表】已同步,生成于 {$generatedAt->diffForHumans(null, $options)}",
- 'should_display' => false
- ];
- }
- } catch (\Exception $e) {
- Log::error('Check pet level config sync status failed: '.$e->getMessage());
- return [
- 'is_synced' => false,
- 'message' => '【宠物等级配置表】检查状态失败:'.$e->getMessage(),
- 'should_display' => true
- ];
- }
- }
- /**
- * 检查宠物技能配置表状态
- *
- * @return array
- */
- private static function checkPetSkillStatus(): array
- {
- try {
- $json = PetSkillJsonConfig::getData();
-
- // 如果没有生成时间戳,说明需要生成
- if (!isset($json['generated_ts'])) {
- return [
- 'is_synced' => false,
- 'message' => '【宠物技能配置表】需要生成,尚未找到配置数据',
- 'should_display' => true
- ];
- }
-
- $generatedAt = \Carbon\Carbon::createFromTimestamp($json['generated_ts']);
- $lastUpdated = \Carbon\Carbon::parse(PetSkill::max('updated_at') ?: '2000-01-01');
- // 使用绝对时间差,避免相对时间导致的"X小时后"这样的显示问题
- $options = ['syntax' => CarbonInterface::DIFF_ABSOLUTE];
-
- if ($generatedAt->lt($lastUpdated)) {
- return [
- 'is_synced' => false,
- 'message' => "【宠物技能配置表】需要更新,生成于 {$generatedAt->diffForHumans(null, $options)},数据库最后更新于 {$lastUpdated->diffForHumans(null, $options)}",
- 'should_display' => true
- ];
- } else {
- return [
- 'is_synced' => true,
- 'message' => "【宠物技能配置表】已同步,生成于 {$generatedAt->diffForHumans(null, $options)}",
- 'should_display' => false
- ];
- }
- } catch (\Exception $e) {
- Log::error('Check pet skill config sync status failed: '.$e->getMessage());
- return [
- 'is_synced' => false,
- 'message' => '【宠物技能配置表】检查状态失败:'.$e->getMessage(),
- 'should_display' => true
- ];
- }
- }
- public static function shouldDisplay(): bool
- {
- return self::checkSyncStatus()['should_display'];
- }
- }
|