ufutx.dma/app/Http/Controllers/H5/LotteryController.php

155 lines
6.4 KiB
PHP
Raw Normal View History

2026-03-04 14:42:40 +08:00
<?php
namespace App\Http\Controllers\H5;
use App\Facades\HttpService;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Models\Lottery;
use App\Models\LotteryAward;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class LotteryController extends Controller
{
use ResponseJson;
public function lottery(Lottery $lottery)
{
$lottery->awards = $lottery->awards()->withCount('members')->get();
return $this->success('ok', $lottery);
}
public function members(Lottery $lottery)
{
$members = $lottery->members;
//缓存当前用户
Cache::put("lottery:{$lottery->id}:members", $members, now()->addDays(7));
return $this->success('ok', $members);
}
public function winningMembers(Lottery $lottery)
{
$limit = 0;
$award_id = request()->award_id;
$members = $lottery->winMembers()->with('award:id,lottery_id,level,awards')->whereHas('award');
if ($award_id) {
$members = $members->where('award_id', $award_id);
$award = LotteryAward::find($award_id);
if ($award->is_refresh) {
$limit = $award->each_num;
}
}
if ($limit) {
$members = $members->limit($limit);
}
$members = $members->orderByDesc('id')->get();
$win_count = $lottery->winMembers()->count();
return $this->success('ok', compact('members', 'win_count'));
}
public function storeMembers(Request $request, Lottery $lottery)
{
if ($lottery->id == 1) return $this->failure("经销商活动不允许报名");
$data = $request->all();
$user_id = auth()->id();
$res = $lottery->members()->where("user_id", $user_id)->exists();
if ($res) return $this->failure("已报名成功,请勿反复操作");
$data['user_id'] = $user_id;
$lottery->members()->create($data);
return $this->success('ok');
}
public function lotto(Lottery $lottery, LotteryAward $award)
{
//中奖人数
$award_num = $lottery->winMembers()->whereHas('award')->award($award->id)->count();
if ($award->num <= $award_num) return $this->failure("中奖人数上限");
if ($lottery->id != $award->lottery_id) throw new \Exception("奖品和抽奖活动不对应");
$members = Cache::get("lottery:{$lottery->id}:members");
if (empty($members)) {
$members = $lottery->members;
}
$user_ids = $members->pluck('user_id')->toArray();
// $user_ids = $lottery->members()->pluck('user_id')->toArray();
if (!$lottery->repeat) {//不可重复中奖
$winning_user_ids = $lottery->winMembers()->whereHas('award')->pluck('user_id')->toArray();
$user_ids = array_diff($user_ids, $winning_user_ids);
}
// if (!count($user_ids)) return $this->failure("抽奖池不足");
//如果是id=1经销商活动 更新抽奖码中奖信息
if ($lottery->id == 1) {
$index = array_rand($user_ids);
$user_id = $user_ids[$index];
$member = $members->where('user_id', $user_id)->first()->toArray();
$member['award_id'] = $award->id;
$win_member = $lottery->winMembers()->create($member);
$id = $member['id'];
// $url = config('app.shop_url') . "admin/sync/agent/lotto/info";
// $param = ['code'=>$win_member->code, 'award'=>$award->awards, 'title'=>$award->level, 'member_id'=>$id];
// HttpService::postData($url, $param);
return $this->success('ok', compact('id'));
}else {
if (count($user_ids) < 10) return $this->failure("抽奖池不足");
shuffle($user_ids);
$out_user_ids = array_slice($user_ids, 0, 10);
$member = $members->where('user_id', $out_user_ids[0])->first()->toArray();
$id = $member['id'];
$members = $members->whereIn('user_id', $out_user_ids)->all();
$data = [];
foreach ($members as $member) {
// $data[] = ['user_id'=>$member['user_id'], 'lottery_id'=>$member['lottery_id'],'name'=>$member['name'],
// "mobile"=>$member['mobile'], 'award_id'=>$award->id];
$member['award_id'] = $award->id;
$win_member = $lottery->winMembers()->create($member->toArray());
}
// $lottery->winMembers()->upsert($data,['user_id', 'lottery_id']);
return $this->success('ok', compact('id'));
}
}
public function lottoV2(Lottery $lottery, LotteryAward $award)
{
//中奖人数
$award_num = $lottery->winMembers()->whereHas('award')->award($award->id)->count();
if ($award->num <= $award_num) return $this->failure("中奖人数上限");
if ($lottery->id != $award->lottery_id) throw new \Exception("奖品和抽奖活动不对应");
$members = Cache::get("lottery:{$lottery->id}:members");
if (empty($members)) {
$members = $lottery->members;
}
//总报名成员id
$member_ids = $members->pluck('id')->toArray();
if (!$lottery->repeat) {//不可重复中奖
$winning_member_ids = $lottery->winMembers()->whereHas('award')->pluck('member_id')->toArray();
$member_ids = array_diff($member_ids, $winning_member_ids);
}
//剩余中奖人数
$remain_num = $award->num - $award_num;
if ($remain_num > $award->each_num) {
$remain_num = $award->each_num;
}
if (count($member_ids) < $remain_num) return $this->failure("抽奖池不足");
shuffle($member_ids);
$ids = array_slice($member_ids, 0, $remain_num);
$members = $members->whereIn('id', $ids)->all();
$data = [];
foreach ($members as $member) {
$data[] = ['member_id'=>$member->id, 'user_id'=>$member['user_id'], 'lottery_id'=>$member['lottery_id'],'name'=>$member['name'],
"mobile"=>$member['mobile'], 'code'=>$member['code'], 'award_id'=>$award->id];
}
$lottery->winMembers()->upsert($data,['user_id', 'lottery_id']);
return $this->success('ok', compact('ids'));
}
public function addQuotas($lottery_id, LotteryAward $award)
{
$award->increment('num');
return $this->success('ok');
}
}