摘要:實現功能抽獎需求后臺控制每種中獎的概率控制獎品數量備注獎品是以優惠券的形式發放給用戶進行兌換,需要考慮到優惠券數量問題以此為例九宮格一個開始,一個謝謝參與,后臺設置七個獎品獲取每個獎品中獎概率,及該獎品的我是以的總數概率來計算的獲取獎品及該
實現功能:抽獎
需求:后臺控制每種中獎的概率、控制獎品數量
備注:獎品是以優惠券的形式發放給用戶進行兌換,需要考慮到優惠券數量問題
以此為例:
九宮格一個開始btn,一個謝謝參與,后臺設置七個獎品
1.獲取每個獎品中獎概率,及該獎品的id,我是以1000的總數概率來計算的
/**獲取獎品及該獎品的中獎概率 * Created by PhpStorm. * User: Alisa * Date: 2018/12/6 * Time: 18:02 * @param $extract_prize_id * @return mixed */ public function user_prize ($extract_prize_id) { $prize = (new Query()) ->from(["p"=>Prize::tableName()]) ->leftJoin(["c"=>Coupon::tableName()],"c.id = p.coupon_id") ->select("p.prize_pro,p.id") ->where(["p.extract_prize_id"=>$extract_prize_id]) ->andWhere([">","c.surplus_num",0]) ->all(); $sum = (new Query()) ->from(["p"=>Prize::tableName()]) ->leftJoin(["c"=>Coupon::tableName()],"c.id = p.coupon_id") ->where(["p.extract_prize_id"=>$extract_prize_id]) ->andWhere([">","c.surplus_num",0]) ->sum("p.prize_pro"); $count = count($prize); foreach ($prize as $k=>$v){ $list[$k] = $v; } $list[$count] = [ "prize_pro"=>Math::sub(1000,$sum,0), "id"=>0 ]; $res = $this->get_rand($list); return $list[$res]["id"]; }
2.進行抽獎計算,返回中獎的獎品id,id是0的話,表示謝謝參與
/**抽獎計算 * Created by PhpStorm. * User: Alisa * Date: 2018/12/6 * Time: 18:10 * @param $proArr * @return int|string */ public function get_rand($proArr){ $result = ""; foreach ($proArr as $key => $val) { $arr[$key] = $val["prize_pro"]; } // 概率數組的總概率 $proSum = 1000; // 概率數組循環 foreach ($arr as $k => $v) { $randNum = mt_rand(1, $proSum); if ($randNum <= $v) { $result = $k; break; } else { $proSum -= $v; } } return $result; }
3.進行后續邏輯處理,判斷優惠券剩余數量并減去、減去用戶抽獎冊數、增加用戶抽獎記錄、中獎的話優惠券到賬
/**用戶抽獎 * @param $userId * @param $extract_prize_id * @return array|bool * @throws yiidbException */ public function extractPrize($userId,$extract_prize_id) { $prize_id = $this->user_prize($extract_prize_id); $coupon_id = 0; $prize_name = "謝謝參與"; $prize_url = ""; if($prize_id){ $coupon = (new Query()) ->select("c.id,c.name,c.rule,c.validity,c.surplus_num") ->from(["pr"=>Prize::tableName()]) ->leftJoin(["c"=>Coupon::tableName()],"c.id = pr.coupon_id") ->where(["pr.id"=>$prize_id]) ->one(); if($coupon["surplus_num"] > 0){ $coupon_id = $coupon["id"]; $prize_name = $coupon["name"]; $url = (new Query()) ->select("pi.url") ->from(["pr"=>Prize::tableName()]) ->leftJoin(["pi"=>Picture::tableName()],"pi.id = pr.img_id") ->where(["pr.id"=>$prize_id]) ->one(); $prize_url = $url["url"]; } } $trans = Yii::$app->db->beginTransaction(); try{ $model = new ExtractPrizeRecord(); $model->prize_id = $prize_id; $model->coupon_id = $coupon_id; $model->prize_name = $prize_name; $model->user_id = $userId; $model->type = $extract_prize_id; $model->create_at = time(); $res_ex = $model->save(); if ( $res_ex ) { //減去用戶抽獎次數 Yii::$app->db->createCommand("update users set $str = $str - 1 where $str > 0 and user_id = :user_id", [ ":user_id" => $userId, ] )->execute(); if(($coupon_id > 0) && ($coupon["surplus_num"] > 0)){ //減去優惠券剩余數量 Yii::$app->db->createCommand("update coupon set surplus_num = surplus_num -1 where id = :coupon_id and surplus_num > 0", [ ":coupon_id" => $coupon_id, ] )->execute(); $myModel = new MyCoupon(); $myModel->user_id = $userId; $myModel->name = $coupon["name"]; $myModel->rule = $coupon["rule"]; $myModel->coupon_id = $coupon_id; $myModel->create_at = time(); $myModel->update_at = time(); $myModel->start_at = time(); $myModel->end_at = time() + $coupon["validity"]* 86400; $myModel->re_code = StringTools::randString(10); $myModel->coupon_number = date("YmdHis") . rand(10000000,99999999); $myModel->save(); } } else { return false; } $trans ->commit(); return ["prize_name"=>$prize_name,"prize_url"=>$prize_url]; }catch (Throwable $t) { $trans->rollBack(); return false; } }
如果你覺得這篇文章還不錯,下角點個贊,是對我開源最大的鼓勵O(∩_∩)O
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29753.html
摘要:未來已來,百度云特推出上云節,通過爆款產品秒殺新購專享特惠等方式來支持全民普惠上云,更有機會抽取等好禮,保證參與的你中獎。在這場云計算的雙十一狂歡盛宴中,屬于你的私人錦鯉,最終只能被你翻牌。這個雙十一,百度云超強福利已打包完畢。 導語:狂歡是一群人的孤單,但至少,云計算的剁手更加高級一點。又是一年雙十一,相信各位對于這個已滿十歲的剁手大party期盼已久,或因為去年沒有實現的愿望,或因...
摘要:如下圖所示負載均衡層的限流防止用戶重復抽獎首先第一次在負載均衡層可以做的事情,就是防止重復抽獎。然后負載均衡感知到了之后,后續請求全部攔截掉返回一個抽獎結束的標識就可以了。一旦抽獎結束,抽獎服務更新狀態,負載均衡層會感知到。公眾號:貍貓技術窩作者:愛釣魚的桌子哥,資深架構師1、抽獎系統的背景引入本文給大家分享一個之前經歷過的抽獎系統的流量削峰架構的設計方案。抽獎、搶紅包、秒殺,這類系統其實都...
摘要:這個月的計劃本來是對基礎的數據結構做一個沉淀,但是,但是,但是這個月的的狀態就是工作工作既然這樣就總結下這個月的工作吧。 前言 目標是每個月寫一篇文章,對從事編程開發的基礎知識做一個學習總結。這個月的計劃本來是對基礎的數據結構做一個沉淀,但是,但是,但是......這個月的的狀態就是工作工作...既然這樣就總結下這個月的工作吧。 工作內容 促銷活動的抽獎工具,具備如下功能: 根據不同...
閱讀 1993·2021-11-24 10:45
閱讀 1849·2021-10-09 09:43
閱讀 1291·2021-09-22 15:38
閱讀 1219·2021-08-18 10:19
閱讀 2837·2019-08-30 15:55
閱讀 3056·2019-08-30 12:45
閱讀 2960·2019-08-30 11:25
閱讀 356·2019-08-29 11:30