feat(odds): 支持基于开注商的赔率区分与优先级处理
- 在赔率数据表中新增 provider_code 字段,默认值为 GLOBAL - 赔率接口与服务中新增 provider_code 参数支持,实现开注商特定赔率加载 - 解析赔率集合时,根据 provider_code 优先级进行排序与筛选,保证特定开注商赔率优先 - 优化赔率唯一索引,新增 provider_code 列以防止不同开注商赔率重复冲突 - 调整赔率相关验证规则,支持开注商代码的合法性与可选性检查 - 玩法解析与出票相关逻辑改造,支持多开注商环境下的投注处理 - 管理界面赔率替换接口增加 provider_code 字段支持 - 同步和测试用例覆盖 provider_code 相关功能,验证开注商赔率隔离与优先切换 - PlayEffectiveCatalogController 支持按 provider_code 返回赔率目录数据 - TicketPlacementService 与 TicketPreviewService 修改为支持 provider_code 多开注商玩法解析 - 维护 OddsStandardScopes 同步逻辑,保证开注商维度佣金与赔率正确同步 - AdminConfigPresenter 增加了对应数据的 provider_code 与 dimension 输出字段 - SDK接口添加 odds_snapshot_json 中开注商字段,完善赔率快照信息 - 路由配置调整管理文档地址,无关改动细微修改
This commit is contained in:
@@ -39,8 +39,10 @@ function mintConfigAdminToken(): string
|
||||
function oddsPutPayloadFromDetail(array $items): array
|
||||
{
|
||||
return collect($items)->map(fn (array $r) => [
|
||||
'provider_code' => $r['provider_code'] ?? 'GLOBAL',
|
||||
'play_code' => $r['play_code'],
|
||||
'prize_scope' => $r['prize_scope'],
|
||||
'dimension' => $r['dimension'] ?? null,
|
||||
'odds_value' => (int) $r['odds_value'],
|
||||
'rebate_rate' => (float) $r['rebate_rate'],
|
||||
'commission_rate' => (float) $r['commission_rate'],
|
||||
@@ -58,6 +60,52 @@ test('play effective catalog is public and merged', function (): void {
|
||||
expect($plays[0])->toHaveKeys(['play_code', 'config', 'odds', 'master_enabled']);
|
||||
});
|
||||
|
||||
test('play effective catalog applies provider odds over global fallback', function (): void {
|
||||
$activeOdds = OddsVersion::query()
|
||||
->where('status', ConfigVersionStatus::Active->value)
|
||||
->firstOrFail();
|
||||
|
||||
$globalFirst = DB::table('odds_items')
|
||||
->where('version_id', $activeOdds->id)
|
||||
->where('provider_code', 'GLOBAL')
|
||||
->where('play_code', 'big')
|
||||
->where('prize_scope', 'first')
|
||||
->first();
|
||||
|
||||
expect($globalFirst)->not->toBeNull();
|
||||
|
||||
DB::table('bet_providers')->insert([
|
||||
'code' => 'MY',
|
||||
'name' => 'Malaysia',
|
||||
'is_enabled' => true,
|
||||
'sort_order' => 2,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
DB::table('odds_items')->insert([
|
||||
'version_id' => $activeOdds->id,
|
||||
'provider_code' => 'MY',
|
||||
'play_code' => 'big',
|
||||
'prize_scope' => 'first',
|
||||
'dimension' => $globalFirst->dimension,
|
||||
'odds_value' => 99_000,
|
||||
'rebate_rate' => $globalFirst->rebate_rate,
|
||||
'commission_rate' => $globalFirst->commission_rate,
|
||||
'currency_code' => $globalFirst->currency_code,
|
||||
'extra_config_json' => null,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
$globalPlays = collect($this->getJson('/api/v1/play/effective?currency=NPR')->assertOk()->json('data.plays'));
|
||||
$providerPlays = collect($this->getJson('/api/v1/play/effective?currency=NPR&provider_code=MY')->assertOk()->json('data.plays'));
|
||||
|
||||
expect($globalPlays->firstWhere('play_code', 'big')['odds']['odds_value'])->toBe((int) $globalFirst->odds_value)
|
||||
->and($providerPlays->firstWhere('play_code', 'big')['odds']['odds_value'])->toBe(99_000)
|
||||
->and($providerPlays->firstWhere('play_code', 'big')['odds']['provider_code'])->toBe('MY');
|
||||
});
|
||||
|
||||
test('admin play config draft publish flow', function (): void {
|
||||
$token = mintConfigAdminToken();
|
||||
$active = PlayConfigVersion::query()->where('status', ConfigVersionStatus::Active->value)->firstOrFail();
|
||||
|
||||
Reference in New Issue
Block a user