GenerateFarmSeedConfigJson.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace App\Module\Farm\Commands;
  3. use App\Module\Farm\Models\FarmSeed;
  4. use App\Module\Farm\Models\FarmFruitGrowthCycle;
  5. use Illuminate\Console\Command;
  6. /**
  7. * 生成种子配置表JSON数据命令
  8. *
  9. * 该命令用于从数据库中的种子表和种子产出表生成JSON数据文件,供客户端使用。
  10. * 生成的JSON文件包含种子的基本信息,如种子ID、名称、类型、生长时间、产量范围、灾害抵抗等,
  11. * 以及种子的产出配置信息。该命令通常在种子配置数据更新后运行,以确保客户端获取最新的配置数据。
  12. */
  13. class GenerateFarmSeedConfigJson extends Command
  14. {
  15. /**
  16. * 命令名称
  17. *
  18. * @var string
  19. */
  20. protected $signature = 'farm:generate-seed-json';
  21. /**
  22. * 命令描述
  23. *
  24. * @var string
  25. */
  26. protected $description = '生成种子配置JSON文件';
  27. /**
  28. * 生成种子配置JSON数据
  29. *
  30. * @return array|bool 生成的数据或失败标志
  31. */
  32. public static function generateJson()
  33. {
  34. try {
  35. // 获取所有种子配置,预加载产出关联
  36. $seeds = FarmSeed::with('outputs')->orderBy('id')->get();
  37. // 准备JSON数据
  38. $jsonData = [
  39. 'generated_ts' => time(),
  40. 'seeds' => [],
  41. 'fruit_growth_cycles' => []
  42. ];
  43. // 获取所有果实生长周期配置
  44. $fruitGrowthCycles = FarmFruitGrowthCycle::all()->keyBy('fruit_item_id');
  45. // 处理果实生长周期数据
  46. foreach ($fruitGrowthCycles as $fruitItemId => $cycle) {
  47. $jsonData['fruit_growth_cycles'][$fruitItemId] = [
  48. 'sprout_time' => $cycle->sprout_time,
  49. 'growth_time' => $cycle->growth_time,
  50. 'mature_time' => $cycle->mature_time,
  51. 'wither_time' => $cycle->wither_time,
  52. ];
  53. }
  54. // 处理种子基本数据和产出数据
  55. foreach ($seeds as $seed) {
  56. // 获取种子的所有产出物品ID
  57. $seedOutputs = [];
  58. foreach ($seed->outputs as $output) {
  59. $seedOutputs[] = $output->item_id;
  60. }
  61. $jsonData['seeds'][] = [
  62. 'id' => $seed->id,
  63. 'name' => $seed->name,
  64. 'type' => $seed->type,
  65. 'seed_time' => $seed->seed_time,
  66. 'min_output' => $seed->min_output,
  67. 'max_output' => $seed->max_output,
  68. 'item_id' => $seed->item_id,
  69. 'disaster_resistance' => $seed->disaster_resistance,
  70. 'display_attributes' => $seed->display_attributes,
  71. 'seed_outputs' => $seedOutputs, // 直接在种子属性中包含产出物品ID数组
  72. ];
  73. }
  74. return $jsonData;
  75. } catch (\Exception $e) {
  76. if (php_sapi_name() === 'cli') {
  77. echo "Error: Generate farm_seed.json failed: {$e->getMessage()}\n";
  78. }
  79. return false;
  80. }
  81. }
  82. /**
  83. * 执行命令
  84. *
  85. * @return int
  86. */
  87. public function handle()
  88. {
  89. $this->info('开始生成种子配置JSON文件...');
  90. try {
  91. // 通过缓存类生成JSON
  92. $result = \App\Module\Game\DCache\FarmSeedJsonConfig::getData([], true);
  93. if ($result !== false && is_array($result)) {
  94. $this->info('种子配置JSON文件生成成功');
  95. $this->info('共生成 ' . count($result['seeds'] ?? []) . ' 条种子数据');
  96. // 统计总的产出物品数量
  97. $totalOutputs = 0;
  98. foreach ($result['seeds'] as $seed) {
  99. $totalOutputs += count($seed['seed_outputs'] ?? []);
  100. }
  101. $this->info('共包含 ' . $totalOutputs . ' 个种子产出物品');
  102. $this->info('共包含 ' . count($result['fruit_growth_cycles'] ?? []) . ' 个果实生长周期配置');
  103. // 显示一些示例数据
  104. if (!empty($result['seeds'])) {
  105. $this->info('种子示例数据:');
  106. $firstSeed = $result['seeds'][0];
  107. $this->line(' ID: ' . $firstSeed['id'] . ', 名称: ' . $firstSeed['name']);
  108. $this->line(' 产出物品: [' . implode(', ', $firstSeed['seed_outputs'] ?? []) . ']');
  109. }
  110. return Command::SUCCESS;
  111. } else {
  112. $this->error('生成种子配置JSON文件失败');
  113. return Command::FAILURE;
  114. }
  115. } catch (\Exception $e) {
  116. $this->error('生成种子配置JSON文件失败: ' . $e->getMessage());
  117. return Command::FAILURE;
  118. }
  119. }
  120. }