109 lines
3.1 KiB
PHP
109 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Bo;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\InstantWin;
|
|
use App\Models\Prize;
|
|
use App\Models\Settings;
|
|
|
|
class InstantWinController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$nbInstantWin = InstantWin::count();
|
|
$canGenerate = 0;
|
|
|
|
if (intval($nbInstantWin) > 0) {
|
|
$canGenerate = 0;
|
|
} else {
|
|
$nbLots = Prize::count();
|
|
if (intval($nbLots) > 0) {
|
|
$canGenerate = 1;
|
|
} else {
|
|
$canGenerate = 0;
|
|
}
|
|
}
|
|
|
|
$instantWin = InstantWin::orderBy('appear_date')->get();
|
|
|
|
return view('bo.instant-win.index', [
|
|
'can_generate' => $canGenerate,
|
|
'instant_win' => $instantWin
|
|
]);
|
|
}
|
|
|
|
public function instantWinGenerate()
|
|
{
|
|
$start_date = Settings::latest()->value("start_date");
|
|
$end_date = Settings::latest()->value("end_date");
|
|
$lots = Prize::all();
|
|
|
|
|
|
|
|
$begin = new \DateTime($start_date);
|
|
$end = new \DateTime($end_date);
|
|
$interval = new \DateInterval('P1D');
|
|
$daterange = new \DatePeriod($begin, $interval, $end);
|
|
$dateGlobal = [];
|
|
$lotsGlobal = [];
|
|
|
|
|
|
|
|
foreach ($lots as $k => $lot) {
|
|
for ($i = 0; $i < $lot->quantity; $i++) {
|
|
$lotsGlobal[] = [
|
|
'id' => $lot->id,
|
|
'name' => $lot->label_one,
|
|
'hour' => str_pad(mt_rand(6, 22), 2, "0", STR_PAD_LEFT)
|
|
. ":" . str_pad(mt_rand(0, 59), 2, "0", STR_PAD_LEFT) . ":00"
|
|
];
|
|
}
|
|
}
|
|
shuffle($lotsGlobal);
|
|
foreach ($daterange as $date) {
|
|
array_push($dateGlobal, ['date' => $date->format("Y-m-d"), 'lots' => []]);
|
|
}
|
|
|
|
$res = $this->generate($lotsGlobal, $dateGlobal, 0);
|
|
|
|
foreach ($res as $date) {
|
|
foreach ($date['lots'] as $lot) {
|
|
$iw = new InstantWin();
|
|
$iw->prize_id = $lot['id'];
|
|
$iw->appear_date = date('Y-m-d H:i:s', strtotime($date['date'] . " " . $lot['hour']));
|
|
$iw->save();
|
|
}
|
|
}
|
|
|
|
$instantWins = InstantWin::all();
|
|
return json_encode($instantWins);
|
|
}
|
|
|
|
|
|
|
|
private function generate($lotsGlobal, $dateGlobal, $lotsDone)
|
|
{
|
|
$rKey = array_rand($dateGlobal, 1);
|
|
if ($lotsDone < count($dateGlobal)) {
|
|
if (count($dateGlobal[$rKey]['lots']) > 0) {
|
|
return $this->generate($lotsGlobal, $dateGlobal, $lotsDone);
|
|
}
|
|
}
|
|
array_push($dateGlobal[$rKey]['lots'], $lotsGlobal[$lotsDone++]);
|
|
if ($lotsDone < count($lotsGlobal)) {
|
|
return $this->generate($lotsGlobal, $dateGlobal, $lotsDone);
|
|
}
|
|
foreach ($dateGlobal as $k => $date) {
|
|
usort($dateGlobal[$k]['lots'], [$this, 'sortFunction']);
|
|
}
|
|
return $dateGlobal;
|
|
}
|
|
|
|
|
|
|
|
private function sortFunction($a, $b)
|
|
{
|
|
return strtotime($a["hour"]) - strtotime($b["hour"]);
|
|
}
|
|
}
|