GenerateDismantleJsonCommand.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace App\Module\GameItems\Commands;
  3. use App\Module\Game\DCache\DismantleJsonConfig;
  4. use Illuminate\Console\Command;
  5. use App\Module\GameItems\Models\ItemDismantleRule;
  6. use Illuminate\Support\Facades\Log;
  7. /**
  8. * 生成物品分解配方配置表JSON数据命令
  9. *
  10. * 该命令用于从数据库中的物品分解规则表生成JSON数据文件,供客户端使用。
  11. * 生成的JSON文件包含分解规则的基本信息,如规则ID、适用物品、分解结果等。
  12. * 该命令通常在分解规则数据更新后运行,以确保客户端获取最新的分解规则数据。
  13. */
  14. class GenerateDismantleJsonCommand extends Command
  15. {
  16. /**
  17. * 命令名称和签名
  18. *
  19. * @var string
  20. */
  21. protected $signature = 'gameitems:generate-dismantle-json';
  22. /**
  23. * 命令描述
  24. *
  25. * @var string
  26. */
  27. protected $description = 'Generate dismantle.json from ItemDismantleRule table';
  28. /**
  29. * 生成分解规则JSON数据
  30. *
  31. * @return array|bool 生成的数据或失败标志
  32. */
  33. public static function generateJson()
  34. {
  35. try {
  36. // 查询ItemDismantleRule表中的数据,并预加载关联数据
  37. $rules = ItemDismantleRule::query()
  38. ->with([
  39. 'item',
  40. 'category',
  41. 'consumeGroup.consumeItems',
  42. 'rewardGroup.rewardItems',
  43. 'conditionGroup.conditionItems',
  44. 'results.resultItem' // 保留兼容性
  45. ])
  46. ->where('is_active', 1)
  47. ->orderBy('priority', 'desc')
  48. ->orderBy('sort_order', 'desc')
  49. ->get()
  50. ->map(function ($rule) {
  51. // 构建规则数据
  52. $ruleData = [
  53. 'id' => $rule->id,
  54. 'name' => $rule->name,
  55. 'code' => $rule->code,
  56. 'description' => $rule->description,
  57. 'priority' => $rule->priority,
  58. 'sort_order' => $rule->sort_order,
  59. 'min_rarity' => $rule->min_rarity,
  60. 'max_rarity' => $rule->max_rarity,
  61. ];
  62. // 根据规则类型添加不同的字段
  63. if ($rule->item_id) {
  64. $ruleData['rule_type'] = 'item';
  65. $ruleData['item_id'] = $rule->item_id;
  66. $ruleData['item_name'] = $rule->item->name ?? '未知物品';
  67. } elseif ($rule->category_id) {
  68. $ruleData['rule_type'] = 'category';
  69. $ruleData['category_id'] = $rule->category_id;
  70. $ruleData['category_name'] = $rule->category->name ?? '未知分类';
  71. } else {
  72. $ruleData['rule_type'] = 'general';
  73. }
  74. // 消耗组数据
  75. if ($rule->consume_group_id && $rule->consumeGroup) {
  76. $ruleData['consume_group'] = [
  77. 'id' => $rule->consumeGroup->id,
  78. 'name' => $rule->consumeGroup->name,
  79. 'items' => $rule->consumeGroup->consumeItems->map(function ($item) {
  80. return [
  81. 'consume_type' => $item->consume_type,
  82. 'target_id' => $item->target_id,
  83. 'quantity' => $item->quantity,
  84. ];
  85. })->toArray()
  86. ];
  87. }
  88. // 奖励组数据
  89. if ($rule->reward_group_id && $rule->rewardGroup) {
  90. $ruleData['reward_group'] = [
  91. 'id' => $rule->rewardGroup->id,
  92. 'name' => $rule->rewardGroup->name,
  93. 'is_random' => $rule->rewardGroup->is_random,
  94. 'random_count' => $rule->rewardGroup->random_count,
  95. 'items' => $rule->rewardGroup->rewardItems->map(function ($item) {
  96. return [
  97. 'reward_type' => $item->reward_type,
  98. 'target_id' => $item->target_id,
  99. 'quantity' => $item->quantity,
  100. 'weight' => $item->weight,
  101. 'is_guaranteed' => $item->is_guaranteed,
  102. ];
  103. })->toArray()
  104. ];
  105. }
  106. // 条件组数据
  107. if ($rule->condition_group_id && $rule->conditionGroup) {
  108. $ruleData['condition_group'] = [
  109. 'id' => $rule->conditionGroup->id,
  110. 'name' => $rule->conditionGroup->name,
  111. 'logic_type' => $rule->conditionGroup->logic_type,
  112. 'items' => $rule->conditionGroup->conditionItems->map(function ($item) {
  113. return [
  114. 'condition_type' => $item->condition_type,
  115. 'target_id' => $item->target_id,
  116. 'operator' => $item->operator,
  117. 'value' => $item->value,
  118. ];
  119. })->toArray()
  120. ];
  121. }
  122. // 兼容旧系统:处理分解结果数据
  123. if ($rule->results && $rule->results->isNotEmpty()) {
  124. $ruleData['legacy_results'] = $rule->results->map(function ($result) {
  125. return [
  126. 'result_item_id' => $result->result_item_id,
  127. 'result_item_name' => $result->resultItem->name ?? '未知物品',
  128. 'min_quantity' => $result->min_quantity,
  129. 'max_quantity' => $result->max_quantity,
  130. 'base_chance' => $result->base_chance,
  131. 'rarity_factor' => $result->rarity_factor,
  132. 'quality_factor' => $result->quality_factor,
  133. ];
  134. })->toArray();
  135. }
  136. return $ruleData;
  137. })
  138. ->toArray();
  139. // 准备完整数据,包含生成时间
  140. $data = [
  141. 'generated_ts' => time(),
  142. 'dismantle_rules' => $rules
  143. ];
  144. return $data;
  145. } catch (\Exception $e) {
  146. Log::error('Generate dismantle.json failed: ' . $e->getMessage());
  147. return false;
  148. }
  149. }
  150. /**
  151. * 执行命令
  152. */
  153. public function handle()
  154. {
  155. $this->info('Generating dismantle JSON data...');
  156. if (DismantleJsonConfig::getData([], true)) {
  157. $this->info('Successfully generated dismantle.json with timestamp');
  158. } else {
  159. $this->error('Failed to generate dismantle.json');
  160. }
  161. }
  162. }