<?php
declare (strict_types=1);
namespace app\api\controller;
use app\api\controller\Base;
use app\common\model\Goods as Goodsmodel;
use app\common\model\GoodsLock;
use app\common\model\GoodsList;
use app\common\model\Collect;
use app\common\model\Shang;
use app\common\model\User;
use app\common\model\Order;
use app\common\model\OrderList;
use app\common\model\UserVip;
use think\facade\Db;
use think\facade\Log;
use \think\Request;
use app\common\model\CouponReceive as CouponReceiveModel;
class Goods extends Base
{
static $page_size = 10;
static $shang_prize_id = [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33];#抽奖赏品id
static $shang_count_id = [10, 38];#统计次数
// static $shang_give_arr = [
// 1 => '上半场随机获得',
// 2 => '下半场随机获得',
// 3 => '最后一发获得',
// 4 => '全场随机获得',
// 5 => '获取指定数量全局赏获得',
// ];#赠送(FIRST赏 LAST赏 最终赏 全局赏 拳王赏)赏品id
static $shang_give_arr = [
1 => '只赠不售',
2 => '只赠不售',
3 => '只赠不售',
4 => '只赠不售',
5 => '只赠不售',
6 => '只赠不售',
7 => '只赠不售',
39 => '只赠不售',
];#赠送(FIRST赏 LAST赏 最终赏 全局赏 拳王赏)赏品id
/**
* 首页盒子列表
* @param Request $request
* @return \think\response\Json
* @throws \think\db\exception\DbException
* created by Admin at 2022/12/7 15:49
* @param [type] 类型 (14)推荐 (1)一番赏 (2)积分赏 (3)擂台赏
*/
public function goods(Request $request)
{
$user_id = $this->getuserid();
$draw_num = 0;
if($user_id > 0){
$draw_num = User::where(['id'=>$user_id])->value('draw_num');
}
//$user_info = $this->getUser();
$keyword = request()->param('keyword', '');
$whe = [];
// $whe[] = ['status', '=', 1];
$whe[] = ['show_is', '=', 0];
$whe[] = ['tower_id', '=', 0];
$whe[] = ['status', 'in', [1, 3]];
#搜索
if ($keyword) {
$whe[] = ['title', 'like', '%' . $keyword . '%'];
}
$type_str = request()->param('type', -1);
if ($type_str == 1) {
$whe[] = ['type', '=', 1];
} elseif ($type_str == 2) {
$whe[] = ['type', '=', 2];
} elseif ($type_str == 3) {
$whe[] = ['type', '=', 3];
} elseif ($type_str == 5) {
$whe[] = ['type', '=', 5];
}elseif ($type_str == 6) {
$whe[] = ['type', '=', 6];
}elseif ($type_str == 7) { # 7抽奖券
$whe[] = ['type', '=', 7];
}elseif ($type_str == 8) {
$whe[] = ['type', '=', 8];
}elseif ($type_str == 9) {
$whe[] = ['type', '=', 9];
}else {
$whe[] = ['type', 'not in', [4,2]];
}
#盒子
$goods = GoodsModel::where($whe)
->field("id,title,imgurl,imgurl_detail,price,type,stock,sale_stock,status,box_is,leitai_num")
->order("sort desc,status esc,id desc")->paginate(15)->each(function ($itme) {
$itme['imgurl'] = imageUrl($itme['imgurl']);
#剩余
$itme['sale_stock'] = $itme['stock'] - $itme['sale_stock'];
#参与人数
$join_user = OrderList::field('user_id')
->append(['userinfo'])
->where('goods_id', '=', $itme['id'])
->where('shang_id', 'between', self::$shang_count_id)
->where('order_type', '=', $itme['type'])
->order('id desc')
->group('user_id')
->limit(5)
->select();
$itme['join_user'] = $join_user;
#参与次数
$join_count = OrderList::field('id')
->where('shang_id', 'between', self::$shang_count_id)
->where('goods_id', '=', $itme['id'])
->where('order_type', '=', $itme['type'])
->count();
$itme['join_count'] = $join_count;
$itme['need_draw_num'] = 0;
if($itme['type'] == 7){
$itme['need_draw_num'] = 1;
}
$box_id = 0;
if($itme['box_is'] == 1 && $itme['type'] == 2){
$box_id = GoodsList::where(['shang_id'=>39,'goods_id'=>$itme['id']])->value('id');
}
$itme['box_id'] = $box_id;
});
$new_data = [
'data' => $goods->items(),
'last_page' => $goods->lastPage(),
'draw_num' => $draw_num #优惠券的数量
];
//▼▼▼ 新增配置部分 ▼▼▼
$rule = getConfig('base');
$other = [
'jump_appid' => $rule['jump_appid'],
'corpid' => $rule['corpid'],
'wx_link' => $rule['wx_link'],
'mp3' => $rule['mp3'],
'logo' => $rule['logo'],
'types' => $rule['types'],
'erweima' => imageUrl($rule['erweima']),
];
$new_data['other'] = $other;
return $this->renderSuccess('请求成功', $new_data);
}
/**
* 商品详情
* @param $goods_id 盒子id
* @param $goods_num 盒子箱号
*/
public function goodsdetail()
{
//$user_info = $this->getUser();
$user_id = $this->getuserid();
$goods_id = request()->param('goods_id/d', 0);
$goods_num = request()->param('goods_num/d', 0);
$goods = Goodsmodel::field('id,title,imgurl_detail,price,stock,sale_stock,lock_is,type,status,sale_time,is_integral')
->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
if (($goods_num > $goods['stock']) || ($goods_num < 0)) {
return $this->renderError("箱号错误");
}
if ($goods['sale_time']) {
$goods['addtime'] = date('m-d', $goods['sale_time']);
} else {
$goods['addtime'] = '';
}
$goods['imgurl_detail'] = imageUrl($goods['imgurl_detail']);
#自动找箱号
if ($goods_num == 0) {
#奖品信息
$goodslist_info = GoodsList::field('num,sum(`surplus_stock`) as all_surplus_stock')
->where(['goods_id' => $goods_id])
->where('shang_id','not in',[1,2,3,4,5])
->having('all_surplus_stock', '>', 0)
->group('num')
->order('num asc')
->find();
if ($goodslist_info) {
$goods_num = $goodslist_info['num'];
} else {
$goods_num = 1;
}
}
$goods['num'] = $goods_num;
#是否收藏
$collection_is = Collect::field('id')
->where(['user_id' => $user_id])
->where(['goods_id' => $goods_id])
->where(['num' => $goods_num])
->find();
$goods['collection_is'] = $collection_is ? 1 : 0;
#本箱子余量
$goods_surplus = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
->where('goods_id', '=', $goods_id)
->where('num', '=', $goods_num)
->where('shang_id', 'in', self::$shang_prize_id)
->find();
$all_surplus_stock = $goods_surplus['surplus_stock'];
$goods['surplus_stock'] = $goods['stock'] - $goods['sale_stock'];
$goods['goodslist_stock'] = $goods_surplus['stock'];
$goods['goodslist_surplus_stock'] = $goods_surplus['surplus_stock'];
#概率不足时
$pro_all = 0;
$pro_max = 0;
$pro_key = 0;
#所有奖品信息
$goodslist = GoodsList::field('id,shang_id,title,stock,surplus_stock,imgurl,goods_type,sale_time,price,sc_money,goods_id,k_zz_num,zz_num')
->append(['shang_title','goods_typename','shang_info'])
->where(['goods_id' => $goods_id])
->where(['num' => $goods_num])
->where(['is_box' => 2])
->order('sort desc,shang_id asc,id asc')
->select()->toArray();
foreach ($goodslist as $key => &$value) {
#价格
$value['price'] = $value['price'] * 1;
#预售时间
if ($value['sale_time']) {
$value['sale_time'] = date('Y-m-d', $value['sale_time']);
}
#剩余
$surplus_stock = $value['surplus_stock'];
if (array_key_exists($value['shang_id'], self::$shang_give_arr)) {
#概率
$pro = self::$shang_give_arr[$value['shang_id']];
if($value['shang_id'] == 1){
$pro = '参与'. ($goods['goodslist_stock'] / 2) .'前发数/'. ($goods['goodslist_stock'] / 2);
}
if($value['shang_id'] == 2){
$pro = '参与'. ($goods['goodslist_stock'] / 2) .'后发数/'. ($goods['goodslist_stock'] / 2);
}
if($value['shang_id'] == 3){
$pro = '随最后一发赠送';
}
if($value['shang_id'] == 4){
$pro = '参与发数/'. $goods['goodslist_stock'];
}
if($value['shang_id'] == 5){
$pro = '只赠不售';
}
if($value['shang_id'] == 6){
$pro = '1-'. $goods['goodslist_stock'] . '发数最多得';
}
if($value['shang_id'] == 7){
$pro = $value['k_zz_num'].'-'. $value['zz_num'] . '发数最多得';
}
$pro_num = 0;
} else {
#概率
if ($surplus_stock > 0) {
$pro_basics = bcdiv("$surplus_stock", "$all_surplus_stock", 4);
$pro = '概率:' . ($pro_basics * 100) . '%';
$pro_num = ($pro_basics * 100);
} else {
$pro = '概率:' . 0 . '%';
$pro_num = 0;
}
}
$value['surplus_stock'] = $surplus_stock;
$value['pro'] = $pro;
$value['imgurl'] = imageUrl($value['imgurl']);
#计算剩余概率
$pro_all += $pro_num;
if ($pro_num >= $pro_max) {
$pro_max = $pro_num;
$pro_key = $key;
}
}
#概率不足时
if ($pro_max > 0 && $pro_all < 100) {
$surplus_pro = bcsub("100", "$pro_all", 2);
$goodslist[$pro_key]['pro'] = bcadd("$pro_max", "$surplus_pro", 2) . '%';
}
#锁箱信息===============
$goods_lock_user_nickname = 0;
$goods_lock_user_headimg = 0;
$goods_lock_surplus_time = 0;
$goods_id_num = $goods_id . '_' . $goods_num;
$goods_lock_info = GoodsLock::where(['goods_id_num' => $goods_id_num])
->where('endtime', '>', time())
->order('id desc')
->find();
if ($goods['lock_is'] && $goods_lock_info) {
$goods_lock_surplus_time = $goods_lock_info['endtime'];
$user_info = User::field('nickname,headimg')->where(['id' => $goods_lock_info['user_id']])->find();
$goods_lock_user_nickname = $user_info['nickname'];
$goods_lock_user_headimg = $user_info['headimg'];
}
$lock_info = [
'lock_is' => $goods['lock_is'],
'goods_lock_user_nickname' => $goods_lock_user_nickname,
'goods_lock_user_headimg' => $goods_lock_user_headimg,
'goods_lock_surplus_time' => $goods_lock_surplus_time,
];
#锁箱信息===============
#参与人数
$join_user = OrderList::field('user_id')
->append(['userinfo'])
->where('goods_id', '=', $goods_id)
->where('num', '=', $goods_num)
->where('shang_id', 'between', self::$shang_count_id)
->where('order_type', '=', $goods['type'])
->order('id desc')
->group('user_id')
->limit(5)
->select();
$new_join_user = [];
foreach ($join_user as $join_user_value) {
$new_join_user[] = $join_user_value['userinfo']['headimg'];
}
#参与次数
$join_count = OrderList::field('id')->where('goods_id', '=', $goods_id)
->where('num', '=', $goods_num)
->where('shang_id', 'between', self::$shang_count_id)
->where('order_type', '=', $goods['type'])
->count();
#时间配置
$config = getConfig('base');
$goods['three_time'] = $config['three_time'];
$goods['five_time'] = $config['five_time'];
$new_data = [
'goods' => $goods,
'lock_info' => $lock_info,
'join_user' => $new_join_user,
'join_count' => $join_count,
'goodslist' => $goodslist,
];
return $this->renderSuccess("请求成功", $new_data);
}
/**
* 换箱箱号
*/
public function goodslist_count()
{
$goods_id = request()->param('goods_id/d', 0);
#盒子信息
$goods = Goodsmodel::field('id,stock,status')
->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
$page_size = self::$page_size;
$length = ceil($goods['stock'] / $page_size);
$data = [];
for ($i = 0; $i < $length; $i++) {
$start_length = ($i * $page_size) + 1;
$end_length = ($i * $page_size) + $page_size;
if ($end_length >= $goods['stock']) {
$end_length = $goods['stock'];
}
$data[] = [
'title' => $start_length . '-' . $end_length,
'page_no' => $i,
];
}
return $this->renderSuccess("请求成功", $data);
}
/**
* 统计多少箱
*/
public function goodslist_content(Request $request)
{
$sort = request()->param('sort/d', 0);#排序1箱号高 2余量高
$goods_id = request()->param('goods_id/d', 0);
$page_no = request()->param('page_no/d', 0);#页码
if ($page_no <= 0) {
$page_no = 0;
}
#盒子信息
$goods = Goodsmodel::field('id,stock,status')
->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
$page_size = self::$page_size;
$start_length = ($page_no * $page_size) + 1;
$end_length = ($page_no * $page_size) + $page_size;
if ($end_length >= $goods['stock']) {
$end_length = $goods['stock'];
}
$data = [];
for ($goods_num = $start_length; $goods_num <= $end_length; $goods_num++) {
#奖品信息
$goodlist = GoodsList::field('id,stock,surplus_stock,shang_id')
->append(['shang_title'])
->where(['goods_id' => $goods_id])
->where(['num' => $goods_num])
->order('sort desc,shang_id asc,id asc')
->select();
#剩余
$surplus_all_stock = 0;
foreach ($goodlist as $key => $value) {
if (!array_key_exists($value['shang_id'], self::$shang_give_arr)) {
$surplus_all_stock += $value['surplus_stock'];
}
unset($value['id']);
}
if ($surplus_all_stock <= 0) {
$surplus_all_stock = 0;
}
$data[] = [
'num' => $goods_num,
'surplus_all_stock' => $surplus_all_stock,
'goodslist' => $goodlist,
];
}
if ($sort == 2) {
$data = arraySequence($data, 'surplus_all_stock');
}
return $this->renderSuccess("请求成功", $data);
}
/**
* 中赏记录
*/
public function shang_log(Request $request)
{
$shang_id = request()->param('shang_id/d', 0);
$goods_id = request()->param('goods_id/d', 0);
$goods_num = request()->param('goods_num/d', 0);
#盒子信息
$goods = Goodsmodel::field('id,stock,status,type')
->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
if (RegInt($goods_num)) {
return $this->renderError("箱号选择错误");
}
#中奖记录分类
$category = GoodsList::field('shang_id')
->append(['shang_title'])
->where('goods_id', '=', $goods_id)
->where('num', '=', $goods_num)
->where('is_box', '=', 2)
->group('shang_id')
->select()->toArray();
array_unshift($category, ['shang_id' => 0, 'shang_title' => '全部']);
$where = [];
if ($shang_id) {
$where[] = ['shang_id', '=', $shang_id];
}
$data = OrderList::field('user_id,goodslist_title,goodslist_imgurl,shang_id,addtime,count(`id`) as prize_num')
->append(['shang_title', 'user_info'])
->where('goods_id', '=', $goods_id)
->where('num', '=', $goods_num)
->where('order_type', '=', $goods['type'])
->where($where)
->order('id desc')
->group("order_id,goodslist_id,user_id")
->paginate(10)->each(function ($item) {
$item['addtime'] = date('Y-m-d H:i:s', $item['addtime']);
$item['goodslist_imgurl'] = imageUrl($item['goodslist_imgurl']);
return $item;
});
// dd($data);
$new_data = [
'category' => $category,
'data' => $data->items(),
'last_page' => $data->lastPage(),
];
return $this->renderSuccess("请求成功", $new_data);
}
/**
* 发数排名
*/
public function paiming_log(Request $request)
{
$goods_id = request()->param('goods_id/d', 0);
$goods_num = request()->param('goods_num/d', 0);
#盒子信息
$goods = Goodsmodel::field('id,stock,status,type')
->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
if (RegInt($goods_num)) {
return $this->renderError("箱号选择错误");
}
$ranking = OrderList::field('user_id, sum(goodslist_type) as total_orders')
->append(['user_info'])
->group('user_id')
->where('goods_id', '=', $goods_id)
->where('num', '=', $goods_num)
->where('order_type', '=', $goods['type'])
->where('shang_id', 'in', self::$shang_prize_id)
->order('total_orders', 'desc')
->select()
->toArray();
$new_data = [
'data' => $ranking,
];
return $this->renderSuccess("请求成功", $new_data);
}
/**
* 下单计算金额
*/
public function ordermoney()
{
//return $this->renderError("正在调试");
$user = $this->getUser();
$user_id = $user['id'] ?? 0;
$prize_num = request()->param('prize_num/d', 0); #抽几发
$goods_id = request()->param('goods_id/d', 0); #盒子ID
$num = request()->param('goods_num/d', 0); #第几箱
$todaySpent = 0;
if ($user_id > 0) {
$start_time = strtotime(date('Y-m-d 00:00:00')); // 今日开始时间
$end_time = strtotime(date('Y-m-d 23:59:59')); // 今日结束时间
$todaySpent = Order::where('user_id', $user_id)
->where('status', 1) // 已支付订单
->where('addtime', '>=', $start_time)
->where('addtime', '<=', $end_time)
->sum('price');
}
// $use_money_is = request()->param('use_money_is/d', 0); #0不抵扣 1抵扣
$use_money_is = 0;
$use_integral_is = request()->param('use_integral_is/d', 0); #0不抵扣 1抵扣
$coupon_id = request()->param('coupon_id'); //优惠券
#盒子信息
$goods = Goodsmodel::field('title,imgurl_detail,type,price,status,imgurl')->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1) {
return $this->renderError("盒子已下架");
}
$goods['imgurl_detail'] = !empty($goods['imgurl_detail']) ? imageUrl($goods['imgurl_detail']) : '';
$goods['imgurl'] = !empty($goods['imgurl']) ? imageUrl($goods['imgurl']) : '';
if (RegInt($num)) {
return $this->renderError("箱号选择错误");
}
#奖品信息
$goodslist = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
->where('goods_id', '=', $goods_id)
->where('num', '=', $num)
->where('shang_id', 'in', self::$shang_prize_id)
->find();
if (!$goodslist) {
return $this->renderError('暂无奖品信息');
}
$surplus_stock = $goodslist['surplus_stock'];
if ($surplus_stock <= 0) {
return $this->renderError('库存剩余不足,请刷新重试');
}
#判断库存
if (RegInt($prize_num)) {
return $this->renderError("抽奖数量选择错误,请刷新重试");
}
if ($prize_num > $surplus_stock) {
return $this->renderError("剩余数量不足,请刷新重试");
}
#盒子单价
$box_price = $goods['price'];
#订单金额 微信支付金额
$order_total = $order_zhe_total = $price = bcmul("$box_price", "$prize_num", 2);
#使用优惠券
$coupon_price = 0;
if(!empty($coupon_id)){
$coupon = CouponReceiveModel::where(['id'=>$coupon_id,'status'=>0,'user_id'=>$user['id']])->where('man_price','<=',$price)->find();
if($coupon){
$coupon_price = $coupon['price'];
}
}else{
$coupon_id = 0;
$coupon = CouponReceiveModel::where(['status'=>0,'user_id'=>$user['id']])->where('man_price','<=',$price)->order('price desc')->find();
if($coupon){
$coupon_price = $coupon['price'];
$coupon_id = $coupon['id'];
}
}
$price = bcsub("$price","$coupon_price",2);
if($price <= 0){
$price = 0;
}
$order_zhe_total = $price;
if ($goods['type'] == 1 || $goods['type'] == 3 || $goods['type'] == 6) {
$zhe = 0;
$vip_info = UserVip::where(['id' => $user['vip']])->find();
if ($vip_info && $vip_info['discount'] > 0) {
$zhe = $vip_info['discount'];
$zhe_bl = bcdiv("$zhe", "10", 2);
$order_zhe_total = $price = bcmul("$price", "$zhe_bl", 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);
}
}
$use_score = 0;
} elseif ($goods['type'] == 5) {
#优惠券
$coupon_id =0;
$coupon_price = 0;
#折扣
$zhe = 0;
#微信支付
$price = 0;
#潮币抵扣
$use_integral = 0;
#余额抵扣
$use_money = 0;
#积分
$use_score = $order_total;
} else {
return $this->renderError("非法请求");
}
#抽奖数量
$goods['prize_num'] = $prize_num;
$data = [
'goods' => $goods,
'order_total' => $order_total * 1,
'order_zhe_total' => $order_zhe_total * 1,
'zhe' => ($zhe * 1),
'today_spent' => $todaySpent,
'price' => $price * 1,
'integral' => $user['integral'] * 1,
'use_integral' => $use_integral * 1,
'money' => $user['money'] * 1,
'use_money' => $use_money * 1,
'score' => $user['score'] * 1,
'use_score' => $use_score,
'coupon_price'=>$coupon_price,
'coupon_id' =>$coupon_id
];
//▼▼▼ 新增配置部分 ▼▼▼
$rule = getConfig('base');
$other = [
'jump_appid' => $rule['jump_appid'],
'corpid' => $rule['corpid'],
'wx_link' => $rule['wx_link'],
'titlek' => $rule['titlek'],
'logoo' => $rule['logoo'],
'day_limit' => $rule['day_limit'],
'mp3' => $rule['mp3'],
'logo' => $rule['logo'],
'types' => $rule['types'],
'erweima' => imageUrl($rule['erweima']),
];
$data['other'] = $other; // 将配置合并到返回数据
return $this->renderSuccess("请求成功", $data);
}
/**
* 下单计算金额
*/
public function orderbuy()
{
$user = $this->getUser();
if (empty($user['mobile'])) {
return $this->renderError('请先绑定手机号', [], -9);
}
// 获取系统配置
$config = getConfig('base');
$day_limit = $config['day_limit'] ?? 0; // 每日限额,0表示不限制
// 如果有限额设置,则检查用户当日消费
if ($day_limit > 0) {
// 获取当日开始和结束时间戳
$start_time = strtotime(date('Y-m-d 00:00:00'));
$end_time = strtotime(date('Y-m-d 23:59:59'));
// 查询用户当日已消费金额
$total_spent = Order::where('user_id', $user['id'])
->where('status', 1) // 已支付订单
->where('addtime', '>=', $start_time)
->where('addtime', '<=', $end_time)
->sum('price');
// 检查是否超出限额
if ($total_spent >= $day_limit) {
return $this->renderError("当日消费金额已超过限额");
}
}
$prize_num = request()->param('prize_num/d', 0); #抽几发
$goods_id = request()->param('goods_id/d', 0); #盒子ID
$num = request()->param('goods_num/d', 0); #第几箱
// $use_money_is = request()->param('use_money_is/d', 0); #0不抵扣 1抵扣
$use_money_is = 0;
$use_integral_is = request()->param('use_integral_is/d', 0); #0不抵扣 1抵扣
$coupon_id = request()->param('coupon_id'); //优惠券
$pay_type = request()->param('pay_type') ? request()->param('pay_type') : 1; // 1微信 2支付宝
#盒子信息
$goods = Goodsmodel::field('title,imgurl_detail,type,price,status,lock_is,lock_time,leitai_num')->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1) {
return $this->renderError("盒子已下架");
}
if (RegInt($num)) {
return $this->renderError("箱号选择错误");
}
#奖品信息
$is_goodslist = GoodsList::field('id')
->where('goods_id', '=', $goods_id)
->where('num', '=', $num)
->where('shang_id', 'in', self::$shang_prize_id)
->find();
if (!$is_goodslist) {
return $this->renderError('暂无奖品信息');
}
#锁箱信息===============
if ($goods['type'] == 1 || $goods['type'] == 6) {
//限购
if($prize_num > 1 && $goods['title'] == '新人福利,胶个朋友'){
return $this->renderError('该赏限购1发');
}
$user_num = OrderList::where('goods_id', '=', $goods_id)
->where('user_id',$user['id'])
->where('num', '=', $num)
->where('order_type', '=', $goods['type'])
->where('shang_id', 'in', self::$shang_prize_id)
->count();
if($user_num >= 1 && $goods['title'] == '新人福利,胶个朋友'){
return $this->renderError('该赏限购1发');
}
$goods_id_num = $goods_id . '_' . $num;
$lock_info = GoodsLock::where(['goods_id_num' => $goods_id_num])
->where('endtime', '>', time())
->order('id desc')
->find();
if ($lock_info && $lock_info['endtime'] > time() && $lock_info['user_id'] !== $user['id']) {
$surplus_time = $lock_info['endtime'] - time();
return $this->renderError('有会员正在锁箱,请等待' . $surplus_time . '秒');
}
}
#锁箱信息===============
#擂台赏限购===============
if ($goods['type'] == 3) {
//限购
if($prize_num > $goods['leitai_num']){
return $this->renderError('该赏限购'.$goods['leitai_num'].'发');
}
$user_num = Order::where('goods_id', '=', $goods_id)
->where('user_id',$user['id'])
->where('num', '=', $num)
->where('order_type', '=', $goods['type'])
->where('status', '=', 1)
->sum('prize_num');
//已购买 + 当前购买 大于 限购
if($user_num + $prize_num > $goods['leitai_num']){
return $this->renderError('该赏限购'.$goods['leitai_num'].'发');
}
}
#擂台赏限购===============
#奖品信息
$goodslist = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
->where('goods_id', '=', $goods_id)
->where('num', '=', $num)
->where('shang_id', 'in', self::$shang_prize_id)
->find();
$surplus_stock = $goodslist['surplus_stock'];
if ($surplus_stock <= 0) {
return $this->renderError('库存剩余不足,请刷新重试');
}
#判断库存
if (RegInt($prize_num)) {
return $this->renderError("抽奖数量选择错误,请刷新重试");
}
if ($prize_num > $surplus_stock) {
return $this->renderError("剩余数量不足,请刷新重试");
}
#盒子单价
$box_price = $goods['price'];
#订单金额 微信支付金额
$order_total = $order_zhe_total = $price = bcmul("$box_price", "$prize_num", 2);
#使用优惠券
$coupon_price = 0;
if(!empty($coupon_id)){
$coupon = CouponReceiveModel::where(['id'=>$coupon_id,'status'=>0,'user_id'=>$user['id']])->where('man_price','<=',$price)->find();
if($coupon){
$coupon_price = $coupon['price'];
}
}
$price = bcsub("$price","$coupon_price",2);
if($price <= 0){
$price = 0;
}
$order_zhe_total = $price;
if ($goods['type'] == 1 || $goods['type'] == 3 || $goods['type'] == 6) {
#折扣
$zhe = 0;
$vip_info = UserVip::where(['id' => $user['vip']])->find();
if ($vip_info && $vip_info['discount'] > 0) {
$zhe = $vip_info['discount'];
$zhe_bl = bcdiv("$zhe", "10", 2);
$order_zhe_total = $price = bcmul("$price", "$zhe_bl", 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);
}
}
$use_score = 0;
} elseif ($goods['type'] == 5) {
#优惠券
$coupon_id =0;
$coupon_price = 0;
#折扣
$zhe = 0;
#微信支付
$price = 0;
#潮币抵扣
$use_integral = 0;
#余额抵扣
$use_money = 0;
#积分
$use_score = $order_total;
if ($user['score'] < $use_score) {
return $this->renderError("积分不足");
}
} else {
return $this->renderError("非法请求");
}
#一番赏锁箱
if ($goods['type'] == 1 || $goods['type'] == 6) {
#盒子id_箱号
$goods_id_num = $goods_id . '_' . $num;
#盒子是否配置锁箱
if ($goods['lock_is'] == 1 && $goods['lock_time'] > 0) {
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis_key = "kpw_lock" . '_' . $goods_id_num;
$redis_key_info = $redis->get($redis_key);
if ($redis_key_info) {
return $this->renderError("有会员正在锁箱,请等待");
} else {
$redis->set($redis_key, 1, 1);
}
#默认锁箱时间
$defaulttime = (time() + $goods['lock_time']);
#锁箱信息
$lock_info = GoodsLock::where('goods_id_num', '=', $goods_id_num)
->where('endtime', '>', time())
->order('id desc')
->find();
if ($lock_info) {#存在锁箱
if ($prize_num == 3 || $prize_num == 5) {
$config_time = getConfig('base');
if ($prize_num == 3) {
$endtime = $defaulttime + $config_time['three_time'];
} elseif ($prize_num == 5) {
$endtime = $defaulttime + $config_time['five_time'];
}
GoodsLock::where('id', '=', $lock_info['id'])
->update([
'endtime' => $endtime,
'update_time' => time(),
]);
} else {
GoodsLock::where('id', '=', $lock_info['id'])
->update([
'endtime' => $defaulttime,
'update_time' => time(),
]);
}
} else {
if ($prize_num == 3 || $prize_num == 5) {
$config_time = getConfig('base');
if ($prize_num == 3) {
$endtime = $defaulttime + $config_time['three_time'];
} elseif ($prize_num == 5) {
$endtime = $defaulttime + $config_time['five_time'];
}
#新增锁箱信息
GoodsLock::insert([
'user_id' => $user['id'],
'goods_id_num' => $goods_id_num,
'endtime' => $endtime,
'update_time' => time(),
]);
} else {
#新增锁箱信息
GoodsLock::insert([
'user_id' => $user['id'],
'goods_id_num' => $goods_id_num,
'endtime' => $defaulttime,
'update_time' => time(),
]);
}
}
}
}
#一番赏锁箱
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis_key = "kpw_orderbuy" . '_' . $user['id'];
$redis_key_info = $redis->get($redis_key);
if ($redis_key_info) {
return $this->renderError("当前操作太快了,请等待");
} else {
$redis->set($redis_key, 1, 10);
}
//轮换商户号
$redis_pay_key = "pay_sh";
$redis_pay_key_info = $redis->get($redis_pay_key);
if(!$redis_pay_key_info){
$redis->set($redis_pay_key, 1, 86400);
$redis_pay_key_info = $redis->get($redis_pay_key);
}
Db::startTrans();
#===================================================***********
#奖品信息加锁
GoodsList::field('id,stock,surplus_stock')
->where('goods_id', '=', $goods_id)
->where('num', '=', $num)
->lock(true)->select();
#奖品信息
$goodslist_lock = GoodsList::field('sum(`surplus_stock`) as surplus_stock')
->where('goods_id', '=', $goods_id)
->where('num', '=', $num)
->where('shang_id', 'in', self::$shang_prize_id)
->find();
#判断库存
if ($goodslist_lock['surplus_stock'] <= 0) {
Db::rollback();
$redis->del($redis_key);
return $this->renderError("已售空,请刷新重试");
}
#===================================================***********
$res = [];
$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' => $use_score,#积分抵扣
'zhe' => $zhe,#会员折扣
'goods_id' => $goods_id,
'num' => $num,
'goods_price' => $goods['price'],
'goods_title' => $goods['title'],
'goods_imgurl' => $goods['imgurl_detail'],
'prize_num' => $prize_num,
'status' => 0,
'pay_type' => $pay_type,#1微信 2支付宝
'pay_sh' => $redis_pay_key_info,
'order_type' => $goods['type'],
'addtime' => time(),
'coupon_id' => $coupon_id?$coupon_id:0,
'use_coupon' => $coupon_price #优惠券抵扣
]);
#微信支付金额大于0
if ($price > 0) {
$body = '购买盒子' . $goods['title'];
if($pay_type == 1){
if ($goods['type'] == 1) {
$attach = 'order_yfs';
} elseif ($goods['type'] == 3) {
$attach = 'order_lts';
} elseif ($goods['type'] == 6) {
$attach = 'order_lts';
}
$payRes = (new Pay())->wxCreateOrder($order_num, $price, $user['openid'], $body, $attach,$redis_pay_key_info);
if($redis_pay_key_info == 1){
$redis->set($redis_pay_key, 2, 86400);
}elseif($redis_pay_key_info == 2){
$redis->set($redis_pay_key, 3, 86400);
}elseif($redis_pay_key_info == 3){
$redis->set($redis_pay_key, 4, 86400);
}elseif($redis_pay_key_info == 4){
$redis->set($redis_pay_key, 5, 86400);
}elseif($redis_pay_key_info == 5){
$redis->set($redis_pay_key, 1, 86400);
}
if ($payRes['status'] == 1) {
#结果集
$new_data = [
'status' => 1,
'pay_type'=>$pay_type,
'order_num' => $order_num,
'res' => $payRes['data'],
];
} else {
#删除redis
$redis->del($redis_key);
Db::rollback();
return $this->renderError("下单失败");
}
}
if($pay_type == 2){
//生成一个 api/login/alipay?订单号的链接
$url = 'https://zxcw.xby6991282.xyz/api/alipay?order_num='.$order_num;
if($url && $order_num){
#结果集
$new_data = [
'status' => 1,
'pay_type'=>$pay_type,
'order_num' => $order_num,
'res' => $url,
];
} else {
#删除redis
$redis->del($redis_key);
Db::rollback();
return $this->renderError("下单失败");
}
}
if($pay_type == 3){
//调用通联支付
$payRes = (new Allinpay())->pay($order_num, $price, $user['openid'], $body);
if($payRes['status'] == 1){
#结果集
$new_data = [
'status' => 1,
'pay_type'=>$pay_type,
'order_num' => $order_num,
'res' => json_decode($payRes['data']['payinfo'], true),
];
} else {
#删除redis
$redis->del($redis_key);
Db::rollback();
return $this->renderError("下单失败");
}
}
} else {
try {
#开盒子
$res[] = (new Notify($this->app))->drawprize_notice($user['id'], $order_id, $goods_id, $num);
} catch (\Throwable $e) {
Db::rollback();
#删除redis
$redis->del($redis_key);
return $this->renderError("火爆中...请刷新重新购买");
}
#结果集
$new_data = [
'status' => 0,
'order_num' => $order_num,
];
}
if (resCheck($res)) {
Db::commit();
#删除redis
$redis->del($redis_key);
return $this->renderSuccess("下单成功", $new_data);
} else {
Db::rollback();
#删除redis
$redis->del($redis_key);
return $this->renderError("购买失败,请刷新重试");
}
}
/**
* 抽中的奖品
* $order_num 订单编号
*/
public function prizeorderlog()
{
$user = $this->getUser();
$order_num = request()->param('order_num', '');
$order_info = Order::field('id,goods_id,num,order_type,price,pay_sh,pay_type')
->where('order_num', '=', $order_num)
->where('user_id', '=', $user['id'])
->where('status', '=', 1)
->find();
if (!$order_info) {
return $this->renderError("支付异常,请刷新重试");
}
// if($order_info['price'] > 0 && $order_info['pay_type'] !== 2 && $order_info['pay_type'] !== 4){
// $this->xcc_fahuo($order_num,$user['openid'],$order_info['pay_sh'],$order_info['pay_type']);
// }
#普通赏
$data = OrderList::field('user_id,shang_id,goodslist_id,goodslist_title,goodslist_imgurl')
->append(['shang_title','shang_imgurl','special_imgurl','color','color1','gn_type'])
->where('user_id', '=', $user['id'])
->where('order_id', '=', $order_info['id'])
->where('order_type', '=', $order_info['order_type'])
// ->orderRaw("field(shang_id,39,34,35,36,37,38) asc,id asc")
->order('shang_id asc, id asc')
->paginate(100)->each(function ($item) {
$item['goodslist_imgurl'] = imageUrl($item['goodslist_imgurl']);
return $item;
});
$new_data = [
'user_info' => [
'nickname' => $user['nickname'],
'headimg' => $user['headimg'],
],
'data' => $data->items(),
];
return $this->renderSuccess("请求成功", $new_data);
}
/**
* 支付同步发货
*/
public function xcc_fahuo($order_num,$openid,$pay_sh = 1,$pay_type = 1){
#同步发货**********************************************************
log::info("**********************************************************");
log::info("开始发货 order_num:,".json_encode($order_num));
log::info("开始发货 openid:,".json_encode($openid));
$wxServer = new \app\common\server\Wx($this->app);
$access_token = $wxServer->get_access_token();
log::info("获取token:,".json_encode($access_token));
$send_url = 'https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token='.$access_token;
if($pay_type == 1){
if($pay_sh == 1){
$mch_id = getConfig('weixinpay')['mch_id'];
}elseif($pay_sh == 2){
$mch_id = getConfig('weixinpay')['mch_id2'];
}elseif($pay_sh == 3){
$mch_id = getConfig('weixinpay')['mch_id3'];
}elseif($pay_sh == 4){
$mch_id = getConfig('weixinpay')['mch_id4'];
}elseif($pay_sh == 5){
$mch_id = getConfig('weixinpay')['mch_id5'];
}
}
if($pay_type == 3 || $pay_type == 4){
$mch_id = '1501244881';
$content = Db::name('wxpay_log')->where('order_no',$order_num)->value('content');
$content = json_decode($content,true);
$order_num = $content['trxid'];
log::info("通联发货:,".$order_num);
}
$sendD = [
'order_key' => [
'order_number_type' => 1, //订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。
"mchid" => $mch_id,
"out_trade_no"=>$order_num
],
'logistics_type' => 3,//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
'delivery_mode' => 1, //发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY
'shipping_list' => [
[
'item_desc' => '您的商品已发到赏袋,请自行发货'
]
],
'upload_time' => date('Y-m-d\TH:i:sP', time()),
'payer' => [
'openid' => $openid
]
];
$sendD = json_encode($sendD, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$result = $this->httpPost($send_url,$sendD);
log::info("发货结果:,".$result);
$result = json_decode($result,true);
}
// 模拟提交数据函数
public function httpPost($url,$data){
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_POST, true); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS,$data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, false); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回
$result = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
return 'Error POST'.curl_error($curl);
}
curl_close($curl); // 关键CURL会话
return $result; // 返回数据
}
/**
* 收藏列表
*/
public function listCollect(Request $request)
{
$user = $this->getUser();
$type = \request()->param('type', 0);
if ($type == 1) {
$data = Collect::field('id,goods_id,type,num')
->where(['user_id' => $user['id']])
->where('type', 'in', [1, 3, 5])
->append(['goods_info'])
->paginate(100)->each(function ($item) {
$item['goods_title'] = $item['goods_info']['title'];
$item['imgurl'] = imageUrl($item['goods_info']['imgurl']);
if ($item['type'] == 1 || $item['type'] == 3 || $item['type'] == 5) {
#库存
$surplus = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
->where('goods_id', '=', $item['goods_id'])
->where('num', '=', $item['num'])
->where('shang_id', 'in', self::$shang_prize_id)
->find();
$item['stock'] = $surplus['stock'];
$item['surplus_stock'] = $surplus['surplus_stock'];
} else {
$item['stock'] = 0;
$item['surplus_stock'] = 0;
}
return $item;
});
} elseif ($type == 2) {
$data = Collect::field('id,goods_id,type,num')
->where(['user_id' => $user['id']])
->where('type', '=', 2)
->append(['goods_info'])
->paginate(100)->each(function ($item) {
$item['goods_title'] = $item['goods_info']['title'];
$item['imgurl'] = imageUrl($item['goods_info']['imgurl']);
if ($item['type'] == 1 || $item['type'] == 3 || $item['type'] == 5) {
#库存
$surplus = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
->where('goods_id', '=', $item['goods_id'])
->where('num', '=', $item['num'])
->where('shang_id', 'in', self::$shang_prize_id)
->find();
$item['stock'] = $surplus['stock'];
$item['surplus_stock'] = $surplus['surplus_stock'];
} else {
$item['stock'] = 0;
$item['surplus_stock'] = 0;
}
return $item;
});
}
$new_data = [
'data' => $data->items(),
'last_page' => $data->lastPage(),
];
return $this->renderSuccess("操作成功", $new_data);
}
/**
* 添加收藏
*/
public function addCollect(Request $request)
{
$user = $this->getUser();
$goods_id = request()->param('goods_id/d', 0);
$goods_num = request()->param('goods_num/d', 0);
#盒子信息
$goods = Goodsmodel::field('id,stock,status,type')
->where(['id' => $goods_id])
->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
$info = Collect::field('id')
->where(['user_id' => $user['id']])
->where(['goods_id' => $goods_id])
->where(['num' => $goods_num])
->find();
if ($info) {
$res = Collect::where(['id' => $info['id']])->delete();
} else {
$res = Collect::insert([
'user_id' => $user['id'],
'goods_id' => $goods_id,
'num' => $goods_num,
'type' => $goods['type'],
'addtime' => time(),
]);
}
if ($res) {
return $this->renderSuccess("操作成功");
} else {
return $this->renderError("操作失败");
}
}
/**
* 删除收藏
*/
public function delCollect(Request $request)
{
$user = $this->getUser();
$id = request()->param('id/d', 0);
$info = Collect::field('id')
->where(['user_id' => $user['id']])
->where(['id' => $id])
->find();
if (!$info) {
return $this->renderError("请求重复操作");
}
$res = Collect::where(['id' => $info['id']])->delete();
if ($res) {
return $this->renderSuccess("删除成功");
} else {
return $this->renderError("删除失败");
}
}
/**
* 抽奖统计
* @param Request $request
*created by Admin at 2022/12/21 11:14
*/
public function luck_draw_log(Request $request){
$id = $request->param('id');
$goods = Goodsmodel::where('id',$id)->find();
if (!$goods){
return $this->renderError("盒子不存在");
}
$user_ids = OrderList::field('user_id')
->append(['userinfo'])
->where('goods_id',$goods['id'])
->group('user_id')
->paginate(20);
foreach ($user_ids as $value){
$count = OrderList::field('user_id')
->where('goods_id',$goods['id'])
->where('user_id',$value['user_id'])
->count();
$value['count'] = $count;
}
return $this->renderSuccess("操作成功", $user_ids);
}
/*
宝箱详情
*/
public function box_detail(Request $request){
$id = $request->param('id');
// $goods_num = request()->param('goods_num/d', 0);
if(empty($id) ){
return $this->renderError("参数有误");
}
$box_detail = GoodsList::where('id', '=', $id)
->where('shang_id', '=', 39)
->find();
if(empty($box_detail)){
return $this->renderError("宝箱不存在");
}
$type = Goodsmodel::where(['id'=>$box_detail['goods_id']])->value('type');
if ($type == 1 || $type == 3 || $type == 5 || $type == 6) {
$whe[] = ['num', '=', 1];
#因为是一番赏,所以有点区别
$id = GoodsList::where('goods_id', '=', $box_detail['goods_id'])
->where('prize_code','=',$box_detail['prize_code'])
->where('shang_id', '=', 39)
->where('num','=',1)
->value('id');
} elseif ($type == 2) {
$whe[] = ['num', '=', 0];
} else {
return $this->renderError('请求参数错误1');
}
#所有奖品信息
$goods_list = GoodsList::field('goods_id,shang_id,title,imgurl,price,real_pro,sc_money,gn_type')
->append(['shang_info'])
->withAttr('imgurl', function($value, $data){
return imageUrl($value);
})
->where(['box_id' => $id])
->where($whe)
->order('sort desc,shang_id asc,id asc')
->paginate(1000);
foreach ($goods_list as &$value) {
$value['shang_title'] = $value['shang_info']['title'];
$value['shang_imgurl'] = $value['shang_info']['imgurl'];
$value['shang_color'] = $value['shang_info']['color'];
unset($value['shang_info']);
}
return $this->renderSuccess("请求成功", $goods_list);
}
}
请帮我将这个代码里的orderbuy这个方法限额消费那里,检查超出限额后微信支付不能支付但是潮币支付仍然可以支付只限制微信支付
最新发布