PHP大转盘抽奖运营活动概率随机数算法附数据库

PHP后端代码

<?php
namespace app\mobile\controller;

use think\Config;
use think\Controller;
use think\Url;
use think\Db;
use think\Exception;
use think\Log;
use think\Session;

class Test extends Controller
{
    public $lottery_name = 'mike';

    public function indexAction($load=false)
    {
        echo 3;exit;
    }

    public function doLotteryAction(){
        $mobile         = 111;
        $lotteryCode    = request()->param('lottery_code', $this->lottery_name);
        $lottery        = Db::table('lottery')->where(['code'=>$lotteryCode, 'valid'=>1])->find();
        $date           = date("Y-m-d H:i:s");
        if($date<$lottery['start_time']){
            $return['result'] = 0;
            $return['message'] = '活动尚未开始';
            return json($return);
        }
        if($date>=$lottery['end_time']){
            $return['result'] = 0;
            $return['message'] = '活动已结束';
            return json($return);
        }

        if(false){
            $return['result'] = 0;
            $return['message'] = '您当前已无抽奖次数';
            return json($return);
        }

        $where = [
            'lottery_code'=>$lotteryCode,
            'probability'=>['gt',0],//概率必须大于0
            'stock'       =>['gt', 0],//奖品必须大于0个
        ];
        $options            = Db::table('lottery_options')->where($where)->order('id asc')->select();

        $probability_all    = 0;//概率总和
        foreach($options as $k=>$option){
            $probability_all += $option['probability'];
        }

        $num            = rand(0, $probability_all);
        $bingoOption    = [];//抽中的奖品
        $lastPro        = 0;
        foreach($options as $option){
            $lastPro    += $option["probability"];
            if ($lastPro >= $num)
            {
                $bingoOption = $option;
                break;
            }
        }
        if(!$bingoOption){
            $return['result'] = 0;
            $return['message'] = '抽奖失败,奖池已无奖品';
            return json($return);
        }

        print_r($bingoOption);exit;

        $lotteryData = [
            'option_id'     => $bingoOption['id'],
            'lottery_options_name' => $bingoOption['name'],
            'mobile'        => $mobile,
            'created_at'    => $date,
            'ip'            => request()->ip(0, true),
        ];

        Db::startTrans();
        try{
            //奖品池数量减1
            Db::table('lottery_options')->where(['id' => $bingoOption['id']])->setDec('stock',1);
            //写入抽奖记录
            $historyId = Db::table('lottery_history')->insertGetId($lotteryData);
            Db::commit();

            $return['result'] = 1;
            $return['data'] = [
                'id' => $bingoOption['id'],
                'name' => $bingoOption['name'],
                'history_id' => $historyId,
            ];
        }catch(Exception $e){
            Log::error($e->getMessage());
            Db::rollback();
            $return['result'] = 0;
            $return['message'] = '抽奖失败,请重试';
        }

        return json($return);
    }

}

 

SQL


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for lottery
-- ----------------------------
DROP TABLE IF EXISTS `lottery`;
CREATE TABLE `lottery` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(50) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `start_time` datetime DEFAULT NULL,
  `end_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for lottery_history
-- ----------------------------
DROP TABLE IF EXISTS `lottery_history`;
CREATE TABLE `lottery_history` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `option_id` int(11) DEFAULT NULL,
  `mobile` varchar(50) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `ip` char(15) DEFAULT NULL,
  `lottery_options_name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for lottery_options
-- ----------------------------
DROP TABLE IF EXISTS `lottery_options`;
CREATE TABLE `lottery_options` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lottery_code` varchar(50) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `probability` int(255) DEFAULT NULL,
  `stock` int(11) DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值