feat: 充值订单审计与重新申请,优化赛事展示和余额刷新

- 新增 deposit_order_audit_logs 表,记录提交/审批/拒绝/撤销/重提全链路
- 管理端充值单页增加审计历史;玩家端充值历史支持时间线与重新申请
- 已拒绝订单可原单号重提;撤销入账使用 PLAYER_DEPOSIT_REVERSAL 并加强幂等
- 结算后清除热门标记,允许归档已结算赛事,完善今日赛事时区窗口
- 足球页今日/早盘独立折叠;资料与余额在进入钱包/个人页及下注后自动刷新
- 补充投注玩法、结算返水规则文档;新增 smoke/settlement CLI 脚本

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-15 14:52:05 +08:00
parent 73a94e6be3
commit afb5c5437e
55 changed files with 3050 additions and 160 deletions

View File

@@ -18,10 +18,28 @@ export async function seedDemoMarkets(prisma: PrismaClient, matchId: bigint) {
cfg.marketType.includes('CORRECT_SCORE') &&
exists._count.selections < cfg.selectionTemplate.length;
if (needRefresh) {
await prisma.market.delete({ where: { id: exists.id } });
} else {
continue;
const existing = await prisma.marketSelection.findMany({
where: { marketId: exists.id },
select: { selectionCode: true },
});
const existingCodes = new Set(existing.map((s) => s.selectionCode));
const missing = cfg.selectionTemplate
.map((s, i) => ({ ...s, sortOrder: i }))
.filter((s) => !existingCodes.has(s.code));
if (missing.length > 0) {
await prisma.marketSelection.createMany({
data: missing.map((s) => ({
marketId: exists.id,
selectionCode: s.code,
selectionName: s.name,
odds: s.odds,
sortOrder: s.sortOrder,
status: 'OPEN',
})),
});
}
}
continue;
}
await prisma.market.create({
data: {