182 lines
6.2 KiB
PHP
182 lines
6.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace app\controller;
|
||
|
|
|
||
|
|
use app\event\Product;
|
||
|
|
use app\model\User;
|
||
|
|
use support\Request;
|
||
|
|
use support\Response;
|
||
|
|
|
||
|
|
class TestProductBuyController extends Base
|
||
|
|
{
|
||
|
|
private $output = '';
|
||
|
|
|
||
|
|
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, // 购买金额
|
||
|
|
'quantity' => 1 // 购买数量
|
||
|
|
]
|
||
|
|
];
|
||
|
|
|
||
|
|
// 生成随机用户数据
|
||
|
|
$users = $this->generateRandomUsers($test_params['users']);
|
||
|
|
|
||
|
|
// 构建用户关系链
|
||
|
|
$users = $this->buildUserChain($users, $test_params['chain']);
|
||
|
|
|
||
|
|
// 获取购买者(最后一个用户)
|
||
|
|
$buyer_id = max(array_keys($users));
|
||
|
|
|
||
|
|
// 模拟购买数据
|
||
|
|
$product_data = [
|
||
|
|
'user_id' => $buyer_id,
|
||
|
|
'product_id' => 1,
|
||
|
|
'questionnaire_id' => 1,
|
||
|
|
'id' => 1,
|
||
|
|
'amount' => round($test_params['purchase']['amount'], 4),
|
||
|
|
'quantity' => $test_params['purchase']['quantity']
|
||
|
|
];
|
||
|
|
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("=====================================================================\n");
|
||
|
|
cp( "购买者关系链:\n");
|
||
|
|
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,($users[$buyer_id]['role_id'] == 2 ? 'VIP' : '渠道商'),$product_data['amount']);
|
||
|
|
|
||
|
|
cp("\n========================================\n");
|
||
|
|
$Product = new \app\event\Product();
|
||
|
|
$Product->test($product_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, 10);
|
||
|
|
}
|
||
|
|
$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;
|
||
|
|
}
|
||
|
|
}
|