migrate_craft_system.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. // 启动Laravel应用
  4. $app = require_once __DIR__ . '/bootstrap/app.php';
  5. $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
  6. $kernel->bootstrap();
  7. use Illuminate\Support\Facades\DB;
  8. use App\Module\Game\Models\GameConsumeGroup;
  9. use App\Module\Game\Models\GameConsumeItem;
  10. use App\Module\Game\Models\GameRewardGroup;
  11. use App\Module\Game\Models\GameRewardItem;
  12. use App\Module\Game\Enums\CONSUME_TYPE;
  13. use App\Module\Game\Enums\REWARD_TYPE;
  14. echo "开始迁移物品合成系统到组系统模式...\n";
  15. try {
  16. DB::transaction(function () {
  17. // 获取所有配方
  18. $recipes = DB::table('kku_item_recipes')->get();
  19. echo "找到 " . count($recipes) . " 个配方需要迁移\n";
  20. foreach ($recipes as $recipe) {
  21. echo "处理配方: {$recipe->name} (ID: {$recipe->id})\n";
  22. // 1. 创建消耗组
  23. $consumeGroup = createConsumeGroup($recipe);
  24. echo " - 创建消耗组: {$consumeGroup->name} (ID: {$consumeGroup->id})\n";
  25. // 2. 创建奖励组
  26. $rewardGroup = createRewardGroup($recipe);
  27. echo " - 创建奖励组: {$rewardGroup->name} (ID: {$rewardGroup->id})\n";
  28. // 3. 更新配方记录
  29. DB::table('kku_item_recipes')
  30. ->where('id', $recipe->id)
  31. ->update([
  32. 'consume_group_id' => $consumeGroup->id,
  33. 'reward_group_id' => $rewardGroup->id,
  34. 'updated_at' => now(),
  35. ]);
  36. echo " - 配方 {$recipe->name} 迁移完成\n\n";
  37. }
  38. });
  39. echo "迁移完成!\n";
  40. } catch (Exception $e) {
  41. echo "迁移失败: " . $e->getMessage() . "\n";
  42. echo "堆栈跟踪:\n" . $e->getTraceAsString() . "\n";
  43. }
  44. /**
  45. * 创建消耗组
  46. */
  47. function createConsumeGroup($recipe)
  48. {
  49. // 创建消耗组
  50. $consumeGroup = GameConsumeGroup::create([
  51. 'name' => "合成消耗: {$recipe->name}",
  52. 'code' => "craft_consume_{$recipe->id}",
  53. 'description' => "配方 {$recipe->name} 的消耗组",
  54. ]);
  55. // 添加材料消耗项
  56. $materials = DB::table('kku_item_recipe_materials')
  57. ->where('recipe_id', $recipe->id)
  58. ->get();
  59. foreach ($materials as $material) {
  60. GameConsumeItem::create([
  61. 'group_id' => $consumeGroup->id,
  62. 'consume_type' => CONSUME_TYPE::ITEM->value,
  63. 'target_id' => $material->item_id,
  64. 'quantity' => $material->quantity,
  65. 'param1' => 0,
  66. 'param2' => 0,
  67. 'extra_data' => null,
  68. ]);
  69. echo " - 添加材料消耗: 物品ID {$material->item_id}, 数量 {$material->quantity}\n";
  70. }
  71. // 添加货币消耗项
  72. if ($recipe->coin_cost) {
  73. $coinCost = json_decode($recipe->coin_cost, true);
  74. if (is_array($coinCost)) {
  75. foreach ($coinCost as $currency => $amount) {
  76. // 根据货币类型获取对应的fund_config_id
  77. $fundConfigId = getFundConfigId($currency);
  78. if ($fundConfigId) {
  79. GameConsumeItem::create([
  80. 'group_id' => $consumeGroup->id,
  81. 'consume_type' => CONSUME_TYPE::FUND_CONFIG->value,
  82. 'target_id' => $fundConfigId,
  83. 'quantity' => $amount,
  84. 'param1' => 0,
  85. 'param2' => 0,
  86. 'extra_data' => null,
  87. ]);
  88. echo " - 添加货币消耗: {$currency} {$amount}\n";
  89. }
  90. }
  91. }
  92. }
  93. return $consumeGroup;
  94. }
  95. /**
  96. * 创建奖励组
  97. */
  98. function createRewardGroup($recipe)
  99. {
  100. // 创建奖励组
  101. $rewardGroup = GameRewardGroup::create([
  102. 'name' => "合成奖励: {$recipe->name}",
  103. 'code' => "craft_reward_{$recipe->id}",
  104. 'description' => "配方 {$recipe->name} 的奖励组",
  105. 'is_random' => false,
  106. 'random_count' => 1,
  107. 'reward_mode' => 1, // 权重选择模式
  108. ]);
  109. // 添加物品奖励项
  110. GameRewardItem::create([
  111. 'group_id' => $rewardGroup->id,
  112. 'reward_type' => REWARD_TYPE::ITEM->value,
  113. 'target_id' => $recipe->result_item_id,
  114. 'param1' => $recipe->result_min_quantity,
  115. 'param2' => $recipe->result_max_quantity,
  116. 'quantity' => $recipe->result_min_quantity, // 基础数量
  117. 'weight' => 1.0,
  118. 'probability' => $recipe->success_rate, // 成功率作为概率
  119. 'is_guaranteed' => $recipe->success_rate >= 100 ? true : false,
  120. 'extra_data' => null,
  121. ]);
  122. echo " - 添加物品奖励: 物品ID {$recipe->result_item_id}, 数量 {$recipe->result_min_quantity}-{$recipe->result_max_quantity}, 成功率 {$recipe->success_rate}%\n";
  123. return $rewardGroup;
  124. }
  125. /**
  126. * 获取货币对应的fund_config_id
  127. */
  128. function getFundConfigId($currency)
  129. {
  130. $mapping = [
  131. 'gold' => 1, // 金币
  132. 'silver' => 2, // 银币
  133. 'copper' => 3, // 铜币
  134. // 根据实际情况添加更多映射
  135. ];
  136. return $mapping[$currency] ?? null;
  137. }