feat: 更新玩法配置管理,简化字段并增强功能
- 将玩法相关的显示名称字段统一为 `display_name`,移除多语言字段。 - 在 `PlayTypePatchController` 中新增即时切换玩法开关的功能,并推送大厅更新。 - 优化多个控制器和服务中的权限检查与数据处理逻辑,提升代码可读性与维护性。
This commit is contained in:
96
app/Console/Commands/LotteryPerfDrawScheduleAuditCommand.php
Normal file
96
app/Console/Commands/LotteryPerfDrawScheduleAuditCommand.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Draw;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Console\Command;
|
||||
use App\Services\Draw\DrawPlannerService;
|
||||
|
||||
/**
|
||||
* PRD §17.2:校验期号计划相邻开奖时刻间隔是否符合 interval_minutes(默认 5 分钟)。
|
||||
*/
|
||||
final class LotteryPerfDrawScheduleAuditCommand extends Command
|
||||
{
|
||||
protected $signature = 'lottery:perf-draw-schedule-audit
|
||||
{--samples=48 : 抽检相邻期数}
|
||||
{--tolerance-seconds=60 : 允许偏差(秒)}';
|
||||
|
||||
protected $description = 'Audit draw_time spacing for schedule punctuality (§17.2)';
|
||||
|
||||
public function handle(DrawPlannerService $planner): int
|
||||
{
|
||||
$samples = max(2, (int) $this->option('samples'));
|
||||
$tolerance = max(0, (int) $this->option('tolerance-seconds'));
|
||||
$intervalMinutes = (int) config('lottery.draw.interval_minutes', 5);
|
||||
$expectedSeconds = $intervalMinutes * 60;
|
||||
|
||||
$planner->ensureBuffer(Carbon::now('UTC'));
|
||||
|
||||
$nowUtc = Carbon::now('UTC');
|
||||
$horizon = $nowUtc->copy()->addDays(14);
|
||||
|
||||
$businessDate = Draw::query()
|
||||
->whereNotNull('draw_time')
|
||||
->where('draw_time', '>', $nowUtc)
|
||||
->where('draw_time', '<=', $horizon)
|
||||
->where('business_date', '<', '2090-01-01')
|
||||
->orderByDesc('business_date')
|
||||
->value('business_date');
|
||||
|
||||
if ($businessDate === null) {
|
||||
$this->error('No upcoming draws found.');
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
|
||||
$times = Draw::query()
|
||||
->where('business_date', $businessDate)
|
||||
->whereNotNull('draw_time')
|
||||
->orderBy('sequence_no')
|
||||
->limit($samples + 1)
|
||||
->pluck('draw_time')
|
||||
->map(fn ($t) => Carbon::parse($t)->utc())
|
||||
->values()
|
||||
->all();
|
||||
|
||||
$this->line('business_date='.$businessDate);
|
||||
|
||||
if (count($times) < 2) {
|
||||
$this->error('Not enough draws to audit.');
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
|
||||
$violations = [];
|
||||
for ($i = 1; $i < count($times); $i++) {
|
||||
$delta = $times[$i]->diffInSeconds($times[$i - 1], absolute: true);
|
||||
if (abs($delta - $expectedSeconds) > $tolerance) {
|
||||
$violations[] = [
|
||||
'pair' => ($i - 1).'→'.$i,
|
||||
'delta_seconds' => $delta,
|
||||
'expected_seconds' => $expectedSeconds,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$this->info(sprintf(
|
||||
'interval_minutes=%d expected_gap=%ds tolerance=±%ds pairs_checked=%d',
|
||||
$intervalMinutes,
|
||||
$expectedSeconds,
|
||||
$tolerance,
|
||||
count($times) - 1,
|
||||
));
|
||||
|
||||
if ($violations === []) {
|
||||
$this->info('PASS — all checked gaps within tolerance.');
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
$this->error('FAIL — spacing violations:');
|
||||
$this->table(['pair', 'delta_seconds', 'expected_seconds'], $violations);
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user