feat: 增强开奖与设置控制器的币种支持功能
引入 CurrencyResolver,用于在 DrawCurrentController、DrawResultShowController 与 DrawResultsIndexController 中统一处理币种代码解析。 更新 DrawHallSnapshotBuilder 与 DrawResultViewService 的构建方法,新增币种代码参数支持,确保开奖相关功能中的币种处理一致性。 增强 SettingIndexController:新增允许访问的 KV 配置分组校验。 在 OddsStreamService、PlayConfigStreamService 与 RiskCapStreamService 中新增广播功能,用于在玩法目录变更时推送更新通知。 新增测试用例,验证风险限额发布的广播行为。
This commit is contained in:
@@ -199,9 +199,10 @@ final class DrawHallSnapshotBuilder
|
||||
/**
|
||||
* @return array<string, mixed>|null
|
||||
*/
|
||||
public function build(?Carbon $nowUtc = null): ?array
|
||||
public function build(?Carbon $nowUtc = null, ?string $currencyCode = null): ?array
|
||||
{
|
||||
$nowUtc = ($nowUtc ?? Carbon::now())->utc();
|
||||
$currencyCode = $this->normalizeCurrencyCode($currencyCode);
|
||||
|
||||
$target = $this->resolveHallTarget($nowUtc);
|
||||
|
||||
@@ -255,7 +256,8 @@ final class DrawHallSnapshotBuilder
|
||||
'seconds_to_draw' => $secsToDraw,
|
||||
'cooling_end_time' => $target->cooling_end_time?->toIso8601String(),
|
||||
'seconds_remaining_in_cooldown' => $coolingRemain,
|
||||
'jackpot' => $this->jackpotSummary->summary('NPR'),
|
||||
'jackpot_currency_code' => $currencyCode,
|
||||
'jackpot' => $this->jackpotSummary->summary($currencyCode),
|
||||
];
|
||||
|
||||
$riskAlerts = RiskPool::query()
|
||||
@@ -320,4 +322,15 @@ final class DrawHallSnapshotBuilder
|
||||
|
||||
return $payload;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Services\Draw;
|
||||
|
||||
use App\Events\OddsUpdateBroadcast;
|
||||
use App\Events\PlayCatalogUpdatedBroadcast;
|
||||
use App\Events\PlayToggleBroadcast;
|
||||
use App\Events\RiskSoldOutBroadcast;
|
||||
use App\Events\RiskWarningBroadcast;
|
||||
@@ -118,6 +119,30 @@ final class LotteryHallRealtimeBroadcaster
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* `play.catalog_updated` —— 玩法/赔率/封顶版本发布(全量目录变更)。
|
||||
*
|
||||
* @param string $module play_config|odds|risk_cap
|
||||
*/
|
||||
public function notifyPlayCatalogUpdated(
|
||||
string $module,
|
||||
int $versionId,
|
||||
string $versionLabel,
|
||||
?array $meta = null,
|
||||
): void {
|
||||
if (! $this->driverSupportsRealtime()) {
|
||||
return;
|
||||
}
|
||||
|
||||
broadcast(new PlayCatalogUpdatedBroadcast(
|
||||
$module,
|
||||
$versionId,
|
||||
$versionLabel,
|
||||
$meta,
|
||||
(int) floor(microtime(true) * 1000),
|
||||
));
|
||||
}
|
||||
|
||||
/** `odds.update` —— 赔率变更 */
|
||||
public function notifyOddsUpdate(int $versionId, string $versionName, ?array $diff = null): void
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user