| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <?php
- namespace App\Module\Game\Logics;
- use App\Module\Game\Dtos\TaskChangeTempDto;
- use App\Module\Task\Events\TaskCompletedEvent;
- use App\Module\Task\Events\TaskRewardClaimedEvent;
- use Illuminate\Support\Facades\Log;
- use UCore\Helper\Cache;
- /**
- * 任务临时数据逻辑类
- *
- * 负责处理任务相关事件的临时数据存储逻辑,包括:
- * 1. 将任务状态变更数据临时存储
- * 2. 将任务进度变更数据临时存储
- * 3. 将任务奖励领取数据临时存储
- * 4. 按照用户进行存储
- * 5. 同一任务多次变更进行数据覆盖
- */
- class TaskTemp
- {
- /**
- * 临时数据键前缀
- */
- const TEMP_KEY_PREFIX = 'game:task:changed:';
- /**
- * 临时数据过期时间(秒)
- */
- const TEMP_TTL = 3600; // 1小时
- /**
- * 处理任务完成事件
- *
- * 将任务完成数据临时存储,按用户ID进行存储
- *
- * @param TaskCompletedEvent $event 任务完成事件
- * @return void
- */
- public static function handleTaskCompleted(TaskCompletedEvent $event): void
- {
- try {
- // 构建临时数据键,按用户ID进行存储
- $tempKey = self::TEMP_KEY_PREFIX . $event->userId;
- // 获取当前用户的任务变更临时数据
- $userTasksTemp = Cache::get($tempKey, []);
- // 构建任务变更数据
- $taskData = [
- 'task_id' => $event->taskId,
- 'task_name' => $event->taskName,
- 'change_type' => 'completed',
- 'status' => 'completed',
- 'completed_at' => $event->completedAt ? $event->completedAt->timestamp : time(),
- 'updated_at' => time(),
- ];
- // 使用任务ID作为键,避免同一任务的多次变更相互覆盖
- $userTasksTemp[$event->taskId] = $taskData;
- // 将更新后的数据存回临时存储
- Cache::put($tempKey, $userTasksTemp, self::TEMP_TTL);
- Log::info('任务完成数据已临时存储', [
- 'user_id' => $event->userId,
- 'task_id' => $event->taskId,
- 'task_name' => $event->taskName,
- ]);
- } catch (\Exception $e) {
- Log::error('任务完成数据临时存储失败', [
- 'error' => $e->getMessage(),
- 'user_id' => $event->userId,
- 'task_id' => $event->taskId,
- ]);
- }
- }
- /**
- * 处理任务奖励领取事件
- *
- * 将任务奖励领取数据临时存储,按用户ID进行存储
- *
- * @param TaskRewardClaimedEvent $event 任务奖励领取事件
- * @return void
- */
- public static function handleTaskRewardClaimed(TaskRewardClaimedEvent $event): void
- {
- try {
- // 构建临时数据键,按用户ID进行存储
- $tempKey = self::TEMP_KEY_PREFIX . $event->userId;
- // 获取当前用户的任务变更临时数据
- $userTasksTemp = Cache::get($tempKey, []);
- // 构建任务变更数据
- $taskData = [
- 'task_id' => $event->taskId,
- 'task_name' => $event->taskName,
- 'change_type' => 'reward_claimed',
- 'status' => 'rewarded',
- 'rewards' => $event->rewards,
- 'rewarded_at' => $event->rewardedAt ? $event->rewardedAt->timestamp : time(),
- 'updated_at' => time(),
- ];
- // 使用任务ID作为键,避免同一任务的多次变更相互覆盖
- $userTasksTemp[$event->taskId] = $taskData;
- // 将更新后的数据存回临时存储
- Cache::put($tempKey, $userTasksTemp, self::TEMP_TTL);
- Log::info('任务奖励领取数据已临时存储', [
- 'user_id' => $event->userId,
- 'task_id' => $event->taskId,
- 'task_name' => $event->taskName,
- 'rewards_count' => count($event->rewards),
- ]);
- } catch (\Exception $e) {
- Log::error('任务奖励领取数据临时存储失败', [
- 'error' => $e->getMessage(),
- 'user_id' => $event->userId,
- 'task_id' => $event->taskId,
- ]);
- }
- }
- /**
- * 处理任务进度更新
- *
- * 将任务进度更新数据临时存储,按用户ID进行存储
- *
- * @param int $userId 用户ID
- * @param int $taskId 任务ID
- * @param string $taskName 任务名称
- * @param int $progress 进度百分比
- * @param array $progressDetails 进度详情
- * @return void
- */
- public static function handleTaskProgressUpdated(int $userId, int $taskId, string $taskName, int $progress, array $progressDetails = []): void
- {
- try {
- // 构建临时数据键,按用户ID进行存储
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- // 获取当前用户的任务变更临时数据
- $userTasksTemp = Cache::get($tempKey, []);
- // 构建任务变更数据
- $taskData = [
- 'task_id' => $taskId,
- 'task_name' => $taskName,
- 'change_type' => 'progress_updated',
- 'status' => 'in_progress',
- 'progress' => $progress,
- 'progress_details' => $progressDetails,
- 'updated_at' => time(),
- ];
- // 使用任务ID作为键,避免同一任务的多次变更相互覆盖
- $userTasksTemp[$taskId] = $taskData;
- // 将更新后的数据存回临时存储
- Cache::put($tempKey, $userTasksTemp, self::TEMP_TTL);
- Log::info('任务进度更新数据已临时存储', [
- 'user_id' => $userId,
- 'task_id' => $taskId,
- 'task_name' => $taskName,
- 'progress' => $progress,
- ]);
- } catch (\Exception $e) {
- Log::error('任务进度更新数据临时存储失败', [
- 'error' => $e->getMessage(),
- 'user_id' => $userId,
- 'task_id' => $taskId,
- ]);
- }
- }
- /**
- * 获取用户的任务变更临时数据
- *
- * @param int $userId 用户ID
- * @return TaskChangeTempDto[] 用户的任务变更数据
- */
- public static function getUserTaskChanges(int $userId): array
- {
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- $rawData = Cache::get($tempKey, []);
- $result = [];
- foreach ($rawData as $taskId => $taskData) {
- $result[] = TaskChangeTempDto::fromArray($taskData);
- }
- return $result;
- }
- /**
- * 获取用户指定任务的变更临时数据
- *
- * @param int $userId 用户ID
- * @param int $taskId 任务ID
- * @return TaskChangeTempDto|null 任务变更数据
- */
- public static function getUserTaskChange(int $userId, int $taskId): ?TaskChangeTempDto
- {
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- $rawData = Cache::get($tempKey, []);
- if (isset($rawData[$taskId])) {
- return TaskChangeTempDto::fromArray($rawData[$taskId]);
- }
- return null;
- }
- /**
- * 清理用户的任务变更临时数据
- *
- * @param int $userId 用户ID
- * @return void
- */
- public static function clearUserTaskChanges(int $userId): void
- {
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- Cache::forget($tempKey);
- Log::info('已清理用户任务变更临时数据', ['user_id' => $userId]);
- }
- /**
- * 清理用户指定任务的变更临时数据
- *
- * @param int $userId 用户ID
- * @param int $taskId 任务ID
- * @return void
- */
- public static function clearUserTaskChange(int $userId, int $taskId): void
- {
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- $rawData = Cache::get($tempKey, []);
- if (isset($rawData[$taskId])) {
- unset($rawData[$taskId]);
- Cache::put($tempKey, $rawData, self::TEMP_TTL);
- Log::info('已清理用户指定任务变更临时数据', [
- 'user_id' => $userId,
- 'task_id' => $taskId
- ]);
- }
- }
- }
|