151916-扩展UrsUserMappingService支持自动创建用户.md 4.5 KB

扩展UrsUserMappingService支持自动创建用户

任务时间: 2025年06月15日 19:16-19:19
任务类型: 功能扩展
模块: UrsPromotion

任务描述

扩展UrsUserMappingService::getFarmUserId方法,使其在不存在映射关系时自动创建新用户并绑定关系。

需求分析

  • 当URS用户ID不存在对应的农场用户映射时,自动创建新的农场用户
  • 用户名格式:'urs-' + ursUserId
  • 密码:随机生成12位字符串
  • 自动建立URS用户与农场用户的映射关系

实现方案

1. 修改getFarmUserId方法逻辑

原逻辑

  • 直接调用模型方法查询映射关系
  • 不存在时返回null

新逻辑

  1. 首先尝试获取现有映射关系
  2. 如果存在,直接返回农场用户ID
  3. 如果不存在,执行自动创建流程:
    • 生成用户名:'urs-' + ursUserId
    • 生成随机密码:Str::random(12)
    • 调用UserService创建新用户
    • 创建用户映射关系
    • 返回新创建的农场用户ID

2. 代码修改

文件: app/Module/UrsPromotion/Services/UrsUserMappingService.php

添加导入

use App\Module\User\Services\UserService;
use Illuminate\Support\Str;

方法重构

public static function getFarmUserId(int $ursUserId): ?int
{
    // 首先尝试获取现有映射关系
    $existingFarmUserId = UrsUserMapping::getFarmUserIdByUrsUserId($ursUserId);
    if ($existingFarmUserId !== null) {
        return $existingFarmUserId;
    }

    // 不存在映射关系,自动创建新用户并建立映射
    try {
        DB::beginTransaction();

        // 生成用户名和随机密码
        $username = 'urs-' . $ursUserId;
        $password = Str::random(12);

        // 创建新用户
        $userDto = UserService::create($username, $password);
        if (is_string($userDto)) {
            // 创建失败
            DB::rollBack();
            Log::error('自动创建URS用户失败', [
                'urs_user_id' => $ursUserId,
                'username' => $username,
                'error' => $userDto
            ]);
            return null;
        }

        // 创建用户映射关系
        $mapping = UrsUserMapping::create([
            'urs_user_id' => $ursUserId,
            'user_id' => $userDto->id,
            'mapping_time' => now(),
            'status' => UrsUserMapping::STATUS_VALID,
        ]);

        DB::commit();

        Log::info('自动创建URS用户映射成功', [
            'urs_user_id' => $ursUserId,
            'farm_user_id' => $userDto->id,
            'username' => $username,
            'mapping_id' => $mapping->id
        ]);

        return $userDto->id;

    } catch (\Exception $e) {
        DB::rollBack();
        Log::error('自动创建URS用户映射失败', [
            'urs_user_id' => $ursUserId,
            'error' => $e->getMessage()
        ]);
        return null;
    }
}

技术特点

1. 数据库事务

  • 使用数据库事务确保用户创建和映射关系建立的原子性
  • 任何步骤失败都会回滚,保证数据一致性

2. 错误处理

  • 详细的异常捕获和日志记录
  • 区分不同类型的失败原因
  • 失败时返回null,不影响调用方的正常流程

3. 日志记录

  • 成功创建时记录详细信息
  • 失败时记录错误原因和相关参数
  • 便于问题排查和监控

4. 向后兼容

  • 保持原有方法签名不变
  • 现有调用代码无需修改
  • 只是扩展了功能,不影响现有逻辑

测试建议

  1. 正常流程测试

    • 测试不存在映射关系时的自动创建功能
    • 验证创建的用户名格式正确
    • 确认映射关系正确建立
  2. 异常情况测试

    • 测试用户创建失败的处理
    • 测试数据库异常的回滚机制
    • 验证日志记录的完整性
  3. 性能测试

    • 测试大量并发调用的性能表现
    • 验证事务处理的效率

提交信息

扩展UrsUserMappingService::getFarmUserId方法,支持自动创建用户并绑定关系

- 当URS用户ID不存在映射关系时,自动创建新的农场用户
- 用户名格式:'urs-' + ursUserId
- 密码:随机生成12位字符串
- 自动建立URS用户与农场用户的映射关系
- 添加详细的日志记录和异常处理
- 使用数据库事务确保数据一致性

总结

成功扩展了UrsUserMappingService::getFarmUserId方法,实现了自动创建用户并绑定关系的功能。该实现具有良好的错误处理机制、完整的日志记录和数据一致性保证,同时保持了向后兼容性。