'integer', 'reward_group_id' => 'integer', 'condition_group_id' => 'integer', 'success_rate' => 'float', 'cooldown_seconds' => 'integer', 'category_id' => 'integer', 'sort_order' => 'integer', 'is_active' => 'boolean', ]; /** * 获取消耗组 * * @return BelongsTo */ public function consumeGroup(): BelongsTo { return $this->belongsTo(\App\Module\Game\Models\GameConsumeGroup::class, 'consume_group_id'); } /** * 获取奖励组 * * @return BelongsTo */ public function rewardGroup(): BelongsTo { return $this->belongsTo(\App\Module\Game\Models\GameRewardGroup::class, 'reward_group_id'); } /** * 获取条件组 * * @return BelongsTo */ public function conditionGroup(): BelongsTo { return $this->belongsTo(\App\Module\Game\Models\GameConditionGroup::class, 'condition_group_id'); } /** * 获取用户配方解锁状态 * * @return HasMany */ public function userRecipes(): HasMany { return $this->hasMany(ItemUserRecipe::class, 'recipe_id'); } /** * 获取合成记录 * * @return HasMany */ public function craftLogs(): HasMany { return $this->hasMany(ItemCraftLog::class, 'recipe_id'); } /** * 检查用户是否已解锁该配方 * * @param int $userId 用户ID * @return bool */ public function isUnlockedByUser(int $userId): bool { $userRecipe = $this->userRecipes() ->where('user_id', $userId) ->first(); return $userRecipe && $userRecipe->is_unlocked; } /** * 格式化消耗组详情用于显示 * * @return string */ public function formatConsumeDetails(): string { if (!$this->consumeGroup) { return '无消耗组'; } return $this->consumeGroup->formatConsumeDetails(); } /** * 格式化奖励组详情用于显示 * * @return string */ public function formatRewardDetails(): string { if (!$this->rewardGroup) { return '无奖励组'; } return $this->rewardGroup->formatRewardDetails(); } /** * 格式化条件组详情用于显示 * * @return string */ public function formatConditionDetails(): string { if (!$this->conditionGroup) { return '无条件组'; } return $this->conditionGroup->formatConditionDetails(); } /** * 检查用户是否可以合成该配方 * * @param int $userId 用户ID * @return array 检查结果,包含是否可合成和原因 */ public function canCraftByUser(int $userId): array { // 检查配方是否激活 if (!$this->is_active) { return [ 'can_craft' => false, 'reason' => '配方未激活', ]; } // 检查条件组(如果设置了条件组) if ($this->condition_group_id && $this->conditionGroup) { $conditionService = app(\App\Module\Game\Services\ConditionService::class); $conditionResult = $conditionService->checkCondition($userId, $this->condition_group_id); if (!$conditionResult['success']) { return [ 'can_craft' => false, 'reason' => '条件不满足: ' . $conditionResult['message'], ]; } } // 检查消耗组是否满足 if ($this->consume_group_id && $this->consumeGroup) { $consumeService = app(\App\Module\Game\Services\ConsumeService::class); $consumeResult = $consumeService->checkConsume($userId, $this->consume_group_id); if (!$consumeResult['success']) { return [ 'can_craft' => false, 'reason' => '材料不足: ' . $consumeResult['message'], ]; } } return [ 'can_craft' => true, ]; } }