From 40cbaa9d92279b5505835a8722b49d8e05274b27 Mon Sep 17 00:00:00 2001 From: wanghongjun <1445693971@qq,com> Date: Tue, 29 Aug 2023 11:55:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E5=88=AE=E5=A5=96=EF=BC=8C?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E5=88=AE=E5=A5=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/Zone.php | 79 +++++++++++++++++++++++ app/logic/Zone.php | 135 +++++++++++++++++++++++----------------- route/app.php | 7 +++ 3 files changed, 165 insertions(+), 56 deletions(-) create mode 100644 app/controller/Zone.php diff --git a/app/controller/Zone.php b/app/controller/Zone.php new file mode 100644 index 0000000..f49c340 --- /dev/null +++ b/app/controller/Zone.php @@ -0,0 +1,79 @@ +renderSuccess('数据返回成功',ZoneModel::getList()); + } + + /** + * 刮奖专区列表 + * @param $zone_id + * @return array + */ + public function zoneGoodsList($zone_id) + { + return $this->renderSuccess('数据返回成功',ZoneGoods::getList($zone_id)); + } + + /** + * 立即刮奖 + * @param $zoneGoodsId + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function beginLottery($zoneGoodsId) + { + # 判断余额够不够 + $userData = Session::get('login_user_data'); + + $judgeRes = ZoneLogic::judgeBalance($userData['id'],$zoneGoodsId); + if (!$judgeRes) return $this->renderError('余额不足'); + + # 获取刮奖图片 + $data = ZoneLogic::createOrder($userData['id'],$zoneGoodsId); + + return $this->renderSuccess('开始刮奖',['list' => $data['data'], 'c_r_id' => $data['c_r_id']]); + } + + /** + * 结束刮奖 + * @param $zoneOrderId + * @return array|void + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function endLottery($c_r_id) + { + $userData = Session::get('login_user_data'); + + $res = ZoneLogic::endOrder($userData['id'],$c_r_id); + + if (!$res['status']) return $this->renderError($res['msg']); + + return $this->renderSuccess($res['msg']); + } + + + +} \ No newline at end of file diff --git a/app/logic/Zone.php b/app/logic/Zone.php index 09918d1..9890d81 100644 --- a/app/logic/Zone.php +++ b/app/logic/Zone.php @@ -1,6 +1,10 @@ find($user_id); + $balance = $userModel['balance']; + + $zoneGoodsModel = ZoneGoods::field('price')->find($zoneGoodsId); + $price = $zoneGoodsModel['price']; + + return $balance < $price; + } /** * 余额扣减后 生成订单 @@ -25,88 +46,86 @@ class Zone # 获取奖项个参数 $zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $zone_goods_id]); - $data = self::getWinningPrize2($zoneParamArr); + # 获取刮刮乐信息 + $data = self::getWinningPrize($zoneParamArr); + + # 扣除余额 + $zoneGoodsModel = ZoneGoods::field('price')->find($zone_goods_id); + $price = $zoneGoodsModel['price']; + $balance = User::decrBalance($user_id,$price); - # 记录订单 - $zone_order_id = ZoneOrder::saveOrder($user_id,$zone_goods_id,$data); + # 消费记录 + $c_r_id = ConsumptionRecords::createRecords($user_id,$zone_goods_id,$price,$price,$balance,$data); + # 返回刮刮乐图标、金额、订单id return [ 'data' => $data, - 'zone_order_id' => $zone_order_id + 'c_r_id' => $c_r_id ]; } /** - * 权重算法 - * @param $patterns + * 刮奖完成 + * @param $user_id + * @param $c_r_id * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ - protected static function getWinningPrize($patterns) + public static function endOrder($user_id,$c_r_id) { - $temp = [ - ['image' => 'test.png', 'weight' => 1], // 奖项图案,权重为5 - ['image' => 'prize2.png', 'weight' => 1], // 奖项图案,权重为3 - ['image' => 'no_prize1.png', 'weight' => 1], // 非奖项图案,权重为10 - ['image' => 'no_prize2.png', 'weight' => 1], // 非奖项图案,权重为8 - ['image' => 'no_prize6.png', 'weight' => 1], // 非奖项图案,权重为8 - ['image' => 'no_prize7.png', 'weight' => 1], // 非奖项图案,权重为8 - ['image' => 'testtest.png', 'weight' => 0.01], // 非奖项图案,权重为8 - ]; - $patterns = array_merge($patterns,$temp); - - // 所有图案的权重相加 - $totalWeight = 0; - foreach ($patterns as $pattern) { - $totalWeight += $pattern['weight']; + # 验证 + $queryWhere = ['status' => 0, 'user_id' => $user_id, 'id' => $c_r_id]; + $zoneOrderModel = new ConsumptionRecords(); + $query = $zoneOrderModel->where($queryWhere)->field('data,zone_goods_id')->find(); + if (!$query) return ['status' => 0, 'msg' => '刮奖异常']; + + # 解密 + $data = unserialize($query['data']); + + # 解析是否中奖 + $awards_amount = 0; + foreach ($data as $goodsParam) { + $awardsAmountRes = ZoneGoodsParam::getAwardsAmount($goodsParam['id']); + if ($awardsAmountRes) { + $awards_amount += $goodsParam['amount']; + } } + # 判断是否中奖 + if ($awards_amount > 0) { - $imageArr = []; - $numberOfGroups = 3; // 要生成的图案组数 - $groupsNum = 4; // 要生成的图案组数 - - for ($i = 0; $i < $numberOfGroups; $i++) { + # 修改用户余额 + $balance = User::IncrBalance($user_id,$awards_amount); - // 每组生成 3 个图案 - for ($j = 0; $j < $groupsNum; $j++) { - - // 输出选中图案 - $selectedPattern = null; + # 中奖做记录 + AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$balance); + } - // 生成随机数 - $randomNumber = rand(1, $totalWeight); + # 完成订单 + ConsumptionRecords::endOrder($c_r_id); - foreach ($patterns as $pattern) { - $randomNumber -= $pattern['weight']; - if ($randomNumber <= 0) { - $selectedPattern = $pattern; - break; - } - } - - $imageArr[$i][] = $selectedPattern['image']; - } - } - return $imageArr; + return ['status' => 1, 'msg' => '完成']; } /** - * 概率算法 + * 获取刮刮乐信息(概率算法) * @return array */ - protected static function getWinningPrize2($patterns) + protected static function getWinningPrize($patterns) { // $patterns = [ // ['image' => 'prize1.png', 'probability' => 0.3], // 奖项图案,概率为30% // ['image' => 'prize2.png', 'probability' => 0.2], // 奖项图案,概率为20% -// ['image' => 'no_prize1.png', 'probability' => 0.1], // 非奖项图案,概率为10% -// ['image' => 'no_prize2.png', 'probability' => 0.32], // 非奖项图案,概率为32% -// ['image' => 'test1.png', 'probability' => 0.07], // 非奖项图案,概率为7% -// ['image' => 'test2.png', 'probability' => 0.002], // 非奖项图案,概率为0.2% -// ['image' => 'test3.png', 'probability' => 0.003], // 非奖项图案,概率为0.3% -// ['image' => 'test4.png', 'probability' => 0.004], // 非奖项图案,概率为0.4% -// ['image' => 'test5.png', 'probability' => 0.001], // 非奖项图案,概率为0.1% +// ['image' => 'no_prize1.png', 'probability' => 0.1], // 奖项图案,概率为10% +// ['image' => 'no_prize2.png', 'probability' => 0.32], // 奖项图案,概率为32% +// ['image' => 'test1.png', 'probability' => 0.07], // 奖项图案,概率为7% +// ['image' => 'test2.png', 'probability' => 0.002], // 奖项图案,概率为0.2% +// ['image' => 'test3.png', 'probability' => 0.003], // 奖项图案,概率为0.3% +// ['image' => 'test4.png', 'probability' => 0.004], // 奖项图案,概率为0.4% +// ['image' => 'test5.png', 'probability' => 0.001], // 奖项图案,概率为0.1% // ]; // 计算概率总和 @@ -141,7 +160,11 @@ class Zone } } - $data[$i][] = $selectedPattern['image']; + $data[$i] = [ + 'id' => $selectedPattern['id'], + 'amount' => $selectedPattern['amount'], + 'image' => get_image_url($selectedPattern['image']) + ]; } } diff --git a/route/app.php b/route/app.php index 25da563..2dfeab7 100644 --- a/route/app.php +++ b/route/app.php @@ -32,4 +32,11 @@ Route::group('user',function (){ Route::post('awardsRecords','user/awardsRecords')->middleware(CheckToken::class); }); +Route::group('zone',function(){ + Route::get('zoneList','zone/zoneList'); + Route::get('zoneGoodsList','zone/zoneGoodsList/:zoneId'); + Route::get('begin','zone/beginLottery/:zoneGoodsId'); + Route::get('begin','zone/endLottery/:c_r_id'); +}); +