HaniBlindBox/server/php/app/api/controller/CardGoods.php
2026-01-01 20:46:07 +08:00

584 lines
21 KiB
PHP

<?php
namespace app\api\controller;
use app\common\model\Advert;
use app\common\model\CardLevel;
use app\common\model\Category;
use app\common\model\Goods as Goodsmodel;
use app\common\model\GoodsList;
use app\common\model\Order;
use app\common\model\OrderList;
use app\common\model\Shang;
use app\Request;
use think\facade\Db;
use app\common\model\Danye;
class CardGoods extends Base
{
/**
* 抽卡及开启关闭
* @return \think\response\Json
*created by Admin at 2023/1/3 10:02
*/
public function open_card(){
$data = [];
$info = getConfig('base');
$data['open_card'] = $info['open_card'];
return $this->renderSuccess("请求成功", compact('data'));
}
/**
* 抽卡机轮播图和弹幕
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*created by Admin at 2022/12/8 9:13
*/
public function card_index(){
//轮播图
$banner = Db::name('advert')->field('imgurl')
->where(['type' => 2])
->order('sort desc,id desc')
->select();
foreach ($banner as &$value) {
$value['imgurl'] = imageUrl($value['imgurl']);
}
//查询弹幕
$bullet_chat= [];
$order_info = OrderList::field('id,user_id,goods_id,goodslist_title as title')
->append(['user_info','goods_info'])
->where('order_type', '=', 4)
->order('id desc')
->limit(20)
->select();
// dd($order_info);
foreach ($order_info as $value) {
$bullet_chat[] = [
'headimg' => $value['user_info']['headimg'],
'content' => $value['user_info']['nickname'] . ' 抽中了 [' . $value['goods_info']['goods_title'] . '] 中的 ' . $value['title'],
];
}
$data = array();
$data['advert'] = $banner;
$data['bullet_chat'] = $bullet_chat;
return $this->renderSuccess('请求成功', $data);
}
/**
* 抽卡机分类列表
*created by Admin at 2022/12/8 9:08
*/
public function card_category_list(){
$data = Category::field('id,title')
->order('sort desc,id asc')
->select()
->toArray();
array_unshift($data, ['id' => 0, 'title' => '全部IP']);
return $this->renderSuccess('请求成功', $data);
}
/**
* 抽卡机列表
* @param Request $request
*created by Admin at 2022/12/8 10:03
*/
public function card_goods_list(Request $request){
$category_id = $request->param('type');
$keyword = request()->param('keyword', '');
$where = [];
if ($category_id && $category_id > 0){
$where[] = ['category_id' ,'=',$category_id];
}
if ($keyword){
$where[] = ['title', 'like', '%' . $keyword . '%'];
}
$where[] = ['type','=',4];
$where[] = ['status','=',1];
$card_goods = GoodsModel::field("id,title,imgurl,price,show_price,type,stock,sale_stock,status")
->where($where)
->order('sort desc id desc')
->paginate(15);
foreach ($card_goods as $value){
$value['imgurl'] = imageUrl($value['imgurl']);
}
return $this->renderSuccess('请求成功', $card_goods);
}
/**
* 抽卡机商品详情
* @param Request $request
*created by Admin at 2022/12/8 10:16
*/
public function card_goods_detail(Request $request){
$goods_id = $request->param('goods_id');
if (!$goods_id){
return $this->renderError("参数错误");
}
$card_goods = Goodsmodel::field('id,title,card_notice,imgurl_detail,card_banner,price,show_price,type,status,addtime')
->where(['id' => $goods_id])
->where(['status' => 1])
->find();
if (empty($card_goods)){
return $this->renderError("盒子不存在或已下架");
}
//查询抽卡规则
$card_set = getConfig('card_set');
$right_shang_name = CardLevel::where('id',$card_set['right_shang_id'])->value('title');
$card_set['right_shang_name'] = $right_shang_name;
$center_shang_name = CardLevel::where('id',$card_set['center_shang_id'])->value('title');
$card_set['center_shang_name'] = $center_shang_name;
$card_goods['card_set'] = $card_set;
return $this->renderSuccess('请求成功', $card_goods);
return $this->renderSuccess('请求成功', $card_goods);
}
/**
* 卡等级
*created by Admin at 2022/12/8 11:07
*/
public function card_level(){
$data = CardLevel::field('id,imgurl,title')->select();
return $this->renderSuccess('请求成功', $data);
}
/**
* 盒子商品图鉴
* @param Request $request
*created by Admin at 2022/12/8 11:09
*/
public function shang_goods(Request $request){
$card_id = $request->param('card_id');
$shang_id = $request->param('shang_id');
$card_goods = Goodsmodel::field('id,title,card_notice,imgurl_detail,card_banner,price,show_price,type,status,addtime')
->where(['id' => $card_id])
->where(['status' => 1])
->find();
if (empty($card_goods)){
return $this->renderError("盒子不存在或已下架");
}
//卡等级
$card_level = CardLevel::field('id,imgurl,title')->select();
$where = [];
if ($shang_id){
$where[] = ['shang_id','=',$shang_id];
}
$goods = GoodsList::field('title,imgurl,shang_id,price,real_pro')
->where('goods_id',$card_goods['id'])
->where($where)
->paginate(20);
foreach ($goods as $value){
$value['shang_name'] = CardLevel::where('id',$value['shang_id'])->value('title');
}
foreach ($card_level as $value){
$real_pro = GoodsList::field('title,imgurl,shang_id,price,real_pro')
->where('goods_id',$card_goods['id'])
->where('shang_id',$value['id'])
->sum('real_pro');
$num = GoodsList::field('title,imgurl,shang_id,price,real_pro')
->where('goods_id',$card_goods['id'])
->where('shang_id',$value['id'])
->count();
if ($num > 0 && $real_pro > 0){
$value['rate'] = $real_pro / $num / 1000;
}else{
$value['rate'] = 0;
}
}
$data['goods'] = $goods;
$data['card_level'] = $card_level;
return $this->renderSuccess('请求成功', $data);
}
/**
* 抽卡机卡册
*created by Admin at 2022/12/8 14:12
*/
public function card_book(Request $request){
$user = $this->getUser();
$card_id = $request->param('card_id');
$title = $request->param('title');
$type = $request->param('type');
$card_goods = Goodsmodel::field('id,title,card_notice,imgurl_detail,card_banner,price,show_price,type,status,addtime')
->where(['id' => $card_id])
->find();
if (empty($card_goods)){
return $this->renderError("盒子不存在");
}
//查询总册数
$card_goods['count'] = GoodsList::where('goods_id',$card_goods['id'])->count();
//我拥有的册数
$card_goods['hove_count'] = OrderList::where('goods_id',$card_goods['id'])
->where('user_id',$user['id'])
->group('goodslist_id')
->count();
$card_goods['gailv'] = ($card_goods['hove_count'] / $card_goods['count']) * 100;
//查询我拥有的卡id
$have_ka_id = OrderList::field('goodslist_id')->where('goods_id',$card_goods['id'])
->where('user_id',$user['id'])
->where('status', '=', 0)
->group('goodslist_id')
->column('goodslist_id');
$have_ka_id = array_values($have_ka_id);
$obj = GoodsList::field('goods_id,title,price,real_pro,id,imgurl,prize_code')->where('goods_id',$card_goods['id']);
if ($type == 1){
$obj->whereIn('id',$have_ka_id);
}else if($type == 2){
$obj->whereNotIn('id',$have_ka_id);
}
if ($title){
$obj->where('title', 'like', '%' . $title . '%');
}
$goods_list = $obj->order('sort desc id desc')->paginate(20);
foreach ($goods_list as $value){
$num = OrderList::where('goodslist_id',$value->id)
->where('user_id',$user['id'])
->where('status', '=', 0)
->count();
$value['num'] = $num;
}
$data['goods_list'] = $goods_list;
$data['card_goods'] = $card_goods;
$config = getConfig("base");
$yufei = [
'free_post' => $config['card_free_post'],
'post_money' => $config['card_post_money'],
];
$data['yuefei'] = $yufei;
return $this->renderSuccess('请求成功', $data);
}
/**
* 中赏记录
* @param Request $request
* created by Admin at 2022/12/8 15:25
*/
public function card_reward_log(Request $request){
$card_id = $request->param('card_id');
$category_id = $request->param('category_id');
$card_goods = Goodsmodel::field('id,title,card_notice,imgurl_detail,card_banner,price,show_price,type,status,addtime')
->where(['id' => $card_id])
->find();
if (empty($card_goods)){
return $this->renderError("盒子不存在");
}
$where = [];
if ($category_id){
$where[]= ['shang_id','=',$category_id];
}
$where[]= ['order_type', '=', $card_goods['type']];
$info = OrderList::field('user_id,goodslist_title,goodslist_imgurl,shang_id,addtime,count(`id`) as prize_num')
->where('goods_id',$card_id)
->append(['shang_title', 'user_info'])
->where($where)
->group("order_id,goodslist_id")
->order('id desc')
->paginate(20);
foreach ($info as $value){
$value['nickname'] = $value['user_info']['nickname'];
$value['headimg'] = $value['user_info']['headimg'];
$value['addtime'] = date('Y-m-d H:i:s', $value['addtime']);
$value['goodslist_imgurl'] = imageUrl($value['goodslist_imgurl']);
}
return $this->renderSuccess('请求成功', $info);
}
/**
* 计算金额
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*created by Admin at 2022/12/19 16:19
*/
public function buy_money(Request $request){
$user = $this->getUser();
$card_id = $request->param('card_id'); //盒子id
$type = $request->param('type', ''); // 抽几发
$use_money_is = $request->param('use_money_is', 0); #余额抵扣0不抵扣 1抵扣
$use_integral_is = $request->param('use_integral_is', 0); #积分抵扣0不抵扣 1抵扣
$card_goods = Goodsmodel::field('id,title,card_notice,imgurl_detail,card_banner,price,show_price,type,status,addtime,card_num')
->where(['id' => $card_id])
->where(['status' => 1])
->find();
if (empty($card_goods)){
return $this->renderError("盒子不存在或已下架");
}
if ($type != 'left_count' && $type != 'center_count' && $type != 'right_count') {
return $this->renderError("请求参数错误");
}
//奖品信息
$is_goodslist = GoodsList::field('id')
->where('goods_id', '=', $card_goods['id'])
->where('num', '=', 0)
->where('real_pro', '>', 0)
->where('special_stock', '<>', 0)
->find();
if (!$is_goodslist) {
return $this->renderError('暂无奖品信息');
}
//抽数设置
$card_set = getConfig('card_set');
if (!isset($card_set[$type])) {
return $this->renderError("配置错误,请联系管理员");
}
$prize_num = $card_set[$type] * $card_goods['card_num'];
//盒子单价
$box_price = $card_goods['price'];
#订单金额 微信支付金额
$order_total = $order_zhe_total = $price = bcmul("$box_price", "$prize_num", 2);
#吧唧币抵扣
$use_integral = 0;
if ($use_integral_is == 1) {
if ($user['integral'] >= $price) {
$use_integral = $price;
$price = 0;
} else {
$use_integral = $user['integral'];
$price = bcsub("$price", "{$user['integral']}", 2);
}
}
#余额抵扣
$use_money = 0;
if ($use_money_is == 1) {
if ($user['money'] >= $price) {
$use_money = $price;
$price = 0;
} else {
$use_money = $user['money'];#
$price = bcsub("$price", "{$user['money']}", 2);
}
}
#抽奖数量
// dd($card_set[$type]);
$goods['prize_num'] = $prize_num;
$goods['first_num'] = $card_set[$type];
$data = [
'goods' => $goods,
'order_total' => $order_total * 1,
'order_zhe_total' => $order_zhe_total * 1,
'price' => $price * 1,
'integral' => $user['integral'] * 1,
'use_integral' => $use_integral * 1,
'money' => $user['money'] * 1,
'use_money' => $use_money * 1,
];
return $this->renderSuccess("请求成功", $data);
}
/**
* 购买盒子
* @param Request $request
*created by Admin at 2022/12/9 9:24
*/
public function card_goods_buy(Request $request){
$user = $this->getUser();
$card_id = $request->param('card_id'); //盒子id
$type = $request->param('type'); // 抽几发
$use_money_is = $request->param('use_money_is', 0); #余额抵扣0不抵扣 1抵扣
$use_integral_is = $request->param('use_integral_is', 0); #积分抵扣0不抵扣 1抵扣
$card_goods = Goodsmodel::field('id,title,card_notice,imgurl_detail,card_banner,price,show_price,type,status,addtime,card_num')
->where(['id' => $card_id])
->where(['status' => 1])
->find();
if (empty($card_goods)){
return $this->renderError("盒子不存在或已下架");
}
//奖品信息
$is_goodslist = GoodsList::field('id')
->where('goods_id', '=', $card_goods['id'])
->where('num', '=', 0)
->where('real_pro', '>', 0)
->where('special_stock', '<>', 0)
->find();
if (!$is_goodslist) {
return $this->renderError('暂无奖品信息');
}
//抽数设置
$card_set = getConfig('card_set');
if (!isset($card_set[$type])) {
return $this->renderError("配置错误,请联系管理员");
}
$prize_card_set = NULL;
if ($type == 'left_count') {
$pre_type = 'left';
} elseif ($type == 'center_count') {
$pre_type = 'center';
} elseif ($type == 'right_count') {
$pre_type = 'right';
} else {
return $this->renderError("请求参数错误!!!");
}
// dd($type);
$num = $card_set[$type] * $card_goods['card_num'];
$key_shang_id = $pre_type . '_shang_id';
// dd($key_shang_id);
//查询出必出的卡等级
if (isset($card_set[$key_shang_id])) {
$prize_card_set = json_encode([
'shang_id' => $card_set[$key_shang_id],
'shang_count' => 1,
]);
}else{
$prize_card_set = null;
}
$goods_price = $card_goods['price'];
//订单金额 微信支付金额
$order_total = $order_zhe_total = $price = bcmul("$goods_price", "$num", 2);
//吧唧币抵扣
$use_integral = 0;
if ($use_integral_is == 1) {
if ($user['integral'] >= $price) {
$use_integral = $price;
$price = 0;
} else {
$use_integral = $user['integral'];
$price = bcsub("$price", "{$user['integral']}", 2);
}
}
//余额抵扣
$use_money = 0;
if ($use_money_is == 1) {
if ($user['money'] >= $price) {
$use_money = $price;
$price = 0;
} else {
$use_money = $user['money'];#
$price = bcsub("$price", "{$user['money']}", 2);
}
}
//更新缓存
$redis = (new \app\common\server\RedisHelper())->getRedis();
$redis_key = "kpw_cardextractor_orderbuy" . '_' . $user['id'];
$redis_key_info = $redis->get($redis_key);
if ($redis_key_info) {
return $this->renderError("当前操作太快了,请等待");
} else {
$redis->set($redis_key, 1, 10);
}
//开启事务
Db::startTrans();
$order_num = create_order_no('MH_', 'order', 'order_num');
#创建订单
$res[] = $order_id = Order::insertGetId([
'user_id' => $user['id'],
'order_num' => $order_num,
'order_total' => $order_total,#订单金额
'order_zhe_total' => $order_zhe_total,#订单折扣金额
'price' => $price,#微信支付
'use_money' => $use_money,#余额抵扣
'use_integral' => $use_integral,#吧唧币抵扣
'use_score' => 0,#积分抵扣
// 'zhe' => $zhe,#会员折扣
'goods_id' => $card_id,
'num' => 0,
'goods_price' => $card_goods['price'],
'goods_title' => $card_goods['title'],
'goods_imgurl' => $card_goods['card_banner'],
'prize_num' => $num,
'prize_card_set' => $prize_card_set,
'status' => 0,
'pay_type' => 1,#1微信 2支付宝
'order_type' => $card_goods['type'],
'addtime' => time(),
]);
//微信支付金额大于0
if ($price > 0) {
$body = '购买盒子' . $card_goods['title'];
$attach = 'order_ckj';
$payRes = (new Pay())->wxCreateOrder($order_num, $price, $user['id'], $body, $attach);
if ($payRes['status'] == 1) {
#结果集
$new_data = [
'status' => 1,
'order_num' => $order_num,
'res' => $payRes['data'],
];
} else {
#删除redis
$redis->del($redis_key);
Db::rollback();
return $this->renderError("下单失败");
}
} else {
#开盒子
$res[] = (new Notify($this->app))->cardextractor_drawprize_notice($user['id'], $order_id, $card_id);
// dd($res);
#结果集
$new_data = [
'status' => 0,
'order_num' => $order_num,
];
}
// dd(resCheck($res));
if (!resCheck($res)) {
Db::rollback();
//删除redis
// dd($redis_key);
$redis->del($redis_key);
// dd($redis->del($redis_key));
return $this->renderError("购买失败,请刷新重试");
}
Db::commit();
//删除redis
$redis->del($redis_key);
return $this->renderSuccess("下单成功", $new_data);
}
/**
* 抽中的奖品
* @param Request $request
* created by Admin at 2022/12/9 15:07
*/
public function prize_log(Request $request){
$user = $this->getUser();
$order_num = $request->param('order_num');
$order_info = Order::where('order_num','=',$order_num)->find();
if (empty($order_info)){
return $this->renderError('订单不存在,请刷新后重试');
}
$data = OrderList::field('id,user_id,order_id,goodslist_title,goodslist_imgurl')
// ->where('user_id',$user['id'])
->where('order_id',$order_info['id'])
->select();
return $this->renderSuccess('操作成功',$data);
}
/**
* 抽卡机规则
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*created by Admin at 2022/12/21 9:05
*/
public function card_rule(){
$info = Danye::where(['id' => 6])->find();
if ($info) {
$content = contentUrl($info['content']);
} else {
$content = '';
}
return $this->renderSuccess("请求成功", $content);
}
}