feat: 世界杯48强夺冠盘、管理端调赔与项目文档

- 固定48强基准数据、同步种子与后台世界杯夺冠页

- 补全 user_preferences 迁移文件;新增启动指南与默认数据说明

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-03 16:19:36 +08:00
parent 3b739982a1
commit 95abbcb470
17 changed files with 1157 additions and 92 deletions

View File

@@ -19,6 +19,7 @@ import { UsersService } from '../../domains/identity/users.service';
import { AgentsService } from '../../domains/agent/agents.service';
import { WalletService } from '../../domains/ledger/wallet.service';
import { MatchesService } from '../../domains/catalog/matches.service';
import { OutrightService } from '../../domains/catalog/outright.service';
import { MarketsService } from '../../domains/odds/markets.service';
import { SettlementService } from '../../domains/settlement/settlement.service';
import { CashbackService } from '../../domains/operations/cashback/cashback.service';
@@ -245,6 +246,20 @@ class UpdateOddsDto {
odds!: number;
}
class OutrightOddsUpdateItemDto {
@IsString()
selectionId!: string;
@IsNumber()
@Min(1.01)
odds!: number;
}
class BatchOutrightOddsDto {
@IsArray()
updates!: OutrightOddsUpdateItemDto[];
}
class CashbackPreviewDto {
@IsString()
periodStart!: string;
@@ -263,6 +278,7 @@ export class AdminController {
private agents: AgentsService,
private wallet: WalletService,
private matches: MatchesService,
private outright: OutrightService,
private markets: MarketsService,
private settlement: SettlementService,
private cashback: CashbackService,
@@ -632,6 +648,27 @@ export class AdminController {
return jsonResponse(selection);
}
@Get('outrights/wc2026')
async getWc2026Outright() {
const data = await this.outright.getWc2026ForAdmin();
return jsonResponse(data);
}
@Put('outrights/wc2026/odds')
async updateWc2026OutrightOdds(
@CurrentUser('id') operatorId: bigint,
@Body() dto: BatchOutrightOddsDto,
) {
const data = await this.outright.updateWc2026Odds(dto.updates, operatorId);
return jsonResponse(data);
}
@Post('outrights/wc2026/apply-canonical')
async applyWc2026Canonical() {
const data = await this.outright.applyWc2026Canonical();
return jsonResponse(data);
}
@Post('matches/:id/settlement/score')
async recordScore(
@CurrentUser('id') operatorId: bigint,