| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <?php
- namespace App\Module\Activity\Logics;
- use App\Module\Activity\Dtos\ActivityRewardDto;
- use App\Module\Activity\Enums\REWARD_STATUS;
- use App\Module\Activity\Models\ActivityConfig;
- use App\Module\Activity\Models\ActivityParticipation;
- use App\Module\Game\Enums\REWARD_SOURCE_TYPE;
- use Exception;
- use Illuminate\Support\Facades\Log;
- /**
- * 奖励逻辑类
- */
- class RewardLogic
- {
- /**
- * 检查用户是否可以领取活动奖励
- *
- * @param int $userId 用户ID
- * @param int $activityId 活动ID
- * @return bool
- */
- public function canClaimReward(int $userId, int $activityId): bool
- {
- // 获取用户参与记录
- $participation = ActivityParticipation::where('user_id', $userId)
- ->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());
- }
- }
- }
|