TaskTemp.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace App\Module\Game\Logics;
  3. use App\Module\Game\Dtos\TaskChangeTempDto;
  4. use App\Module\Task\Events\TaskCompletedEvent;
  5. use App\Module\Task\Events\TaskRewardClaimedEvent;
  6. use Illuminate\Support\Facades\Log;
  7. use UCore\Helper\Cache;
  8. /**
  9. * 任务临时数据逻辑类
  10. *
  11. * 负责处理任务相关事件的临时数据存储逻辑,包括:
  12. * 1. 将任务状态变更数据临时存储
  13. * 2. 将任务进度变更数据临时存储
  14. * 3. 将任务奖励领取数据临时存储
  15. * 4. 按照用户进行存储
  16. * 5. 同一任务多次变更进行数据覆盖
  17. */
  18. class TaskTemp
  19. {
  20. /**
  21. * 临时数据键前缀
  22. */
  23. const TEMP_KEY_PREFIX = 'game:task:changed:';
  24. /**
  25. * 临时数据过期时间(秒)
  26. */
  27. const TEMP_TTL = 3600; // 1小时
  28. /**
  29. * 处理任务完成事件
  30. *
  31. * 将任务完成数据临时存储,按用户ID进行存储
  32. *
  33. * @param TaskCompletedEvent $event 任务完成事件
  34. * @return void
  35. */
  36. public static function handleTaskCompleted(TaskCompletedEvent $event): void
  37. {
  38. try {
  39. // 构建临时数据键,按用户ID进行存储
  40. $tempKey = self::TEMP_KEY_PREFIX . $event->userId;
  41. // 获取当前用户的任务变更临时数据
  42. $userTasksTemp = Cache::get($tempKey, []);
  43. // 构建任务变更数据
  44. $taskData = [
  45. 'task_id' => $event->taskId,
  46. 'task_name' => $event->taskName,
  47. 'change_type' => 'completed',
  48. 'status' => 'completed',
  49. 'completed_at' => $event->completedAt ? $event->completedAt->timestamp : time(),
  50. 'updated_at' => time(),
  51. ];
  52. // 使用任务ID作为键,避免同一任务的多次变更相互覆盖
  53. $userTasksTemp[$event->taskId] = $taskData;
  54. // 将更新后的数据存回临时存储
  55. Cache::put($tempKey, $userTasksTemp, self::TEMP_TTL);
  56. Log::info('任务完成数据已临时存储', [
  57. 'user_id' => $event->userId,
  58. 'task_id' => $event->taskId,
  59. 'task_name' => $event->taskName,
  60. ]);
  61. } catch (\Exception $e) {
  62. Log::error('任务完成数据临时存储失败', [
  63. 'error' => $e->getMessage(),
  64. 'user_id' => $event->userId,
  65. 'task_id' => $event->taskId,
  66. ]);
  67. }
  68. }
  69. /**
  70. * 处理任务奖励领取事件
  71. *
  72. * 将任务奖励领取数据临时存储,按用户ID进行存储
  73. *
  74. * @param TaskRewardClaimedEvent $event 任务奖励领取事件
  75. * @return void
  76. */
  77. public static function handleTaskRewardClaimed(TaskRewardClaimedEvent $event): void
  78. {
  79. try {
  80. // 构建临时数据键,按用户ID进行存储
  81. $tempKey = self::TEMP_KEY_PREFIX . $event->userId;
  82. // 获取当前用户的任务变更临时数据
  83. $userTasksTemp = Cache::get($tempKey, []);
  84. // 构建任务变更数据
  85. $taskData = [
  86. 'task_id' => $event->taskId,
  87. 'task_name' => $event->taskName,
  88. 'change_type' => 'reward_claimed',
  89. 'status' => 'rewarded',
  90. 'rewards' => $event->rewards,
  91. 'rewarded_at' => $event->rewardedAt ? $event->rewardedAt->timestamp : time(),
  92. 'updated_at' => time(),
  93. ];
  94. // 使用任务ID作为键,避免同一任务的多次变更相互覆盖
  95. $userTasksTemp[$event->taskId] = $taskData;
  96. // 将更新后的数据存回临时存储
  97. Cache::put($tempKey, $userTasksTemp, self::TEMP_TTL);
  98. Log::info('任务奖励领取数据已临时存储', [
  99. 'user_id' => $event->userId,
  100. 'task_id' => $event->taskId,
  101. 'task_name' => $event->taskName,
  102. 'rewards_count' => count($event->rewards),
  103. ]);
  104. } catch (\Exception $e) {
  105. Log::error('任务奖励领取数据临时存储失败', [
  106. 'error' => $e->getMessage(),
  107. 'user_id' => $event->userId,
  108. 'task_id' => $event->taskId,
  109. ]);
  110. }
  111. }
  112. /**
  113. * 处理任务进度更新
  114. *
  115. * 将任务进度更新数据临时存储,按用户ID进行存储
  116. *
  117. * @param int $userId 用户ID
  118. * @param int $taskId 任务ID
  119. * @param string $taskName 任务名称
  120. * @param int $progress 进度百分比
  121. * @param array $progressDetails 进度详情
  122. * @return void
  123. */
  124. public static function handleTaskProgressUpdated(int $userId, int $taskId, string $taskName, int $progress, array $progressDetails = []): void
  125. {
  126. try {
  127. // 构建临时数据键,按用户ID进行存储
  128. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  129. // 获取当前用户的任务变更临时数据
  130. $userTasksTemp = Cache::get($tempKey, []);
  131. // 构建任务变更数据
  132. $taskData = [
  133. 'task_id' => $taskId,
  134. 'task_name' => $taskName,
  135. 'change_type' => 'progress_updated',
  136. 'status' => 'in_progress',
  137. 'progress' => $progress,
  138. 'progress_details' => $progressDetails,
  139. 'updated_at' => time(),
  140. ];
  141. // 使用任务ID作为键,避免同一任务的多次变更相互覆盖
  142. $userTasksTemp[$taskId] = $taskData;
  143. // 将更新后的数据存回临时存储
  144. Cache::put($tempKey, $userTasksTemp, self::TEMP_TTL);
  145. Log::info('任务进度更新数据已临时存储', [
  146. 'user_id' => $userId,
  147. 'task_id' => $taskId,
  148. 'task_name' => $taskName,
  149. 'progress' => $progress,
  150. ]);
  151. } catch (\Exception $e) {
  152. Log::error('任务进度更新数据临时存储失败', [
  153. 'error' => $e->getMessage(),
  154. 'user_id' => $userId,
  155. 'task_id' => $taskId,
  156. ]);
  157. }
  158. }
  159. /**
  160. * 获取用户的任务变更临时数据
  161. *
  162. * @param int $userId 用户ID
  163. * @return TaskChangeTempDto[] 用户的任务变更数据
  164. */
  165. public static function getUserTaskChanges(int $userId): array
  166. {
  167. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  168. $rawData = Cache::get($tempKey, []);
  169. $result = [];
  170. foreach ($rawData as $taskId => $taskData) {
  171. $result[] = TaskChangeTempDto::fromArray($taskData);
  172. }
  173. return $result;
  174. }
  175. /**
  176. * 获取用户指定任务的变更临时数据
  177. *
  178. * @param int $userId 用户ID
  179. * @param int $taskId 任务ID
  180. * @return TaskChangeTempDto|null 任务变更数据
  181. */
  182. public static function getUserTaskChange(int $userId, int $taskId): ?TaskChangeTempDto
  183. {
  184. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  185. $rawData = Cache::get($tempKey, []);
  186. if (isset($rawData[$taskId])) {
  187. return TaskChangeTempDto::fromArray($rawData[$taskId]);
  188. }
  189. return null;
  190. }
  191. /**
  192. * 清理用户的任务变更临时数据
  193. *
  194. * @param int $userId 用户ID
  195. * @return void
  196. */
  197. public static function clearUserTaskChanges(int $userId): void
  198. {
  199. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  200. Cache::forget($tempKey);
  201. Log::info('已清理用户任务变更临时数据', ['user_id' => $userId]);
  202. }
  203. /**
  204. * 清理用户指定任务的变更临时数据
  205. *
  206. * @param int $userId 用户ID
  207. * @param int $taskId 任务ID
  208. * @return void
  209. */
  210. public static function clearUserTaskChange(int $userId, int $taskId): void
  211. {
  212. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  213. $rawData = Cache::get($tempKey, []);
  214. if (isset($rawData[$taskId])) {
  215. unset($rawData[$taskId]);
  216. Cache::put($tempKey, $rawData, self::TEMP_TTL);
  217. Log::info('已清理用户指定任务变更临时数据', [
  218. 'user_id' => $userId,
  219. 'task_id' => $taskId
  220. ]);
  221. }
  222. }
  223. }