feat: 增强开奖与设置控制器的币种支持功能

引入 CurrencyResolver,用于在 DrawCurrentController、DrawResultShowController 与 DrawResultsIndexController 中统一处理币种代码解析。
更新 DrawHallSnapshotBuilder 与 DrawResultViewService 的构建方法,新增币种代码参数支持,确保开奖相关功能中的币种处理一致性。
增强 SettingIndexController:新增允许访问的 KV 配置分组校验。
在 OddsStreamService、PlayConfigStreamService 与 RiskCapStreamService 中新增广播功能,用于在玩法目录变更时推送更新通知。
新增测试用例,验证风险限额发布的广播行为。
This commit is contained in:
2026-05-27 09:57:39 +08:00
parent 618201f980
commit a9d0f39a9c
13 changed files with 237 additions and 21 deletions

View File

@@ -75,8 +75,9 @@ final class DrawResultViewService
*
* @return array<string, mixed>|null
*/
public function summarizeDraw(Draw $draw): ?array
public function summarizeDraw(Draw $draw, ?string $currencyCode = null): ?array
{
$currencyCode = $this->normalizeCurrencyCode($currencyCode);
$version = (int) $draw->current_result_version;
if ($version < 1) {
return null;
@@ -115,7 +116,8 @@ final class DrawResultViewService
'draw_time_iso' => $draw->draw_time?->toIso8601String(),
'result_version' => $version,
'result_source' => $draw->result_source,
'jackpot' => $this->jackpotSummary->summary('NPR'),
'jackpot_currency_code' => $currencyCode,
'jackpot' => $this->jackpotSummary->summary($currencyCode),
'results' => $numbers,
'result_items' => $items->map(fn (DrawResultItem $r) => [
'prize_type' => $r->prize_type,
@@ -132,10 +134,10 @@ final class DrawResultViewService
/**
* @param LengthAwarePaginator<int, Draw> $paginator
*/
public function decoratePaginator(LengthAwarePaginator $paginator): LengthAwarePaginator
public function decoratePaginator(LengthAwarePaginator $paginator, ?string $currencyCode = null): LengthAwarePaginator
{
$collection = $paginator->getCollection()->map(function (Draw $draw): ?array {
return $this->summarizeDraw($draw);
$collection = $paginator->getCollection()->map(function (Draw $draw) use ($currencyCode): ?array {
return $this->summarizeDraw($draw, $currencyCode);
})->filter();
$paginator->setCollection($collection->values());
@@ -183,4 +185,15 @@ final class DrawResultViewService
'next_draw_no' => $nextNo,
];
}
private function normalizeCurrencyCode(?string $currencyCode): string
{
$code = strtoupper(substr(trim((string) ($currencyCode ?? '')), 0, 16));
if ($code !== '') {
return $code;
}
return strtoupper(substr(trim((string) config('lottery.default_currency', 'NPR')), 0, 16));
}
}