Переглянути джерело

【Fix】抽奖概率问题修复

liuxiangxin 1 місяць тому
батько
коміт
3673805b21

+ 3 - 3
app/Models/Lottery/OrderReward.php

@@ -124,7 +124,7 @@ class OrderReward extends Model
         // 获取列表结构
         $list                               = array_values($list);
         // 增补一个谢谢参与
-        // if( $list )            array_unshift($list,['id'=>0,'reward_name'=>'谢谢参与','reward_thumb'=>'','reward_type'=>0,'reward_total'=>1,'reward_info'=>'','probability'=>0,'lottery_id'=>$lotteryId]);
+        if( $list )                         array_unshift($list,['id'=>0,'reward_name'=>'谢谢参与','reward_thumb'=>'','reward_type'=>0,'reward_total'=>0,'reward_all'=>0,'reward_info'=>'','probability'=>0,'lottery_id'=>$lotteryId]);
         // 返回结果
         return                              $list;
     }
@@ -142,11 +142,11 @@ class OrderReward extends Model
         // 没有任何奖品的话,直接返回
         $total                          = array_sum(array_column($reward,'reward_all'));
         // 如果已经没有奖项
-        if( !$total )                   return [];
+        if( !$total )                   return ['reward_list'=>$reward,'index'=>0];
         // 计算剩余总数
         $total                          = array_sum(array_column($reward,'reward_total'));
         // 如果已经没有奖项
-        if( !$total )                   return [];
+        if( !$total )                   return ['reward_list'=>$reward,'index'=>0];
         // 从0开始, 包含0
 		$offset							= 0;
 		// 随机数,包含起始值,不含结束值

+ 40 - 22
app/Models/Lottery/RecruitmentReward.php

@@ -34,7 +34,7 @@ class RecruitmentReward extends Model
         // 如果操作失败
         if( !$id )                          return $id;
         // 更新缓存
-        $this->getList(true);
+        if( isset($data['lottery_id']))     $this->getList($data['lottery_id'],true);
         // 返回结果
         return                              $id;
     }
@@ -52,7 +52,7 @@ class RecruitmentReward extends Model
         // 如果操作失败
         if( !$result )                      return $result;
         // 更新缓存
-        $this->getList(true);
+        if( isset($data['lottery_id']))     $this->getList($data['lottery_id'],true);
         // 返回结果
         return                              $result;
     }
@@ -62,14 +62,14 @@ class RecruitmentReward extends Model
      * @param   bool    $force  是否强制更新
      * 
      */
-    public function getList($force = false)
+    public function getList($lotteryId, $force = false)
     {
         // 结果数据
-        $list                  = $force ? [] : cache('admin:lottery:recruitment:reward:list');
+        $list                  = $force ? [] : cache('admin:lottery:recruitment:reward:list:'.$lotteryId);
         // 不存在数据
         if ( !$list ) {
             // 从数据库获取数据
-            $data              = $this->query()->where([['status','=',0]])->get(['id','reward_name','reward_thumb','reward_type','reward_total','reward_info','probability','lottery_id']);
+            $data              = $this->query()->where([['status','=',0]])->get(['id','reward_name','reward_thumb','reward_type','reward_all','reward_total','reward_info','probability','lottery_id']);
             // 是否有数据
             $data              = $data ? $data->toArray() : [];
             // 循环处理数据
@@ -82,7 +82,7 @@ class RecruitmentReward extends Model
                 $list[$value['id']] = $value;
             }
             // 存起来
-            cache(['admin:lottery:recruitment:reward:list'=>$list]);
+            cache(['admin:lottery:recruitment:reward:list:'.$lotteryId=>$list]);
         }
         // 返回结果
         return                  $list;
@@ -95,10 +95,10 @@ class RecruitmentReward extends Model
      * @param   string     指定字段
      * 
      */
-    public function getOne($id,$field='')
+    public function getOne($lotteryId,$id,$field='')
     {
         // 获取列表数据
-        $list                   = $this->getList();
+        $list                   = $this->getList($lotteryId);
         // 获取数据
         $one                    = isset($list[$id]) ? $list[$id] : [];
         // 返回值
@@ -113,32 +113,48 @@ class RecruitmentReward extends Model
     public function getListByLottery($lotteryId)
     {
         // 结果数据
-        $data                  = $this->getList();
-        //  返回结果
-        $list                  = [];
+        $list                               = $this->getList($lotteryId);
+        // 查询奖品总份数
+		$total				                = $list ? array_sum(array_column($list,'reward_all')) : 0;
         // 循环处理
-        foreach ($data as $value) {
-            // 获取数据
-            if( $lotteryId == $value['lottery_id'] )  $list[] = $value;
+        foreach ($list as $key=>$value)     {
+            // 中奖概率,如果不存在的话
+			$value['probability']           = $total ? round($value['reward_all'] / $total * 100,2) : 0;
+			// 重组
+			$list[$key]			            = $value;
         }
-        // 追加一个谢谢参与
-        if( $list )            array_unshift($list,['id'=>0,'reward_name'=>'谢谢参与','reward_thumb'=>'','reward_type'=>0,'reward_total'=>1,'reward_info'=>'','probability'=>0,'lottery_id'=>$lotteryId]);
+        // 获取列表结构
+        $list                               = array_values($list);
+        // 增补一个谢谢参与
+        if( $list )                         array_unshift($list,['id'=>0,'reward_name'=>'谢谢参与','reward_thumb'=>'','reward_type'=>0,'reward_total'=>0,'reward_all'=>0,'reward_info'=>'','probability'=>0,'lottery_id'=>$lotteryId]);
         // 返回结果
-        return                 $list;
+        return                              $list;
     }
 
     /**
      * 获取抽奖结果
-     * @param   array    $reward  奖品列表
+     * @param   int    $lotteryId  活动
      * 
      */
-    public function getRewardResult($reward){
-        // 从0开始
+    public function getRewardResult($lotteryId){
+        // 获取奖项
+        $reward                         = $this->getListByLottery($lotteryId);
+        // 如果已经没有奖项
+        if( !$reward )                  return [];
+        // 没有任何奖品的话,直接返回
+        $total                          = array_sum(array_column($reward,'reward_all'));
+        // 如果已经没有奖项
+        if( !$total )                   return ['reward_list'=>$reward,'index'=>0];
+        // 计算剩余总数
+        $total                          = array_sum(array_column($reward,'reward_total'));
+        // 如果已经没有奖项
+        if( !$total )                   return ['reward_list'=>$reward,'index'=>0];
+        // 从0开始, 包含0
 		$offset							= 0;
 		// 随机数,包含起始值,不含结束值
 		$randInt						= random_int($offset,10000);
 		// 中奖下标
-		$index							= 0;
+		$index							= -1;
 		// 循环奖品
 		foreach ($reward as $key => $value) {
             // 概率为0 或者产品份数为0,不参与
@@ -152,8 +168,10 @@ class RecruitmentReward extends Model
 			// 区间内即抽中
 			if( $start <= $randInt && $end >= $randInt ) $index = $key;
 		}
+        // 如果未抽中,继续抽奖
+        if( $index < 0 )                return $this->getRewardResult($lotteryId);
         // 是否中奖,以及奖项下标
-        return                          $index;
+        return                          ['reward_list'=>$reward,'index'=>$index];
     }
 
 }

+ 40 - 24
app/Models/Lottery/ScoreReward.php

@@ -34,7 +34,7 @@ class ScoreReward extends Model
         // 如果操作失败
         if( !$id )                          return $id;
         // 更新缓存
-        $this->getList(true);
+        if( isset($data['lottery_id']))     $this->getList($data['lottery_id'],true);
         // 返回结果
         return                              $id;
     }
@@ -52,7 +52,7 @@ class ScoreReward extends Model
         // 如果操作失败
         if( !$result )                      return $result;
         // 更新缓存
-        $this->getList(true);
+        if( isset($data['lottery_id']))     $this->getList($data['lottery_id'],true);
         // 返回结果
         return                              $result;
     }
@@ -62,16 +62,14 @@ class ScoreReward extends Model
      * @param   bool    $force  是否强制更新
      * 
      */
-    public function getList($force = false)
+    public function getList($lotteryId, $force = false)
     {
         // 结果数据
-        $list                  = $force ? [] : cache('admin:lottery:score:reward:list');
+        $list                  = $force ? [] : cache('admin:lottery:score:reward:list:'.$lotteryId);
         // 不存在数据
         if ( !$list ) {
             // 从数据库获取数据
-            $data              = $this->query()->where([['status','=',0]])->get(['id','reward_name','reward_thumb','reward_type','reward_total','reward_info','probability','lottery_id']);
-            // 是否有数据
-            $data              = $data ? $data->toArray() : [];
+            $data              = $this->query()->where([['lottery_id','=',$lotteryId],['status','=',0]])->get(['id','reward_name','reward_thumb','reward_type','reward_all','reward_total','reward_info','probability','lottery_id'])->toArray();
             // 循环处理数据
             $list              = [];
             // 进行更新
@@ -82,7 +80,7 @@ class ScoreReward extends Model
                 $list[$value['id']] = $value;
             }
             // 存起来
-            cache(['admin:lottery:score:reward:list'=>$list]);
+            cache(['admin:lottery:score:reward:list:'.$lotteryId=>$list]);
         }
         // 返回结果
         return                  $list;
@@ -95,10 +93,10 @@ class ScoreReward extends Model
      * @param   string     指定字段
      * 
      */
-    public function getOne($id,$field='')
+    public function getOne($lotteryId,$id,$field='')
     {
         // 获取列表数据
-        $list                   = $this->getList();
+        $list                   = $this->getList($lotteryId);
         // 获取数据
         $one                    = isset($list[$id]) ? $list[$id] : [];
         // 返回值
@@ -113,32 +111,48 @@ class ScoreReward extends Model
     public function getListByLottery($lotteryId)
     {
         // 结果数据
-        $data                  = $this->getList();
-        //  返回结果
-        $list                  = [];
+        $list                               = $this->getList($lotteryId);
+        // 查询奖品总份数
+		$total				                = $list ? array_sum(array_column($list,'reward_all')) : 0;
         // 循环处理
-        foreach ($data as $value) {
-            // 获取数据
-            if( $lotteryId == $value['lottery_id'] )  $list[] = $value;
+        foreach ($list as $key=>$value)     {
+            // 中奖概率,如果不存在的话
+			$value['probability']           = $total ? round($value['reward_all'] / $total * 100,2) : 0;
+			// 重组
+			$list[$key]			            = $value;
         }
-        // 追加一个谢谢参与
-        if( $list )            array_unshift($list,['id'=>0,'reward_name'=>'谢谢参与','reward_thumb'=>'','reward_type'=>0,'reward_total'=>1,'reward_info'=>'','probability'=>0,'lottery_id'=>$lotteryId]);
+        // 获取列表结构
+        $list                               = array_values($list);
+        // 增补一个谢谢参与
+        if( $list )                         array_unshift($list,['id'=>0,'reward_name'=>'谢谢参与','reward_thumb'=>'','reward_type'=>0,'reward_total'=>0,'reward_all'=>0,'reward_info'=>'','probability'=>0,'lottery_id'=>$lotteryId]);
         // 返回结果
-        return                 $list;
+        return                              $list;
     }
 
     /**
      * 获取抽奖结果
-     * @param   array    $reward  奖品列表
+     * @param   int    $lotteryId  活动
      * 
      */
-    public function getRewardResult($reward){
-        // 从0开始
+    public function getRewardResult($lotteryId){
+        // 获取奖项
+        $reward                         = $this->getListByLottery($lotteryId);
+        // 如果已经没有奖项
+        if( !$reward )                  return [];
+        // 没有任何奖品的话,直接返回
+        $total                          = array_sum(array_column($reward,'reward_all'));
+        // 如果已经没有奖项
+        if( !$total )                   return ['reward_list'=>$reward,'index'=>0];
+        // 计算剩余总数
+        $total                          = array_sum(array_column($reward,'reward_total'));
+        // 如果已经没有奖项
+        if( !$total )                   return ['reward_list'=>$reward,'index'=>0];
+        // 从0开始, 包含0
 		$offset							= 0;
 		// 随机数,包含起始值,不含结束值
 		$randInt						= random_int($offset,10000);
 		// 中奖下标
-		$index							= 0;
+		$index							= -1;
 		// 循环奖品
 		foreach ($reward as $key => $value) {
             // 概率为0 或者产品份数为0,不参与
@@ -152,8 +166,10 @@ class ScoreReward extends Model
 			// 区间内即抽中
 			if( $start <= $randInt && $end >= $randInt ) $index = $key;
 		}
+        // 如果未抽中,继续抽奖
+        if( $index < 0 )                return $this->getRewardResult($lotteryId);
         // 是否中奖,以及奖项下标
-        return                          $index;
+        return                          ['reward_list'=>$reward,'index'=>$index];
     }
 
 }

+ 0 - 4
resources/views/admin/lottery_order_reward/add.blade.php

@@ -45,10 +45,6 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		<label class="control-label">奖品信息</label>
 		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="" />
 	</div>
-	<!-- <div class="form-group col-sm-3">
-		<label class="control-label">中奖概率</label>
-		<input class="form-control" required="required" type="number" step="0.01" min="0" placeholder="中奖概率" name="probability" max="{{$maxProbability}}" value="" />
-	</div> -->
 	<div class="form-group col-sm-12">
 		@csrf
 		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />

+ 0 - 4
resources/views/admin/lottery_order_reward/edit.blade.php

@@ -45,10 +45,6 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		<label class="control-label">奖品信息</label>
 		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="{{$oldData['reward_info']}}" />
 	</div>
-	<!-- <div class="form-group col-sm-3">
-		<label class="control-label">中奖概率</label>
-		<input class="form-control" required="required" type="number" step="0.01" min="0" placeholder="中奖概率" name="probability" max="{{$maxProbability}}" value="{{$oldData['probability']}}" />
-	</div> -->
 	<div class="form-group col-sm-12">
 		@csrf
 		<input type="hidden" name="id" id="id" value="{{$oldData['id']}}" />

+ 6 - 1
resources/views/admin/lottery_order_reward/index.blade.php

@@ -24,6 +24,11 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
 	<a href="{{url('admin/lottery_order_reward/index')}}" class="btn btn-sm btn-default" >重置</a>
 </form>
+<div class="row">
+	<div class="col-xs-12">	
+		<p class="text-center text-red">奖项请设置3-7个,默认自带一个谢谢参与奖项</p>
+	</div>
+</div>
 <div class="row">
 	<div class="col-xs-12">	
 		<div class="table-responsive">
@@ -76,7 +81,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						</tr>  
 						@endforeach
 						<tr>
-							<td colspan="20">总计 {{count($list)}} 个奖</td>
+							<td colspan="20">总计 {{count($list)}} 个奖</td>
 						</tr>
 				</tbody>
 				

+ 6 - 6
resources/views/admin/lottery_recruitment_reward/add.blade.php

@@ -34,16 +34,16 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		</select>
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品数</label>
-		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_total" value="" />
+		<label class="control-label">奖品数</label>
+		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_all" value="0" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品信息</label>
-		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="" />
+		<label class="control-label">剩余数量</label>
+		<input class="form-control" required="required" type="number" placeholder="剩余数量" name="reward_total" value="0" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">中奖概率</label>
-		<input class="form-control" required="required" type="text" min="0" placeholder="中奖概率" name="probability" max="{{$maxProbability}}" value="" />
+		<label class="control-label">奖品信息</label>
+		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="" />
 	</div>
 	<div class="form-group col-sm-12">
 		@csrf

+ 6 - 6
resources/views/admin/lottery_recruitment_reward/edit.blade.php

@@ -34,16 +34,16 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		</select>
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品数</label>
-		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_total" value="{{$oldData['reward_total']}}" />
+		<label class="control-label">奖品数</label>
+		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_all" value="{{$oldData['reward_all']}}" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品信息</label>
-		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="{{$oldData['reward_info']}}" />
+		<label class="control-label">剩余数量</label>
+		<input class="form-control" required="required" type="number" placeholder="剩余数量" name="reward_total" value="{{$oldData['reward_total']}}" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">中奖概率</label>
-		<input class="form-control" required="required" type="number" step="0.01" min="0" placeholder="中奖概率" name="probability" max="{{$maxProbability}}" value="{{$oldData['probability']}}" />
+		<label class="control-label">奖品信息</label>
+		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="{{$oldData['reward_info']}}" />
 	</div>
 	<div class="form-group col-sm-12">
 		@csrf

+ 5 - 6
resources/views/admin/lottery_recruitment_reward/index.blade.php

@@ -39,7 +39,8 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<th>奖品名称</th>
 						<th>奖品类型</th>
 						<th>奖品信息</th>
-						<th>奖品份数</th>
+						<th>奖品数量</th>
+						<th>剩余奖品</th>
 						<th>中奖概率</th>
 						<th>所属活动</th>
 						<th>状态</th>
@@ -55,8 +56,9 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 							<td>{{$a['reward_name']}}</td>
 							<td>{{$a['reward_type']}}</td>
 							<td>{{$a['reward_info']}}</td>
+							<td>{{$a['reward_all']}}</td>
 							<td>{{$a['reward_total']}}</td>
-							<td>{{$a['probability']}}</td>
+							<td>{{$a['probability']}}%</td>
 							<td>
 								@foreach ($lotteryList as $value)
 									@if( $a['lottery_id'] == $value['id'] ) {{$value['name']}} @endif
@@ -79,10 +81,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						</tr>  
 						@endforeach
 						<tr>
-							<td colspan="20" class="page">{{$list->render()}}</td>
-						</tr>
-						<tr>
-							<td colspan="20">总计 {{$list->total()}} 个商店</td>
+							<td colspan="20">总计 {{count($list)}} 个奖项</td>
 						</tr>
 				</tbody>
 				

+ 6 - 6
resources/views/admin/lottery_score_reward/add.blade.php

@@ -34,16 +34,16 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		</select>
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品数</label>
-		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_total" value="" />
+		<label class="control-label">奖品数</label>
+		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_all" value="0" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品信息</label>
-		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="" />
+		<label class="control-label">剩余数量</label>
+		<input class="form-control" required="required" type="number" placeholder="剩余数量" name="reward_total" value="0" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">中奖概率</label>
-		<input class="form-control" required="required" type="number" step="0.01" min="0" placeholder="中奖概率" name="probability" max="{{$maxProbability}}" value="" />
+		<label class="control-label">奖品信息</label>
+		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="" />
 	</div>
 	<div class="form-group col-sm-12">
 		@csrf

+ 6 - 6
resources/views/admin/lottery_score_reward/edit.blade.php

@@ -34,16 +34,16 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		</select>
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品数</label>
-		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_total" value="{{$oldData['reward_total']}}" />
+		<label class="control-label">奖品数</label>
+		<input class="form-control" required="required" type="number" placeholder="奖品数" name="reward_all" value="{{$oldData['reward_all']}}" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">奖品信息</label>
-		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="{{$oldData['reward_info']}}" />
+		<label class="control-label">剩余数量</label>
+		<input class="form-control" required="required" type="number" placeholder="剩余数量" name="reward_total" value="{{$oldData['reward_total']}}" />
 	</div>
 	<div class="form-group col-sm-3">
-		<label class="control-label">中奖概率</label>
-		<input class="form-control" required="required" type="number" step="0.01" min="0" placeholder="中奖概率" name="probability" max="{{$maxProbability}}" value="{{$oldData['probability']}}" />
+		<label class="control-label">奖品信息</label>
+		<input class="form-control" type="text" placeholder="积分数量,红包金额,优惠券编码" name="reward_info" value="{{$oldData['reward_info']}}" />
 	</div>
 	<div class="form-group col-sm-12">
 		@csrf

+ 6 - 7
resources/views/admin/lottery_score_reward/index.blade.php

@@ -39,7 +39,8 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<th>奖品名称</th>
 						<th>奖品类型</th>
 						<th>奖品信息</th>
-						<th>奖品份数</th>
+						<th>奖品数量</th>
+						<th>剩余奖品</th>
 						<th>中奖概率</th>
 						<th>所属活动</th>
 						<th>状态</th>
@@ -55,8 +56,9 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 							<td>{{$a['reward_name']}}</td>
 							<td>{{$a['reward_type']}}</td>
 							<td>{{$a['reward_info']}}</td>
+							<td>{{$a['reward_all']}}</td>
 							<td>{{$a['reward_total']}}</td>
-							<td>{{$a['probability']}}</td>
+							<td>{{$a['probability']}}%</td>
 							<td>
 								@foreach ($lotteryList as $value)
 									@if( $a['lottery_id'] == $value['id'] ) {{$value['name']}} @endif
@@ -76,13 +78,10 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 									@endif
 								@endif
 							</td>							
-						</tr>  
-						@endforeach
-						<tr>
-							<td colspan="20" class="page">{{$list->render()}}</td>
 						</tr>
+						@endforeach
 						<tr>
-							<td colspan="20">总计 {{$list->total()}} 个商店</td>
+							<td colspan="20">总计 {{count($list)}} 个奖项</td>
 						</tr>
 				</tbody>