feat: 扩展玩法配置快照字段并切换目录生效来源

This commit is contained in:
2026-05-16 10:27:59 +08:00
parent f7f6c58b02
commit 7daf0c3bba
15 changed files with 254 additions and 47 deletions

View File

@@ -4,7 +4,6 @@ namespace App\Services\Config;
use App\Models\Currency;
use App\Models\OddsItem;
use App\Models\PlayType;
use App\Models\OddsVersion;
use App\Models\RiskCapItem;
use App\Models\PlayConfigItem;
@@ -37,8 +36,6 @@ final class EffectivePlayCatalogService
->where('status', ConfigVersionStatus::Active->value)
->firstOrFail();
$playTypes = PlayType::query()->orderBy('sort_order')->orderBy('play_code')->get();
/** @var Collection<string, PlayConfigItem> $configByCode */
$configByCode = PlayConfigItem::query()
->where('version_id', $playVersion->id)
@@ -58,26 +55,30 @@ final class EffectivePlayCatalogService
->orderBy('normalized_number')
->get();
$plays = $playTypes->map(function (PlayType $pt) use ($configByCode, $oddsByPlay): array {
$c = $configByCode->get($pt->play_code);
$items = $oddsByPlay->get($pt->play_code, collect());
$o = $this->pickPrimaryOddsItem($items);
$plays = $configByCode->values()
->sortBy([
['display_order', 'asc'],
['play_code', 'asc'],
])
->map(function (PlayConfigItem $c) use ($oddsByPlay): array {
$items = $oddsByPlay->get($c->play_code, collect());
$o = $this->pickPrimaryOddsItem($items);
return [
'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,
'sort_order' => (int) $pt->sort_order,
'supports_multi_number' => (bool) $pt->supports_multi_number,
'master_enabled' => (bool) $pt->is_enabled,
'config' => $c === null ? null : $this->serializePlayConfigItem($c),
'odds' => $o === null ? null : $this->serializeOddsItem($o),
];
})->values()->all();
return [
'play_code' => $c->play_code,
'category' => $c->category,
'dimension' => $c->dimension === null ? null : (int) $c->dimension,
'bet_mode' => $c->bet_mode,
'display_name_zh' => $c->display_name_zh,
'display_name_en' => $c->display_name_en,
'display_name_ne' => $c->display_name_ne,
'sort_order' => (int) $c->display_order,
'supports_multi_number' => (bool) $c->supports_multi_number,
'master_enabled' => (bool) $c->is_enabled,
'config' => $this->serializePlayConfigItem($c),
'odds' => $o === null ? null : $this->serializeOddsItem($o),
];
})->values()->all();
return [
'currency_code' => $currency->code,
@@ -144,10 +145,18 @@ final class EffectivePlayCatalogService
private function serializePlayConfigItem(PlayConfigItem $r): array
{
return [
'category' => $r->category,
'dimension' => $r->dimension === null ? null : (int) $r->dimension,
'bet_mode' => $r->bet_mode,
'display_name_zh' => $r->display_name_zh,
'display_name_en' => $r->display_name_en,
'display_name_ne' => $r->display_name_ne,
'is_enabled' => (bool) $r->is_enabled,
'min_bet_amount' => (int) $r->min_bet_amount,
'max_bet_amount' => (int) $r->max_bet_amount,
'display_order' => (int) $r->display_order,
'supports_multi_number' => (bool) $r->supports_multi_number,
'reserved_rule_json' => $r->reserved_rule_json,
'rule_text_zh' => $r->rule_text_zh,
'rule_text_en' => $r->rule_text_en,
'rule_text_ne' => $r->rule_text_ne,