优化无限赏支付抽奖方式。修复问题

This commit is contained in:
manghe 2025-03-31 14:56:31 +00:00
parent b7b40cd120
commit f1b5ff9a0b
17 changed files with 579 additions and 18 deletions

View File

@ -68,3 +68,56 @@ composer require yzalis/identicon
composer require topthink/think-image
php think UserStatisticsHour
```
原抽无限赏奖逻辑(内存消耗过大,不在使用)
```sh
// #组合中奖商品
// $all_goods_id = [];
// foreach ($goodslist as $value) {
// $real_pro1 = $value['real_pro'];
// $real_pro = $real_pro1 * 100000;
// for ($i = 1; $i <= $real_pro; $i++) {
// $all_goods_id[] = $value['id'];
// }
// }
// for ($i = 0; $i < $prize_num; $i++) {
// #随机打乱
// shuffle($all_goods_id);
// shuffle($all_goods_id);
// $prize_id = $all_goods_id[0];
// $prize_info = GoodsList::where(['id' => $prize_id])->find();
// #编号
// $luck_no = OrderList::field('id')
// ->where('goods_id', '=', $goods_id)
// ->where('num', '=', 0)
// ->where('order_type', '=', $order_type)
// ->order('id desc')
// ->value('luck_no');
// $luck_no++;
// #新增记录
// $save_prize_info = [
// 'order_id' => $order_id,
// 'user_id' => $user_id,
// 'status' => 0,#0未操作 1选择兑换 2选择发货
// 'goods_id' => $goods_id,
// 'num' => 0,
// 'shang_id' => $prize_info['shang_id'],
// 'goodslist_id' => $prize_info['id'],
// 'goodslist_title' => $prize_info['title'],
// 'goodslist_imgurl' => $prize_info['imgurl'],
// 'goodslist_price' => $prize_info['price'],
// 'goodslist_money' => $prize_info['money'],
// 'goodslist_type' => $prize_info['goods_type'],
// 'goodslist_sale_time' => $prize_info['sale_time'],
// 'addtime' => time(),
// 'prize_code' => $prize_info['prize_code'],
// 'order_type' => $order_type,
// 'luck_no' => $luck_no,
// ];
// #入库===
// $res[] = OrderList::insert($save_prize_info);
// }
```

View File

@ -53,6 +53,7 @@ class Advert extends Base
*/
public function add(Request $request)
{
if (!$request->isPost()) {
$types = AdvertTypeModel::order('sort asc, id asc')->select();
View::assign('types', $types);

View File

@ -770,7 +770,7 @@ class Goods extends Base
if ($type == 1 || $type == 5 || $type == 10 || $type == 6 || $type == 11) {
} elseif ($type == 2 || $type == 8 || $type == 9) {
if (RegMoney($data['real_pro']*100)) {
if (RegMoney($data['real_pro']*1000)) {
return $this->renderError('真实概率设置错误,最多保留两位小数');
}
} else if ($type == 3) {

View File

@ -965,9 +965,10 @@ class User extends Base
{
$id = input('id');
View::assign('id',$id);
View::assign('user_id',$id);
$nickname = input('nickname');
View::assign('nickname',$nickname);
return View::fetch();
return View::fetch('User/user_order');
}
/**

View File

@ -0,0 +1,135 @@
<?php
namespace app\admin\controller;
use app\MyController;
use app\common\model\WelfareHouse as WelfareHouseModel;
use think\facade\View;
class WelfareHouse extends Base
{
// 列表页
public function index()
{
if (request()->isAjax()) {
$param = input('param.');
$limit = $param['limit'] ?? 15;
$offset = $param['offset'] ?? 0;
$where = [];
if (!empty($param['name'])) {
$where[] = ['name', 'like', '%' . $param['name'] . '%'];
}
$count = WelfareHouseModel::where($where)->count();
$list = WelfareHouseModel::where($where)
->order('sort asc, id desc')
->limit($offset, $limit)
->select();
return json([
'code' => 0,
'msg' => '',
'count' => $count,
'data' => $list
]);
// json(['total' => $count, 'rows' => $list]);
}
return View::fetch();
}
// 添加
public function add()
{
if (request()->isPost()) {
$param = input('post.');
$validate = validate([
'name|名称' => 'require',
'image|图片' => 'require',
'url|跳转路径' => 'require',
'sort|排序' => 'require|number',
]);
if (!$validate->check($param)) {
return json(['status' => 0, 'msg' => $validate->getError()]);
}
$param['status'] = isset($param['status']) ? 1 : 0;
$result = WelfareHouseModel::create($param);
if ($result) {
return json(['status' => 1, 'msg' => '添加成功']);
} else {
return json(['status' => 0, 'msg' => '添加失败']);
}
}
return View::fetch();
}
// 编辑
public function edit()
{
$id = input('id');
$info = WelfareHouseModel::find($id);
if (!$info) {
return json(['status' => 0, 'msg' => '数据不存在']);
}
if (request()->isPost()) {
$param = input('post.');
$validate = validate([
'name|名称' => 'require',
'image|图片' => 'require',
'url|跳转路径' => 'require',
'sort|排序' => 'require|number',
]);
if (!$validate->check($param)) {
return json(['status' => 0, 'msg' => $validate->getError()]);
}
$param['status'] = isset($param['status']) ? 1 : 0;
$result = WelfareHouseModel::update($param);
if ($result) {
return json(['status' => 1, 'msg' => '编辑成功']);
} else {
return json(['status' => 0, 'msg' => '编辑失败']);
}
}
View::assign('info', $info);
return View::fetch();
}
// 删除
public function del()
{
$id = input('id');
$result = WelfareHouseModel::destroy($id);
if ($result) {
return json(['status' => 1, 'msg' => '删除成功']);
} else {
return json(['status' => 0, 'msg' => '删除失败']);
}
}
// 修改状态
public function status()
{
$id = input('id');
$status = input('status');
$result = WelfareHouseModel::where('id', $id)->update(['status' => $status]);
if ($result) {
return json(['status' => 1, 'msg' => '操作成功']);
} else {
return json(['status' => 0, 'msg' => '操作失败']);
}
}
}

View File

@ -333,4 +333,13 @@ Route::post('goodstype/add', 'GoodsType/add');
Route::rule('goodstype/edit', 'GoodsType/edit', 'GET|POST');
Route::post('goodstype/delete', 'GoodsType/delete');
Route::post('goodstype/status', 'GoodsType/status');
Route::get('goodstype/getTypeList', 'GoodsType/getTypeList');
Route::get('goodstype/getTypeList', 'GoodsType/getTypeList');
#============================
#WelfareHouse.php福利屋管理
#============================
Route::rule('welfare_house', 'WelfareHouse/index', 'GET|POST');
Route::rule('welfare_house_add', 'WelfareHouse/add', 'GET|POST');
Route::rule('welfare_house_edit', 'WelfareHouse/edit', 'GET|POST');
Route::rule('welfare_house_del', 'WelfareHouse/del', 'POST');
Route::rule('welfare_house_status', 'WelfareHouse/status', 'POST');

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>后台管理 -{$config.title}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="/static/admin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="/static/admin/style/admin.css" media="all">
</head>
<body class="layui-layout-body">
<div id="LAY_app">
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<!-- 头部区域 -->
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item layadmin-flexible" lay-unselect>
<a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
<i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
</a>
</li>
<li class="layui-nav-item" lay-unselect>
<a href="javascript:;" layadmin-event="refresh" title="刷新">
<i class="layui-icon layui-icon-refresh-3"></i>
</a>
</li>
</ul>
<ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
<li class="layui-nav-item layui-hide-xs" lay-unselect>
<a href="javascript:;" layadmin-event="theme">
<i class="layui-icon layui-icon-theme"></i>
</a>
</li>
<li class="layui-nav-item layui-hide-xs" lay-unselect>
<a href="javascript:;" layadmin-event="fullscreen">
<i class="layui-icon layui-icon-screen-full"></i>
</a>
</li>
<li class="layui-nav-item" lay-unselect>
<a href="javascript:;">
<cite>{:session('admin_user','','admin')}</cite>
</a>
<dl class="layui-nav-child">
<dd layadmin-event="" style="text-align: center;"><a href="{:url('/admin/loginout')}">退出</a></dd>
</dl>
</li>
<li class="layui-nav-item layui-hide-xs" lay-unselect>
<a href="javascript:;"></a>
</li>
</ul>
</div>
</div>
</div>
<script src="/static/admin/layui/layui.js"></script>
<script src="/static/admin/js/jquery.min.js"></script>

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>后台管理 - {$config.title}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="/static/admin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="/static/admin/style/admin.css" media="all">
<style>
.active_page span{
background-color: #2196f385;
}
</style>
</head>
<script src="/static/admin/layui/layui.js"></script>
<script src="/static/admin/js/jquery.min.js"></script>

View File

@ -0,0 +1,104 @@
{include file="Public:header2"/}
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">添加福利屋</div>
<div class="layui-card-body">
<form class="layui-form" action="" method="post">
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="name" required lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="image">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<input type="hidden" name="image" value="">
<div class="layui-upload-list">
<img class="layui-upload-img" id="imagePreview" style="max-width: 200px; max-height: 100px;">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">跳转路径</label>
<div class="layui-input-block">
<input type="text" name="url" required lay-verify="required" placeholder="请输入跳转路径" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input type="number" name="sort" value="0" required lay-verify="required|number" placeholder="请输入排序" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="checkbox" name="status" lay-skin="switch" lay-text="启用|禁用" checked>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formSubmit">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{include file="Public:footer"/}
<script>
layui.use(['form', 'upload'], function(){
var form = layui.form;
var upload = layui.upload;
// 执行实例
var uploadInst = upload.render({
accept: 'image'
,elem: '#image' // 绑定元素
,url: '/admin/picture' // 上传接口
,done: function(res){
// 上传完毕回调
if(res.status == 1){ // 成功
layer.msg("上传成功", {icon:1, time:1000}, function(){
$("#imagePreview").attr("src", res.data.path); // 单图
$("input[name=image]").val(res.data.imgurl);
});
} else { // 失败
layer.msg(res.msg, {icon:2, anim:6, time:1500});
}
}
,error: function(){
// 请求异常回调
layer.msg('服务繁忙,请稍后再试', {icon:2, anim:6, time:1500});
}
});
form.on('submit(formSubmit)', function(data){
$.ajax({
url: '/admin/welfare_house_add',
type: 'post',
data: data.field,
dataType: 'json',
success: function(res){
if(res.status == 1){
layer.msg(res.msg, {icon: 1, time: 1000}, function(){
window.location.href = '/admin/welfare_house';
});
}else{
layer.msg(res.msg, {icon: 2, anim: 6, time: 1500});
}
}
});
return false;
});
});
</script>

View File

@ -0,0 +1,105 @@
{include file="Public:header2"/}
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">编辑福利屋</div>
<div class="layui-card-body">
<form class="layui-form" action="" method="post">
<input type="hidden" name="id" value="{$info.id}">
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="name" value="{$info.name}" required lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="image">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<input type="hidden" name="image" value="{$info.image}">
<div class="layui-upload-list">
<img class="layui-upload-img" id="imagePreview" src="{$info.image}" style="max-width: 200px; max-height: 100px;">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">跳转路径</label>
<div class="layui-input-block">
<input type="text" name="url" value="{$info.url}" required lay-verify="required" placeholder="请输入跳转路径" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{$info.sort}" required lay-verify="required|number" placeholder="请输入排序" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="checkbox" name="status" lay-skin="switch" lay-text="启用|禁用" {if $info.status eq 1}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formSubmit">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{include file="Public:footer"/}
<script>
layui.use(['form', 'upload'], function(){
var form = layui.form;
var upload = layui.upload;
// 执行实例
var uploadInst = upload.render({
accept: 'image'
,elem: '#image' // 绑定元素
,url: '/admin/picture' // 上传接口
,done: function(res){
// 上传完毕回调
if(res.status == 1){ // 成功
layer.msg("上传成功", {icon:1, time:1000}, function(){
$("#imagePreview").attr("src", res.data.path); // 单图
$("input[name=image]").val(res.data.imgurl);
});
} else { // 失败
layer.msg(res.msg, {icon:2, anim:6, time:1500});
}
}
,error: function(){
// 请求异常回调
layer.msg('服务繁忙,请稍后再试', {icon:2, anim:6, time:1500});
}
});
form.on('submit(formSubmit)', function(data){
$.ajax({
url: '/admin/welfare_house_edit',
type: 'post',
data: data.field,
dataType: 'json',
success: function(res){
if(res.status == 1){
layer.msg(res.msg, {icon: 1, time: 1000}, function(){
window.location.href = '/admin/welfare_house';
});
}else{
layer.msg(res.msg, {icon: 2, anim: 6, time: 1500});
}
}
});
return false;
});
});
</script>

View File

@ -43,10 +43,10 @@ class Notify extends Base
// 获取微信支付配置
$wxpayConfig = \app\common\helper\WxPayHelper::getWxPayConfig();
$merchant = $wxpayConfig['merchant'];
// 使用随机商户的密钥
static::$secretKey = $merchant['keys'];
// 获取公众号密钥
static::$secretKeyAccount = getConfig('wechatofficialaccount')['keys'];
}
@ -1186,21 +1186,41 @@ class Notify extends Base
->where($where)
->select()->toArray();
if ($goodslist) {
#组合中奖商品
$all_goods_id = [];
foreach ($goodslist as $value) {
$real_pro = $value['real_pro'] * 10000;
for ($i = 1; $i <= $real_pro; $i++) {
$all_goods_id[] = $value['id'];
}
// 计算总概率
$totalProbability = array_sum(array_column($goodslist, 'real_pro'));
// 构建概率区间
$probabilityRanges = [];
$currentRange = 0;
foreach ($goodslist as $good) {
$rangeStart = $currentRange;
$currentRange += $good['real_pro'];
$probabilityRanges[] = [
'id' => $good['id'],
'start' => $rangeStart,
'end' => $currentRange
];
}
for ($i = 0; $i < $prize_num; $i++) {
#随机打乱
shuffle($all_goods_id);
shuffle($all_goods_id);
$prize_id = $all_goods_id[0];
// 生成随机数 (保持与原始方法相同的精度100000)
$maxRand = (int) ($totalProbability * 100000);
$random = mt_rand(0, $maxRand) / 100000;
// 查找中奖奖品
$prize_id = null;
foreach ($probabilityRanges as $range) {
if ($random >= $range['start'] && $random < $range['end']) {
$prize_id = $range['id'];
break;
}
}
// 获取奖品信息
$prize_info = GoodsList::where(['id' => $prize_id])->find();
#编号
$luck_no = OrderList::field('id')
->where('goods_id', '=', $goods_id)
@ -1209,6 +1229,7 @@ class Notify extends Base
->order('id desc')
->value('luck_no');
$luck_no++;
#新增记录
$save_prize_info = [
'order_id' => $order_id,
@ -1229,10 +1250,12 @@ class Notify extends Base
'order_type' => $order_type,
'luck_no' => $luck_no,
];
#入库===
$res[] = OrderList::insert($save_prize_info);
}
//去除秘宝池次数
if ($infinite_goods['type'] == 9 && $order['is_mibao'] == 1) {
User::where('id', $user_id)->dec('mb_number', $prize_num)->update();
@ -1960,7 +1983,7 @@ class Notify extends Base
{
//微信官方发货
$wxServer = new \app\common\server\Wx($this->app);
$access_token = $wxServer->get_access_token();
$open_id = Db::name('user')->where('id', $user_id)->value('openid');
$wxServer->post_order($open_id, $access_token, $order_num);

View File

@ -0,0 +1,19 @@
<?php
namespace app\api\controller;
use app\BaseController;
use app\common\model\WelfareHouse as WelfareHouseModel;
class WelfareHouse extends BaseController
{
// 获取福利屋列表
public function getList()
{
$list = WelfareHouseModel::where('status', 1)
->order('sort asc, id desc')
->select()
->toArray();
return json(['status' => 1, 'msg' => '获取成功', 'data' => $list]);
}
}

View File

@ -169,4 +169,9 @@ Route::any('mall_orderbuy', 'Mall/mall_orderbuy');
Route::rule('goods/receive_sync', 'Goods/receive_sync', 'POST');
// 配置信息接口
Route::rule('config', 'Config/index', 'GET');
Route::rule('config', 'Config/index', 'GET');
#============================
#WelfareHouse.php福利屋
#============================
Route::any('welfare_house_list', 'WelfareHouse/getList');

View File

@ -0,0 +1,26 @@
<?php
namespace app\common\model;
use think\Model;
class WelfareHouse extends Model
{
// 设置表名
protected $name = 'welfare_house';
// 自动写入时间戳
protected $autoWriteTimestamp = true;
// 状态获取器
public function getStatusTextAttr($value, $data)
{
$status = [0 => '禁用', 1 => '启用'];
return $status[$data['status']];
}
// 图片获取器
public function getImageAttr($value)
{
return imageUrl($value);
}
}

View File

@ -180,6 +180,10 @@ return [
'url' => '/admin/advert',
'name' => '图片管理',
],
[
'url' => '/admin/welfare_house',
'name' => '福利屋管理',
],
],
],
[

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB