Browse Source

开始刮奖,结束刮奖接口

master
wanghongjun 3 years ago
parent
commit
40cbaa9d92
  1. 79
      app/controller/Zone.php
  2. 135
      app/logic/Zone.php
  3. 7
      route/app.php

79
app/controller/Zone.php

@ -0,0 +1,79 @@
<?php
namespace app\controller;
use app\BaseController;
use app\model\Zone as ZoneModel;
use app\model\ZoneGoods;
use app\logic\Zone as ZoneLogic;
use app\model\ZoneOrder;
use think\facade\Session;
/**
* 专区
*/
class Zone extends BaseController
{
/**
* 首页专区列表
* @return array
*/
public function zoneList()
{
return $this->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']);
}
}

135
app/logic/Zone.php

@ -1,6 +1,10 @@
<?php
namespace app\logic;
use app\model\AwardsRecords;
use app\model\ConsumptionRecords;
use app\model\User;
use app\model\ZoneGoods;
use app\model\ZoneGoodsParam;
use app\model\ZoneOrder;
use think\facade\Db;
@ -10,6 +14,23 @@ use think\facade\Db;
*/
class Zone
{
/**
* 判断余额是否足够
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function judgeBalance($user_id,$zoneGoodsId)
{
$userModel = User::field('balance')->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'])
];
}
}

7
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');
});

Loading…
Cancel
Save