FundTemp.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace App\Module\Game\Logics;
  3. use App\Module\Fund\Events\FundChangedEvent;
  4. use App\Module\Game\Dtos\FundChangeTempDto;
  5. use Illuminate\Support\Facades\Log;
  6. use UCore\Helper\Cache;
  7. /**
  8. * 资金临时数据逻辑类
  9. *
  10. * 负责处理资金变更事件的临时数据存储逻辑,包括:
  11. * 1. 将资金变更数据临时存储
  12. * 2. 按照用户进行存储
  13. * 3. 同一资金类型多次变更进行数据覆盖
  14. */
  15. class FundTemp
  16. {
  17. /**
  18. * 临时数据键前缀
  19. */
  20. const TEMP_KEY_PREFIX = 'game:fund:changed:';
  21. /**
  22. * 临时数据过期时间(秒)
  23. */
  24. const TEMP_TTL = 3600; // 1小时
  25. /**
  26. * 处理资金变更事件
  27. *
  28. * 将资金变更数据临时存储,按用户ID和资金类型ID进行存储
  29. * 同一资金类型多次变更会覆盖之前的数据
  30. *
  31. * @param FundChangedEvent $event 资金变更事件
  32. * @return void
  33. */
  34. public static function handleFundChanged(FundChangedEvent $event): void
  35. {
  36. try {
  37. // 构建临时数据键,按用户ID进行存储
  38. $tempKey = self::TEMP_KEY_PREFIX . $event->userId;
  39. // 获取当前用户的资金变更临时数据
  40. $userFundsTemp = Cache::get($tempKey, []);
  41. // 构建资金变更数据
  42. $fundData = [
  43. 'fund_id' => $event->fundId,
  44. 'old_balance' => $event->beforeBalance,
  45. 'new_balance' => $event->afterBalance,
  46. 'change_amount' => $event->amount,
  47. 'updated_at' => time(),
  48. ];
  49. // 使用资金类型ID作为键,实现同一资金类型多次变更的数据覆盖
  50. $userFundsTemp[$event->fundId] = $fundData;
  51. // 将更新后的数据存回临时存储
  52. Cache::put($tempKey, $userFundsTemp, self::TEMP_TTL);
  53. Log::info('资金变更数据已临时存储', [
  54. 'user_id' => $event->userId,
  55. 'fund_id' => $event->fundId,
  56. 'change_amount' => $event->amount,
  57. ]);
  58. } catch (\Exception $e) {
  59. Log::error('资金变更数据临时存储失败', [
  60. 'error' => $e->getMessage(),
  61. 'user_id' => $event->userId,
  62. 'fund_id' => $event->fundId,
  63. ]);
  64. }
  65. }
  66. /**
  67. * 获取用户的资金变更临时数据
  68. *
  69. * @param int $userId 用户ID
  70. * @return FundChangeTempDto[] 用户的资金变更数据
  71. */
  72. public static function getUserFundChanges(int $userId): array
  73. {
  74. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  75. $rawData = Cache::get($tempKey, []);
  76. $result = [];
  77. foreach ($rawData as $fundId => $fundData) {
  78. $result[$fundId] = FundChangeTempDto::fromArray($fundData);
  79. }
  80. return $result;
  81. }
  82. /**
  83. * 获取用户特定资金类型的变更临时数据
  84. *
  85. * @param int $userId 用户ID
  86. * @param int $fundId 资金类型ID
  87. * @return FundChangeTempDto|null 资金变更数据,不存在时返回null
  88. */
  89. public static function getUserFundChange(int $userId, int $fundId): ?FundChangeTempDto
  90. {
  91. $userFundChanges = self::getUserFundChanges($userId);
  92. return $userFundChanges[$fundId] ?? null;
  93. }
  94. /**
  95. * 清除用户的资金变更临时数据
  96. *
  97. * @param int $userId 用户ID
  98. * @return void
  99. */
  100. public static function clearUserFundChanges(int $userId): void
  101. {
  102. $tempKey = self::TEMP_KEY_PREFIX . $userId;
  103. Cache::put($tempKey, [], 0);
  104. }
  105. }