161619-修复用户登录后资金账户未创建问题.md 4.2 KB

修复用户登录后资金账户未创建问题

时间: 2025年06月16日 16:19
问题: 用户登录后,资金账户未创建,比如:userid 38936

问题分析

问题现象

  • 用户38936登录后,在kku_fund表中没有对应的资金账户记录
  • 用户存在于kku_users表中,但缺少必要的资金账户

问题原因

通过代码分析发现:

  1. Fund模块提供了AccountService::check4user()方法用于检查和创建用户账户
  2. 但是在登录成功事件中,没有Fund模块的监听器来自动创建资金账户
  3. 只有Farm模块和User模块有登录成功事件的监听器

修复方案

1. 创建Fund模块的登录成功事件监听器

文件: app/Module/Fund/Listeners/LoginSuccessListener.php

<?php

namespace App\Module\Fund\Listeners;

use App\Module\AppGame\Events\LoginSuccessEvent;
use App\Module\Fund\Services\AccountService;
use Illuminate\Support\Facades\Log;

/**
 * 登录成功事件监听器
 *
 * 监听用户登录成功事件,自动创建用户资金账户
 */
class LoginSuccessListener
{
    /**
     * 处理事件
     *
     * @param LoginSuccessEvent $event
     * @return void
     */
    public function handle(LoginSuccessEvent $event): void
    {
        try {
            $userId = $event->user->id;

            Log::info('用户登录成功,开始检查和创建资金账户', [
                'user_id' => $userId,
                'login_time' => $event->loginTime
            ]);

            // 检查和创建用户资金账户
            AccountService::check4user($userId);

            Log::info('用户资金账户检查和创建完成', [
                'user_id' => $userId
            ]);

        } catch (\Exception $e) {
            Log::error('处理登录成功事件失败,资金账户创建失败', [
                'error' => $e->getMessage(),
                'user_id' => $event->user->id,
                'trace' => $e->getTraceAsString()
            ]);
        }
    }
}

2. 更新Fund模块的服务提供者

文件: app/Module/Fund/Providers/FundServiceProvider.php

添加登录成功事件监听器的注册:

use App\Module\AppGame\Events\LoginSuccessEvent;
use App\Module\Fund\Listeners\LoginSuccessListener;

protected $listen = [
    // ... 其他事件监听器
    LoginSuccessEvent::class => [
        LoginSuccessListener::class . '@handle',
    ],
];

3. 修复UserActivityService中的枚举类型错误

问题: UserActivityService::updateLoginTime方法中使用了错误的枚举类型

修复: 将STATUS2::Normal改为STATUS::Off

// 修复前
$userInfo = UserInfo::firstOrCreate(
    ['user_id' => $userId],
    ['status' => \App\Module\User\Enums\STATUS2::Normal]
);

// 修复后
$userInfo = UserInfo::firstOrCreate(
    ['user_id' => $userId],
    ['status' => \App\Module\User\Enums\STATUS::Off]
);

4. 创建测试命令

文件: app/Module/Fund/Commands/TestLoginAccountCreationCommand.php

创建测试命令验证登录时资金账户自动创建功能。

修复结果

1. 为用户38936手动创建资金账户

INSERT INTO kku_fund (user_id, fund_id, balance, create_time, update_time) VALUES 
(38936, 1, 0.0000000000, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(38936, 2, 0.0000000000, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(38936, 3, 0.0000000000, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());

2. 验证自动创建功能

通过测试命令验证:

  • 新用户登录前:0个资金账户
  • 触发登录成功事件后:自动创建3个资金账户(金币、钻石、钻石冻结)

测试验证

# 运行测试命令
php artisan fund:test-login-account-creation {user_id}

测试结果显示:

  • 登录成功事件正确触发Fund模块监听器
  • 自动创建了所有必要的资金账户类型
  • 账户初始余额为0,符合预期

总结

通过创建Fund模块的登录成功事件监听器,成功解决了用户登录后资金账户未创建的问题。现在所有新用户在登录时都会自动创建完整的资金账户体系,确保系统功能的正常运行。

影响范围:

  • 所有新登录用户将自动创建资金账户
  • 现有用户不受影响,已有账户保持不变
  • 系统稳定性和用户体验得到提升