356 lines
13 KiB
PHP
356 lines
13 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Api\Miniprogram;
|
||
|
||
use DB;
|
||
use Carbon\Carbon;
|
||
use App\Http\Controllers\Controller;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Http\Response;
|
||
use App\Models\{ActivityLog, ActivityOption, PointsLog,LuckDrawActivity,LuckDrawOption,UserLuckTime,UserLuckLog};
|
||
use App\Services\ActivityService;
|
||
use App\Jobs\{SendActivityDrawJob, SendLuckActivityDrawJob};
|
||
use App\Http\Resources\{LuckActivityResource};
|
||
|
||
class ActivityController extends Controller
|
||
{
|
||
protected $activity_service;
|
||
|
||
public function __construct(ActivityService $activity_service){
|
||
$this->activity_service = $activity_service;
|
||
}
|
||
|
||
public function awardsOptions(Request $request){
|
||
return $this->success([
|
||
'exchange_points'=>ActivityOption::findOrFail(13)->key_value,
|
||
'f_draw_points'=>ActivityOption::findOrFail(14)->key_value,
|
||
'activity_dec'=>ActivityOption::findOrFail(15)->key_value
|
||
]);
|
||
}
|
||
|
||
public function awardsName(Request $request){
|
||
$awrad_array = ActivityOption::where('key_type', 0)
|
||
->where(['is_niu'=>0])
|
||
->pluck('key_name', 'id')->toArray();
|
||
return $this->success($awrad_array);
|
||
}
|
||
|
||
|
||
/**
|
||
* 一发入魂兑换次数;
|
||
*/
|
||
public function pointToTimes(Request $request){
|
||
$user = auth('api')->user();
|
||
$times = 1;
|
||
$points = $times*(ActivityOption::findOrFail(13)->key_value);
|
||
if($user->points >= $points){
|
||
$res_data = [];
|
||
try {
|
||
DB::beginTransaction();
|
||
$user->decrement('points', $points);
|
||
$user->increment('draw_num', $times);
|
||
//记录积分消耗记录
|
||
PointsLog::create([
|
||
'user_id'=>$user->id,
|
||
'type'=>2,
|
||
'points'=> 0-$points,
|
||
'now_points'=>$user->points,
|
||
'desc'=>'扭蛋:一发入魂',
|
||
]);
|
||
DB::commit();
|
||
} catch (\Throwable $th) {
|
||
DB::rollback();
|
||
return $this->error($th->getMessage());
|
||
}
|
||
return $this->success('兑换成功');
|
||
}else{
|
||
return $this->error('剩余积分不足');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 翻牌抽奖
|
||
*/
|
||
public function toDraw(Request $request){
|
||
//消耗抽奖机会
|
||
$user = auth('api')->user();
|
||
|
||
if($user->draw_num > 0){
|
||
$res_data = [];
|
||
try {
|
||
DB::beginTransaction();
|
||
$user->decrement('draw_num');
|
||
//抽奖
|
||
$res_data = $this->activity_service->activityDarw();
|
||
//记录并发放结果
|
||
foreach($res_data as $draw_id){
|
||
$activity_log = new ActivityLog();
|
||
$activity_log->user_id = $user->id;
|
||
$activity_log->draw_id = $draw_id;
|
||
$activity_log->save();
|
||
SendActivityDrawJob::dispatch($activity_log);
|
||
}
|
||
DB::commit();
|
||
} catch (\Throwable $th) {
|
||
DB::rollback();
|
||
return $this->error($th->getMessage());
|
||
}
|
||
return $this->success($res_data);
|
||
}else{
|
||
return $this->error('剩余抽奖次数不足');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 五连必中
|
||
*/
|
||
public function toDrawFive(Request $request){
|
||
//消耗积分抽5次
|
||
$user = auth('api')->user();
|
||
$times = 5;
|
||
$points = ActivityOption::findOrFail(14)->key_value;
|
||
if($user->points >= $points){
|
||
$res_data = [];
|
||
try {
|
||
DB::beginTransaction();
|
||
$user->decrement('points', $points);
|
||
//记录积分消耗记录
|
||
PointsLog::create([
|
||
'user_id'=>$user->id,
|
||
'type'=>3,
|
||
'points'=> 0-$points,
|
||
'now_points'=>$user->points,
|
||
'desc'=>'扭蛋:五连必中',
|
||
]);
|
||
//抽奖
|
||
$res_data = $this->activity_service->activityDarw($times);
|
||
|
||
//检查中奖结果中有没有is_niu,没有则随机替换一个现有奖品
|
||
$niu_list = ActivityOption::where('is_niu', 1)->pluck('id')->toArray();
|
||
if(count(array_intersect($res_data, $niu_list)) < 1){
|
||
$key = rand(0, count($res_data)-1);
|
||
$draw_id = array_rand($niu_list);
|
||
$res_data[$key] = $niu_list[$draw_id];
|
||
}
|
||
//记录并发放结果
|
||
foreach($res_data as $draw_id){
|
||
$activity_log = new ActivityLog();
|
||
$activity_log->user_id = $user->id;
|
||
$activity_log->draw_id = $draw_id;
|
||
$activity_log->save();
|
||
SendActivityDrawJob::dispatch($activity_log);
|
||
}
|
||
DB::commit();
|
||
} catch (\Throwable $th) {
|
||
DB::rollback();
|
||
return $this->error($th->getMessage());
|
||
}
|
||
return $this->success($res_data);
|
||
}else{
|
||
return $this->error('剩余积分不足');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 抽奖活动
|
||
*/
|
||
public function luckIndex($activity_id){
|
||
return LuckActivityResource::make(LuckDrawActivity::findOrFail($activity_id));
|
||
// $this->activity_service->luckActivityDarw(1,5);
|
||
}
|
||
|
||
/**
|
||
* 抽奖活动-兑换次数
|
||
*/
|
||
public function luckPointsToTimes($activity_id){
|
||
$user = auth('api')->user();
|
||
$times = 1;
|
||
$time = Carbon::now();
|
||
$activity = LuckDrawActivity::findOrFail($activity_id);
|
||
if($activity->start_time > $time){
|
||
return $this->error('活动暂未开启');
|
||
}
|
||
if($activity->end_time < $time){
|
||
return $this->error('活动已经结束');
|
||
}
|
||
$points = $times*($activity->one_draw);
|
||
if($user->points >= $points){
|
||
try {
|
||
DB::beginTransaction();
|
||
$user->decrement('points', $points);
|
||
//新增活动抽奖次数
|
||
$user_luck_times = UserLuckTime::where(['user_id'=>$user->id,'activity_id'=>$activity->id])->first();
|
||
if($user_luck_times){
|
||
$user_luck_times->increment('times');
|
||
}else{
|
||
UserLuckTime::create([
|
||
'user_id'=>$user->id,
|
||
'activity_id'=>$activity->id,
|
||
'times'=>1
|
||
]);
|
||
}
|
||
|
||
//记录积分消耗记录
|
||
PointsLog::create([
|
||
'user_id'=>$user->id,
|
||
'type'=>2,
|
||
'points'=> 0-$points,
|
||
'now_points'=>$user->points,
|
||
'desc'=>'抽奖活动:一发入魂',
|
||
]);
|
||
DB::commit();
|
||
} catch (\Throwable $th) {
|
||
DB::rollback();
|
||
return $this->error($th->getMessage());
|
||
}
|
||
return $this->success('兑换成功');
|
||
}else{
|
||
return $this->error('剩余积分不足');
|
||
}
|
||
}
|
||
/**
|
||
* 抽奖活动-单次抽奖
|
||
*/
|
||
public function luckToDraw($activity_id){
|
||
//消耗抽奖机会
|
||
$user = auth('api')->user();
|
||
$time = Carbon::now();
|
||
$activity = LuckDrawActivity::findOrFail($activity_id);
|
||
if($activity->start_time > $time){
|
||
return $this->error('活动暂未开启');
|
||
}
|
||
if($activity->end_time < $time){
|
||
return $this->error('活动已经结束');
|
||
}
|
||
$user_luck_times = UserLuckTime::where(['user_id'=>$user->id,'activity_id'=>$activity->id])->first();
|
||
if($user_luck_times && $user_luck_times->times > 0){
|
||
$res_data = [];
|
||
try {
|
||
DB::beginTransaction();
|
||
$user_luck_times->decrement('times');
|
||
//抽奖
|
||
$res_data = $this->activity_service->luckActivityDarw($activity->id);
|
||
//记录并发放结果
|
||
$draw_id = $res_data[0];
|
||
// foreach($res_data as $draw_id){
|
||
$luck_log = new UserLuckLog();
|
||
$luck_log->user_id = $user->id;
|
||
$luck_log->activity_id = $activity->id;
|
||
$luck_log->draw_id = $draw_id;
|
||
// $luck_log->ext = '恭喜抽中';
|
||
$luck_log->save();
|
||
if($draw_id){
|
||
LuckDrawOption::findOrFail($draw_id)->increment('luck_num');
|
||
SendLuckActivityDrawJob::dispatch($luck_log);
|
||
}
|
||
|
||
// }
|
||
DB::commit();
|
||
} catch (\Throwable $th) {
|
||
DB::rollback();
|
||
return $this->error($th->getMessage());
|
||
}
|
||
$res_data = $this->drawIdToDrawName($res_data, $activity_id);
|
||
return $this->success($res_data);
|
||
|
||
}else{
|
||
return $this->error('剩余抽奖次数不足');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 抽奖活动-五连抽
|
||
*/
|
||
public function luckToDrawFive($activity_id){
|
||
//消耗积分抽5次
|
||
$user = auth('api')->user();
|
||
$times = 5;
|
||
$time = Carbon::now();
|
||
$activity = LuckDrawActivity::findOrFail($activity_id);
|
||
if($activity->start_time > $time){
|
||
return $this->error('活动暂未开启');
|
||
}
|
||
if($activity->end_time < $time){
|
||
return $this->error('活动已经结束');
|
||
}
|
||
$points = $activity->five_draw;
|
||
|
||
if($user->points >= $points){
|
||
$res_data = [];
|
||
try {
|
||
DB::beginTransaction();
|
||
$user->decrement('points', $points);
|
||
//记录积分消耗记录
|
||
PointsLog::create([
|
||
'user_id'=>$user->id,
|
||
'type'=>3,
|
||
'points'=> 0-$points,
|
||
'now_points'=>$user->points,
|
||
'desc'=>'抽奖活动:五连必中',
|
||
]);
|
||
//抽奖
|
||
$res_data = $this->activity_service->luckActivityDarw($activity->id, $times);
|
||
//检查中奖结果中有没有五连必中,没有则随机替换一个现有奖品
|
||
$niu_list = LuckDrawOption::where('is_five', 1)->pluck('id')->toArray();
|
||
if(count($niu_list) > 0 && count(array_intersect($res_data, $niu_list)) < 1){
|
||
$key = rand(0, count($res_data)-1);
|
||
$draw_id = array_rand($niu_list);
|
||
$res_data[$key] = $niu_list[$draw_id];
|
||
}
|
||
// dd($res_data);
|
||
//记录并发放结果
|
||
foreach($res_data as $draw_id){
|
||
$luck_log = new UserLuckLog();
|
||
$luck_log->user_id = $user->id;
|
||
$luck_log->activity_id = $activity->id;
|
||
$luck_log->draw_id = $draw_id;
|
||
// $luck_log->ext = '恭喜抽中';
|
||
$luck_log->save();
|
||
if($draw_id){
|
||
SendLuckActivityDrawJob::dispatch($luck_log);
|
||
}
|
||
}
|
||
$up_res_data = array_filter($res_data);
|
||
if($up_res_data){
|
||
LuckDrawOption::whereIn('id', $up_res_data)->increment('luck_num');
|
||
}
|
||
|
||
DB::commit();
|
||
} catch (\Throwable $th) {
|
||
DB::rollback();
|
||
return $this->error($th->getMessage());
|
||
}
|
||
$res_data = $this->drawIdToDrawName($res_data, $activity_id);
|
||
return $this->success($res_data);
|
||
}else{
|
||
return $this->error('剩余积分不足');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 奖品ID替换为奖品名称
|
||
*/
|
||
private function drawIdToDrawName($draw_ids, $activity_id=0){
|
||
if(!is_array($draw_ids)){
|
||
$draw_ids = [$draw_ids];
|
||
}
|
||
$luck_draw_options = LuckDrawOption::where('activity_id', $activity_id)->get()->keyBy('id');
|
||
$draw_name = [];
|
||
foreach($draw_ids as $draw_id){
|
||
if(isset($luck_draw_options[$draw_id])){
|
||
$draw_name[] = [
|
||
'draw_id' => $draw_id,
|
||
'draw_name' => $luck_draw_options[$draw_id]->draw_name,
|
||
'draw_image'=> $luck_draw_options[$draw_id]->draw_logo,
|
||
];
|
||
}else{
|
||
$draw_name[] = [
|
||
'draw_id' => $draw_id,
|
||
'draw_name' => '谢谢参与',
|
||
'draw_image'=> ''
|
||
];
|
||
}
|
||
}
|
||
return $draw_name;
|
||
}
|
||
} |