設計翻牌抽獎

實現功能:抽獎數組

需求:後臺控制每種中獎的機率、控制獎品數量app

備註:獎品是以優惠券的形式發放給用戶進行兌換,須要考慮到優惠券數量問題yii

clipboard.png

以此爲例:
九宮格一個開始btn,一個謝謝參與,後臺設置七個獎品this

1.獲取每一個獎品中獎機率,及該獎品的id,我是以1000的總數機率來計算的url

/**獲取獎品及該獎品的中獎機率
 * 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的話,表示謝謝參與spa

/**抽獎計算
 * 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.進行後續邏輯處理,判斷優惠券剩餘數量並減去、減去用戶抽獎冊數、增長用戶抽獎記錄、中獎的話優惠券到帳code

/**用戶抽獎
 * @param $userId
 * @param $extract_prize_id
 * @return array|bool
 * @throws \yii\db\Exception
 */
 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(∩_∩)Oorm

相關文章
相關標籤/搜索