MigrateLandUpgradeConditionsToConditionGroupsCommand.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace App\Module\Farm\Commands;
  3. use App\Module\Farm\Models\FarmLandUpgradeConfig;
  4. use App\Module\Game\Enums\CONDITION_OPERATOR;
  5. use App\Module\Game\Enums\CONDITION_TYPE;
  6. use App\Module\Game\Models\GameConditionGroup;
  7. use App\Module\Game\Models\GameConditionItem;
  8. use Illuminate\Console\Command;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Str;
  11. /**
  12. * 将土地升级条件迁移到条件组的命令
  13. */
  14. class MigrateLandUpgradeConditionsToConditionGroupsCommand extends Command
  15. {
  16. /**
  17. * 命令名称
  18. *
  19. * @var string
  20. */
  21. protected $signature = 'farm:migrate-land-upgrade-conditions {--dry-run : 只显示将要执行的操作,不实际执行}';
  22. /**
  23. * 命令描述
  24. *
  25. * @var string
  26. */
  27. protected $description = '将土地升级条件迁移到条件组';
  28. /**
  29. * 执行命令
  30. *
  31. * @return int
  32. */
  33. public function handle()
  34. {
  35. $this->info('开始迁移土地升级条件到条件组...');
  36. // 获取所有土地升级配置
  37. $configs = FarmLandUpgradeConfig::all();
  38. $this->info("找到 {$configs->count()} 个土地升级配置");
  39. // 是否为干运行模式
  40. $dryRun = $this->option('dry-run');
  41. if ($dryRun) {
  42. $this->warn('干运行模式:不会实际执行数据库操作');
  43. }
  44. // 开始迁移
  45. $migratedCount = 0;
  46. $skippedCount = 0;
  47. $errorCount = 0;
  48. foreach ($configs as $config) {
  49. $this->line('');
  50. $this->line("处理配置 ID: {$config->id}, 从 {$config->from_type_id} 到 {$config->to_type_id}");
  51. // 如果已经有条件组ID,则跳过
  52. if ($config->condition_group_id) {
  53. $this->warn(" 已有条件组ID ({$config->condition_group_id}),跳过");
  54. $skippedCount++;
  55. continue;
  56. }
  57. // 获取条件
  58. $conditions = [];
  59. if (is_string($config->conditions)) {
  60. $conditions = json_decode($config->conditions, true) ?? [];
  61. } else {
  62. $conditions = $config->conditions ?? [];
  63. }
  64. if (empty($conditions)) {
  65. $this->warn(" 没有条件,跳过");
  66. $skippedCount++;
  67. continue;
  68. }
  69. $this->info(" 找到条件: " . json_encode($conditions, JSON_UNESCAPED_UNICODE));
  70. try {
  71. // 如果不是干运行模式,则创建条件组
  72. if (!$dryRun) {
  73. DB::beginTransaction();
  74. // 创建条件组
  75. $conditionGroup = new GameConditionGroup();
  76. $conditionGroup->name = "土地升级: {$config->from_type_id} -> {$config->to_type_id}";
  77. $conditionGroup->code = "land_upgrade_{$config->from_type_id}_{$config->to_type_id}_" . Str::random(6);
  78. $conditionGroup->description = "从土地类型 {$config->from_type_id} 升级到 {$config->to_type_id} 所需条件";
  79. $conditionGroup->logic_type = GameConditionGroup::LOGIC_TYPE_ALL; // 默认全部满足
  80. $conditionGroup->save();
  81. $this->info(" 创建条件组: ID={$conditionGroup->id}, 名称={$conditionGroup->name}");
  82. // 创建条件项
  83. if (isset($conditions['house_level_min'])) {
  84. $conditionItem = new GameConditionItem();
  85. $conditionItem->group_id = $conditionGroup->id;
  86. $conditionItem->condition_type = CONDITION_TYPE::HOUSE_LEVEL->value;
  87. $conditionItem->target_id = 0; // 房屋等级不需要目标ID
  88. $conditionItem->operator = CONDITION_OPERATOR::GREATER_THAN_OR_EQUAL->value;
  89. $conditionItem->value = $conditions['house_level_min'];
  90. $conditionItem->save();
  91. $this->info(" 创建条件项: ID={$conditionItem->id}, 类型=房屋等级, 运算符=大于等于, 值={$conditionItem->value}");
  92. }
  93. // 处理特殊土地数量限制
  94. if (isset($conditions['special_land_check']) && $conditions['special_land_check']) {
  95. // 这个条件比较特殊,需要在代码中处理,这里只是记录一下
  96. $this->warn(" 特殊土地数量限制条件需要在代码中处理,已记录到条件组描述中");
  97. $conditionGroup->description .= ",包含特殊土地数量限制";
  98. $conditionGroup->save();
  99. }
  100. // 更新土地升级配置
  101. $config->condition_group_id = $conditionGroup->id;
  102. $config->save();
  103. $this->info(" 更新土地升级配置: condition_group_id={$config->condition_group_id}");
  104. DB::commit();
  105. } else {
  106. $this->info(" [干运行] 将创建条件组和条件项,并更新土地升级配置");
  107. }
  108. $migratedCount++;
  109. } catch (\Exception $e) {
  110. if (!$dryRun) {
  111. DB::rollBack();
  112. }
  113. $this->error(" 迁移失败: " . $e->getMessage());
  114. $errorCount++;
  115. }
  116. }
  117. $this->line('');
  118. $this->info("迁移完成: 成功 {$migratedCount}, 跳过 {$skippedCount}, 失败 {$errorCount}");
  119. return 0;
  120. }
  121. }