项目4:抽奖程序 分时间段(按时段设置的奖品数为概率)-阿里云开发者社区

开发者社区> 风来了> 正文

项目4:抽奖程序 分时间段(按时段设置的奖品数为概率)

简介: 数据库先 activity_lyq_lottery 奖品表 lotteryid name 礼品名称 sum 礼品总数 time_start 开始时间 time_end 结束时间 addtime 时间 probability 中奖概率 大于0:表示概率 0:表示奖品数为概率 isdisable 是否开启 0开启1关闭 listorder 排序 默认正序 msg 发
+关注继续查看

数据库先

activity_lyq_lottery	奖品表	
lotteryid		
name	礼品名称	
sum	礼品总数	
time_start	开始时间	
time_end	结束时间	
addtime	时间	
probability	中奖概率	大于0:表示概率    0:表示奖品数为概率
isdisable	是否开启	0开启1关闭
listorder	排序	默认正序
msg	发送短信或显示信息	
content	备注	
angle	转盘角度	奖品所在的角度
time_1	时间段个数限制	个数限制,-1表示不限制,0表示不发
time_2		
time_3		
time_4		
time_5		
time_6		
time_7		
time_8		
time_9		
time_10		
time_11		
time_12		
time_13		
time_14		
time_15		
time_16		
time_17		
		
		
		
activity_lyq_lottery_log	抽奖日志	
logid	ID	
uid	用户ID	
tel	手机号	
addtime	抽奖时间	
ip	抽奖IP	
lotteryid	奖品ID	
iswinning	是否抽中	1抽中0无
result	返状态回值	
hao	随机号	

主程序

<?php
require_once (APP_ROOT . "./class/class_lib.php");
require_once libfile ( 'class/StoreProcs' );
pc_base::load_app_class('table_sub','',0);
/**
 * 大转盘
 * @author Administrator
 *
 */
class lib_dzp_lottery extends app_lib {
	/**
	 * 奖品表
	 */
	public $lottery = 'activity_lyq_lottery';
	/**
	 * 奖品日志表
	 */
	public $lottery_log = 'activity_lyq_lottery_log';
	/**
	 * n等奖品
	 */
	private $level = array();
	/**
	 * 奖品信息
	 */
	private $lotteryArray = array();
	/***
	 * 随机数结束位数
	 */
	private $max = 30000;
	/**
	 * 中奖专业户
	 */
	private $tel_zy=false;
	/**
	 *增加时段时间
	 */
	private $second=0;
	/**
	 *时段时间
	 */
	private $time=array();
	/**
	 * 读取配置
	 */
	public function load_setting() {
		$data=getcache('lyqdzp_setting');
		define('TIME', time());									//当前时间
		define('L_START', strtotime($data['l_start']));			//报名开始时间
		define('L_END', strtotime($data['l_end']));				//报名结束时间,-1意思昨天 23:59:59
		define('L_DAY_START',$data['l_day_start']);				//每天开始时间
		define('L_DAY_END', $data['l_day_end']);				//每天结束时间
		define('L_DAY_CISHU', $data['l_day_cishu']);			//每天获得奖品次数
		define('L_CISHU', $data['l_cishu']);					//共计获得奖品次数
		define('L_MIN', 20);									//最少来福币
		define('L_LFB', $data['l_lfb']);						//减少来福币
		define('L_ZY', $data['l_zy']);							//专业户
		define('L_QUANSHU', $data['l_quanshu']);				//圈数,大转盘开始圈数
		define('L_KONGJIANG', intval($data['l_kongjiang']));			//空奖概率
		$host='www.*****.com';								//现网
		if($_SERVER['HTTP_HOST']=='221.******'){
			$host='221.*******';						//测试机
		}elseif($_SERVER['HTTP_HOST']=='125.com'){
			$host='125life.com';								//本地
		}elseif(strpos($_SERVER['HTTP_HOST'],'192.168.')==0){
			//$host=$_SERVER['HTTP_HOST'].'/125.com';			//本地
		}
		define('L_SITE', 'http://'.$host.'/');					//域名最后加/
		define('L_URL', L_SITE.'index.php');	//访问地址
		
		//只能通过flash地址访问
		$s=L_SITE.'flash/zhuanpan/i.swf';
		if(preg_replace('/swf.*$/','swf',$_SERVER['HTTP_REFERER'])!=$s){
			exit('老兄你已经得到得够多了,请通过正规途径摇奖!');
		}
		$this->load();
	}
	/**
	 * 黑名单
	 */
	private $heimingdan = array();
	/**
	 * 读取奖品配置
	 */
	public function load() {
		$this->setlottery ();
		$this->heimingdan = getcache ( 'tel', 'blanklist' );
	}
	private function setlottery() {
		$time=strtotime(date('Y-m-d',TIME));
		$sql = "select u.* ";
		$sql .= " from " . DB::table ( $this->lottery ) . " AS u ";
		$sql .= " where 1 ";
		$sql .= " and u.isdisable='0' ";
		$sql .= " and u.time_start<='$time' ";
		$sql .= " and u.time_end>='$time' ";
		$sql .= " ORDER BY u.listorder ";
		$d = DB::fetch_all ( $sql );
		
		foreach ( $d as $r ) {
			$sql = "select count(*) m from " . DB::table ( $this->lottery_log );
			$sql .= " where lotteryid='".$r ['lotteryid']."' and iswinning='1' ";
			$r ['num']= intval ( DB::result_first ( $sql ) );
			$r ['sum_over'] = intval ( $r ['sum'] ) - intval ( $r ['num'] );
			$r['msg']=str_replace('{name}', $r['name'],$r['msg']);
			$this->lotteryArray [$r ['lotteryid']] = $r;
		}

		
		//时间段的奖品数为概率
		$sum = 0;
		$this->second=$second=45*60;
		$d = array(
				1 => array(
						'time' => strtotime ( date ( 'Y-m-d 00:00:00', TIME ) ),
						'time_end' => strtotime ( date ( 'Y-m-d 07:59:59', TIME ) )
				)
		);
		for ($i=2;$i<=17;$i++){
			$d[$i]=array(
					'time' => strtotime ( date ( 'Y-m-d '.($i+6).':00:00', TIME ) )+$second,
					'time_end' => strtotime ( date ( 'Y-m-d '.($i+6).':59:59', TIME ) )+$second
			);
		}
		
		foreach ($d as $k=>$t){
			if(TIME>=$t['time']&&TIME<=$t['time_end']){
				foreach ( $this->lotteryArray as $r ) {
					if ($r ['sum_over'] > 0) {
						if($r ['time_'.$k]>0){
							$sum += $r ['time_'.$k];
						}
					}
				}
			}
		}
		
		$this->time=$d;
		//本时段 奖品数
		foreach ($d as $k=>$t){
			if(TIME>=$t['time']&&TIME<=$t['time_end']){
				$m = 1;
				$probability = 0;
				$newsum=0;
				//80%空奖+20%奖
				$this->max = $sum + $sum * (L_KONGJIANG/100) / ((100-L_KONGJIANG)/100);
				
				foreach ( $this->lotteryArray as $r ) {
					$newsum=0;
					if ($r ['sum_over'] > 0) {
						if($r ['time_'.$k]>0){
							$newsum=$r ['time_'.$k];
							if($r['probability']>0){
								$probability=0;
								$probability=ceil($newsum*100/$r['probability']);
								if($probability>0){
									$newsum=$probability;
								}
							}
							$this->level [$r ['lotteryid']] ['start'] = $m;
							$this->level [$r ['lotteryid']] ['end'] = $m + $newsum;
							$m = $m + $newsum;
						}elseif ($r ['time_'.$k]<0){
							$newsum=$r ['sum_over'];
							if($r['probability']>0){
								$probability=0;
								$probability=ceil($newsum*100/$r['probability']);
								if($probability>0){
									$newsum=$probability;
								}
							}
							$this->level [$r ['lotteryid']] ['start'] = $m;
							$this->level [$r ['lotteryid']] ['end'] = $m + $newsum;
							$m = $m + $newsum;
						}
					}
				}
			}
		}
	}
	/**
	 * 检测用户是否中奖 0 谢谢参与,其他 返回奖品data数据
	 * @param array $user array(uid,tel,ip)
	 */
	public function check($user) {
		if (intval ( $user ['uid'] ) < 1) {
			//没有登录
			return 0;
		}
		if(intval(TIME)<intval(L_START)){
			//您来早了,活动还没有开始!
			return -21;
		}
		if(intval(TIME)>intval(L_END)){
			//已经过了活动时间,非常遗憾,谢谢!
			return -22;
		}
		if ($this->get_user_lfb ( $user ['uid'] ) < L_MIN) {
			//$this->credit ( $user ['uid'], -11, $logid );
			return -11; //您的来福币余额不足
		}
		
		$data = array(
				'uid' => $user ['uid'],
				'tel' => $user ['tel'],
				'ip' => $user ['ip'],
				'addtime' => time ()
		);
		$logid = DB::insert ( $this->lottery_log, $data, true );

		
		//检查用户  每天 已中奖品数
		if ($this->get_lottery ( $user ['uid'], strtotime ( date ( 'Y-m-d', TIME ) ), strtotime ( "+1day", strtotime ( date ( 'Y-m-d', TIME ) ) ), true ) >= L_DAY_CISHU) {
			$this->credit ( $user ['uid'], -12, $logid );
			//很遗憾,你本次什么也没有抽到!
			return -12;
		}
		//检查用户  全部 已中奖品数
		if ($this->get_lottery ( $user ['uid'], 0, 0, true ) >= L_CISHU&&L_CISHU>0) {
			$this->credit ( $user ['uid'], -12, $logid );
			//很遗憾,你本次什么也没有抽到!
			return -15;
		}
		//检测黑名单,设置概率
		if ($this->checkhei ( $user ['tel'] ) > 0) {
			$this->credit ( $user ['uid'], -13, $logid );
			//很遗憾,你本次什么也没有抽到!
			return -13;
		}
		$lotteryid = $this->choujiang();
		$this->credit ( $user ['uid'], $lotteryid<1?$lotteryid:0, $logid, $lotteryid ,$this->hao);
		if ($lotteryid > 0) {
			return $this->lotteryArray [$lotteryid];
		} else {
			return -4;
		}
		//-1奖品已发完
		//-2本时段奖品已玩
		//-3不发奖品
		//-4奖品有问题
		//-11您的来福币余额不足
		//-12很遗憾,你本次什么也没有抽到!
		//-13黑名单里面,很遗憾,你本次什么也没有抽到!
		//-14中奖专业户禁止中高讲高奖品
		//-15已超过yizhong总奖品数
		//-21您来早了,活动还没有开始!
		//-22已经过了活动时间,非常遗憾,谢谢!
		//-23对不起,现在不是活动时间,活动时间为每天
	}
	/**
	 * 显示
	 * @param unknown_type $data
	 */
	public function show($data){
		$ok=0;//3中奖
		$zz=0;//转盘度数
		$result='';//奖品名称
		$lotteryid=0;//奖品ID
		if(is_array($data)){
			$ok=3;
			$result=$data['msg'];
			$zz=$data['angle']+L_QUANSHU*360;
			$lotteryid=$data['lotteryid'];
		}else{
			$m='';
			switch($data){
				case 0:{
					$m= '请先登录!';
				}break;
				case -11:{
					$m= '您的来福币余额不足!';
				}break;
				case -12:{
					$m= '很遗憾,你本次什么也没有抽到!';
				}break;
				case -21:{
					$m= '您来早了,活动还没有开始!';
				}break;
				case -22:{
					$m= '已经过了活动时间,非常遗憾,谢谢!';
				}break;
				case -23:{
					$m= '对不起,现在不是活动时间,活动时间为每天'.L_DAY_START.':00-'.L_DAY_END.':00';
				}break;
				default:{
					$m= '很遗憾,你本次什么也没有抽到!';
				}break;
			}
			$result=$m;
			$ok=3;//3中奖
			$zz=360+L_QUANSHU*360;//再接再厉
		}
		header("Expires:Mon,26Jul199705:00:00GMT");
		header("Cache-Control:no-cache,must-revalidate");
		header("Pragma:no-cache");
		header("Content-type:text/html;charset=utf-8");
		echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
		echo '<gift>'."\n";
		echo '<shift ok="'.$ok.'" zz="'.$zz.'" add="9" down="0" lid="0" result="'.$result.'"/>'."\n";
		echo '</gift>'."\n";
		exit;
	}
	/**
	 * 抽奖的号
	 */
	private $hao=0;
	/**
	 * 抽奖开始
	 */
	private function choujiang() {
		$j = 0;
		$lotteryid = 0;
		$j = mt_rand ( 1, $this->max );
		$this->hao=$j;
		foreach ( $this->level as $k => $r ) {
			if ($r ['start'] <= $j && $j< $r ['end'] ) {
				$lotteryid = $k;
				break;
			}
		}
		$d = $this->time;
		if($lotteryid>0){
			$l=$this->lotteryArray [$lotteryid];
			$sql = "select count(*) m from " . DB::table ( $this->lottery_log );
			$sql .= " where lotteryid='$lotteryid' ";
			$s= intval ( DB::result_first ( $sql ) );
			$sum_over=$l['sum']-$s;
			if($sum_over>0){
				//本时段 奖品数
				$sum=0;
				foreach ($d as $k=>$r){
					if(TIME>=$r['time']&&TIME<=$r['time_end']){
						if($l['time_'.$k]>0){//个数限制
							$sum=$this->get_lottery_id(0,$r['time'],$r['time_end']+1,$lotteryid);
							if($sum>=$l['time_'.$k]){
								//本时段奖品已玩
								$lotteryid=-2;
								break;
							}
						}elseif ($l['time_'.$k]==0){
							//不发奖品
							$lotteryid=-3;
							break;
						}else{
							//-1 不限制
						}
						
					}
				}
				if($this->tel_zy && $lotteryid>0&&$lotteryid<4){
					$lotteryid=-14;
				}
			}else{
				//奖品已发完
				$lotteryid=-1;
			}
		}else{
			//奖品有问题
			$lotteryid=-4;
		}
		return $lotteryid;
	
	}
	/**
	 * 检测黑名单和普通用户,概率
	 * @param string $tel
	 * @return 大于1 表示本次禁止抽
	 */
	private function checkhei($tel) {
		$n = mt_rand ( 1, 100 );
		if (in_array ( $tel, $this->heimingdan ['tel'] ) && L_ZY > 0) {
			$this->tel_zy=true;
			if ($n > L_ZY) {
				return 1;
			}
		}else{
			//号码检测
 			if (!self::check_tel($tel)) {
 				return 1;
 			}
		}
		return 0;
	}
	/**
	 * 合计奖品数
	 * @param intval $uid
	 * @param intval $start
	 * @param intval $end
	 * @param bool $bool true 获得奖品数 false 不统计
	 * @return number
	 */
	private function get_lottery($uid = 0, $start = 0, $end = 0, $bool = false) {
		$sql = "select count(*) m from " . DB::table ( $this->lottery_log );
		$sql .= " where 1 ";
		if (intval ( $start ) > 0) {
			$sql .= " and addtime>='$start' ";
		}
		if (intval ( $end ) > 0) {
			$sql .= " and addtime<'$end' ";
		}
		if ($bool) {
			$sql .= " and lotteryid>0 ";
		}
		if (intval ( $uid ) > 0) {
			$sql .= " and uid='$uid' ";
		}
		return intval ( DB::result_first ( $sql ) );
	}
	/**
	 * 合计奖品数
	 * @param intval $uid
	 * @param intval $start
	 * @param intval $end
	 * @param intval $bool 奖品id
	 * @return number
	 */
	private function get_lottery_id($uid = 0, $start = 0, $end = 0, $lotteryid = 0) {
	
		$sql = "select count(*) m from " . DB::table ( $this->lottery_log );
		$sql .= " where 1 ";
		if (intval ( $start ) > 0) {
			$sql .= " and addtime>='$start' ";
		}
		if (intval ( $end ) > 0) {
			$sql .= " and addtime<'$end' ";
		}
		if ($lotteryid>=0) {
			$sql .= " and lotteryid='$lotteryid' ";
		}
		if (intval ( $uid ) > 0) {
			$sql .= " and uid='$uid' ";
		}
		return intval ( DB::result_first ( $sql ) );
	}
	/**
	 * 获取用户来福币
	 * @param intval $uid
	 * @return number
	 */
	public function get_user_lfb($uid) {
		$sql = "select extcredits2 from sz_common_member_count ";
		$sql .= " where 1 ";
		$sql .= " and uid='$uid' ";
		$s=intval ( DB::result_first ( $sql ) );
		return $s>0?$s:0;
	}
	/**
	 * 记录日志和更新用户来福币
	 * @param intval $uid
	 * @param intval $r  返回值
	 * @param intval $logid
	 * @param intval $lotteryid
	 */
	private function credit($uid, $result, $logid = 0, $lotteryid = 0,$hao=0) {
		$data = array();
		if ($lotteryid > 0) {
			$data ['lotteryid'] = $lotteryid;
			$data ['iswinning'] = 1;
		}
		$data ['result'] = $result;
		$data ['hao'] = $hao;
		$data ['HTTP_REFERER'] = $_SERVER['HTTP_REFERER'];
		$data['139sz']=$this->type?0:1;
		DB::Update ( $this->lottery_log, $data, " logid='$logid' " );
		if (L_LFB > 0) {
			$sql = "UPDATE sz_common_member_count SET extcredits2=extcredits2-'". L_LFB ."' WHERE extcredits2>'0' and extcredits2>='".L_LFB."' and uid='$uid' ";
			DB::query ( $sql );
			$this->credit_log ( $uid, 'reduce', L_LFB, 1, '积分清零活动' );
		}
	}
	
	/**
	 *手机号检查
	 */
	private function check_tel($tel){
		$different_network=table_sub::get_different_network();
		if (!preg_match("/$different_network/",$tel)) {
			return false;
		}
		return true;
	}
	/**
	 * 存储过程链接
	 */
	private $StoreProcs;
	/**
	 * 来福币日志 存储过程
	 * @param intval $uid
	 * @param string $op add增加  reduce 消耗
	 * @param intval $creditvalue 来福币
	 * @param intval $credittype 1来福币 2来福点
	 * @param string $oreason  说明
	 */
	private function credit_log($uid, $op, $creditvalue, $credittype, $oreason) {
		if (! $this->StoreProcs) {
			$this->StoreProcs = new StoreProcs ();
		}
		//调用存储过程
		$this->StoreProcs->query ( "call app_credit_log($uid,'$op','$credittype',1,$creditvalue,'$oreason')" );
	}

}
调用:
$dzp=new lib_dzp_lottery();
$u=array('uid'=>$_G ['uid'],'tel'=>$_G ['tel'],'ip'=> $_G ['clientip']);
$dzp->load_setting();
$dzp->show($dzp->check($u));


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
艾伟也谈项目管理,个人管理:从昨天的一个设计评审来谈如何与人交流你的设计思路
  昨天项目组进行了一个设计评审,主要是对OpenExpressApp的AutoUI部分进行重构,我相当于评审人。大家也可以把这个评审过程当做与人交流你的设计思路的一个过程,以下从我评审的一些要素来谈谈与人交流设计思路时需要考虑的内容,也许对大家在实际工作中的架构、设计和沟通都有所帮助。
779 0
开源项目推荐:物联网消息引擎EMQ X/大数据平台TDengine/可视化平台Grafana
开源项目推荐:物联网消息引擎EMQ X/大数据平台TDengine/可视化平台Grafana
9 0
SpringBoot项目设置热部署
记录一个SpringBoot 设置热部署(修改项目之后,项目自动重启)实例   POM.XML 文件 org.springframework.boot spring-boot-devtools true       SpringBoot启动类的代码: package com.
813 0
请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 警告!!!
原文:请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 警告!!!
1892 0
印度推出创业银行项目,为创企提供定制产品和服务
上周三,印度财政部长拉吉夫·库马尔(Rajiv Kumar)宣布推出“巴罗达创业银行”(Baroda Startup Banking)项目,为创业公司提供定制银行产品和服务。
110 0
+关注
222
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载