order-food-admin/app/Http/Controllers/Api/Miniprogram/ActivityController.php

356 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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;
}
}