manghe/app/api/controller/FuLiWu.php
2025-06-04 19:03:49 +08:00

371 lines
14 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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\Request;
use app\common\model\CouponReceive as CouponReceiveModel;
use app\common\model\UserCoupon;
use app\common\model\GoodsType;
use app\common\service\CommonService;
class FuLiWu extends Base
{
/**
* 福利屋
* @param \think\Request $request
* @return \think\response\Json
*/
public function index(Request $request)
{
$type_str = request()->param('type', 1);
if ($type_str != 1 && $type_str != 3) {
return $this->renderError('参数错误');
}
$order = 'sort desc,id desc';
$whe = [];
$whe[] = ['status', '=', $type_str];
$paginate = 15;
$whe[] = ['type', '=', 15];
$whe[] = ['is_open', '=', $type_str == 1 ? 0 : 1];
if ($type_str != 1) {
$order = 'open_time desc';
}
$user_id = $this->getUserId();
if ($user_id == 0) {
//充值金额
$whe[] = ['unlock_amount', '=', 0];
} else {
$order_price = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('price');
$order_money = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('use_money');
if($order_money>0){
$order_price = $order_price + $order_money;
}
$userInfo = User::where('id', '=', $user_id)->field('istest')->find();
if ($userInfo && $userInfo['istest'] > 0) {
//推广账号,门槛计算是全部的
$order_price = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('order_zhe_total');
}
$whe[] = ['unlock_amount', '<=', $order_price];
}
#盒子
$goods = GoodsModel::where($whe)
->field("id,title,imgurl,price,type,new_is,quanju_xiangou,choujiang_xianzhi,flw_start_time,flw_end_time,open_time,goods_describe,is_open")
->order($order)->paginate($paginate)->each(function ($itme) {
$itme['imgurl'] = imageUrl($itme['imgurl']);
$itme['flw_start_time'] = date('Y-m-d H:i:s', $itme['flw_start_time']);
$itme['flw_end_time'] = date('Y-m-d H:i:s', $itme['flw_end_time']);
$itme['open_time'] = date('Y-m-d H:i:s', $itme['open_time']);
$goodslist = GoodsList::where('goods_id', '=', $itme['id'])
->where('num', '=', 0)
->field('title,imgurl,stock,price,sc_money')
->select()
->toArray();
$itme['goodslist'] = $goodslist;
#参与次数
$redis = (new \app\common\server\RedisHelper())->getRedis();
$cacheKey = "order_goods_count:{$itme['id']}";
$join_count = $redis->get($cacheKey);
// 缓存未命中,从数据库获取并缓存
if ($join_count === false || true) {
$join_count = OrderList::field('id')
->where('goods_id', '=', $itme['id'])
->count();
// 设置缓存5分钟过期
$redis->set($cacheKey, $join_count, 300);
} else {
// 转为整数
$join_count = intval($join_count);
}
$itme['join_count'] = $join_count;
});
$new_data = [
'data' => $goods->items(),
'last_page' => $goods->lastPage(),
];
return $this->renderSuccess('请求成功', $new_data);
}
/**
* 福利屋详情
* @param \think\Request $request
* @return \think\response\Json
*/
public function fuliwu_detail(Request $request)
{
$goods_id = request()->param('goods_id/d', 0);
$goods = GoodsModel::where(['id' => $goods_id])->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($goods['status'] != 1 && $goods['status'] != 3) {
return $this->renderError("盒子已下架");
}
// 检查类型是否为福利屋
if ($goods['type'] != 15) {
return $this->renderError("该盒子不是福利屋类型");
}
// 获取用户信息
$user_id = $this->getUserId();
// 检查用户是否可以查看该福利屋(解锁金额限制)
if ($user_id > 0) {
$order_price = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('price');
$order_money = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('use_money');
if($order_money>0){
$order_price = $order_price + $order_money;
}
$userInfo = User::where('id', '=', $user_id)->field('istest')->find();
if ($userInfo && $userInfo['istest'] > 0) {
// 推广账号,门槛计算是全部的
$order_price = Order::where('status', '=', 1)->where('user_id', '=', $user_id)->sum('order_zhe_total');
}
if ($goods['unlock_amount'] > $order_price) {
return $this->renderError("您需要消费满" . $goods['unlock_amount'] . "元才能查看此福利屋");
}
} else if ($goods['unlock_amount'] > 0) {
return $this->renderError("您需要登录并充值满" . $goods['unlock_amount'] . "元才能查看此福利屋");
}
// 获取福利屋详细信息
$goods_detail = GoodsModel::field("id,title,imgurl,imgurl_detail,price,type,new_is,quanju_xiangou,choujiang_xianzhi,flw_start_time,flw_end_time,open_time,goods_describe,is_open,unlock_amount,sort")
->where(['id' => $goods_id])
->find();
// 处理图片地址和时间格式
$goods_detail['imgurl'] = imageUrl($goods_detail['imgurl']);
if (!empty($goods_detail['imgurl_detail'])) {
$goods_detail['imgurl_detail'] = imageUrl($goods_detail['imgurl_detail']);
} else {
$goods_detail['imgurl_detail'] = $goods_detail['imgurl'];
}
// 获取福利屋中的奖品列表
$goodslist = GoodsList::where('goods_id', '=', $goods_id)
->where('num', '=', 0)
->field('id,title,imgurl,imgurl_detail,stock,price,sc_money,shang_id,surplus_stock,sort')
->order('shang_id desc,sort asc')
->select()
->toArray();
// 处理奖品列表,添加图片地址
foreach ($goodslist as &$item) {
$item['imgurl'] = imageUrl($item['imgurl']);
if (!empty($item['imgurl_detail'])) {
$item['imgurl_detail'] = imageUrl($item['imgurl_detail']);
} else {
$item['imgurl_detail'] = $item['imgurl'];
}
// 获取奖品类型信息
$shang_info = Shang::field('title,color')->where(['id' => $item['shang_id']])->find();
$item['shang_title'] = $shang_info ? $shang_info['title'] : '';
$item['shang_color'] = $shang_info ? $shang_info['color'] : '';
}
// 统计参与人数
$join_count = OrderList::field('id')
->where('goods_id', '=', $goods_id)
->where('order_type', '=', $goods_detail['type'])
->count();
//
$user_count = OrderList::
where('goods_id', '=', $goods_id)
->where('user_id', '=', $user_id)
->where('order_type', '=', $goods_detail['type'])
->field('id')
->count();
// 获取用户在该福利屋活动期间的消费情况
$consumptionData = CommonService::getUserConsumptionByTimeRange(
$user_id,
$goods_detail['flw_start_time'],
$goods_detail['flw_end_time']
);
$goods_detail['flw_start_time'] = date('Y-m-d H:i', $goods_detail['flw_start_time']);
$goods_detail['flw_end_time'] = date('Y-m-d H:i', $goods_detail['flw_end_time']);
$goods_detail['open_time'] = date('Y-m-d H:i', $goods_detail['open_time']);
// 组装返回数据
$data = [
'goods' => $goods_detail,
'goodslist' => $goodslist,
'join_count' => $join_count,
'current_time' => date('Y-m-d H:i:s'),
'user_count' => $user_count,
'user_consumption' => $consumptionData
];
// 判断福利屋状态
$now = time();
$start_time = strtotime($goods_detail['flw_start_time']);
$end_time = strtotime($goods_detail['flw_end_time']);
$open_time = strtotime($goods_detail['open_time']);
if ($now < $start_time) {
$data['status'] = 'waiting'; // 等待开始
$data['status_text'] = '即将开始';
} else if ($now >= $start_time && $now < $end_time) {
$data['status'] = 'ongoing'; // 进行中
$data['status_text'] = '进行中';
} else if ($now >= $end_time && $now < $open_time) {
$data['status'] = 'ended'; // 已结束,等待开奖
$data['status_text'] = '已结束,等待开奖';
} else if ($now >= $open_time) {
if ($goods_detail['is_open'] == 1) {
$data['status'] = 'opened'; // 已开奖
$data['status_text'] = '已开奖';
} else {
$data['status'] = 'to_open'; // 待开奖(超过开奖时间但未开奖)
$data['status_text'] = '待开奖';
}
}
return $this->renderSuccess('请求成功', $data);
}
/**
* 福利屋参与人员
* @param Request $request
* @return \think\response\Json
*/
public function fuliwu_participants(Request $request)
{
$goods_id = request()->param('goods_id/d', 0);
$list = OrderList::where('goods_id', '=', $goods_id)
->where('order_type', '=', 15)
->field('user_id,addtime')
->order('addtime desc')
->limit(1000)
->select();
foreach ($list as $item) {
$user_id = $item['user_id'];
$user_info = User::where('id', '=', $user_id)->field('nickname,headimg')->find();
unset($item['user_id']);
if ($user_info) {
$item['nickname'] = $user_info['nickname'];
$item['avatar'] = imageUrl($user_info['headimg']);
}
$item['create_time'] = date('Y-m-d H:i', $item['addtime']);
}
$data = [
'list' => $list,
];
return $this->renderSuccess('请求成功', $data);
}
/**
* 福利屋开奖记录
* @param Request $request
* @return \think\response\Json
*/
public function fuliwu_records(Request $request)
{
$goods_id = request()->param('goods_id/d', 0);
$list = OrderList::where('goods_id', '=', $goods_id)
->where('order_type', '=', 15)
->where('shang_id', '>', 0)
->field('user_id,addtime,goodslist_title,shang_id')
->order('shang_id desc,addtime desc')
->limit(1000)
->select();
foreach ($list as $item) {
$user_id = $item['user_id'];
$user_info = User::where('id', '=', $user_id)->field('nickname,headimg')->find();
unset($item['user_id']);
if ($user_info) {
$item['nickname'] = $user_info['nickname'];
$item['avatar'] = imageUrl($user_info['headimg']);
}
$item['create_time'] = date('Y-m-d H:i', $item['addtime']);
}
$data = [
'list' => $list,
];
return $this->renderSuccess('请求成功', $data);
}
/**
* 福利屋用户参与记录
* @param \think\Request $request
* @return \think\response\Json
*/
public function fuliwu_user_records(Request $request)
{
$user = $this->getUser();
$user_id = $user['id'];
// $user_id = $this->getUserId();
$list = OrderList::where('user_id', '=', $user_id)
->where('order_type', '=', 15)
->field('user_id,addtime,goodslist_title,shang_id,goods_id')
->order('addtime desc')
->limit(1000)
->select();
if ($list) {
foreach ($list as $item) {
$goods_id = $item['goods_id'];
$goods = GoodsModel::where('id', '=', $goods_id)->find();
$item['goods_title'] = $goods['title'];
$item['create_time'] = date('Y-m-d H:i', $item['addtime']);
}
}
$data = [
'list' => $list,
];
return $this->renderSuccess('请求成功', $data);
}
/**
* 福利屋用户参与记录
* @param \think\Request $request
* @return \think\response\Json
*/
public function fuliwu_user_winning_records(Request $request)
{
$user = $this->getUser();
$user_id = $user['id'];
$list = OrderList::where('user_id', '=', $user_id)
->where('order_type', '=', 15)
->where('shang_id', '>', 0)
->field('user_id,addtime,goodslist_title,shang_id,goods_id')
->order('addtime desc')
->limit(1000)
->select();
if ($list) {
foreach ($list as $item) {
$goods_id = $item['goods_id'];
$goods = GoodsModel::where('id', '=', $goods_id)->find();
$item['goods_title'] = $goods['title'];
$item['create_time'] = date('Y-m-d H:i', $goods['open_time']);
}
}
$data = [
'list' => $list,
];
return $this->renderSuccess('请求成功', $data);
}
}