where('activity_id', $activityId) ->first(); if (!$participation) { return false; } // 检查是否已完成且未领取奖励 return $participation->completion_status === 1 && $participation->reward_status === REWARD_STATUS::NOT_CLAIMED; } /** * 标记奖励为已领取 * * @param int $userId 用户ID * @param int $activityId 活动ID * @return bool * @throws Exception */ public function markRewardAsClaimed(int $userId, int $activityId): bool { // 获取用户参与记录 $participation = ActivityParticipation::where('user_id', $userId) ->where('activity_id', $activityId) ->first(); if (!$participation) { throw new Exception('用户未参与此活动'); } if ($participation->completion_status !== 1) { throw new Exception('活动未完成,无法领取奖励'); } if ($participation->reward_status === REWARD_STATUS::CLAIMED) { throw new Exception('奖励已领取'); } // 更新奖励状态为已领取 $participation->reward_status = REWARD_STATUS::CLAIMED; return $participation->save(); } /** * 标记奖励为已过期 * * @param int $userId 用户ID * @param int $activityId 活动ID * @return bool * @throws Exception */ public function markRewardAsExpired(int $userId, int $activityId): bool { // 获取用户参与记录 $participation = ActivityParticipation::where('user_id', $userId) ->where('activity_id', $activityId) ->first(); if (!$participation) { throw new Exception('用户未参与此活动'); } if ($participation->reward_status !== REWARD_STATUS::NOT_CLAIMED) { throw new Exception('奖励状态不是未领取,无法标记为已过期'); } // 更新奖励状态为已过期 $participation->reward_status = REWARD_STATUS::EXPIRED; return $participation->save(); } /** * 获取活动奖励信息 * * @param int $activityId 活动ID * @return ActivityRewardDto|null */ public function getActivityReward(int $activityId): ?ActivityRewardDto { // 获取活动信息 $activity = ActivityConfig::find($activityId); if (!$activity) { return null; } // 如果活动没有配置奖励组,返回空 if (!$activity->reward_group_id && !$activity->reward_group_code) { return null; } // 创建奖励DTO $rewardDto = ActivityRewardDto::create( $activity->reward_group_id, $activity->reward_group_code ); // 尝试获取奖励组信息 try { // 这里应该调用奖励组服务获取奖励组信息 // 由于没有实际的奖励组服务,这里只返回基本信息 $rewardDto->rewardGroupName = '活动奖励'; $rewardDto->rewardGroupDescription = '完成活动获得的奖励'; // 模拟奖励项 $rewardDto->rewardItems = [ [ 'type' => 'item', 'id' => 1001, 'name' => '金币', 'quantity' => 100 ] ]; } catch (Exception $e) { Log::error('获取奖励组信息失败', [ 'activity_id' => $activityId, 'reward_group_id' => $activity->reward_group_id, 'reward_group_code' => $activity->reward_group_code, 'error' => $e->getMessage() ]); } return $rewardDto; } /** * 发放活动奖励 * * @param int $userId 用户ID * @param int $activityId 活动ID * @return array 奖励结果 * @throws Exception */ public function grantActivityReward(int $userId, int $activityId): array { // 获取活动信息 $activity = ActivityConfig::find($activityId); if (!$activity) { throw new Exception('活动不存在'); } // 如果活动没有配置奖励组,返回空结果 if (!$activity->reward_group_id && !$activity->reward_group_code) { return [ 'success' => true, 'message' => '活动未配置奖励', 'rewards' => [] ]; } // 尝试发放奖励 try { // 使用奖励组服务发放奖励 $rewardGroupId = $activity->reward_group_id; $rewardGroupCode = $activity->reward_group_code; // 调用奖励组服务 $rewardService = new \App\Module\Game\Services\RewardService(); $rewardResult = $rewardService::grantReward( $userId, $rewardGroupId ?: $rewardGroupCode, REWARD_SOURCE_TYPE::ACTIVITY, $activity->id ); if ($rewardResult->success) { return [ 'success' => true, 'message' => '奖励发放成功', 'rewards' => $rewardResult->items ]; } else { return [ 'success' => false, 'message' => $rewardResult->errorMessage, 'rewards' => [] ]; } } catch (Exception $e) { Log::error('发放活动奖励失败', [ 'user_id' => $userId, 'activity_id' => $activityId, 'error' => $e->getMessage() ]); throw new Exception('发放奖励失败: ' . $e->getMessage()); } } }