@ -5,8 +5,10 @@ use app\common\lib\pinyin\PinyinNumber;
use app\model\AwardsRecords;
use app\model\ConsumptionRecords;
use app\model\User;
use app\model\ZoneAmountParam;
use app\model\ZoneGoods;
use app\model\ZoneGoodsParam;
use app\model\ZoneGoodsPlay;
use think\facade\Db;
/**
@ -14,323 +16,351 @@ use think\facade\Db;
*/
class Zone
{
protected static $user_id;
protected static $zone_goods_id;
protected static $play_code;
protected static $patterns;
protected static $param;
protected static $awards_icon_dirname;
protected static $awards_number_count = 0;
protected static $direction = 3;
protected static $transverse = 4;
/**
* 判断余额是否足够
* 刮奖初始化数据
* @param $user_id
* @param $zone_goods_id
* @return bool|string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function judgeBalance($user_id,$zoneGoodsId)
protected static function ticketingInit($zone_goods_id, $user_i d)
{
self::$user_id = $user_id;
self::$zone_goods_id = $zone_goods_id;
$userModel = User::field('balance')->find($user_id);
$balance = $userModel->balance ?: 0;
# 判断余额够不够
$judgeRes = self::judgeBalance();
if (!$judgeRes) return '余额不足';
$zoneGoods = ZoneGoods::where('id', $zone_goods_id)->find();
if (empty($zoneGoods)) return '刮奖失败';
self::$awards_number_count = $zoneGoods['awards_number_count']; // 中奖号码数量
self::$direction = $zoneGoods['direction_count']; // 纵向数量
self::$transverse = $zoneGoods['transverse_count']; // 横向数量
self::$awards_icon_dirname = $zoneGoods['awards_icon_dirname']; // 横向数量
$playRes = ZoneGoodsPlay::find($zoneGoods['play_id']);
if (empty($playRes)) return '未设置玩法';
self::$play_code = $playRes['play_code'];
$zoneParamArr = self::getZoneParam(['zone_goods_id' => $zone_goods_id]);
if (empty($zoneParamArr)) return '未设置中奖参数';
self::$patterns = $zoneParamArr;
$zoneGoodsModel = ZoneGoods::field('price')->find($zoneGoodsId);
$price = $zoneGoodsModel->price ?: 0;
if ($balance < $price) {
return false;
}
return true;
}
/**
* 出奖
* @param $user_id
* @param $zone_goods_id
* @param $type
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException、
*/
public static function ticketing($user_id,$zone_goods_id,$type = 1 )
public static function ticketing($user_id, $zone_goods_id)
{
# 获取奖项个参数
$zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $zone_goods_id]);
if (empty($zoneParamArr)) return ['status' => 0, 'msg' => '刮奖失败'];
# 获取刮刮乐信息
if ($type == 1) {
$resData = self::getWinningPrize($zoneParamArr);
} else {
$resData = self::getWinningPrizeRandNumber($zoneParamArr);
}
$save_data = $resData['save_data'];
$prizes_data = $resData['prizes_data'] ?? [];
# 解析是否中奖,组合中奖金额
$awards_amount = 0;
foreach ($save_data as $key => $goodsParam) {
foreach ($goodsParam as $k => $item) {
$save_data[$key][$k]['is_awards'] = 0;
if (isset($item['id'])) {
$awardsAmountRes = ZoneGoodsParam::getAwardsAmount($item['id']);
if ($awardsAmountRes) {
$save_data[$key][$k]['is_awards'] = 1;
$awards_amount += $awardsAmountRes['amount'];
}
}
}
}
# 处理数据返回
$data = self::handleTextData($save_data);
# 开启事务
$connection = Db::connect();
# 获取刮奖玩法设定规则参数
try {
$initMsg = self::ticketingInit($zone_goods_id, $user_id);
if ($initMsg !== true) throw new \Exception($initMsg);
$connection->startTrans();
# 获取刮奖数据
$resData = self::getTextData();
# 扣除余额
$zoneGoodsModel = ZoneGoods::field('price')->find($zone_goods_id);
$price = $zoneGoodsModel['price'];
# 消费金额
$consumptionBalance = User::decrBalance($user_id,$price);
$save_data = $resData['save_data'];
$prizes_data = $resData['prizes_data'] ?? [];
$prizes_icon_data = $resData['prizes_icon_data'] ?? [];
# 判断是否中奖
$awards_status = 0;
# 可提余额
$withdrawal_balance = 0;
if ($awards_amount > 0) {
# 解析是否中奖,组合中奖金额
$awards_amount = self::calculateAmount($save_data);
$awards_status = 1;
# 处理数据返回
$data = self::handleTextData($save_data);
# 修改用户可提余 额
$withdrawal_balance = User::incrWithdrawalBalance($user_id,$awards_amount );
}
# 结算金额
$settlementRes = self::settlementAmount($awards_amount, $save_data, $prizes_data, $prizes_icon_data);
if (!$settlementRes['status']) throw new \Exception($settlementRes['msg']);
# 消费订单
$c_r_id = ConsumptionRecords::saveRecords($user_id,$zone_goods_id,$price,$price,$consumptionBalance,$save_data,$prizes_data,$awards_status);
# 返回客户 刮奖数据 、 消费ID 、 code 玩法模板标识
$returnData = [
'status' => 1,
'data' => $data,
'c_r_id' => $settlementRes['c_r_id'],
'code' => self::$play_code
];
# 消费返点
User::addRebateRatioAmount($user_id,$price,0,$c_r_id);
if (empty($prizes_data)) $returnData['prizes_data'] = $prizes_data;
if (empty($prizes_icon_data)) $returnData['prizes_icon_data'] = $prizes_icon_data;
if ($awards_status == 1) {
# 中奖做记录
AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$withdrawal_balance);
}
$connection->commit();
# 返回 刮奖数据 、 消费ID
return ['status' => 1, 'data' => $data, 'c_r_id' => $c_r_id, 'prizes_data' => $prizes_data];
return $returnData;
} catch (\Exception $e) {
$connection->rollback();
return ['status' => 0, 'msg' => '操作失败'];
return ['status' => 0, 'msg' => $e->getMessage()];
}
}
/**
* 刮奖完成
* @param $user_id
* @param $c_r_id
* 获取刮奖参数
* @param $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function endTicketing($user_id,$c_r_id )
protected static function getZoneParam($where = [] )
{
$where['status'] = 1;
$list = ZoneGoodsParam::where($where)
->field('id,amount,image,probability,awards')
->order('probability')
->select()
->toArray();
$ZoneAmountParam = [];
$sumProbability = 0;
foreach ($list as & $item) {
if ($item['image']) $item['image'] = get_image_url($item['image']);
if ($item['awards'] != 1) {
# 获取无奖项随机金额
$res = ZoneAmountParam::getRandAmount($ZoneAmountParam);
$item['amount'] = $res['amount'];
$ZoneAmountParam = $res['data'];
}
$sumProbability += $item['probability'];
}
# 验证
$queryWhere = ['user_id' => $user_id, 'id' => $c_r_id];
$ConsumptionRecords = new ConsumptionRecords();
$query = $ConsumptionRecords->where($queryWhere)->field('text_data,zone_goods_id,status,prizes_data')->find();
if (!$query) return ['status' => 0, 'msg' => '数据不存在'];
# 解密
$data = unserialize($query['text_data']);
$prizes_data = unserialize($query['prizes_data']);
$returnData = self::handleTextData($data);
$awards_amount = 0;
$AwardsRecordsRes = AwardsRecords::where('cr_id',$c_r_id)->find();
if ($AwardsRecordsRes) $awards_amount = round($AwardsRecordsRes['awards_amount']);
# 返回 刮奖数据 、 中奖号码、 中奖总金额、 中奖状态
return ['status' => 1, 'msg' => '完成', 'data' => $returnData, 'awards_amount' => $awards_amount, 'prizes_data' => $prizes_data];
# 概率未补全则自动补全 归1
if ($sumProbability < 1 & & strpos ( $ sumProbability , ' . ' ) ! = = false ) {
for ($i = 1; $i < = 10; $i++) {
$residueProbability = 1 - $sumProbability;
$res = ZoneAmountParam::getRandAmount($ZoneAmountParam);
$list[] = [
'id' => 0,
'amount' => $res['amount'],
'image' => rand_icon('icon',true),
'probability' => $residueProbability / 10,
'awards' => 0
];
}
}
return $list;
}
/**
* 余额扣减后 生成订单
* @param $user_id
* @param $zone_goods_id
* @return array
* 判断余额是否足够
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function createOrder($user_id,$zone_goods_id )
protected static function judgeBalance( )
{
# 判断用户是否存在未刮的
$inspect = self::inspectCompleteRecord($user_id);
if ($inspect['status']) {
return $inspect;
}
# 获取奖项个参数
$zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $zone_goods_id]);
if (empty($zoneParamArr)) return ['status' => 0, 'msg' => '刮奖失败'];
# 获取刮刮乐信息
$resData = self::getWinningPrize($zoneParamArr);
$data = $resData['data'];
$save_data = $resData['save_data'];
$userModel = User::field('balance')->find(self::$user_id);
$balance = $userModel->balance ?: 0;
# 开启事务
$connection = Db::connect();
try {
$connection->startTrans();
# 扣除余额
$zoneGoodsModel = ZoneGoods::field('price')->find($zone_goods_id);
$price = $zoneGoodsModel['price'];
$balance = User::decrBalance($user_id,$price);
# 消费记录
$c_r_id = ConsumptionRecords::createRecords($user_id,$zone_goods_id,$price,$price,$balance,$save_data);
$connection->commit();
# 返回刮刮乐图标、金额、订单id
return ['status' => 1, 'data' => $data, 'c_r_id' => $c_r_id];
} catch (\Exception $e) {
$connection->rollback();
return ['status' => 0, 'msg' => '操作失败'];
$zoneGoodsModel = ZoneGoods::field('price')->find(self::$zone_goods_id);
$price = $zoneGoodsModel->price ?: 0;
if ($balance < $price) {
return false;
}
return true;
}
/**
* 刮奖完成
* @param $user_id
* @param $c_r_id
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* 计算奖金
* @param $save_data
* @return int|mixed
*/
public static function endOrder($user_id,$c_r_id )
protected static function calculateAmount($save_data)
{
# 验证
$queryWhere = ['user_id' => $user_id, 'id' => $c_r_id];
$ConsumptionRecords = new ConsumptionRecords();
$query = $ConsumptionRecords->where($queryWhere)->field('text_data,zone_goods_id,status')->find();
if (!$query) return ['status' => 0, 'msg' => '数据不存在'];
if ($query['status'] == 1) return ['status' => 0, 'msg' => '刮奖结果已公布'];
# 解密
$data = unserialize($query['text_data']);
# 解析是否中奖
$awards_amount = 0;
foreach ($data as $key => $goodsParam) {
foreach ($save_data as $key => $goodsParam) {
foreach ($goodsParam as $k => $item) {
$data[$key][$k]['is_awards'] = 0;
$save_data[$key][$k]['is_awards'] = 0;
if (isset($item['id'])) {
$awardsAmountRes = ZoneGoodsParam::getAwardsAmount($item['id']);
if ($awardsAmountRes) {
$data[$key][$k]['is_awards'] = 1;
$save_data[$key][$k]['is_awards'] = 1;
$awards_amount += $awardsAmountRes['amount'];
}
}
}
}
$returnData = self::handleTextData($data) ;
$ConsumptionRecords->awardsData($data,$c_r_id);
return $awards_amount ;
}
/**
* 结算金额
* @param $awards_amount
* @param $text_data
* @param $prizes_data
* @param $prizes_icon_data
* @return array
*/
protected static function settlementAmount($awards_amount, $text_data, $prizes_data, $prizes_icon_data)
{
# 开启事务
$connection = Db::connect();
try {
$connection->startTrans();
# 扣除余额
$zoneGoodsModel = ZoneGoods::field('price')->find(self::$zone_goods_id);
$price = $zoneGoodsModel['price'];
# 消费金额
$consumptionBalance = User::decrBalance(self::$user_id, $price);
# 判断是否中奖
$awards_status = 0;
# 可提余额
$withdrawal_balance = 0;
if ($awards_amount > 0) {
# 修改用户余额
$balance = User::incrWithdrawalBalance($user_id,$awards_amount);
$awards_status = 1;
# 修改用户可提余额
$withdrawal_balance = User::incrWithdrawalBalance(self::$user_id, $awards_amount);
}
# 消费订单
$c_r_id = ConsumptionRecords::saveRecords(
self::$user_id,
self::$zone_goods_id,
$price,
$price,
$consumptionBalance,
$text_data,
$prizes_data,
$awards_status,
$prizes_icon_data
);
# 消费返点
User::addRebateRatioAmount(self::$user_id, $price, 0, $c_r_id);
if ($awards_status == 1) {
# 中奖做记录
AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$balance);
AwardsRecords::createRecords(self:: $user_id, $c_r_id, $awards_amount, $withdrawal_ balance);
}
# 完成订单
ConsumptionRecords::endOrder($c_r_id,$awards_amount);
$connection->commit();
return ['status' => 1, 'msg' => '完成', 'awards_amount' => $awards_amount, 'data' => $returnData];
# 消费ID
return ['status' => 1, 'c_r_id' => $c_r_id];
} catch (\Exception $e) {
$connection->rollback();
return ['status' => 0, 'msg' => '操作异常'];
return ['status' => 0, 'msg' => '操作失败 '];
}
}
/**
* 检查用户是否存在未刮的
* @param $user_id
* @return array|int[]
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function inspectCompleteRecord($user_id)
{
$query = ConsumptionRecords::where(['user_id' => $user_id,'status' => 0])->find();
if ($query) {
$data = self::handleTextData(unserialize($query['text_data']));
return ['status' => 1, 'data' => $data, 'c_r_id' => $query['id']];
};
return ['status' => 0];
}
/**
* 处理刮奖信息数据
* @param $data
* @param $is_awards // 1-删除 0-不删
* @return mixed
* 选择玩法返回不同刮奖数据
* @return array
*/
public static function handleTextData($data,$is_awards = 0 )
protected static function getTextData()
{
foreach ($data as $key => $value) {
foreach ($value as $k => $v) {
#$data[$key][$k]['amount'] = rtrim($v['amount'],'.00');
unset($data[$key][$k]['id']);
if ($is_awards) {
unset($data[$key][$k]['is_awards']);
$returnArr = ['save_data' => []];
switch (self::$play_code) {
// 数字 + 中奖号码
case 'digit_number':
# 中奖号码
$prizesFiles = []; # 有奖号码图片
# 获取数字图片
$noPrizeFiles = return_image_name('number_icon'); # 无奖号码图片
# 获取随机中奖数字 踢出所在数组
for ($i = 1; $i < = self::$awards_number_count; $i++) {
$rand = rand(0,count($noPrizeFiles)-1);
$prizesFiles[] = $noPrizeFiles[$rand];
unset($noPrizeFiles[$rand]);
sort($noPrizeFiles);
}
}
# 传参给方法使用
self::$param = ['noPrizeFiles' => $noPrizeFiles,'prizesFiles' => $prizesFiles];
# 拼接完整连接
foreach ($prizesFiles as & $file_icon) $file_icon = get_image_url($file_icon);
$returnArr['save_data'] = self::probabilityAlgorithm('digitNumber');
$returnArr['prizes_data'] = $prizesFiles;
break;
// 数字 + 图标
case 'digit_icon':
$noPrizeFiles = return_image_name('number_icon'); # 无奖号码图片
foreach ($noPrizeFiles as $key => $value) {
if (in_array($value,['number_icon/06.png','number_icon/07.png'])) unset($noPrizeFiles[$key]);
}
sort($noPrizeFiles);
# 传参给方法使用
self::$param = ['noPrizeFiles' => $noPrizeFiles];
$returnArr['save_data'] = self::probabilityAlgorithm('digitIcon');
break;
// 数字 + 中奖号码 + 图标
case 'digit_number_icon':
# 中奖号码
$prizesFiles = []; # 有奖号码图片
# 获取数字图片
$noPrizeFiles = return_image_name('number_icon'); # 无奖号码图片
# 获取随机中奖数字 踢出所在数组
for ($i = 1; $i < = self::$awards_number_count; $i++) {
$rand = rand(0,count($noPrizeFiles)-1);
$prizesFiles[] = $noPrizeFiles[$rand];
unset($noPrizeFiles[$rand]);
sort($noPrizeFiles);
}
# 传参给方法使用
self::$param = ['noPrizeFiles' => $noPrizeFiles,'prizesFiles' => $prizesFiles];
$returnArr['save_data'] = self::probabilityAlgorithm('digitNumberIcon');
# 拼接完整连接
foreach ($prizesFiles as & $file_icon) $file_icon = get_image_url($file_icon);
$returnArr['prizes_data'] = $prizesFiles;
# 获取指定有奖图标
$awards_icon = return_image_name(self::$awards_icon_dirname);
$rand_icon = [];
$randomKeys = array_rand($awards_icon, 4);
foreach ($randomKeys as $key) $rand_icon[] = get_image_url($awards_icon[$key]);
$prizes_icon_data = [
[$rand_icon[0],$rand_icon[1]],
[$rand_icon[2],$rand_icon[3]]
];
$returnArr['prizes_icon_data'] = $prizes_icon_data;
break;
// 图标
case 'icon':
$returnArr['save_data'] = self::probabilityAlgorithm('icon');
break;
default :
return [];
}
return $data;
return $returnArr ;
}
/**
* 获取刮刮乐信息(概率算法 - 自定义中奖图片 - 获取随机无奖图片)
* @param array $patterns // 数据 和 占比
* @param int $direction // 纵向数量
* @param int $transverse // 横向数量
* @return array[]
* 概率算法
* $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], // 奖项图案,概率为40%
* ];
* @param $function
* @param $noPrizeFiles
* @param $prizesFiles
* @return array
*/
public static function getWinningPrize(array $patterns,int $direction = 3,int $transverse = 4)
protected static function probabilityAlgorithm($function )
{
// $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%
// ];
$patterns = self::$patterns;
// 计算概率总和
$totalProbability = 0;
@ -347,11 +377,11 @@ class Zone
}
unset($pattern);
$data = [];
$save_data = [];
for ($i = 0; $i < $direction; $i++) {
for ($i = 0; $i < self:: $ direction ; $ i + + ) {
for ($j = 0; $j < self:: $ transverse ; $ j + + ) { / / 每组生成 3 个图案
for ($j = 0; $j < $transverse; $j++) { // 每组生成 3 个图案
$selectedPattern = null;
$randomNumber = mt_rand() / mt_getrandmax(); // 生成 0 到 1 之间的随机数
@ -361,125 +391,167 @@ class Zone
break;
}
}
$amount = round($selectedPattern['amount']);
$pinyin = PinyinNumber::getPinyin($amount,true);
$amount_format = number_format($amount);
$image_url = get_image_url($selectedPattern['image']);
$data[$i][] = [
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $image_url
];
$save_data[$i][] = [
'id' => $selectedPattern['id'],
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $image_url
];
}
$save_data[$i][] = self::$function($selectedPattern);
}
}
return [
'data' => $data,
'save_data' => $save_data
];
return $save_data;
}
/**
* 获取刮刮乐信息(概率算法 - 随机中奖数字图片 随机无奖数字图片)
* @param array $patterns // 数据 和 占比
* @param int $direction // 纵向数量
* @param int $transverse // 横向数量
* @param int $randNum // 中奖号码数量
* @return array[]
* 数字+中奖号码 玩法
* @param $selectedPattern
* @param $param
* @return array
*/
public static function getWinningPrizeRandNumber(array $patterns,int $direction = 3,int $transverse = 4, int $randNum = 3 )
protected static function digitNumber($selectedPattern)
{
$noPrizeFiles = self::$param['noPrizeFiles'];
$prizesFiles = self::$param['prizesFiles'];
# 中奖号码
$prizesFiles = []; # 有奖号码图片
# 获取数字图片
$noPrizeFiles = return_image_name('number_icon'); # 无奖号码图片
# 获取随机中奖数字 踢出所在数组
for ($i = 1; $i < = $randNum; $i++) {
$rand = rand(0,count($noPrizeFiles)-1);
$prizesFiles[] = $noPrizeFiles[$rand];
unset($noPrizeFiles[$rand]);
sort($noPrizeFiles);
}
$noPrizeCount = count($noPrizeFiles);
// 计算概率总和
$totalProbability = 0;
foreach ($patterns as $pattern) {
$totalProbability += $pattern['probability'];
# 有奖 无奖指定图片
if ($selectedPattern['awards'] == '1') {
$tempRand = rand(0,self::$awards_number_count -1);
$numberImage = $prizesFiles[$tempRand];
} else {
$tempRand = rand(0,$noPrizeCount - 1);
$numberImage = $noPrizeFiles[$tempRand];
}
$numberImage = get_image_url($numberImage);
// 归一化处理,并计算累积概率
$accumulatedProbability = 0;
foreach ($patterns as & $pattern) {
$pattern['probability'] /= $totalProbability; // 归一化处理
$accumulatedProbability += $pattern['probability'];
$pattern['accumulatedProbability'] = $accumulatedProbability; // 累积概率
}
unset($pattern);
# 金额拼音
$amount = round($selectedPattern['amount']);
$pinyin = PinyinNumber::getPinyin($amount,true);
$amount_format = number_format($amount);
$data = [];
$save_data = [];
for ($i = 0; $i < $direction; $i++) {
return [
'id' => $selectedPattern['id'],
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $numberImage
];
}
for ($j = 0; $j < $transverse; $j++) { // 每组生成 3 个图案
$selectedPattern = null;
$randomNumber = mt_rand() / mt_getrandmax(); // 生成 0 到 1 之间的随机数
/**
* 数字+图标 玩法
* @param $selectedPattern // 概率选中数据
* @param $noPrizeFiles // 无奖数字图标组
* @return array
*/
protected static function digitIcon($selectedPattern)
{
$noPrizeFiles = self::$param['noPrizeFiles'];
$noPrizeCount = count($noPrizeFiles);
foreach ($patterns as $pattern) {
if ($randomNumber < = $pattern['accumulatedProbability']) {
$selectedPattern = $pattern;
break;
}
}
# 新逻辑 数字图片
if ($selectedPattern['awards'] == '1') {
$tempRand = rand(0,$randNum -1);
$numberImage = $prizesFiles[$tempRand];
} else {
$tempRand = rand(0,$noPrizeCount - 1);
$numberImage = $noPrizeFiles[$tempRand];
}
$numberImage = get_image_url($numberImage);
# 金额拼音
$amount = round($selectedPattern['amount']);
$pinyin = PinyinNumber::getPinyin($amount,true);
$amount_format = number_format($amount);
# 返回给用户数据
$data[$i][] = [
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $numberImage
];
# 保存到系统数据
$save_data[$i][] = [
'id' => $selectedPattern['id'],
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $numberImage
];
}
$numberImage = $selectedPattern['image'];
}
$amount = round($selectedPattern['amount']);
# 返回中奖图片地址
foreach ($prizesFiles as & $valFiles) {
$valFiles = get_image_url($valFiles);
# 无奖替换成 数字icon
if ($selectedPattern['awards'] != '1') {
$tempRand = rand(0,$noPrizeCount - 1);
$numberImage = $noPrizeFiles[$tempRand];
}
$pinyin = PinyinNumber::getPinyin($amount,true);
$numberImage = get_image_url($numberImage);
$amount_format = number_format($amount);
$image_url = get_image_url($numberImage);
return [
'data' => $data,
'save_data' => $save_data,
'prizes_data' => $prizesFiles
'id' => $selectedPattern['id'],
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $image_url
];
}
/**
* 数字+中奖号码+图标 玩法
* @return array
*/
protected static function digitNumberIcon($selectedPattern)
{
$param = self::$param;
return self::digitNumber($selectedPattern);
}
/**
* 图标玩法
* @return array
*/
protected static function icon($selectedPattern)
{
$amount = round($selectedPattern['amount']);
$pinyin = PinyinNumber::getPinyin($amount,true);
$amount_format = number_format($amount);
$image_url = get_image_url($selectedPattern['image']);
return [
'id' => $selectedPattern['id'],
'amount' => $amount_format,
'pinyin' => $pinyin,
'image' => $image_url
];
}
/**
* 刮奖完成
* @param $user_id
* @param $c_r_id
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function endTicketing($user_id,$c_r_id)
{
# 验证
$queryWhere = ['user_id' => $user_id, 'id' => $c_r_id];
$ConsumptionRecords = new ConsumptionRecords();
$query = $ConsumptionRecords->where($queryWhere)->field('text_data,zone_goods_id,status,prizes_data')->find();
if (!$query) return ['status' => 0, 'msg' => '数据不存在'];
# 解密
$data = unserialize($query['text_data']);
$prizes_data = unserialize($query['prizes_data']);
$returnData = self::handleTextData($data);
$awards_amount = 0;
$AwardsRecordsRes = AwardsRecords::where('cr_id',$c_r_id)->find();
if ($AwardsRecordsRes) $awards_amount = round($AwardsRecordsRes['awards_amount']);
# 返回 刮奖数据 、 中奖号码、 中奖总金额、 中奖状态
return ['status' => 1, 'msg' => '完成', 'data' => $returnData, 'awards_amount' => $awards_amount, 'prizes_data' => $prizes_data];
}
/**
* 处理刮奖信息数据
* @param $data
* @param $is_awards // 1-删除 0-不删
* @return mixed
*/
public static function handleTextData($data,$is_awards = 0)
{
foreach ($data as $key => $value) {
foreach ($value as $k => $v) {
#$data[$key][$k]['amount'] = rtrim($v['amount'],'.00');
unset($data[$key][$k]['id']);
if ($is_awards) {
unset($data[$key][$k]['is_awards']);
}
}
}
return $data;
}
/**
* 自动刮奖测试机
* @param $user_id
@ -507,72 +579,8 @@ class Zone
$limit = 1;
while ($limit < = $count) {
$result = self::ticketing($user_id,$zone_goods_id,2 );
$result = self::ticketing($user_id,$zone_goods_id);
if (!$result['status']) return $result['msg'];
// # 获取奖项个参数
// $zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $zone_goods_id]);
// if (empty($zoneParamArr)) return '奖项不存在';
//
// # 获取刮刮乐信息
// $resData = Zone::getWinningPrize($zoneParamArr);
// #$data = $resData['data'];
// $save_data = $resData['save_data'];
//
// # 开启事务
// $connection = Db::connect();
// try {
//
// $connection->startTrans();
//
// # 扣除余额
// $zoneGoodsModel = ZoneGoods::field('price')->find($zone_goods_id);
// $price = $zoneGoodsModel['price'];
// $balance = User::decrBalance($user_id,$price);
//
// # 消费记录
// $c_r_id = ConsumptionRecords::createRecords($user_id,$zone_goods_id,$price,$price,$balance,$save_data);
//
// # 解析是否中奖
// $awards_amount = 0;
// foreach ($save_data as $key => $goodsParam) {
// foreach ($goodsParam as $k => $item) {
// $save_data[$key][$k]['is_awards'] = 0;
// if (isset($item['id'])) {
// $awardsAmountRes = ZoneGoodsParam::getAwardsAmount($item['id']);
// if ($awardsAmountRes) {
// $save_data[$key][$k]['is_awards'] = 1;
// $awards_amount += $item['amount'];
// }
// }
// }
// }
//
// $ConsumptionRecords = new ConsumptionRecords();
//
// $ConsumptionRecords::awardsData($save_data,$c_r_id);
//
// # 判断是否中奖
// if ($awards_amount > 0) {
//
// # 修改用户余额
// $balance = User::incrWithdrawalBalance($user_id,$awards_amount);
//
// # 中奖做记录
// AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$balance);
// }
//
// # 完成订单
// ConsumptionRecords::endOrder($c_r_id,$awards_amount);
//
// $connection->commit();
//
// # 返回刮刮乐图标、金额、订单id
// } catch (\Exception $e) {
//
// $connection->rollback();
// return $e->getMessage();
// }
# 循环执行
$limit++;
}