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 <?php
namespace app\logic; 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\ZoneGoodsParam;
use app\model\ZoneOrder; use app\model\ZoneOrder;
use think\facade\Db; use think\facade\Db;
@ -10,6 +14,23 @@ use think\facade\Db;
*/ */
class Zone 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]); $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 [ return [
'data' => $data, '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 * @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 $queryWhere = ['status' => 0, 'user_id' => $user_id, 'id' => $c_r_id];
['image' => 'prize2.png', 'weight' => 1], // 奖项图案,权重为3 $zoneOrderModel = new ConsumptionRecords();
['image' => 'no_prize1.png', 'weight' => 1], // 非奖项图案,权重为10 $query = $zoneOrderModel->where($queryWhere)->field('data,zone_goods_id')->find();
['image' => 'no_prize2.png', 'weight' => 1], // 非奖项图案,权重为8 if (!$query) return ['status' => 0, 'msg' => '刮奖异常'];
['image' => 'no_prize6.png', 'weight' => 1], // 非奖项图案,权重为8
['image' => 'no_prize7.png', 'weight' => 1], // 非奖项图案,权重为8 # 解密
['image' => 'testtest.png', 'weight' => 0.01], // 非奖项图案,权重为8 $data = unserialize($query['data']);
];
$patterns = array_merge($patterns,$temp); # 解析是否中奖
$awards_amount = 0;
// 所有图案的权重相加 foreach ($data as $goodsParam) {
$totalWeight = 0; $awardsAmountRes = ZoneGoodsParam::getAwardsAmount($goodsParam['id']);
foreach ($patterns as $pattern) { if ($awardsAmountRes) {
$totalWeight += $pattern['weight']; $awards_amount += $goodsParam['amount'];
}
} }
# 判断是否中奖
if ($awards_amount > 0) {
$imageArr = []; # 修改用户余额
$numberOfGroups = 3; // 要生成的图案组数 $balance = User::IncrBalance($user_id,$awards_amount);
$groupsNum = 4; // 要生成的图案组数
for ($i = 0; $i < $numberOfGroups; $i++) {
// 每组生成 3 个图案 # 中奖做记录
for ($j = 0; $j < $groupsNum; $j++) { AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$balance);
}
// 输出选中图案
$selectedPattern = null;
// 生成随机数 # 完成订单
$randomNumber = rand(1, $totalWeight); ConsumptionRecords::endOrder($c_r_id);
foreach ($patterns as $pattern) { return ['status' => 1, 'msg' => '完成'];
$randomNumber -= $pattern['weight'];
if ($randomNumber <= 0) {
$selectedPattern = $pattern;
break;
}
}
$imageArr[$i][] = $selectedPattern['image'];
}
}
return $imageArr;
} }
/** /**
* 概率算法 * 获取刮刮乐信息(概率算法)
* @return array * @return array
*/ */
protected static function getWinningPrize2($patterns) protected static function getWinningPrize($patterns)
{ {
// $patterns = [ // $patterns = [
// ['image' => 'prize1.png', 'probability' => 0.3], // 奖项图案,概率为30% // ['image' => 'prize1.png', 'probability' => 0.3], // 奖项图案,概率为30%
// ['image' => 'prize2.png', 'probability' => 0.2], // 奖项图案,概率为20% // ['image' => 'prize2.png', 'probability' => 0.2], // 奖项图案,概率为20%
// ['image' => 'no_prize1.png', 'probability' => 0.1], // 奖项图案,概率为10% // ['image' => 'no_prize1.png', 'probability' => 0.1], // 奖项图案,概率为10%
// ['image' => 'no_prize2.png', 'probability' => 0.32], // 奖项图案,概率为32% // ['image' => 'no_prize2.png', 'probability' => 0.32], // 奖项图案,概率为32%
// ['image' => 'test1.png', 'probability' => 0.07], // 奖项图案,概率为7% // ['image' => 'test1.png', 'probability' => 0.07], // 奖项图案,概率为7%
// ['image' => 'test2.png', 'probability' => 0.002], // 奖项图案,概率为0.2% // ['image' => 'test2.png', 'probability' => 0.002], // 奖项图案,概率为0.2%
// ['image' => 'test3.png', 'probability' => 0.003], // 奖项图案,概率为0.3% // ['image' => 'test3.png', 'probability' => 0.003], // 奖项图案,概率为0.3%
// ['image' => 'test4.png', 'probability' => 0.004], // 奖项图案,概率为0.4% // ['image' => 'test4.png', 'probability' => 0.004], // 奖项图案,概率为0.4%
// ['image' => 'test5.png', 'probability' => 0.001], // 奖项图案,概率为0.1% // ['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::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