Commit 904a2075 by haojie

1

parent 3167990b
<?php
namespace App\Admin\Common;
class ChangeConfig
{
private function setConfig($value)
{
$config = \Illuminate\Support\Facades\Config::get('address');
$config['address'] = $value;
$path = base_path() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'address.php';
file_put_contents($path, "<?php \n return " . var_export($config, true) . ';');
}
}
......@@ -104,11 +104,16 @@ protected function form()
# winner_list--中奖用户列表
// $form->display('status');
$form->number('winner_num', '中奖人数')->default(1)->min(0);
$form->file('project_icon', '项目图片')->accept('jpg,png,gif,jpeg', 'image/*')->disk('admin')->autoUpload(true)->uniqueName();
$form->number('box_num', '生成盲盒数量')->default(1)->min(0);
$form->number('can_invite_num', '最高邀请人数')->default(1)->min(0);
$form->number('invite_up_rate', '单次邀请增加的几率')->default(1)->min(0);
$form->file('project_icon', '项目图片')->accept('jpg,png,gif,jpeg', 'image/*')->disk('admin')->autoUpload(true)->uniqueName();
$form->textarea('rules', '规则');
$form->display('created_at');
$form->display('updated_at');
$form->saving(function (Form $form) {
$form->project_icon = url("/uploads/$form->project_icon");
});
$form->saved(function (Form $form, $result) {
// 自增ID
$newId = $result;
......
......@@ -82,7 +82,7 @@ protected function grid()
# 参与钱包
$grid->column('purchased', '参与钱包')->display(function () {
$json = json_decode($this->purchased);
if (!is_array($json)) {
if (!$json) {
return '暂无';
}
return '点击展开';
......@@ -92,9 +92,9 @@ protected function grid()
# 是数组
$div = '';
if (is_array($json)) {
if ($json && count($json)) {
foreach ($json as $value) {
$div = $div . "<div>$value</div>";
$div = $div . "<div>$value->address</div>";
}
}
return "<div style='padding:10px 10px 0'>$div</div>";
......@@ -104,7 +104,7 @@ protected function grid()
$list = ['12', '234'];
$json = json_encode($list);
$json = json_decode($json);
if (is_array($json)) {
if (count($json)) {
# 是数组
$div = '';
foreach ($json as $value) {
......
......@@ -32,19 +32,19 @@ public function handle()
{
try {
$list = BlindBoxList::query()->where('status', '!=', 3)->get();
Log::error($list);
foreach ($list as $value) {
$start_time = ToTimestamp($value->start_time);
$end_time = ToTimestamp($value->end_time);
$status = getBlindBoxStatus($start_time, $end_time);
if ($status == 3) {
# 开奖
app(OpenPrizeController::class)->useOpenPrize();
app(OpenPrizeController::class)->useOpenPrize($value);
}
if ($status != $value->id) {
BlindBoxList::query()->where('id', $value->id)->update(['status' => $status]);
}
}
Log::error('结束运行了');
} catch (\Exception $e) {
Log::error($e);
}
......
......@@ -6,15 +6,24 @@
use App\Models\BlindBoxList;
use App\Models\UserWallet;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Log;
class BlindBoxController
{
/**
* 需要的参数
*/
private $Parameter = ['end_time', 'id', 'invite_up_rate', 'max_participants_num', 'price',
'projectName', 'project_icon', 'rules', 'start_time', 'status', 'purchased'];
/**
* 进行中的盲盒列表
*/
public function getProgressBoxList()
{
$list = BlindBoxList::query()->where('status', '!=', 3)->get();
$list = BlindBoxList::query()->where('status', '!=', 3)->get($this->Parameter);
# 计算购买倒计时
foreach ($list as $item) {
# 获取当前时间
......@@ -25,7 +34,7 @@ public function getProgressBoxList()
# 购买人数list
$purchased = json_decode($item->purchased);
$buy_num = 0;
if (is_array($purchased)) {
if ($purchased && count($purchased)) {
$buy_num = count($purchased);
}
# 删除原始购买人数字段
......@@ -51,43 +60,54 @@ public function getProgressBoxList()
public function getUserPayBlindBox($address, $status, $page, $limit, $request)
{
# 获取用户购买成功的订单id
$ID_LIST = UserWallet::query()->where('user_address', $address)->whereIn('status', [1])->get(['blind_box_id']);
$ID_LIST = UserWallet::query()->where('user_address', $address)->where('status', 1)->get(['blind_box_id']);
if (count($ID_LIST)) {
# 存在购买的订单-前往盲盒列表查询
$list = [];
foreach ($ID_LIST as $value) {
if ($status == 3) {
# 获取已完成的订单--要加个状态-是否中奖
$obj = BlindBoxList::query()->where('id', $value->blind_box_id)->whereIn('status', [3])->get()->first();
# 获取已完成的订单
$obj = self::getSuccessOrder($value->blind_box_id, 3);
if ($obj) {
$buy_num = count(json_decode($obj->purchased));
if ($buy_num >= $obj->min_participants_num) {
$buy_num = json_decode($obj->purchased);
if ($buy_num && $buy_num >= $obj->min_participants_num) {
# 购买人数已达到指定数
$obj->buy_num = $buy_num;
$obj->buy_num = count($buy_num);
# - 是否中奖
$winner_list = json_decode($obj->winner_list);
$obj->is_sucess = false;
if ($winner_list && count($winner_list)) {
foreach ($winner_list as $item) {
if ($address == $item) {
$obj->is_sucess = true;
break;
}
}
}
unset($obj->purchased);
array_push($list, $obj);
}
}
} else if ($status == 2) {
# 进行中 --["0xcc88e86aa0e589e18ff03fb9b0449468a1ef1f4b"]
$obj = BlindBoxList::query()->where('id', $value->blind_box_id)->whereIn('status', [2])->get()->first();
# 进行中 --
$obj = self::getSuccessOrder($value->blind_box_id, 2);
if ($obj) {
$buy_num = count(json_decode($obj->purchased));
if ($buy_num >= $obj->min_participants_num) {
$buy_num = json_decode($obj->purchased);
if ($buy_num && count($buy_num) >= $obj->min_participants_num) {
# 购买人数已达到指定数
$obj->buy_num = $buy_num;
$obj->buy_num = count($buy_num);
unset($obj->purchased);
array_push($list, $obj);
}
}
} else if ($status == 1) {
# 未完成
$obj = BlindBoxList::query()->where('id', $value->blind_box_id)->whereIn('status', [2])->get()->first();
$obj = self::getSuccessOrder($value->blind_box_id, 2);
if ($obj) {
$buy_num = count(json_decode($obj->purchased));
if ($buy_num < $obj->min_participants_num) {
$buy_num = json_decode($obj->purchased);
if ($buy_num && count($buy_num) < $obj->min_participants_num) {
# 未到达指定人数
$obj->buy_num = $buy_num;
$obj->buy_num = count($buy_num);
unset($obj->purchased);
array_push($list, $obj);
}
......@@ -103,8 +123,15 @@ public function getUserPayBlindBox($address, $status, $page, $limit, $request)
]);
# return $list;
} else {
return [];
return new LengthAwarePaginator([], 0, $limit, $page, [
'path' => $request->url(), // 当前页面的url
'pageName' => 'page', //参数名
]);
}
}
private function getSuccessOrder($id, $status)
{
return BlindBoxList::query()->where('id', $id)->where('status', $status)->first($this->Parameter);
}
}
......@@ -5,6 +5,7 @@
use App\Models\BlindBoxList;
use App\Models\UserWallet;
use App\Models\UseUser;
use Illuminate\Support\Facades\Log;
......@@ -13,11 +14,35 @@ class BuyBlindBoxController
/**
*
*/
public function toBuy($address, $hash, $id, $price)
public function toBuy($address, $hash, $id, $invite_code, $Invitees_box_id)
{
# 需要hash--address--盲盒id
# 创建订单
UserWallet::query()->create(['user_address' => $address, 'status' => 0, 'price' => $price, 'blind_box_id' => $id, 'hash' => $hash]);
# 获取盲盒价格
$price = BlindBoxList::query()->where('id', $id)->first(['price']);
# 检查提交的盲盒id是否存在
$box_id_item = BlindBoxList::query()->where('id', $Invitees_box_id)->first(['id']);
# 判断是否存在邀请人
if ($invite_code && $box_id_item) {
# 是分享的链接
# 筛选出邀请码对应的地址
$item = UseUser::query()->where('invitation_code', $invite_code)->first(['user_address']);
$cur_code_address = '';
if ($item->user_address) {
$cur_code_address = $item->user_address;
}
# 存在邀请人--且--购买账户与与邀请人账户不一致
if ($cur_code_address && $cur_code_address != $address) {
# 向order表插入邀请人地址和邀请人购买的盒子id
UserWallet::query()->create(['user_address' => $address, 'status' => 0, 'price' => $price->price,
'blind_box_id' => $id, 'hash' => $hash, 'Invitees_address' => $cur_code_address, 'Invitees_box_id' => $Invitees_box_id]);
} else {
# 创建订单
UserWallet::query()->create(['user_address' => $address, 'status' => 0, 'price' => $price->price, 'blind_box_id' => $id, 'hash' => $hash]);
}
} else {
# 创建订单
UserWallet::query()->create(['user_address' => $address, 'status' => 0, 'price' => $price->price, 'blind_box_id' => $id, 'hash' => $hash]);
}
}
/**
......@@ -33,31 +58,80 @@ public function IntervalCheck()
*/
public function CheckCallback($hash, $status)
{
# status没有改变就直接return
$change = UserWallet::query()->where('hash', $hash)->first(['status']);
if ($change->status == $status) {
return '';
}
# 更新订单状态
UserWallet::query()->where('hash', $hash)->update(['status' => $status]);
# 获取当前hash的购买地址-和盲盒id
$item = UserWallet::query()->where('hash', $hash)->first(['user_address', 'blind_box_id']);
$item = UserWallet::query()->where('hash', $hash)->first();
#获取已购买列表
$purchased = BlindBoxList::query()->where('id', $item->blind_box_id)->first(['purchased']);
$purchased = BlindBoxList::query()->where('id', $item->blind_box_id)->first(['purchased', 'min_participants_num']);
#更新盲盒购买状态
$pur_list = json_decode($purchased->purchased);
if (!empty($pur_list) && is_array($pur_list)) {
if ($pur_list && count($pur_list)) {
# 先判断是否存在地址了
foreach ($pur_list as $values) {
if ($values == $item->user_address) {
if ($values->address == $item->user_address) {
return '已存在';
}
}
# 盲盒购买者是否需要添加邀请人数
self::AddInviteNum($item, $status);
$obj = (object)[];
$obj->address = $item->user_address;
$obj->invite_num = 0;
$obj->rate = 0;
# 往数组添加
array_push($pur_list, $item->user_address);
array_push($pur_list, $obj);
# 更新当前盲盒购买人数
BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => json_encode($pur_list)]);
} else {
# 首次添加
# 盲盒购买者是否需要添加邀请人数
self::AddInviteNum($item, $status);
$list = [];
Log::error($item->user_address);
array_push($list, $item->user_address);
$obj = (object)[];
$obj->address = $item->user_address;
$obj->invite_num = 0;
$obj->rate = 0;
array_push($list, $obj);
BlindBoxList::query()->where('id', $item->blind_box_id)->update(['purchased' => json_encode($list)]);
}
# 再次获取购买人数
$purchased = BlindBoxList::query()->where('id', $item->blind_box_id)->first(['purchased', 'min_participants_num']);
# 当购买人数达到最低购买人数时,计算中奖几率
$buy_list = json_decode($purchased->purchased);
if (count($buy_list) > $purchased->min_participants_num) {
# 这里只要处理平均分--后续邀请增加购买几率在购买接口
}
return '';
}
/**
* 给邀请人添加邀请人数记录
*/
private function AddInviteNum($item, $status)
{
# 只操作购买成功的-且两个人购买的是相同盲盒--且两个地址不一致
if ($status == 1 && $item && $item->blind_box_id == $item->Invitees_box_id && $item->user_address != $item->Invitees_address) {
# 找到盲盒
$values = BlindBoxList::query()->where('id', $item->Invitees_box_id)->first(['purchased', 'can_invite_num', 'max_participants_num']);
$purchased = json_decode($values->purchased);
if ($purchased && count($purchased)) {
foreach ($purchased as $obj) {
# 最高邀请人数-1.不能超过盲盒最大购买数量减一,,-2.不能超过后台设置的可邀请人数
if ($obj->address == $item->Invitees_address && $obj->invite_num < $values->can_invite_num && $obj->invite_num < $values->max_participants_num) {
$obj->invite_num += 1;
return;
}
}
}
# 更新盲盒
BlindBoxList::query()->where('id', $item->Invitees_box_id)->update(['purchased' => json_encode($purchased)]);
}
}
}
......@@ -13,9 +13,96 @@ class OpenPrizeController
/**
* 盲盒开奖
*/
public function useOpenPrize()
public function useOpenPrize($item)
{
return '';
Log::error('进入');
# 已购买人数
$purchased = json_decode($item->purchased);
# 可中奖人数
$winner_num = $item->winner_num;
if ($purchased && count($purchased) && count($purchased) > $item->min_participants_num) {
# 计算购买者应有的中奖几率
#平均值
$average_value = 100 / count($purchased);
$max = 100;
# 没有邀请的购买者人数
$not_invite_num = 0;
foreach ($purchased as $values) {
# 获取各自的邀请人数
if ($values->invite_num) {
# 不为0的
$values->rate = $average_value + ($values->invite_num * $values->invite_up_rate);
$max -= $values->rate;
} else {
$not_invite_num += 1;
}
}
# 循环结束后,$max剩下的人平分
$not_invite_rate = $max / $not_invite_num;
foreach ($purchased as $values) {
if (!$values->invite_num) {
$values->rate = $not_invite_rate;
}
}
}
# 开奖 - address-invite_num-rate---$winner_num
$while_status = true;
$winner_list = json_decode($item->winner_list);
while ($while_status) {
# 直到抽奖人数达标
if ($winner_list && count($winner_list) >= $winner_num) {
$while_status = false;
continue;
}
$res = self::get_prize($purchased);
Log::error($res);
if ($res) {
if ($winner_list && count($winner_list)) {
# 数组已存在
foreach ($winner_list as $win_item) {
if ($win_item == $res) {
continue;
} else {
# 没有重复中奖--push
$winner_list[] = $res;
break;
}
}
} else {
# 为空创建一个数组
$list = [];
$list[] = $res;
$winner_list = $list;
}
} else {
Log::error('空地址');
$while_status = false;
}
$while_status = false;
}
Log::error('结束');
# 更新数据
BlindBoxList::query()->where('id', $item->id)->update(['winner_list' => json_encode($winner_list),
'purchased' => json_encode($purchased)]);
}
public function get_prize($list)
{
$result = '';
//概率数组的总概率精度
$proSum = 100;
//概率数组循环
foreach ($list as $item) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $item->rate) {
$result = $item->address;
break;
} else {
$proSum -= $item->rate;
}
}
return $result;
}
}
......@@ -11,6 +11,8 @@
use Illuminate\Support\Facades\Redis;
use App\Models\UserWallet;
use App\Http\Controllers\API\User\CreateUser;
use App\Models\BlindBoxList;
class IndexController extends Controller
{
......@@ -23,11 +25,12 @@ class IndexController extends Controller
public function getUserInfo(Request $request)
{
$address = $request->input('address', null);
$id = $request->input('id', null);
if (empty($address)) {
return $this->success('success', '');
}
# 创建用户
$result = app(CreateUser::class)->useCreateAccount($address);
$result = app(CreateUser::class)->useCreateAccount($address, $id);
return $this->success('success', $result);
}
......@@ -61,6 +64,38 @@ public function useUserOrder(Request $request)
}
/**
* 用户能否购买当前盲盒
*/
public function useCanNotBuy(Request $request)
{
$address = $request->input('address', null);
$id = $request->input('id', null);
if (empty($address) || empty($id)) {
return $this->success('success', false);
}
#
$items = BlindBoxList::query()->where('id', $id)->first(['purchased', 'max_participants_num']);
$purchased = json_decode($items->purchased);
# 已经买过的
if ($purchased && count($purchased)) {
foreach ($purchased as $obj) {
if ($obj->address == $address) {
# 无法购买
return $this->success('success', false);
}
}
# 超出最高购买人数的
if (count($purchased) >= $items->max_participants_num) {
# 无法购买
return $this->success('success', false);
}
}
return $this->success('success', true);
}
/**
* 购买盲盒
*/
public function useBuy(Request $request)
......@@ -68,11 +103,14 @@ public function useBuy(Request $request)
$address = $request->input('address', null);
$hash = $request->input('hash', null);
$id = $request->input('id', null);
$price = $request->input('price', null);
if (empty($address) || empty($hash) || empty($id) || empty($price)) {
# 邀请码
$invite_code = $request->input('invite_code', null);
# 邀请人分享的盲盒id
$Invitees_box_id = $request->input('Invitees_box_id', null);
if (empty($address) || empty($hash) || empty($id)) {
return $this->error('缺少数据', 400, 400);
}
$result = app(BuyBlindBoxController::class)->toBuy($address, $hash, $id, $price);
$result = app(BuyBlindBoxController::class)->toBuy($address, $hash, $id, $invite_code, $Invitees_box_id);
return $this->success('success', $result);
}
......@@ -99,7 +137,7 @@ public function usePayCheck(Request $request)
# 获取交易
$obj = (object)[];
$obj->hash = $hash;
$obj->notify_url = 'http://127.0.0.1:8000/api/BlindBox/buy/CheckCallback';
$obj->notify_url = config('address.callback');
$obj->retry = 1;
$obj->amount = $amount;
$obj->form = $form;
......
......@@ -3,30 +3,47 @@
namespace App\Http\Controllers\API\User;
use App\Models\UseUser;
use App\Models\UserWallet;
use App\Models\BlindBoxList;
class CreateUser
{
public function useCreateAccount($address)
public function useCreateAccount($address, $id)
{
# 前端连接钱包成功后,判断是否创建用户
$user = UseUser::query()->where('user_address', $address)->first();
$invitation_code = '';
if (!$user) {
#用户不存在
# 生成邀请码的位数
$count = 6;
#循环判断是否存在
# 生成邀请码
$invitation_code = self::getRandomStr($count);
# 判断表中是否存在相同邀请码
$item = UseUser::query()->where('invitation_code', $invitation_code)->first();
if (!$item) {
# 不存在-创建账户
UseUser::query()->create(['user_address' => $address, 'invitation_code' => $invitation_code]);
} else {
# 存在相同的邀请码
for ($i = 1; $i <= 10; $i++) {
$res = self::CreateSuccess($address, $count);
if (!$res->status) {
$count += 1;
} else {
$invitation_code = $res->invitation_code;
break;
}
}
} else {
# 已存在--获取邀请码
$code = UseUser::query()->where('user_address', $address)->first(['invitation_code']);
$invitation_code = $code->invitation_code;
}
# 创建成功--返回邀请码
$obj = (object)[];
# 邀请链接
$obj->invitation_link = "http://test.com/raffle/$invitation_code/$id";
# 已邀请列表
$invite_list = UserWallet::query()->where('Invitees_address', $address)->where('Invitees_box_id', $id)->where('status', 1)->get(['user_address']);
$obj->invite_list = $invite_list ?? [];
#获取当前盲盒单个邀请增加的几率
$rate = BlindBoxList::query()->where('id', $id)->first(['invite_up_rate']);
$obj->rate = $rate->invite_up_rate;
return $obj;
}
/**
......@@ -46,4 +63,28 @@ private function getRandomStr($count)
}
return $code;
}
private function CreateSuccess($address, $count)
{
$status = false;
for ($i = 1; $i <= 20; $i++) {
# 生成邀请码
$invitation_code = self::getRandomStr($count);
# 判断表中是否存在相同邀请码
$item = UseUser::query()->where('invitation_code', $invitation_code)->first();
if ($item) {
# 存在相同的邀请码
continue;
} else {
# 不存在-创建账户
UseUser::query()->create(['user_address' => $address, 'invitation_code' => $invitation_code]);
$status = true;
break;
}
}
$obj = (object)[];
$obj->invitation_code = $invitation_code;
$obj->status = $status;
return $obj;
}
}
......@@ -22,6 +22,9 @@ class BlindBoxList extends Model
'project_icon',
'box_num',
'rules',
'status'
'status',
'can_invite_num',
'invite_up_rate'
];
}
<?php
return [
# 0x51eF357cf7204DB2a6e31750817F709a10c86f37
'address' => '0x51eF357cf7204DB2a6e31750817F709a10c86f37',
'callback' => 'http://127.0.0.1:8000/api/BlindBox/buy/CheckCallback'
];
......@@ -23,6 +23,8 @@
], static function () {
// 获取盲盒列表
Route::get('/BlindBoxList', 'IndexController@getList');
# 用户能否购买当前盲盒
Route::get('/CanNotBuy', 'IndexController@useCanNotBuy');
# 购买盲盒
Route::post('/BlindBox/buy', 'IndexController@useBuy');
# 检查交易
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment