with([ 'consumeGroup.consumeItems', 'rewardGroup.rewardItems', 'conditionGroup.conditionItems', 'materials.item' // 保留兼容性 ]) ->where('is_active', 1) ->orderBy('sort_order', 'desc') ->get() ->map(function ($recipe) { // 构建配方数据 $recipeData = [ 'id' => $recipe->id, 'name' => $recipe->name, 'code' => $recipe->code, 'description' => $recipe->description, 'success_rate' => $recipe->success_rate, 'cooldown_seconds' => $recipe->cooldown_seconds, 'sort_order' => $recipe->sort_order, ]; // 消耗组数据 if ($recipe->consume_group_id && $recipe->consumeGroup) { $recipeData['consume_group'] = [ 'id' => $recipe->consumeGroup->id, 'name' => $recipe->consumeGroup->name, 'items' => $recipe->consumeGroup->consumeItems->map(function ($item) { return [ 'consume_type' => $item->consume_type, 'target_id' => $item->target_id, 'quantity' => $item->quantity, ]; })->toArray() ]; } // 奖励组数据 if ($recipe->reward_group_id && $recipe->rewardGroup) { $recipeData['reward_group'] = [ 'id' => $recipe->rewardGroup->id, 'name' => $recipe->rewardGroup->name, 'is_random' => $recipe->rewardGroup->is_random, 'random_count' => $recipe->rewardGroup->random_count, 'items' => $recipe->rewardGroup->rewardItems->map(function ($item) { return [ 'reward_type' => $item->reward_type, 'target_id' => $item->target_id, 'quantity' => $item->quantity, 'weight' => $item->weight, 'is_guaranteed' => $item->is_guaranteed, ]; })->toArray() ]; } // 条件组数据 if ($recipe->condition_group_id && $recipe->conditionGroup) { $recipeData['condition_group'] = [ 'id' => $recipe->conditionGroup->id, 'name' => $recipe->conditionGroup->name, 'logic_type' => $recipe->conditionGroup->logic_type, 'items' => $recipe->conditionGroup->conditionItems->map(function ($item) { return [ 'condition_type' => $item->condition_type, 'target_id' => $item->target_id, 'operator' => $item->operator, 'value' => $item->value, ]; })->toArray() ]; } // 兼容旧系统:处理材料数据 if ($recipe->materials && $recipe->materials->isNotEmpty()) { $recipeData['legacy_materials'] = $recipe->materials->map(function ($material) { return [ 'item_id' => $material->item_id, 'item_name' => $material->item->name ?? '未知物品', 'quantity' => $material->quantity, 'is_consumed' => $material->is_consumed, ]; })->toArray(); } return $recipeData; }) ->toArray(); // 准备完整数据,包含生成时间 $data = [ 'generated_ts' => time(), 'recipes' => $recipes ]; return $data; } catch (\Exception $e) { Log::error('Generate recipe.json failed: ' . $e->getMessage()); return false; } } /** * 执行命令 */ public function handle() { $this->info('Generating recipe JSON data...'); if (RecipeJsonConfig::getData([], true)) { $this->info('Successfully generated recipe.json with timestamp'); } else { $this->error('Failed to generate recipe.json'); } } }