176 lines
6.0 KiB
PHP
176 lines
6.0 KiB
PHP
<?php
|
|
|
|
namespace app\controller;
|
|
|
|
use app\model\User;
|
|
use support\Request;
|
|
use support\Response;
|
|
use app\event\Role;
|
|
|
|
class TestRoleBuyController
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
ob_start();
|
|
ob_implicit_flush(false);
|
|
|
|
// 测试参数配置
|
|
$test_params = [
|
|
'users' => [
|
|
'count' => 30, // 用户总数
|
|
'min_direct' => 5, // 最小直推人数
|
|
'max_direct' => 30, // 最大直推人数
|
|
'role_weights' => [ // 角色权重分布
|
|
1 => 0, // 普通用户 30%
|
|
2 => 70, // VIP 35%
|
|
3 => 30 // 渠道商 35%
|
|
]
|
|
],
|
|
'chain' => [
|
|
'min_depth' => 5, // 最小层级深度
|
|
'max_depth' => 15, // 最大层级深度
|
|
'max_children' => 5 // 每个用户最多下级数
|
|
],
|
|
'purchase' => [
|
|
'amount' => 1000, // 购买金额
|
|
'role_id' => 3 // 购买者角色(2=VIP, 3=渠道商)
|
|
]
|
|
];
|
|
|
|
// 生成随机用户数据
|
|
$users = $this->generateRandomUsers($test_params['users']);
|
|
|
|
// 构建用户关系链
|
|
$users = $this->buildUserChain($users, $test_params['chain']);
|
|
|
|
// 获取购买者(最后一个用户)
|
|
$buyer_id = max(array_keys($users));
|
|
|
|
// 模拟购买数据
|
|
$buy_data = [
|
|
'user_id' => $buyer_id,
|
|
'amount' => round($test_params['purchase']['amount'], 4),
|
|
'role_id' => Input('role_id',2)
|
|
];
|
|
|
|
cp("<pre>");
|
|
// 输出用户关系链
|
|
// cp("所有用户列表:");
|
|
// cp("========================================");
|
|
|
|
// // 显示所有用户信息
|
|
// foreach ($users as $user_id => $user) {
|
|
// $role_text = $user['role_id'] == 1 ? '普通用户' : ($user['role_id'] == 2 ? 'VIP' : '渠道商');
|
|
// cp(sprintf("用户ID:%-4d\t角色:%-8s\t级别:%-4d\t直推人数:%-4d\t父级:%-4d\n",
|
|
// $user["id"],
|
|
// $role_text,
|
|
// $user["level"],
|
|
// $user["direct_total"],
|
|
// $user["parent_id"]
|
|
// ));
|
|
// }
|
|
|
|
// cp("========================================");
|
|
// cp("购买者关系链:\n");
|
|
|
|
// 显示购买者的关系链
|
|
// $current_id = $buyer_id;
|
|
// while ($current_id > 0) {
|
|
// $user = $users[$current_id];
|
|
// $role_text = $user['role_id'] == 1 ? '普通用户' : ($user['role_id'] == 2 ? 'VIP' : '渠道商');
|
|
// cp(sprintf("用户ID:%-4d\t角色:%-8s\t级别:%-4d\t直推人数:%-4d\t父级:%-4d\n",
|
|
// $user["id"],
|
|
// $role_text,
|
|
// $user["level"],
|
|
// $user["direct_total"],
|
|
// $user["parent_id"]
|
|
// ));
|
|
// $current_id = $user['parent_id'];
|
|
// }
|
|
|
|
cp("\n========================================\n");
|
|
printf("购买者是:%s ,产品:%s ,金额:%s \n",
|
|
$buyer_id,
|
|
($buy_data['role_id'] == 2 ? 'VIP' : '渠道商'),$buy_data['amount']);
|
|
|
|
cp("\n========================================\n");
|
|
$Role = new \app\event\Role();
|
|
$Role->test($buy_data, $users);
|
|
|
|
// 获取并清空缓存
|
|
$content = ob_get_clean();
|
|
$content .= "</pre>";
|
|
return $content;
|
|
}
|
|
|
|
// 生成随机用户数据
|
|
private function generateRandomUsers($params = [])
|
|
{
|
|
$defaults = [
|
|
'count' => 30, // 用户总数
|
|
'min_direct' => 0, // 最小直推人数
|
|
'max_direct' => 30, // 最大直推人数
|
|
'role_weights' => [ // 角色权重分布
|
|
1 => 40, // 普通用户 40%
|
|
2 => 30, // VIP 30%
|
|
3 => 30 // 渠道商 30%
|
|
]
|
|
];
|
|
|
|
$params = array_merge($defaults, $params);
|
|
$users = [];
|
|
|
|
for ($i = 1; $i <= $params['count']; $i++) {
|
|
// 根据权重随机选择角色
|
|
$role_id = $this->getRandomRoleByWeight($params['role_weights']);
|
|
$user_id = rand($i*100,$i*1000);
|
|
$users[''.$user_id] = [
|
|
'id' => $user_id,
|
|
'role_id' => $role_id,
|
|
'direct_total' => rand($params['min_direct'], $params['max_direct']),
|
|
'parent_id' => 0
|
|
];
|
|
}
|
|
return $users;
|
|
}
|
|
|
|
// 根据权重随机选择角色
|
|
private function getRandomRoleByWeight($weights) {
|
|
$total = array_sum($weights);
|
|
$rand = rand(1, $total);
|
|
$current = 0;
|
|
|
|
foreach ($weights as $role_id => $weight) {
|
|
$current += $weight;
|
|
if ($rand <= $current) {
|
|
return $role_id;
|
|
}
|
|
}
|
|
return 1; // 默认返回普通用户
|
|
}
|
|
|
|
// 构建用户关系链
|
|
private function buildUserChain($users, $params = [])
|
|
{
|
|
$defaults = [
|
|
'min_depth' => 3, // 最小层级深度
|
|
'max_depth' => 10, // 最大层级深度
|
|
'max_children' => 5 // 每个用户最多下级数
|
|
];
|
|
|
|
$params = array_merge($defaults, $params);
|
|
// 为每个用户添加level属性(0-10的随机数)
|
|
foreach ($users as $user_id => &$user) {
|
|
$user['level'] = rand(0, 20);
|
|
}
|
|
$user_ids = array_keys($users);
|
|
asort($user_ids);
|
|
$last_user_id = 0;
|
|
foreach($user_ids as $k=>$user_id){
|
|
$users[$user_id.'']['parent_id'] = $last_user_id;
|
|
$last_user_id = $user_id;
|
|
}
|
|
|
|
return $users;
|
|
}
|
|
} |