提交代码
This commit is contained in:
parent
2a367c5c3c
commit
19f1f3e7b6
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -5,4 +5,5 @@ vendor/*
|
|||
404.html
|
||||
public/.well-known/*
|
||||
public/ueditor/*
|
||||
public/pay_log/*
|
||||
public/pay_log/*
|
||||
public/draw_log/*
|
||||
|
|
@ -744,7 +744,7 @@ class Notify extends Base
|
|||
private function weightedRandom(array $weights)
|
||||
{
|
||||
$sum = array_sum($weights);
|
||||
$rand = mt_rand(1, $sum);
|
||||
$rand = random_int(1, $sum);
|
||||
|
||||
foreach ($weights as $index => $weight) {
|
||||
$rand -= $weight;
|
||||
|
|
@ -1182,7 +1182,7 @@ class Notify extends Base
|
|||
// 生成随机数 (保持与原始方法相同的精度:100000)
|
||||
|
||||
$maxRand = (int) ($totalProbability * $multiple);
|
||||
$random = mt_rand(0, $maxRand) / $multiple;
|
||||
$random = random_int(0, $maxRand) / $multiple;
|
||||
|
||||
// 查找中奖奖品
|
||||
$prize_id = null;
|
||||
|
|
@ -1266,10 +1266,10 @@ class Notify extends Base
|
|||
$order_id = $order['id'];#订单ID
|
||||
$goods_id = $order['goods_id'];#盒子ID
|
||||
$prize_num = $order['prize_num'];#抽奖数量
|
||||
$order_type = $order['order_type'];#订单类型
|
||||
// $order_type = $order['order_type'];#订单类型
|
||||
$whe = [];
|
||||
$whe[] = ['id', '=', $order['goods_id']];
|
||||
$infinite_goods = Goods::getInfo($whe, 'type,lingzhu_is,lingzhu_fan,lingzhu_shang_id,king_user_id');
|
||||
$infinite_goods = Goods::getInfo($whe, '*');
|
||||
|
||||
$where = [];
|
||||
$where[] = ['goods_id', '=', $goods_id];
|
||||
|
|
@ -1284,12 +1284,12 @@ class Notify extends Base
|
|||
}
|
||||
$where[] = ['goods_list_id', '=', 0];
|
||||
#查找奖品
|
||||
$goodslist = GoodsList::field('id,shang_id,real_pro')
|
||||
$goodslist = GoodsList::field('id,shang_id,real_pro,title,price,money')
|
||||
->where($where)
|
||||
->select()->toArray();
|
||||
if ($goodslist) {
|
||||
|
||||
$res[] = $this->infinite_drawprize_box($goodslist, $prize_num, $order_id, $user_id, $goods_id, $order_type, $infinite_goods);
|
||||
$res[] = $this->infinite_drawprize_box($goodslist, $prize_num, $user_id, $goods_id, $infinite_goods, $order);
|
||||
|
||||
// 更新Redis中盒子的热度值(增加本次抽奖次数)
|
||||
$this->updateGoodsHeat($goods_id, $prize_num);
|
||||
|
|
@ -1321,8 +1321,10 @@ class Notify extends Base
|
|||
* 抽出奖品
|
||||
* @param $order 订单信息
|
||||
*/
|
||||
protected function infinite_drawprize_box($goodslist, $prize_num, $order_id, $user_id, $goods_id, $order_type, $infinite_goods)
|
||||
protected function infinite_drawprize_box1($goodslist, $prize_num, $user_id, $goods_id, $infinite_goods, $order)
|
||||
{
|
||||
$order_id = $order['id'];
|
||||
$order_type = $order['order_type'];
|
||||
|
||||
// 计算总概率
|
||||
$totalProbability = array_sum(array_column($goodslist, 'real_pro'));
|
||||
|
|
@ -1339,24 +1341,21 @@ class Notify extends Base
|
|||
'end' => $currentRange
|
||||
];
|
||||
}
|
||||
//获取抽奖倍数,100000
|
||||
$multiple = ConfigHelper::getInfiniteMultiple();
|
||||
$lingzhu_shang_id = 0;
|
||||
if (!$infinite_goods) {
|
||||
$infinite_goods = Goods::getInfo(['id' => $goods_id], 'type,lingzhu_is,lingzhu_fan,lingzhu_shang_id,king_user_id');
|
||||
}
|
||||
if ($infinite_goods != null && $infinite_goods['type'] == 8 && $infinite_goods['lingzhu_is'] == 1) {
|
||||
// $infinite_goods['lingzhu_shang_id']
|
||||
$lingzhu_shang_id = $infinite_goods['lingzhu_shang_id'];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
for ($i = 0; $i < $prize_num; $i++) {
|
||||
// 生成随机数 (保持与原始方法相同的精度:100000)
|
||||
|
||||
$maxRand = (int) ($totalProbability * $multiple);
|
||||
$random = mt_rand(0, $maxRand) / $multiple;
|
||||
$random = random_int(0, $maxRand) / $multiple;
|
||||
// 查找中奖奖品
|
||||
$prize_id = null;
|
||||
foreach ($probabilityRanges as $range) {
|
||||
|
|
@ -1432,12 +1431,427 @@ class Notify extends Base
|
|||
->where('goods_list_id', '=', $prize_info['id'])
|
||||
->select()->toArray();
|
||||
// $res[] = $this->infinite_drawprize_box($order);
|
||||
$res[] = $this->infinite_drawprize_box($goodslist_1, 1, $order_id, $user_id, $goods_id, $order_type, $infinite_goods);
|
||||
$res[] = $this->infinite_drawprize_box($goodslist_1, 1, $user_id, $goods_id, $infinite_goods, $order);
|
||||
}
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
/**
|
||||
* 无限抽奖箱:每次抽奖重新随机排序并构建概率区间
|
||||
*
|
||||
* @param array $goodslist 奖品列表(每个奖品需要包含 real_pro 字段作为概率)
|
||||
* @param int $prize_num 抽奖次数
|
||||
* @param int $order_id 订单ID
|
||||
* @param int $user_id 用户ID
|
||||
* @param int $goods_id 商品ID
|
||||
* @param int $order_type 订单类型
|
||||
* @param array|null $infinite_goods 商品扩展信息(用于领主赏判断)
|
||||
* @return array 抽奖结果集合
|
||||
*/
|
||||
protected function infinite_drawprize_box($goodslist, $prize_num, $user_id, $goods_id, $infinite_goods, $order)
|
||||
{
|
||||
// 记录抽奖总开始时间
|
||||
$total_start_time = microtime(true);
|
||||
|
||||
// 记录抽奖出货总金额
|
||||
$total_prize_money = 0;
|
||||
|
||||
$order_id = $order['id'];//订单id
|
||||
$order_type = $order['order_type'];//订单类型
|
||||
$order_num = $order['order_num'];//订单编号
|
||||
$res = []; // 保存每次抽奖结果
|
||||
$multiple = ConfigHelper::getInfiniteMultiple(); // 获取随机倍数(例如100000)
|
||||
|
||||
// 将赏品列表转换为map格式,以id为键,便于快速查找
|
||||
$shang_list_array = Shang::field('id,title')->select()->toArray();
|
||||
$shang_list = [];
|
||||
foreach ($shang_list_array as $shang) {
|
||||
$shang_list[$shang['id']] = $shang['title'];
|
||||
}
|
||||
|
||||
$lingzhu_shang_id = 0; // 初始化领主赏上级ID
|
||||
if (!$infinite_goods) {
|
||||
$infinite_goods = Goods::getInfo(['id' => $goods_id], '*');
|
||||
}
|
||||
if ($infinite_goods != null && $infinite_goods['type'] == 8 && $infinite_goods['lingzhu_is'] == 1) {
|
||||
$lingzhu_shang_id = $infinite_goods['lingzhu_shang_id'];
|
||||
}
|
||||
|
||||
// 创建日志数据集合数组
|
||||
$log_data_collection = [];
|
||||
|
||||
// 循环抽奖指定次数
|
||||
for ($i = 0; $i < $prize_num; $i++) {
|
||||
// 记录单次抽奖开始时间
|
||||
$single_start_time = microtime(true);
|
||||
|
||||
// 用于记录日志的数据
|
||||
$log_data = [
|
||||
'draw_num' => $i + 1,
|
||||
'user_id' => $user_id,
|
||||
'box_id' => $goods_id,
|
||||
'order_num' => $order_num,
|
||||
'probability_ranges' => []
|
||||
];
|
||||
|
||||
// 1. 每次抽奖前,随机打乱奖品列表
|
||||
$shuffledGoodsList = $goodslist;
|
||||
shuffle($shuffledGoodsList);
|
||||
// 2. 重新计算总概率和构建新的概率区间
|
||||
$totalProbability = array_sum(array_column($shuffledGoodsList, 'real_pro'));
|
||||
$probabilityRanges = [];
|
||||
$currentRange = 0;
|
||||
foreach ($shuffledGoodsList as $good) {
|
||||
$rangeStart = $currentRange;
|
||||
$currentRange += $good['real_pro'];
|
||||
$probabilityRanges[] = [
|
||||
'id' => $good['id'],
|
||||
'start' => $rangeStart,
|
||||
'end' => $currentRange
|
||||
];
|
||||
|
||||
// 收集奖品区间分布数据用于日志
|
||||
// 判断$good中是否已包含需要的信息
|
||||
if (isset($good['title']) && isset($good['price'])) {
|
||||
$log_data['probability_ranges'][] = [
|
||||
'id' => $good['id'],
|
||||
'title' => $good['title'],
|
||||
'price' => $good['price'],
|
||||
'money' => $good['money'],
|
||||
'start' => $rangeStart,
|
||||
'shang_id' => $good['shang_id'],
|
||||
'shang_title' => isset($shang_list[$good['shang_id']]) ? $shang_list[$good['shang_id']] : '未知',
|
||||
'end' => $currentRange,
|
||||
'real_pro' => $good['real_pro']
|
||||
];
|
||||
} else {
|
||||
// 如果没有,才查询数据库
|
||||
$good_info = GoodsList::where(['id' => $good['id']])->field('id,title,price,money,real_pro,shang_id')->find();
|
||||
if ($good_info) {
|
||||
$log_data['probability_ranges'][] = [
|
||||
'id' => $good['id'],
|
||||
'title' => $good_info['title'],
|
||||
'price' => $good_info['price'],
|
||||
'money' => $good_info['money'],
|
||||
'shang_id' => $good_info['shang_id'],
|
||||
'shang_title' => isset($shang_list[$good_info['shang_id']]) ? $shang_list[$good_info['shang_id']] : '未知',
|
||||
'start' => $rangeStart,
|
||||
'end' => $currentRange,
|
||||
'real_pro' => $good_info['real_pro']
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 随机生成一个数,根据区间确定中奖奖品
|
||||
$maxRand = (int) ($totalProbability * $multiple);
|
||||
$random = random_int(0, $maxRand) / $multiple;
|
||||
|
||||
// 记录随机数
|
||||
$log_data['random'] = $random;
|
||||
|
||||
$prize_id = null;
|
||||
foreach ($probabilityRanges as $range) {
|
||||
if ($random >= $range['start'] && $random < $range['end']) {
|
||||
$prize_id = $range['id'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$prize_id) {
|
||||
// 记录日志 - 未中奖
|
||||
$log_data['prize_id'] = 0;
|
||||
$log_data['prize_title'] = '未中奖';
|
||||
|
||||
// 计算单次抽奖耗时
|
||||
$single_end_time = microtime(true);
|
||||
$log_data['execution_time'] = round(($single_end_time - $single_start_time) * 1000, 2); // 毫秒
|
||||
|
||||
// 收集日志数据而不是立即写入
|
||||
$log_data_collection[] = $log_data;
|
||||
continue; // 防止异常空抽
|
||||
}
|
||||
|
||||
// 4. 获取中奖奖品详细信息
|
||||
$prize_info = GoodsList::where(['id' => $prize_id])->find();
|
||||
if (!$prize_info) {
|
||||
// 记录日志 - 奖品信息不存在
|
||||
$log_data['prize_id'] = $prize_id;
|
||||
$log_data['prize_title'] = '奖品信息不存在';
|
||||
|
||||
// 计算单次抽奖耗时
|
||||
$single_end_time = microtime(true);
|
||||
$log_data['execution_time'] = round(($single_end_time - $single_start_time) * 1000, 2); // 毫秒
|
||||
|
||||
// 收集日志数据而不是立即写入
|
||||
$log_data_collection[] = $log_data;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 累加中奖金额到总金额
|
||||
$total_prize_money += (float)$prize_info['money'];
|
||||
$log_data['prize_money'] = $prize_info['money'];
|
||||
|
||||
// 5. 处理编号
|
||||
$luck_no = OrderList::field('luck_no')
|
||||
->where('goods_id', '=', $goods_id)
|
||||
->where('num', '=', 0)
|
||||
->where('order_type', '=', $order_type)
|
||||
->order('id desc')
|
||||
->value('luck_no');
|
||||
$luck_no = $luck_no ? $luck_no + 1 : 1;
|
||||
|
||||
// 6. 处理翻倍赏
|
||||
$doubling = $prize_info['doubling'] ?? 0;
|
||||
|
||||
// 7. 判断是否是领主赏
|
||||
$lingzhu = $prize_info['is_lingzhu'] ?? 0;
|
||||
if ($infinite_goods['type'] == 8) {
|
||||
if ($lingzhu_shang_id > 0 && $lingzhu == 0) {
|
||||
if ($lingzhu_shang_id == $prize_info['shang_id']) {
|
||||
$lingzhu = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 记录日志数据
|
||||
$log_data['prize_id'] = $prize_info['id'];
|
||||
$log_data['prize_title'] = $prize_info['title'];
|
||||
$log_data['doubling'] = $doubling;
|
||||
$log_data['is_lingzhu'] = $lingzhu;
|
||||
$log_data['is_king'] = isset($infinite_goods['king_user_id']) && $infinite_goods['king_user_id'] == $user_id ? 1 : 0;
|
||||
$log_data['is_box'] = $prize_info['goods_type'] == 4 ? 1 : 0;
|
||||
$log_data['shang_id'] = $prize_info['shang_id'];
|
||||
$log_data['shang_title'] = isset($shang_list[$prize_info['shang_id']]) ? $shang_list[$prize_info['shang_id']] : '未知';
|
||||
|
||||
// 8. 组装抽奖记录
|
||||
$save_prize_info = [
|
||||
'order_id' => $order_id,
|
||||
'user_id' => $user_id,
|
||||
'status' => 0, // 0未操作
|
||||
'goods_id' => $goods_id,
|
||||
'num' => 0,
|
||||
'doubling' => $doubling,
|
||||
'shang_id' => $prize_info['shang_id'],
|
||||
'goodslist_id' => $prize_info['id'],
|
||||
'goodslist_title' => $prize_info['title'],
|
||||
'goodslist_imgurl' => $prize_info['imgurl'],
|
||||
'goodslist_price' => $prize_info['price'],
|
||||
'goodslist_money' => $prize_info['money'],
|
||||
'goodslist_type' => $prize_info['goods_type'],
|
||||
'goodslist_sale_time' => $prize_info['sale_time'],
|
||||
'addtime' => time(),
|
||||
'prize_code' => $prize_info['prize_code'],
|
||||
'order_type' => $order_type,
|
||||
'luck_no' => $luck_no,
|
||||
'parent_goods_list_id' => $prize_info['goods_list_id'],
|
||||
'is_lingzhu' => $lingzhu,
|
||||
];
|
||||
|
||||
// 9. 插入中奖记录到订单表
|
||||
$res[] = OrderList::insert($save_prize_info);
|
||||
// 10. 如果中奖是翻倍赏,赠送货币积分
|
||||
if ($doubling > 1) {
|
||||
$bei = $doubling - 1;
|
||||
$change_money = $prize_info['money'] * $bei * 100;
|
||||
$res[] = User::changeIntegral($user_id, $change_money, 6, '抽中翻倍赏-' . $prize_info['title'] . '赠送');
|
||||
$log_data['doubling_res'] = '翻倍赠送UU币:' . $change_money;
|
||||
}
|
||||
// 11. 如果奖品绑定了额外奖励,发放奖励
|
||||
if (isset($prize_info['reward_id']) && $prize_info['reward_id'] != '') {
|
||||
$reward_res = RewardService::sendReward($user_id, $prize_info['reward_id'], '抽中' . $prize_info['title']);
|
||||
$log_data['reward_res'] = $reward_res;
|
||||
}
|
||||
|
||||
// 计算单次抽奖耗时
|
||||
$single_end_time = microtime(true);
|
||||
$log_data['execution_time'] = round(($single_end_time - $single_start_time) * 1000, 2); // 毫秒
|
||||
|
||||
// 收集日志数据而不是立即写入
|
||||
$log_data_collection[] = $log_data;
|
||||
|
||||
// 12. 如果抽到宝箱奖品,需要继续递归抽奖
|
||||
if ($prize_info['goods_type'] == 4) {
|
||||
$goodslist_1 = GoodsList::where(['goods_id' => $goods_id])
|
||||
->where('goods_list_id', '=', $prize_info['id'])
|
||||
->select()
|
||||
->toArray();
|
||||
if (!empty($goodslist_1)) {
|
||||
$box_result = $this->infinite_drawprize_box($goodslist_1, 1, $user_id, $goods_id, $infinite_goods, $order);
|
||||
// 将子抽奖的总金额加到当前总金额中
|
||||
if (isset($box_result['total_prize_money'])) {
|
||||
$total_prize_money += $box_result['total_prize_money'];
|
||||
}
|
||||
$res[] = $box_result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 计算总耗时
|
||||
$total_end_time = microtime(true);
|
||||
$total_execution_time = round(($total_end_time - $total_start_time) * 1000, 2); // 毫秒
|
||||
|
||||
// 抽奖循环结束后,统一写入日志
|
||||
if (!empty($log_data_collection)) {
|
||||
try {
|
||||
$this->recordDrawLog($log_data_collection, $infinite_goods, $order, $total_execution_time, $total_prize_money);
|
||||
} catch (\Exception $e) {
|
||||
// 记录异常信息,但不影响主流程
|
||||
\think\facade\Log::error('记录抽奖日志异常:' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// 将总金额添加到返回结果中,以便递归调用时能够累加子抽奖的金额
|
||||
$res['total_prize_money'] = $total_prize_money;
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录抽奖日志(Markdown 格式)
|
||||
* @param array $data_collection 抽奖数据集合
|
||||
* @param array $goods 商品信息
|
||||
* @param array $order 订单信息
|
||||
* @param float $total_execution_time 总执行时间(毫秒)
|
||||
* @param float $total_prize_money 总出货金额
|
||||
* @return void
|
||||
*/
|
||||
protected function recordDrawLog($data_collection, $goods, $order, $total_execution_time = 0, $total_prize_money = 0)
|
||||
{
|
||||
// 如果数据集合为空,直接返回
|
||||
if (empty($data_collection)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 获取第一条数据,用于确定日志文件路径
|
||||
// $first_data = $data_collection[0];
|
||||
$goods_id = $goods['id'];
|
||||
$goods_title = $goods['title'];
|
||||
$goods_price = $goods['price'];
|
||||
$order_num = $order['order_num'];
|
||||
// 日志目录格式:./draw_log/{box_id}/
|
||||
$log_dir = "./draw_log/{$goods_id}";
|
||||
if (!is_dir($log_dir)) {
|
||||
mkdir($log_dir, 0755, true);
|
||||
}
|
||||
|
||||
// 日志文件路径
|
||||
$log_file = $log_dir . '/' . $order_num . '.md';
|
||||
|
||||
// 是否为新文件,写入标题
|
||||
$is_new_file = !file_exists($log_file);
|
||||
|
||||
// 构建完整的日志内容
|
||||
$full_log_content = '';
|
||||
|
||||
$full_log_content .= "# 抽奖日志 - 盒子名称: {$goods_title} - 订单号: {$order_num} - 盒子ID: {$goods_id} - 盒子价格: {$goods_price} " . PHP_EOL . PHP_EOL;
|
||||
|
||||
// 添加订单详情信息
|
||||
$full_log_content .= "## 订单详情" . PHP_EOL;
|
||||
$full_log_content .= "- **订单总金额**: {$order['order_total']}" . PHP_EOL;
|
||||
$full_log_content .= "- **订单折扣金额**: {$order['order_zhe_total']}" . PHP_EOL;
|
||||
$full_log_content .= "- **微信支付**: {$order['price']}" . PHP_EOL;
|
||||
$full_log_content .= "- **钻石支付**: {$order['use_money']}" . PHP_EOL;
|
||||
$full_log_content .= "- **UU币支付**: {$order['use_integral']}" . PHP_EOL;
|
||||
$full_log_content .= "- **达达卷支付**: {$order['use_money2']}" . PHP_EOL;
|
||||
$full_log_content .= "- **优惠券ID**: {$order['coupon_id']}" . PHP_EOL;
|
||||
$full_log_content .= "- **是否首抽五折**: " . ($order['is_shou_zhe'] == 1 ? '是' : '否') . PHP_EOL;
|
||||
$full_log_content .= "- **抽奖数量**: {$order['prize_num']}" . PHP_EOL;
|
||||
$full_log_content .= "- **下单时间**: " . date('Y-m-d H:i:s', $order['addtime']) . PHP_EOL;
|
||||
if (!empty($order['pay_time'])) {
|
||||
$full_log_content .= "- **付款时间**: " . date('Y-m-d H:i:s', $order['pay_time']) . PHP_EOL;
|
||||
}
|
||||
$full_log_content .= "- **是否为福利屋**: " . ($order['is_flw'] == 1 ? '是' : '否') . PHP_EOL;
|
||||
$full_log_content .= "- **支付类型**: " . ($order['pay_type'] == 1 ? '微信' : ($order['pay_type'] == 2 ? '支付宝' : '其他')) . PHP_EOL;
|
||||
$full_log_content .= PHP_EOL;
|
||||
|
||||
// 添加总执行时间信息和出货总金额
|
||||
$full_log_content .= "## 抽奖总耗时: {$total_execution_time} 毫秒" . PHP_EOL;
|
||||
$full_log_content .= "## 本次抽奖出货总金额: {$total_prize_money}" . PHP_EOL . PHP_EOL;
|
||||
|
||||
// 处理每条抽奖记录
|
||||
foreach ($data_collection as $data) {
|
||||
// 当前时间
|
||||
$now = date('Y-m-d H:i:s');
|
||||
|
||||
$full_log_content .= "## 第 {$data['draw_num']} 次抽奖 - {$now}" . PHP_EOL;
|
||||
$full_log_content .= "- **用户ID**: {$data['user_id']}" . PHP_EOL;
|
||||
$full_log_content .= "- **随机数**: {$data['random']}" . PHP_EOL;
|
||||
$full_log_content .= "- **执行时间**: {$data['execution_time']} 毫秒" . PHP_EOL;
|
||||
|
||||
// 获取中奖ID,方便后续在表格中标红
|
||||
$winning_prize_id = isset($data['prize_id']) && $data['prize_id'] > 0 ? $data['prize_id'] : 0;
|
||||
|
||||
// 中奖信息
|
||||
if ($winning_prize_id) {
|
||||
$full_log_content .= "- **中奖ID**: {$data['prize_id']}" . PHP_EOL;
|
||||
$full_log_content .= "- **商品名**: {$data['prize_title']}" . PHP_EOL;
|
||||
if (isset($data['prize_money'])) {
|
||||
$full_log_content .= "- **奖品金额**: {$data['prize_money']}" . PHP_EOL;
|
||||
}
|
||||
if (isset($data['shang_id']) && isset($data['shang_title'])) {
|
||||
$full_log_content .= "- **赏ID**: {$data['shang_id']}" . PHP_EOL;
|
||||
$full_log_content .= "- **赏名称**: {$data['shang_title']}" . PHP_EOL;
|
||||
}
|
||||
} else {
|
||||
$full_log_content .= "- **未中奖或奖品信息异常**" . PHP_EOL;
|
||||
}
|
||||
|
||||
// 奖品翻倍
|
||||
if (isset($data['doubling']) && $data['doubling'] > 0) {
|
||||
$full_log_content .= "- **奖品翻倍**: {$data['doubling']} 倍" . PHP_EOL;
|
||||
if (isset($data['doubling_res'])) {
|
||||
$full_log_content .= "- **翻倍奖励**: {$data['doubling_res']}" . PHP_EOL;
|
||||
}
|
||||
} else {
|
||||
$full_log_content .= "- **奖品翻倍**: 无" . PHP_EOL;
|
||||
}
|
||||
|
||||
// 领主等信息
|
||||
$full_log_content .= "- **是否领主赏**: " . (isset($data['is_lingzhu']) && $data['is_lingzhu'] == 1 ? "是" : "否") . PHP_EOL;
|
||||
$full_log_content .= "- **是否领主**: " . (isset($data['is_king']) && $data['is_king'] == 1 ? "是" : "否") . PHP_EOL;
|
||||
$full_log_content .= "- **是否宝箱**: " . (isset($data['is_box']) && $data['is_box'] == 1 ? "是" : "否") . PHP_EOL;
|
||||
|
||||
// 发放奖励结果
|
||||
if (isset($data['reward_res'])) {
|
||||
$full_log_content .= "- **发放奖励结果**: " . (is_string($data['reward_res']) ? $data['reward_res'] : json_encode($data['reward_res'], JSON_UNESCAPED_UNICODE)) . PHP_EOL;
|
||||
}
|
||||
|
||||
// 奖品区间分布表格
|
||||
if (!empty($data['probability_ranges'])) {
|
||||
$full_log_content .= PHP_EOL . "### 奖品区间分布" . PHP_EOL;
|
||||
$full_log_content .= "| 奖品ID | 名称 | 价格 | 金额 | 概率 | 区间范围 | 赏ID | 赏名称 |" . PHP_EOL;
|
||||
$full_log_content .= "|--------|------|------|------|------|-----------|------|--------|" . PHP_EOL;
|
||||
foreach ($data['probability_ranges'] as $range) {
|
||||
$start = $range['start'];
|
||||
$end = $range['end'];
|
||||
$shang_id = $range['shang_id'] ?? 0;
|
||||
$shang_title = $range['shang_title'] ?? '未知';
|
||||
$money = $range['money'] ?? 0;
|
||||
|
||||
// 判断是否是中奖奖品,如果是,则把名称变成红色
|
||||
$title = $range['title'];
|
||||
if ($winning_prize_id && $winning_prize_id == $range['id']) {
|
||||
$title = "<span style=\"color:red\">{$title}</span>";
|
||||
}
|
||||
|
||||
$full_log_content .= "| {$range['id']} | {$title} | {$range['price']} | {$money} | {$range['real_pro']} | {$start} ~ {$end} | {$shang_id} | {$shang_title} |" . PHP_EOL;
|
||||
}
|
||||
}
|
||||
|
||||
$full_log_content .= PHP_EOL . "---" . PHP_EOL . PHP_EOL;
|
||||
}
|
||||
|
||||
// 一次性写入所有日志内容
|
||||
file_put_contents($log_file, $full_log_content, $is_new_file ? FILE_APPEND : (FILE_APPEND | LOCK_EX));
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// 捕获异常,防止影响主流程
|
||||
\think\facade\Log::error('记录抽奖日志异常:' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 商城赏
|
||||
|
|
@ -2488,7 +2902,7 @@ class Notify extends Base
|
|||
$payment_type = 'wxpay';
|
||||
$order_type = 'order_wxs';
|
||||
$user_id = 123;
|
||||
$order_num = 'MH_' . date('YmdHis') . mt_rand(1000, 9999);
|
||||
$order_num = 'MH_' . date('YmdHis') . random_int(1000, 9999);
|
||||
$nonce_str = getRandStr(16);
|
||||
|
||||
try {
|
||||
|
|
@ -2548,4 +2962,5 @@ class Notify extends Base
|
|||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -919,18 +919,27 @@ class User extends Base
|
|||
->where('type', '=', 5)
|
||||
->where('change_money', '>', 0)
|
||||
->sum('change_money');
|
||||
|
||||
$money1 = ProfitIntegral::field('change_money')
|
||||
->where('user_id', '=', $user_id)
|
||||
->where('type', '=', 5)
|
||||
->where('change_money', '>', 0)
|
||||
->sum('change_money');
|
||||
if ($money1 > 0) {
|
||||
$money = round($money + ($money1 / 100), 2);
|
||||
}
|
||||
#配置
|
||||
$rule = getConfig('base');
|
||||
|
||||
|
||||
// 获取用户推广海报
|
||||
$posterService = new \app\common\service\PosterService();
|
||||
$posterResult = $posterService->getUserPoster($user_id);
|
||||
|
||||
|
||||
$share_image = '';
|
||||
if ($posterResult['status']) {
|
||||
$share_image = $posterResult['data']['image_url'];
|
||||
}
|
||||
|
||||
|
||||
$new_data = [
|
||||
'share_title' => $rule['share_title'],
|
||||
'share_image' => $share_image,
|
||||
|
|
@ -1104,7 +1113,7 @@ class User extends Base
|
|||
#token字符串
|
||||
$token_num = getRandStr(10);
|
||||
#加密token
|
||||
$account_token = user_md5((string)$user_id . $token_num . (string)$time);
|
||||
$account_token = user_md5((string) $user_id . $token_num . (string) $time);
|
||||
|
||||
//修改UserAccount 表中的
|
||||
$res[] = UserAccount::where(['user_id' => $user_id])->update([
|
||||
|
|
@ -1117,15 +1126,15 @@ class User extends Base
|
|||
}
|
||||
return $this->renderSuccess("", $user_account);
|
||||
}
|
||||
|
||||
|
||||
// 检查用户是否存在
|
||||
$user = Usermodel::where('id', '=', $user_id)->find();
|
||||
if ($user) {
|
||||
// 创建新的用户账号记录
|
||||
$time = time();
|
||||
$token_num = getRandStr(10);
|
||||
$account_token = user_md5((string)$user_id . $token_num . (string)$time);
|
||||
|
||||
$account_token = user_md5((string) $user_id . $token_num . (string) $time);
|
||||
|
||||
$result = UserAccount::insert([
|
||||
'user_id' => $user_id,
|
||||
'account_token' => $account_token,
|
||||
|
|
@ -1134,7 +1143,7 @@ class User extends Base
|
|||
'last_login_time' => $time,
|
||||
'addtime' => $time,
|
||||
]);
|
||||
|
||||
|
||||
if ($result) {
|
||||
$user_account = UserAccount::where('user_id', '=', $user_id)->find();
|
||||
return $this->renderSuccess("创建账号成功", $user_account);
|
||||
|
|
@ -1142,7 +1151,7 @@ class User extends Base
|
|||
return $this->renderError("创建账号失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $this->renderError("用户id错误");
|
||||
}
|
||||
|
||||
|
|
@ -1155,7 +1164,7 @@ class User extends Base
|
|||
$lastUser = Usermodel::where('mobile', 'like', '187611270%')
|
||||
->order('id', 'desc')
|
||||
->find();
|
||||
|
||||
|
||||
if (!$lastUser) {
|
||||
// 如果不存在,从18761127000开始
|
||||
$newMobile = '18761127000';
|
||||
|
|
@ -1163,28 +1172,28 @@ class User extends Base
|
|||
// 获取最后两位并加1
|
||||
$lastTwoDigits = substr($lastUser['mobile'], -2);
|
||||
$newLastTwoDigits = intval($lastTwoDigits) + 1;
|
||||
|
||||
|
||||
// 确保两位数格式
|
||||
$newLastTwoDigits = str_pad((string)$newLastTwoDigits, 2, '0', STR_PAD_LEFT);
|
||||
$newLastTwoDigits = str_pad((string) $newLastTwoDigits, 2, '0', STR_PAD_LEFT);
|
||||
$newMobile = '187611270' . $newLastTwoDigits;
|
||||
}
|
||||
|
||||
|
||||
// 生成随机数作为昵称的一部分
|
||||
$randomNum = mt_rand(1000, 9999);
|
||||
$nickname = '微信用户' . $randomNum;
|
||||
|
||||
|
||||
// 生成随机openid
|
||||
$openid = 'oVQcD' . getRandStr(28);
|
||||
|
||||
|
||||
// 头像url
|
||||
$headimg = 'https://image.zfunbox.cn/storage/users/icon/default/1613.png';
|
||||
|
||||
|
||||
// 当前时间戳
|
||||
$time = time();
|
||||
|
||||
|
||||
// 随机生成uid
|
||||
$uid = mt_rand(100000, 999999);
|
||||
|
||||
|
||||
// 开始事务
|
||||
Db::startTrans();
|
||||
try {
|
||||
|
|
@ -1213,11 +1222,11 @@ class User extends Base
|
|||
'istest' => 0,
|
||||
'uid' => $uid
|
||||
]);
|
||||
|
||||
|
||||
// 生成token
|
||||
$token_num = getRandStr(10);
|
||||
$account_token = user_md5((string)$userId . $token_num . (string)$time);
|
||||
|
||||
$account_token = user_md5((string) $userId . $token_num . (string) $time);
|
||||
|
||||
// 插入用户账号表
|
||||
UserAccount::insert([
|
||||
'user_id' => $userId,
|
||||
|
|
@ -1225,19 +1234,19 @@ class User extends Base
|
|||
'token_num' => $token_num,
|
||||
'token_time' => $time,
|
||||
'last_login_time' => $time,
|
||||
'last_login_ip'=>'2085608754'
|
||||
'last_login_ip' => '2085608754'
|
||||
]);
|
||||
|
||||
|
||||
// 提交事务
|
||||
Db::commit();
|
||||
|
||||
|
||||
return $this->renderSuccess('创建用户成功', [
|
||||
'user_id' => $userId,
|
||||
'mobile' => $newMobile,
|
||||
'nickname' => $nickname,
|
||||
'headimg' => $headimg
|
||||
]);
|
||||
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// 回滚事务
|
||||
Db::rollback();
|
||||
|
|
|
|||
|
|
@ -343,7 +343,7 @@ class User extends Base
|
|||
$pid = self::field('id')->where('id', '=', $order['user_id'])->value('pid');
|
||||
if ($pid) {
|
||||
//赠送Uu币
|
||||
$res[] = self::changeIntegral($pid, $jiangli * 100, 5, '邀请好友奖励', $order['user_id'], '奖励比例:' . $fx_bili);
|
||||
$res[] = self::changeIntegral($pid, $jiangli * 100, 5, ' ·', $order['user_id'], '奖励比例:' . $fx_bili);
|
||||
}
|
||||
}
|
||||
if (empty($res)) {
|
||||
|
|
@ -424,6 +424,14 @@ class User extends Base
|
|||
->where('share_uid', '=', $data['id'])
|
||||
->where('change_money', '>', 0)
|
||||
->sum('change_money');
|
||||
$money1 = ProfitIntegral::field('change_money')
|
||||
->where('user_id', '=', $data['pid'])
|
||||
->where('type', '=', 5)
|
||||
->where('change_money', '>', 0)
|
||||
->sum('change_money');
|
||||
if ($money1 > 0) {
|
||||
$money = round($money + ($money1 / 100), 2);
|
||||
}
|
||||
return $money;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user