139 lines
4.4 KiB
PHP
139 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use DB;
|
|
use Carbon\Carbon;
|
|
use App\Models\{User,Order, ActivityOption, ActivityGood, ActivityUser, ActivityLog, LuckDrawOption, UserLuckLog};
|
|
|
|
/**
|
|
* Class OrderService
|
|
*
|
|
* @package App\Services
|
|
*/
|
|
class ActivityService
|
|
{
|
|
/**
|
|
* 抽奖
|
|
* $num 抽几次
|
|
*/
|
|
public function activityDarw($times = 1){
|
|
//获取配置比例
|
|
$options = ActivityOption::where('key_type', 0)->where('rate', '>', 0)->get();
|
|
$star_num = 1;
|
|
$end_num = 1;
|
|
foreach($options as $option){
|
|
$end_num += (int)($option->rate * 100);
|
|
}
|
|
$draw_nums = [];
|
|
for($i = 0; $i<$times; $i++){
|
|
$draw_nums[] = rand($star_num, (int)$end_num);
|
|
}
|
|
//拿去中奖ID
|
|
$draw_id = [];
|
|
foreach($options as $option){
|
|
foreach($draw_nums as $key => $draw_num){
|
|
if($draw_num >= $star_num && $draw_num <=(int)($option->rate * 100 + $star_num)){
|
|
$draw_id[] = $option->id;
|
|
unset($draw_nums[$key]);
|
|
}
|
|
}
|
|
$star_num += (int)($option->rate * 100);
|
|
}
|
|
return $draw_id;
|
|
}
|
|
|
|
/**
|
|
* 发放奖品
|
|
*/
|
|
public function sendDraw(ActivityLog $activity_log){
|
|
$start_time = Carbon::now()->startOfDay();
|
|
$end_time = Carbon::now()->endOfDay();
|
|
|
|
//如果是吹牛奖
|
|
$niu_draw = ActivityOption::where('key_type', 0)->where('is_niu', 1)->pluck('id')->toArray();//可能多个ID都是吹牛
|
|
if(in_array($activity_log->draw_id, $niu_draw)){
|
|
//找到该用户当前最新一笔未取餐订单
|
|
$order = Order::where([
|
|
'user_id'=>$activity_log->user_id,
|
|
'order_status'=>1,
|
|
'pay_status'=>1,
|
|
'shipping_status'=>0,
|
|
'is_niu'=>0])
|
|
->whereBetween('created_at', [$start_time, $end_time])
|
|
->orderBy('created_at', 'asc')->first();
|
|
if($order){
|
|
$order->update(['is_niu'=>1]);
|
|
}
|
|
}
|
|
//发放奖品
|
|
if($activity_log->draw_id<10){
|
|
ActivityUser::where('user_id', $activity_log->user_id)->increment('award_'.$activity_log->draw_id);
|
|
}
|
|
$activity_log->status = 1;
|
|
$activity_log->save();
|
|
}
|
|
|
|
/**
|
|
* 抽奖活动-抽奖
|
|
*/
|
|
public function luckActivityDarw($activity_id, $times = 1){
|
|
//获取配置比例
|
|
$options = LuckDrawOption::where('activity_id', $activity_id)->where('draw_rate', '>', 0)->where(function($q){
|
|
$q->where('is_num', 0)->orWhereColumn('draw_num', '<', 'luck_num');
|
|
})->get();
|
|
$star_num = 1;
|
|
$end_num = 1;
|
|
foreach($options as $option){
|
|
$end_num += (int)($option->draw_rate * 100);
|
|
}
|
|
if($end_num < 10000){
|
|
$end_num = 10000;
|
|
}
|
|
$draw_nums = [];
|
|
for($i = 0; $i<$times; $i++){
|
|
$draw_nums[] = rand($star_num, (int)$end_num);
|
|
}
|
|
//拿去中奖ID
|
|
$draw_id = [];
|
|
|
|
foreach($draw_nums as $key => $draw_num){
|
|
$star_num = 0;
|
|
$option_status = false;
|
|
foreach($options as $option){
|
|
if($draw_num >= $star_num && $draw_num <=(int)($option->draw_rate * 100 + $star_num)){
|
|
$draw_id[] = $option->id;
|
|
$option_status = true;
|
|
}else{
|
|
if(!$option_status && $option == $options->last()){
|
|
$draw_id[] = 0;
|
|
}
|
|
}
|
|
$star_num += (int)($option->draw_rate * 100);
|
|
}
|
|
}
|
|
// dd($draw_id);
|
|
return $draw_id;
|
|
}
|
|
|
|
public function sendLuckDraw(UserLuckLog $userLuckLog){
|
|
$user = User::find($userLuckLog->user_id);
|
|
if($user){
|
|
try{
|
|
DB::beginTransaction();
|
|
switch($userLuckLog->draw->draw_type){
|
|
case 1://优惠券
|
|
$user->sendTicket($userLuckLog->draw->draw_info, 0, '活动抽奖');
|
|
break;
|
|
}
|
|
$userLuckLog->log_status = 1;
|
|
$userLuckLog->save();
|
|
DB::commit();
|
|
}catch (\Throwable $th) {
|
|
DB::rollback();
|
|
$userLuckLog->log_status = -1;
|
|
$userLuckLog->save();
|
|
}
|
|
}
|
|
}
|
|
} |