| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- <?php
- namespace App\Module\Game\Logics;
- use App\Module\Fund\Events\FundChangedEvent;
- use App\Module\Game\Dtos\FundChangeTempDto;
- use Illuminate\Support\Facades\Log;
- use UCore\Helper\Cache;
- /**
- * 资金临时数据逻辑类
- *
- * 负责处理资金变更事件的临时数据存储逻辑,包括:
- * 1. 将资金变更数据临时存储
- * 2. 按照用户进行存储
- * 3. 同一资金类型多次变更进行数据覆盖
- */
- class FundTemp
- {
- /**
- * 临时数据键前缀
- */
- const TEMP_KEY_PREFIX = 'game:fund:changed:';
- /**
- * 临时数据过期时间(秒)
- */
- const TEMP_TTL = 3600; // 1小时
- /**
- * 处理资金变更事件
- *
- * 将资金变更数据临时存储,按用户ID和资金类型ID进行存储
- * 同一资金类型多次变更会覆盖之前的数据
- *
- * @param FundChangedEvent $event 资金变更事件
- * @return void
- */
- public static function handleFundChanged(FundChangedEvent $event): void
- {
- try {
- // 构建临时数据键,按用户ID进行存储
- $tempKey = self::TEMP_KEY_PREFIX . $event->userId;
- // 获取当前用户的资金变更临时数据
- $userFundsTemp = Cache::get($tempKey, []);
- // 构建资金变更数据
- $fundData = [
- 'fund_id' => $event->fundId,
- 'old_balance' => $event->beforeBalance,
- 'new_balance' => $event->afterBalance,
- 'change_amount' => $event->amount,
- 'updated_at' => time(),
- ];
- // 使用资金类型ID作为键,实现同一资金类型多次变更的数据覆盖
- $userFundsTemp[$event->fundId] = $fundData;
- // 将更新后的数据存回临时存储
- Cache::put($tempKey, $userFundsTemp, self::TEMP_TTL);
- Log::info('资金变更数据已临时存储', [
- 'user_id' => $event->userId,
- 'fund_id' => $event->fundId,
- 'change_amount' => $event->amount,
- ]);
- } catch (\Exception $e) {
- Log::error('资金变更数据临时存储失败', [
- 'error' => $e->getMessage(),
- 'user_id' => $event->userId,
- 'fund_id' => $event->fundId,
- ]);
- }
- }
- /**
- * 获取用户的资金变更临时数据
- *
- * @param int $userId 用户ID
- * @return FundChangeTempDto[] 用户的资金变更数据
- */
- public static function getUserFundChanges(int $userId): array
- {
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- $rawData = Cache::get($tempKey, []);
- $result = [];
- foreach ($rawData as $fundId => $fundData) {
- $result[$fundId] = FundChangeTempDto::fromArray($fundData);
- }
- return $result;
- }
- /**
- * 获取用户特定资金类型的变更临时数据
- *
- * @param int $userId 用户ID
- * @param int $fundId 资金类型ID
- * @return FundChangeTempDto|null 资金变更数据,不存在时返回null
- */
- public static function getUserFundChange(int $userId, int $fundId): ?FundChangeTempDto
- {
- $userFundChanges = self::getUserFundChanges($userId);
- return $userFundChanges[$fundId] ?? null;
- }
- /**
- * 清除用户的资金变更临时数据
- *
- * @param int $userId 用户ID
- * @return void
- */
- public static function clearUserFundChanges(int $userId): void
- {
- $tempKey = self::TEMP_KEY_PREFIX . $userId;
- Cache::put($tempKey, [], 0);
- }
- }
|