PHP转盘抽奖


<?php
include __DIR__ . '/header.php';

$input = SFRequest::json();



//查询用户当前有多少票
$chance_num = TUserInfo::query()
    ->leftJoin('t_wechat_user','t_wechat_user.f_openid','=','user_info.f_open_id')
    ->where('f_open_id', (string)$input['f_open_id'])
    ->get();
$user_current_chance = object_array(json_decode($chance_num));
//有票扣一次,没有返回-1
if ($user_current_chance[0]['f_chance'] > 1&&$user_current_chance[0]['get_prize_num']>0) {

    $chance = TUserInfo::query()
        ->where('f_open_id', (string)$input['f_open_id'])
        ->decrement('f_chance', 2, ['updated_at' => date('Y-m-d H:i:s')]);
    TUserInfo::query()
        ->where('f_open_id', (string)$input['f_open_id'])
        ->decrement('get_prize_num', 1, ['updated_at' => date('Y-m-d H:i:s')]);

    $data = TPrize::query()
        ->get();
    $prize_arr = object_array(json_decode($data));
    foreach ($prize_arr as $key => $val) {
        $arr[$val['id']] = $val['rate'];
    }
    $rid = get_rand($arr); //根据概率获取奖项id
    //如果抽中的奖品没库存了,就返回再接再厉了。中了库存-1,添加记录
    if ($prize_arr[$rid - 1]['num'] === 0) {
        $res['id'] = 7; //中奖项
        $res['name'] = '再接再厉'; //中奖项
        $status = 0;
    } else {
        //如果抽中的不是再接再厉正常-1,加记录,如果抽的再接再厉,不记录,不减库存
        if ($prize_arr[$rid - 1]['id'] != 7) {
            $result = TPrize::query()
                ->where('id', $prize_arr[$rid - 1]['id'])
                ->decrement('num', 1, ['updated_at' => date('Y-m-d H:i:s')]);
            TRecord::query()
                ->insertGetId([
                    'f_open_id' => (string)$input['f_open_id'],
                    'user_name' =>$user_current_chance[0]['f_nickname'],
                    'action' => $prize_arr[$rid - 1]['prize'] . '当前库存' . ($prize_arr[$rid - 1]['num'] - (int)1),
                    'prize' => $prize_arr[$rid - 1]['prize'],
                    'create_at' => date('Y-m-d H:i:s'),
                ]);
            $res['id'] = $prize_arr[$rid - 1]['id']; //中奖项
            $res['name'] = $prize_arr[$rid - 1]['prize']; //中奖项
            $status = 0;
        } else {
            $res['id'] = $prize_arr[$rid - 1]['id']; //中奖项
            $res['name'] = $prize_arr[$rid - 1]['prize']; //中奖项
            $status = 0;
        }
    }
}else if($user_current_chance[0]['get_prize_num']===0){
    $status=-100;
    $res['name']=null;
    $res['id']=null;
} else {
    $status = -1;
    $res['name']=null;
    $res['id']=null;
}

echo json_encode([
    'id' => $res['id'],
    'name' => $res['name'],
    'status' => $status
]);

function object_array($array)
{
    if (is_object($array)) {
        $array = (array)$array;
    }
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            $array[$key] = object_array($value);
        }
    }
    return $array;
}

function get_rand($proArr)
{
    $result = '';
    //概率数组的总概率精度
    $proSum = array_sum($proArr);
    //概率数组循环
    foreach ($proArr as $key => $proCur) {
        $randNum = mt_rand(1, $proSum);
        if ($randNum <= $proCur) {
            $result = $key;
            break;
        } else {
            $proSum -= $proCur;
        }
    }
    unset ($proArr);
    return $result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值