GenerateShopItemsJsonCommand.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace App\Module\Shop\Commands;
  3. use App\Module\Game\DCache\ShopItemsJsonConfig;
  4. use App\Module\Game\Services\JsonConfigService;
  5. use Carbon\Carbon;
  6. use Illuminate\Console\Command;
  7. use App\Module\Shop\Models\ShopItem;
  8. use Illuminate\Support\Facades\Log;
  9. /**
  10. * 生成商店商品配置表JSON数据命令
  11. *
  12. * 该命令用于从数据库中的商店商品表生成商品JSON数据文件,供客户端使用。
  13. * 生成的JSON文件包含商品的基本信息,如ID、名称、描述、消耗组、奖励组和展示属性等。
  14. * 该命令通常在商店商品数据更新后运行,以确保客户端获取最新的商品数据。
  15. */
  16. class GenerateShopItemsJsonCommand extends Command
  17. {
  18. /**
  19. * 命令名称和签名
  20. *
  21. * @var string
  22. */
  23. protected $signature = 'shop:generate-json';
  24. /**
  25. * 命令描述
  26. *
  27. * @var string
  28. */
  29. protected $description = 'Generate shop_items.json from ShopItem table';
  30. /**
  31. * 执行命令
  32. */
  33. /**
  34. * 生成商店商品JSON数据
  35. *
  36. * @return array|bool 生成的数据或失败标志
  37. */
  38. public static function generateJson()
  39. {
  40. try {
  41. // 查询ShopItem表中的激活商品数据,并预加载关联数据
  42. $shopItems = ShopItem::query()
  43. ->with([
  44. 'category',
  45. 'consumeGroup.consumeItems',
  46. 'rewardGroup.rewardItems',
  47. 'activePurchaseLimits'
  48. ])
  49. ->where('is_active', 1)
  50. ->where(function ($query) {
  51. // 检查上架时间
  52. $query->whereNull('start_time')
  53. ->orWhere('start_time', '<=', now());
  54. })
  55. ->where(function ($query) {
  56. // 检查下架时间
  57. $query->whereNull('end_time')
  58. ->orWhere('end_time', '>=', now());
  59. })
  60. ->orderBy('sort_order', 'desc')
  61. ->orderBy('id', 'asc')
  62. ->get()
  63. ->map(function ($item) {
  64. // 构建商品数据
  65. $itemData = [
  66. 'id' => $item->id,
  67. 'name' => $item->name,
  68. 'description' => $item->description,
  69. 'category_id' => $item->category_id,
  70. 'category_name' => $item->category_name,
  71. 'consume_group_id' => $item->consume_group_id,
  72. 'reward_group_id' => $item->reward_group_id,
  73. 'max_single_buy' => $item->max_single_buy,
  74. 'sort_order' => $item->sort_order,
  75. 'display_attributes' => $item->display_attributes,
  76. 'start_time' => $item->start_time ? $item->start_time->toDateTimeString() : null,
  77. 'end_time' => $item->end_time ? $item->end_time->toDateTimeString() : null,
  78. ];
  79. // 添加分类信息
  80. if ($item->category) {
  81. $itemData['category'] = [
  82. 'id' => $item->category->id,
  83. 'name' => $item->category->name,
  84. ];
  85. }
  86. // 添加消耗组信息
  87. if ($item->consumeGroup) {
  88. $itemData['consume_group'] = [
  89. 'id' => $item->consumeGroup->id,
  90. 'name' => $item->consumeGroup->name,
  91. 'description' => $item->consumeGroup->description,
  92. 'items' => $item->consumeGroup->consumeItems->map(function ($consumeItem) {
  93. return [
  94. 'type' => $consumeItem->type,
  95. 'target_id' => $consumeItem->target_id,
  96. 'quantity' => $consumeItem->quantity,
  97. 'name' => $consumeItem->name,
  98. ];
  99. })->toArray()
  100. ];
  101. }
  102. // 添加奖励组信息
  103. if ($item->rewardGroup) {
  104. $itemData['reward_group'] = [
  105. 'id' => $item->rewardGroup->id,
  106. 'name' => $item->rewardGroup->name,
  107. 'description' => $item->rewardGroup->description,
  108. 'items' => $item->rewardGroup->rewardItems->map(function ($rewardItem) {
  109. return [
  110. 'type' => $rewardItem->type,
  111. 'target_id' => $rewardItem->target_id,
  112. 'min_quantity' => $rewardItem->min_quantity,
  113. 'max_quantity' => $rewardItem->max_quantity,
  114. 'probability' => $rewardItem->probability,
  115. 'is_guaranteed' => $rewardItem->is_guaranteed,
  116. 'name' => $rewardItem->name,
  117. ];
  118. })->toArray()
  119. ];
  120. }
  121. // 添加限购信息
  122. if ($item->activePurchaseLimits->isNotEmpty()) {
  123. $itemData['purchase_limits'] = $item->activePurchaseLimits->map(function ($limit) {
  124. return [
  125. 'id' => $limit->id,
  126. 'type' => $limit->type,
  127. 'period' => $limit->period,
  128. 'max_quantity' => $limit->max_quantity,
  129. 'description' => $limit->description,
  130. ];
  131. })->toArray();
  132. }
  133. return $itemData;
  134. })
  135. ->toArray();
  136. // 准备完整数据,包含生成时间
  137. $data = [
  138. 'generated_ts' => time(),
  139. 'generated_at' => now()->toDateTimeString(),
  140. 'shop_items' => $shopItems
  141. ];
  142. return $data;
  143. } catch (\Exception $e) {
  144. Log::error('Generate shop_items.json failed: ' . $e->getMessage());
  145. return false;
  146. }
  147. }
  148. public function handle()
  149. {
  150. if (ShopItemsJsonConfig::getData([], true)) {
  151. $this->info('Successfully generated shop_items.json with timestamp');
  152. } else {
  153. $this->error('Failed to generate shop_items.json');
  154. }
  155. }
  156. }