mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 12:57:32 +08:00
150 lines
4.0 KiB
PHP
150 lines
4.0 KiB
PHP
<?php
|
||
namespace addons\shopro\library;
|
||
|
||
use app\admin\model\shopro\user\User as UserModel;
|
||
|
||
/**
|
||
* 邀请码工具类
|
||
*/
|
||
class InviteHelper
|
||
{
|
||
/**
|
||
* 为用户生成邀请码
|
||
* @param int $userId 用户ID
|
||
* @return string 邀请码
|
||
*/
|
||
public static function generateCode($userId)
|
||
{
|
||
$user = UserModel::find($userId);
|
||
|
||
if (!$user) {
|
||
return '';
|
||
}
|
||
|
||
// 已有邀请码直接返回
|
||
if ($user->invite_code) {
|
||
return $user->invite_code;
|
||
}
|
||
|
||
// 生成唯一邀请码(排除易混淆字符)
|
||
$chars = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
|
||
$maxAttempts = 50;
|
||
|
||
for ($i = 0; $i < $maxAttempts; $i++) {
|
||
$code = '';
|
||
for ($j = 0; $j < 6; $j++) {
|
||
$code .= $chars[mt_rand(0, strlen($chars) - 1)];
|
||
}
|
||
|
||
// 检查是否重复
|
||
if (!UserModel::where('invite_code', $code)->find()) {
|
||
$user->invite_code = $code;
|
||
$user->save();
|
||
return $code;
|
||
}
|
||
}
|
||
|
||
// 兜底:用MD5
|
||
$code = strtoupper(substr(md5($userId . time() . mt_rand()), 0, 6));
|
||
$user->invite_code = $code;
|
||
$user->save();
|
||
|
||
return $code;
|
||
}
|
||
|
||
/**
|
||
* 验证邀请码
|
||
* @param string $inviteCode 邀请码
|
||
* @return array
|
||
*/
|
||
public static function validate($inviteCode)
|
||
{
|
||
$inviteCode = strtoupper(trim($inviteCode));
|
||
|
||
if (strlen($inviteCode) !== 6) {
|
||
return ['code' => 0, 'msg' => '邀请码格式错误'];
|
||
}
|
||
|
||
$inviter = UserModel::where('invite_code', $inviteCode)
|
||
->where('status', 'normal')
|
||
->field(['id', 'nickname', 'avatar', 'invite_code'])
|
||
->find();
|
||
|
||
if (!$inviter) {
|
||
return ['code' => 0, 'msg' => '邀请码不存在'];
|
||
}
|
||
|
||
return [
|
||
'code' => 1,
|
||
'msg' => '邀请码有效',
|
||
'data' => [
|
||
'user_id' => $inviter->id,
|
||
'invite_code' => $inviter->invite_code,
|
||
'inviter' => [
|
||
'id' => $inviter->id,
|
||
'nickname' => $inviter->nickname,
|
||
'avatar' => $inviter->avatar
|
||
]
|
||
]
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 绑定上下级关系
|
||
* @param string $inviteCode 邀请码
|
||
* @param int $userId 被邀请人ID
|
||
* @return array
|
||
*/
|
||
public static function bind($inviteCode, $userId)
|
||
{
|
||
$inviteCode = strtoupper(trim($inviteCode));
|
||
$user = UserModel::find($userId);
|
||
|
||
if (!$user) {
|
||
return ['code' => 0, 'msg' => '用户不存在'];
|
||
}
|
||
|
||
// 已绑定过上级
|
||
if ($user->parent_user_id !== null) {
|
||
return ['code' => 0, 'msg' => '您已有推荐人,无法修改'];
|
||
}
|
||
|
||
// 验证邀请码
|
||
$validateResult = self::validate($inviteCode);
|
||
if ($validateResult['code'] != 1) {
|
||
return $validateResult;
|
||
}
|
||
|
||
$inviterUserId = $validateResult['data']['user_id'];
|
||
|
||
// 不能邀请自己
|
||
if ($inviterUserId == $userId) {
|
||
return ['code' => 0, 'msg' => '不能使用自己的邀请码'];
|
||
}
|
||
|
||
// 绑定
|
||
$user->parent_user_id = $inviterUserId;
|
||
$user->invite_code_used = $inviteCode;
|
||
$user->save();
|
||
|
||
\think\Log::info("邀请码绑定: 邀请人[{$inviterUserId}] -> 被邀请人[{$userId}] 邀请码[{$inviteCode}]");
|
||
|
||
// 触发分销业绩统计
|
||
$agent = new \addons\shopro\service\commission\Agent($userId);
|
||
$agent->createAsyncAgentUpgrade($userId);
|
||
|
||
// 添加分销推广记录
|
||
\app\admin\model\shopro\commission\Log::add(
|
||
$inviterUserId,
|
||
'share',
|
||
['user' => $user, 'type' => 'invite_code']
|
||
);
|
||
|
||
return [
|
||
'code' => 1,
|
||
'msg' => '绑定成功',
|
||
'data' => $validateResult['data']
|
||
];
|
||
}
|
||
}
|