|
|
@@ -0,0 +1,256 @@
|
|
|
+<?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
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|