rewardRepository = $rewardRepository; $this->rewardLogRepository = $rewardLogRepository; } /** * 获取任务奖励列表 * * @param int $taskId 任务ID * @return array 奖励列表 */ public function getTaskRewards(int $taskId): array { return $this->rewardRepository->getRewardsByTaskId($taskId); } /** * 发放任务奖励 * * @param int $userId 用户ID * @param int $taskId 任务ID * @param int $userTaskId 用户任务ID * @return array 发放结果 */ public function distributeRewards(int $userId, int $taskId, int $userTaskId): array { try { // 开始事务 DB::beginTransaction(); // 获取任务奖励 $rewards = $this->getTaskRewards($taskId); if (empty($rewards)) { throw new \Exception('任务没有奖励'); } // 发放每个奖励 $results = []; $allSuccess = true; foreach ($rewards as $reward) { $result = $this->distributeReward($userId, $reward); $results[] = $result; if (!$result['success']) { $allSuccess = false; } } // 记录奖励发放日志 $this->recordRewardLog($userId, $taskId, $userTaskId, $rewards, $results); // 提交事务 DB::commit(); return [ 'success' => $allSuccess, 'message' => $allSuccess ? '奖励发放成功' : '部分奖励发放失败', 'rewards' => $results, ]; } catch (\Exception $e) { // 回滚事务 DB::rollBack(); Log::error('奖励发放失败', [ 'user_id' => $userId, 'task_id' => $taskId, 'user_task_id' => $userTaskId, 'error' => $e->getMessage(), ]); return [ 'success' => false, 'message' => '奖励发放失败: ' . $e->getMessage(), ]; } } /** * 发放单个奖励 * * @param int $userId 用户ID * @param array|TaskReward $reward 奖励信息 * @return array 发放结果 */ protected function distributeReward(int $userId, $reward): array { try { // 将TaskReward对象转换为数组 if ($reward instanceof TaskReward) { $reward = $reward->toArray(); } // 根据奖励类型调用不同的发放方法 $rewardType = REWARD_TYPE::tryFrom($reward['reward_type']) ?? null; if (!$rewardType) { throw new \Exception('未知的奖励类型: ' . $reward['reward_type']); } switch ($rewardType) { case REWARD_TYPE::ITEM: return $this->distributeItemReward($userId, $reward); case REWARD_TYPE::CURRENCY: return $this->distributeCurrencyReward($userId, $reward); case REWARD_TYPE::EXPERIENCE: return $this->distributeExperienceReward($userId, $reward); case REWARD_TYPE::FEATURE_UNLOCK: return $this->distributeFeatureUnlockReward($userId, $reward); case REWARD_TYPE::VIP_POINTS: return $this->distributeVipPointsReward($userId, $reward); case REWARD_TYPE::TITLE: return $this->distributeTitleReward($userId, $reward); case REWARD_TYPE::AVATAR_FRAME: return $this->distributeAvatarFrameReward($userId, $reward); case REWARD_TYPE::PET: return $this->distributePetReward($userId, $reward); case REWARD_TYPE::PET_ITEM: return $this->distributePetItemReward($userId, $reward); case REWARD_TYPE::FARM_DECORATION: return $this->distributeFarmDecorationReward($userId, $reward); default: throw new \Exception('未实现的奖励类型: ' . $rewardType->value); } } catch (\Exception $e) { Log::error('发放单个奖励失败', [ 'user_id' => $userId, 'reward' => $reward, 'error' => $e->getMessage(), ]); return [ 'success' => false, 'message' => '发放奖励失败: ' . $e->getMessage(), 'reward_type' => $reward['reward_type'] ?? 'unknown', 'reward_param1' => $reward['reward_param1'] ?? '', 'reward_param2' => $reward['reward_param2'] ?? '', 'quantity' => $reward['quantity'] ?? 0, ]; } } /** * 发放物品奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeItemReward(int $userId, array $reward): array { // 这里应该调用物品模块的服务来发放物品 // 例如:ItemService::addItem($userId, $reward['reward_param2'], $reward['quantity'], [...]); // 模拟发放结果 $success = true; $message = '物品发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放货币奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeCurrencyReward(int $userId, array $reward): array { // 这里应该调用货币模块的服务来发放货币 // 例如:CurrencyService::addCurrency($userId, $reward['reward_param1'], $reward['reward_param2'], $reward['quantity'], [...]); // 模拟发放结果 $success = true; $message = '货币发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放经验奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeExperienceReward(int $userId, array $reward): array { // 这里应该调用经验模块的服务来发放经验 // 例如:ExperienceService::addExperience($userId, $reward['reward_param1'], $reward['quantity'], [...]); // 模拟发放结果 $success = true; $message = '经验发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放功能解锁奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeFeatureUnlockReward(int $userId, array $reward): array { // 这里应该调用功能解锁模块的服务来解锁功能 // 例如:FeatureService::unlockFeature($userId, $reward['reward_param1'], $reward['reward_param2'], [...]); // 模拟发放结果 $success = true; $message = '功能解锁成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放VIP点数奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeVipPointsReward(int $userId, array $reward): array { // 这里应该调用VIP模块的服务来发放VIP点数 // 例如:VipService::addPoints($userId, $reward['quantity'], [...]); // 模拟发放结果 $success = true; $message = 'VIP点数发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放称号奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeTitleReward(int $userId, array $reward): array { // 这里应该调用称号模块的服务来发放称号 // 例如:TitleService::addTitle($userId, $reward['reward_param1'], $reward['reward_param2'], [...]); // 模拟发放结果 $success = true; $message = '称号发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放头像框奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeAvatarFrameReward(int $userId, array $reward): array { // 这里应该调用头像框模块的服务来发放头像框 // 例如:AvatarFrameService::addFrame($userId, $reward['reward_param1'], $reward['reward_param2'], [...]); // 模拟发放结果 $success = true; $message = '头像框发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放宠物奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributePetReward(int $userId, array $reward): array { // 这里应该调用宠物模块的服务来发放宠物 // 例如:PetService::addPet($userId, $reward['reward_param1'], $reward['reward_param2'], [...]); // 模拟发放结果 $success = true; $message = '宠物发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放宠物物品奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributePetItemReward(int $userId, array $reward): array { // 这里应该调用宠物物品模块的服务来发放宠物物品 // 例如:PetItemService::addItem($userId, $reward['reward_param1'], $reward['reward_param2'], $reward['quantity'], [...]); // 模拟发放结果 $success = true; $message = '宠物物品发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 发放农场装饰物奖励 * * @param int $userId 用户ID * @param array $reward 奖励信息 * @return array 发放结果 */ protected function distributeFarmDecorationReward(int $userId, array $reward): array { // 这里应该调用农场装饰物模块的服务来发放农场装饰物 // 例如:FarmDecorationService::addDecoration($userId, $reward['reward_param1'], $reward['reward_param2'], $reward['quantity'], [...]); // 模拟发放结果 $success = true; $message = '农场装饰物发放成功'; return [ 'success' => $success, 'message' => $message, 'reward_type' => $reward['reward_type'], 'reward_param1' => $reward['reward_param1'], 'reward_param2' => $reward['reward_param2'], 'quantity' => $reward['quantity'], ]; } /** * 记录奖励发放日志 * * @param int $userId 用户ID * @param int $taskId 任务ID * @param int $userTaskId 用户任务ID * @param array $rewards 奖励列表 * @param array $results 发放结果 * @return bool 是否成功 */ protected function recordRewardLog(int $userId, int $taskId, int $userTaskId, array $rewards, array $results): bool { try { // 创建奖励日志 $this->rewardLogRepository->create([ 'user_id' => $userId, 'task_id' => $taskId, 'user_task_id' => $userTaskId, 'rewards' => $rewards, 'rewarded_at' => Carbon::now(), 'ip_address' => request()->ip(), 'device_info' => request()->userAgent(), ]); return true; } catch (\Exception $e) { Log::error('记录奖励发放日志失败', [ 'user_id' => $userId, 'task_id' => $taskId, 'user_task_id' => $userTaskId, 'error' => $e->getMessage(), ]); return false; } } /** * 获取用户的奖励发放历史 * * @param int $userId 用户ID * @param int|null $taskId 任务ID(可选) * @param int $page 页码 * @param int $pageSize 每页数量 * @return array 奖励发放历史 */ public function getUserRewardHistory(int $userId, ?int $taskId = null, int $page = 1, int $pageSize = 10): array { try { // 构建查询 $query = $this->rewardLogRepository->query() ->where('user_id', $userId); if ($taskId) { $query->where('task_id', $taskId); } // 分页查询 $total = $query->count(); $logs = $query->orderBy('id', 'desc') ->forPage($page, $pageSize) ->get(); return [ 'success' => true, 'total' => $total, 'page' => $page, 'page_size' => $pageSize, 'logs' => $logs, ]; } catch (\Exception $e) { Log::error('获取用户奖励发放历史失败', [ 'user_id' => $userId, 'task_id' => $taskId, 'error' => $e->getMessage(), ]); return [ 'success' => false, 'message' => '获取用户奖励发放历史失败: ' . $e->getMessage(), ]; } } }