用户绑定关系是URS推广模块的核心基础功能,负责建立和管理URS系统用户与农场系统用户之间的映射关系。该功能实现了分离映射关系设计,使得URS推广系统可以独立于农场用户系统存在,同时保持两个系统之间的数据关联。
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| urs_user_id | bigint | URS用户ID(核心标识) |
| user_id | bigint | 农场用户ID(对应users表) |
| mapping_time | timestamp | 映射建立时间(用户进入农场时间) |
| status | tinyint | 状态:1有效,0无效 |
| is_active | tinyint | 是否活跃:1活跃,0不活跃 |
| last_activity_check | timestamp | 最后活跃检查时间 |
| active_days_count | int | 活跃天数统计 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
// 映射状态
const STATUS_INVALID = 0; // 无效
const STATUS_VALID = 1; // 有效
// 活跃状态
const ACTIVE_NO = 0; // 不活跃
const ACTIVE_YES = 1; // 活跃
PRIMARY KEY (id)UNIQUE KEY uk_urs_user_id (urs_user_id) - 确保URS用户唯一映射UNIQUE KEY uk_user_id (user_id) - 确保农场用户唯一映射KEY idx_mapping_time (mapping_time) - 支持时间查询KEY idx_status (status) - 支持状态筛选/**
* 创建用户映射关系(用户进入农场时调用)
* @param int $ursUserId URS用户ID
* @param int $farmUserId 农场用户ID
* @return UrsUserMappingDto
*/
public static function createMapping(int $ursUserId, int $farmUserId): UrsUserMappingDto
/**
* 根据URS用户ID获取农场用户ID
* @param int $ursUserId URS用户ID
* @return int|null 农场用户ID,如果未找到返回null
*/
public static function getFarmUserId(int $ursUserId): ?int
/**
* 根据农场用户ID获取URS用户ID
* @param int $farmUserId 农场用户ID
* @return int|null URS用户ID,如果未找到返回null
*/
public static function getUrsUserId(int $farmUserId): ?int
/**
* 检查URS用户是否已进入农场
* @param int $ursUserId URS用户ID
* @return bool
*/
public static function hasEnteredFarm(int $ursUserId): bool
/**
* 获取或创建农场用户ID(不存在时自动创建)
* @param int $ursUserId URS用户ID
* @return int|null 农场用户ID,创建失败返回null
*/
public static function getOrCreateFarmUserId(int $ursUserId): ?int
/**
* 批量获取URS用户ID对应的农场用户ID
* @param array $ursUserIds URS用户ID数组
* @return array 映射关系数组 [urs_user_id => farm_user_id]
*/
public static function batchGetFarmUserIds(array $ursUserIds): array
/**
* 禁用用户映射关系
* @param int $ursUserId URS用户ID
* @return bool
*/
public static function disableMapping(int $ursUserId): bool
/**
* 启用用户映射关系
* @param int $ursUserId URS用户ID
* @return bool
*/
public static function enableMapping(int $ursUserId): bool
/**
* 获取映射统计信息
* @return array
*/
public static function getMappingStats(): array
/**
* 获取用户映射详情
* @param int $ursUserId URS用户ID
* @return UrsUserMappingDto|null
*/
public static function getMappingDetail(int $ursUserId): ?UrsUserMappingDto
graph TD
A[URS用户进入农场] --> B{检查是否已有映射关系}
B -->|已存在| C{检查映射的农场用户ID是否匹配}
C -->|匹配| D[返回现有映射关系]
C -->|不匹配| E[抛出异常:已映射到其他用户]
B -->|不存在| F{检查农场用户ID是否已被映射}
F -->|已被映射| G[抛出异常:农场用户已被映射]
F -->|未被映射| H[创建新映射关系]
H --> I[记录操作日志]
I --> J[返回映射关系DTO]
graph TD
A[获取或创建农场用户] --> B{检查是否已有映射关系}
B -->|已存在| C[返回现有农场用户ID]
B -->|不存在| D[生成用户名: urs-{ursUserId}]
D --> E[生成随机密码]
E --> F[调用UserService创建用户]
F --> G{用户创建是否成功}
G -->|失败| H[记录错误日志并返回null]
G -->|成功| I[创建用户映射关系]
I --> J[记录成功日志]
J --> K[返回农场用户ID]
use App\Module\UrsPromotion\Services\UrsUserMappingService;
// 用户进入农场时建立映射关系
$ursUserId = 1001;
$farmUserId = 2001;
try {
$mapping = UrsUserMappingService::createMapping($ursUserId, $farmUserId);
echo "映射关系建立成功,ID: " . $mapping->id;
} catch (\Exception $e) {
echo "建立失败: " . $e->getMessage();
}
// 查询映射关系
$farmUserId = UrsUserMappingService::getFarmUserId(1001);
$ursUserId = UrsUserMappingService::getUrsUserId(2001);
// 检查用户是否已进入农场
$hasEntered = UrsUserMappingService::hasEnteredFarm(1001);
// 获取或自动创建农场用户
$ursUserId = 1002;
$farmUserId = UrsUserMappingService::getOrCreateFarmUserId($ursUserId);
if ($farmUserId) {
echo "农场用户ID: " . $farmUserId;
} else {
echo "创建失败";
}
// 批量获取映射关系
$ursUserIds = [1001, 1002, 1003];
$mappings = UrsUserMappingService::batchGetFarmUserIds($ursUserIds);
foreach ($mappings as $ursUserId => $farmUserId) {
echo "URS用户 {$ursUserId} 映射到农场用户 {$farmUserId}";
}
// 获取已进入农场的URS用户列表
$enteredUsers = UrsUserMapping::getEnteredFarmUrsUserIds($ursUserIds);
try {
$mapping = UrsUserMappingService::createMapping($ursUserId, $farmUserId);
} catch (\Exception $e) {
Log::error('用户映射创建失败', [
'urs_user_id' => $ursUserId,
'farm_user_id' => $farmUserId,
'error' => $e->getMessage()
]);
// 根据异常类型进行不同处理
if (strpos($e->getMessage(), '已映射') !== false) {
// 处理重复映射异常
}
}
所有映射关系的关键操作都会记录详细日志: