Files
lotteryLaravel/database/seeders/OperationalConfigV1Seeder.php

141 lines
5.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace Database\Seeders;
use App\Models\OddsItem;
use App\Models\PlayType;
use App\Models\OddsVersion;
use App\Models\RiskCapItem;
use App\Models\PlayConfigItem;
use App\Models\RiskCapVersion;
use Illuminate\Database\Seeder;
use App\Models\PlayConfigVersion;
use Illuminate\Support\Facades\DB;
use App\Support\OddsStandardScopes;
use App\Lottery\ConfigVersionStatus;
/**
* 阶段 4写入首套 **active** 玩法配置 / 赔率 / 风控封顶版本(依赖 {@see PlayTypeSeeder}、{@see CurrencySeeder})。
*
* 幂等:仅当三套版本均已有 active 行时跳过;否则只补缺失的一类(避免「仅有 play active 时整段被跳过」导致 /play/effective 不可用)。
*/
final class OperationalConfigV1Seeder extends Seeder
{
public function run(): void
{
$hasPlay = PlayConfigVersion::query()
->where('status', ConfigVersionStatus::Active->value)
->exists();
$hasOdds = OddsVersion::query()
->where('status', ConfigVersionStatus::Active->value)
->exists();
$hasRisk = RiskCapVersion::query()
->where('status', ConfigVersionStatus::Active->value)
->exists();
if ($hasPlay && $hasOdds && $hasRisk) {
return;
}
DB::transaction(function () use ($hasPlay, $hasOdds, $hasRisk): void {
if (! $hasPlay) {
$this->seedActivePlayConfigVersion();
}
if (! $hasOdds) {
$this->seedActiveOddsVersion();
}
if (! $hasRisk) {
$this->seedActiveRiskCapVersion();
}
});
}
private function seedActivePlayConfigVersion(): void
{
$versionNo = (int) (PlayConfigVersion::query()->max('version_no') ?? 0) + 1;
$playVersion = PlayConfigVersion::query()->create([
'version_no' => $versionNo,
'status' => ConfigVersionStatus::Active->value,
'effective_at' => now(),
'updated_by' => null,
'reason' => 'seed:v1',
]);
foreach (PlayType::query()->orderBy('sort_order')->orderBy('play_code')->get() as $pt) {
PlayConfigItem::query()->create([
'version_id' => $playVersion->id,
'play_code' => $pt->play_code,
'category' => $pt->category,
'dimension' => $pt->dimension,
'bet_mode' => $pt->bet_mode,
'display_name_zh' => $pt->display_name_zh,
'display_name_en' => $pt->display_name_en,
'display_name_ne' => $pt->display_name_ne,
'is_enabled' => (bool) $pt->is_enabled,
'min_bet_amount' => 100,
'max_bet_amount' => 500_000_000,
'display_order' => (int) $pt->sort_order,
'supports_multi_number' => (bool) $pt->supports_multi_number,
'reserved_rule_json' => $pt->reserved_rule_json,
'rule_text_zh' => null,
'rule_text_en' => null,
'rule_text_ne' => null,
'extra_config_json' => null,
]);
}
}
private function seedActiveOddsVersion(): void
{
$versionNo = (int) (OddsVersion::query()->max('version_no') ?? 0) + 1;
$oddsVersion = OddsVersion::query()->create([
'version_no' => $versionNo,
'status' => ConfigVersionStatus::Active->value,
'effective_at' => now(),
'updated_by' => null,
'reason' => 'seed:v1',
]);
/** 对齐界面文档 §5.5:头/二/三/特别/安慰odds_value = 乘数×10000NPR 基准展示口径) */
foreach (PlayType::query()->orderBy('sort_order')->orderBy('play_code')->get() as $pt) {
foreach (OddsStandardScopes::PRESET_ODDS_BY_SCOPE as $scope => $oddsValue) {
OddsItem::query()->create([
'version_id' => $oddsVersion->id,
'play_code' => $pt->play_code,
'prize_scope' => $scope,
'odds_value' => $oddsValue,
'rebate_rate' => 0,
'commission_rate' => 0,
'currency_code' => 'NPR',
'extra_config_json' => null,
]);
}
}
}
private function seedActiveRiskCapVersion(): void
{
$versionNo = (int) (RiskCapVersion::query()->max('version_no') ?? 0) + 1;
$riskVersion = RiskCapVersion::query()->create([
'version_no' => $versionNo,
'status' => ConfigVersionStatus::Active->value,
'effective_at' => now(),
'updated_by' => null,
'reason' => 'seed:v1',
]);
foreach (['0000', '1234', '9999'] as $num) {
RiskCapItem::query()->create([
'version_id' => $riskVersion->id,
'draw_id' => null,
'normalized_number' => $num,
'cap_amount' => 50_000_000_000,
'cap_type' => 'per_number',
]);
}
}
}