Appearance
结算系统逻辑完整梳理 v1.0(已归档)
⚠️ 已归档文档(2026-04-21):本文档为 2026-02 前的历史技术梳理版本,多处状态枚举、业务流程已与当前 PRD 口径不一致(如旧版盘口状态用"部分结算/取消"业务态、赛事状态缺"已取消"枚举、引用"强制结算"路径、延期超 24h 自动转取消等)。
不作为业务参照依据。以各章节正式 PRD 为准:
- 赛事 / 盘口 / 注单状态定义 → 第 18 章 状态流转规则
- 结算自动化分层与本期范围 → 第 1 章 产品概述 / 第 11 章 11.0.1 本期范围声明
- 赛事异常处理 → 第 16 章 赛事异常处理
- 驳回与二次结算差额矩阵 → 第 15 章 驳回与二次结算
仅保留本文档供历史演进参考,新功能设计 / 开发 / 测试均以 PRD 正式章节为准。
一、核心概念层级定义
1.1 结算层级架构(四层)
赛事结算状态
↓
盘口结算状态(17种玩法 + 数据源玩法)
↓
盘口线结算状态(仅让球/大小类玩法)
↓
选项结算结果(最终中奖判定)1.2 各层级状态定义
| 层级 | 状态枚举 | 说明 |
|---|---|---|
| 赛事 | 待结算、已结算、异常 | 基于下属盘口状态自动计算 |
| 盘口 | 待结算、已结算、部分结算、取消 | 玩法维度 |
| 盘口线 | 待结算、已结算、走水、取消 | 仅MultiLineTable玩法 |
| 选项 | 赢、输、赢半、输半、走水、取消、退款 | 最终派彩依据 |
1.3 赛事结算状态判定规则(写死)
| 条件 | 赛事状态 |
|---|---|
| 所有可操盘盘口均为「已结算」或「取消」 | 已结算 |
| 存在任一盘口为「待结算」或「部分结算」 | 待结算 |
| 存在任一盘口为「异常」状态 | 异常 |
二、结算来源与流程
2.1 两种结算来源
| 来源 | 触发方式 | 结算权限 | 审批流程 |
|---|---|---|---|
| 数据源结算(IM) | IM下发赛果自动触发 | 系统自动执行 | 无需审批 |
| 自收结算(本地) | 结算人员手动录入赛果 | 结算人员执行 | 无需审批(风险自担) |
2.2 数据源结算流程
IM下发赛果数据
↓
系统解析赛果(比分、角球、红黄牌等)
↓
系统自动计算各盘口线中奖结果
↓
自动更新选项结算状态
↓
记录结算日志(标记来源:数据源)
↓
等待结算人员点击「结算赛事」确认2.3 自收结算流程
赛事完赛
↓
结算人员录入赛果数据(按盘口线维度)
↓
系统自动计算该盘口线下所有选项结果
↓
结算人员确认结算结果
↓
更新盘口线及选项状态
↓
记录结算日志(标记来源:人工 + 操作人)
↓
所有盘口结算完成后,点击「结算赛事」三、17种玩法结算规则详解
3.1 玩法分类与结算粒度
| 渲染器 | 玩法 | 结算粒度 | 赛果录入维度 |
|---|---|---|---|
| MultiLineTable | BT1让球、BT2大小、BT160主队大小、BT161客队大小 | 盘口线级 | 按盘口线录入 |
| SingleLineTable | BT3独赢、BT5单双、BT8双重机会、BT159第X粒入球 | 玩法级 | 按玩法整体录入 |
| Matrix | BT6波胆、BT158反波胆、BT9半全场 | 选项级 | 按精确比分录入 |
| LongList | BT7总进球 | 选项级 | 按总进球数录入 |
3.2 各玩法赛果录入要素
| 玩法ID | 玩法名称 | 所需赛果数据 | 结算判定逻辑 |
|---|---|---|---|
| BT1 | 让球 | 主队得分、客队得分 | (主分+盘口线) vs 客分 |
| BT2 | 大小 | 总进球数 | 总进球 vs 盘口线 |
| BT3 | 独赢 | 主队得分、客队得分 | 主分 vs 客分(主胜/和/客胜) |
| BT5 | 单双 | 总进球数 | 总进球 % 2(0=双,1=单) |
| BT6 | 波胆 | 精确比分(主-客) | 完全匹配比分 |
| BT7 | 总进球 | 总进球数 | 匹配进球区间 |
| BT8 | 双重机会 | 主队得分、客队得分 | 匹配两种结果之一 |
| BT9 | 半全场 | 半场比分、全场比分 | 匹配半场+全场组合 |
| BT158 | 反波胆 | 精确比分(主-客) | 不匹配该比分即中 |
| BT159 | 第X粒入球 | 各进球归属 | 该粒进球由哪队打入 |
| BT160 | 主队大小 | 主队进球数 | 主队进球 vs 盘口线 |
| BT161 | 客队大小 | 客队进球数 | 客队进球 vs 盘口线 |
3.3 完整赛果录入数据结构
赛果数据 {
// 基础比分(必填)
fullTimeScore: {
home: number, // 主队全场得分
away: number // 客队全场得分
},
halfTimeScore: {
home: number, // 主队半场得分
away: number // 客队半场得分
},
// 角球统计(角球玩法需要)
corners: {
home: number, // 主队角球
away: number, // 客队角球
firstCorner: 'home' | 'away' | null // 首个角球
},
// 红黄牌统计(罚牌玩法需要)
cards: {
homeYellow: number,
homeRed: number,
awayYellow: number,
awayRed: number,
firstCard: { team: 'home' | 'away', type: 'yellow' | 'red' } | null
},
// 进球详情(第X粒入球玩法需要)
goals: [
{ minute: number, team: 'home' | 'away', scorer?: string }
],
// 特殊事件
events: {
ownGoals: number, // 乌龙球数
penalties: number, // 点球数
extraTime: boolean, // 是否加时
penaltyShootout: { // 点球大战
home: number,
away: number
} | null
}
}四、盘口线级结算判定规则
4.1 让球盘判定(BT1)
公式: 调整后主队得分 = 主队得分 + 盘口线值
| 盘口线 | 调整后得分 vs 客队得分 | 主队结果 | 客队结果 |
|---|---|---|---|
| -0.5 | 主(2)+(-0.5)=1.5 vs 客(1) | 赢 | 输 |
| -0.5 | 主(1)+(-0.5)=0.5 vs 客(1) | 输 | 赢 |
| -1.0 | 主(2)+(-1.0)=1.0 vs 客(1) | 走水 | 走水 |
| -0.25 | 主(2)+(-0.25)=1.75 vs 客(1) | 赢 | 输 |
| -0.25 | 主(1)+(-0.25)=0.75 vs 客(1) | 输半 | 赢半 |
| -0.25 | 主(2)+(-0.25)=1.75 vs 客(2) | 输半 | 赢半 |
| +0.25 | 主(1)+(+0.25)=1.25 vs 客(1) | 赢半 | 输半 |
4.2 大小盘判定(BT2)
公式: 总进球 = 主队得分 + 客队得分
| 盘口线 | 总进球 vs 盘口线 | 大结果 | 小结果 |
|---|---|---|---|
| 2.5 | 3 > 2.5 | 赢 | 输 |
| 2.5 | 2 < 2.5 | 输 | 赢 |
| 3.0 | 3 = 3.0 | 走水 | 走水 |
| 2.25 | 2 < 2.25 | 输 | 赢 |
| 2.25 | 3 > 2.25 | 赢 | 输 |
| 2.75 | 3 = 2.75 (近似) | 赢半 | 输半 |
4.3 半赢/半输判定规则(亚洲盘)
| 盘口尾数 | 结果差值 | 判定 |
|---|---|---|
| 0.25 | 刚好=0 | 让方半输,受让方半赢 |
| 0.75 | 刚好=0.5 | 需细分 |
五、串关结算方案
5.1 串关状态定义
| 状态 | 说明 | 触发条件 |
|---|---|---|
| 进行中 | 部分关联赛事已结算 | 存在未结算的关联赛事 |
| 全中 | 所有场均中奖 | 所有场状态为「赢」或「赢半」 |
| 已输 | 任一场未中 | 任一场状态为「输」 |
| 部分取消 | 部分场取消/走水 | 存在取消或走水场,其余正常 |
| 全部取消 | 所有场取消 | 所有场状态为「取消」或「走水」 |
5.2 串关结算时机
关联赛事1 完赛结算 → 更新该场状态
↓
关联赛事2 完赛结算 → 更新该场状态
↓
...
↓
最后一场关联赛事完赛结算
↓
检查所有场状态
↓
计算最终派彩5.3 串关派彩计算规则
| 情况 | 计算公式 | 示例 |
|---|---|---|
| 全中 | 投注额 × 累计赔率 | ¥100 × (1.85 × 0.92 × 2.10) = ¥357.42 |
| 任一输 | 0 | ¥0 |
| 存在走水 | 投注额 × (其余场累计赔率) | 3场中1场走水:¥100 × (1.85 × 2.10) = ¥388.50 |
| 存在赢半 | 投注额 × 累计赔率 × 调整系数 | 赢半场的赔率减半后参与累计 |
| 存在输半 | 投注额 × 累计赔率 × 调整系数 | 输半场只退一半本金 |
5.4 串关特殊情况处理
| 情况 | 处理规则 | 说明 |
|---|---|---|
| 单场走水 | 该场赔率视为1.00 | 不影响其他场 |
| 单场取消 | 该场赔率视为1.00 | 盘口取消等同取消 |
| 单场赛事腰斩 | 等待人工处理 | 可选择该场视为取消 |
| 单场赛事延期超24h | 该场视为取消 | 默认值24小时(风控配置) |
| 所有场取消 | 全额退款 | 派彩 = 投注额 |
5.5 串关与本地/数据源盘口混合
5.5.1 盘口分类
| 类型 | 定义 | 可操盘 | 结算控制 |
|---|---|---|---|
| 可操盘盘口 | 17种标准玩法(BT1-BT180) | 是 | 本地可控 |
| 数据源盘口 | IM下发的其他玩法(角球、红黄牌等) | 否 | 完全依赖IM |
5.5.2 串关场景分类
| 场景 | 组成 | 结算处理 | 本地操作权限 |
|---|---|---|---|
| 纯本地串关 | 全部是17种可操盘盘口 | 本地完全控制 | 可手动结算 |
| 纯IM串关 | 全部是IM非可操盘盘口 | 完全依赖IM | 只读,无操作权限 |
| 混合串关 | 可操盘盘口 + IM盘口 | 各场独立结算 | 仅本地场可操作 |
5.5.3 混合串关结算流程
混合串关注单(示例:5串1)
│
├── 场1: 让球 [可操盘盘口] → 本地结算 ✓
├── 场2: 独赢 [可操盘盘口] → 本地结算 ✓
├── 场3: 角球大小 [IM盘口] → 等IM结算 ◐
├── 场4: 大小 [可操盘盘口] → 本地结算 ✓
└── 场5: 红牌数 [IM盘口] → 等IM结算 ○
│
↓
各场独立获得结算结果(来源不同)
│
↓
所有场都有结果后 → 计算串关最终结果5.5.4 各场结算来源对照
| 场类型 | 结算触发 | 结算结果来源 | 赔率来源 |
|---|---|---|---|
| 可操盘盘口场(数据源开) | 等IM下发 | IM结算结果 | 用户下注时锁定 |
| 可操盘盘口场(数据源关) | 本地录入赛果 | 本地计算 | 用户下注时锁定 |
| IM盘口场 | 等IM下发 | IM结算结果 | 用户下注时锁定 |
关键规则:无论盘口来源是本地还是IM,用户下注时锁定的赔率即为结算时的赔率。
5.5.5 结算详情页展示策略
| 场类型 | 展示方式 | 操作权限 |
|---|---|---|
| 可操盘盘口场 | 显示完整结算操作界面 | 可手动录入赛果、确认结算 |
| IM盘口场 | 只读显示结算状态 | 无操作权限,等待IM结果 |
5.5.6 短路判定规则
任一场判定为「输」→ 整单立即判负(无需等其他场)
│
↓
派彩 = 0,串关结算完成六、盘口二次结算机制
6.1 二次结算条件
| 条件 | 允许二次结算 |
|---|---|
| 盘口状态为「已结算」 | 是 |
| 盘口状态为「取消」 | 否(需先恢复) |
| 派彩已执行 | 是(需同时处理退款/追回) |
| 存在关联串关已结算 | 需级联处理 |
6.2 二次结算流程
结算人员发起二次结算
↓
填写二次结算原因(必填)
↓
系统检查关联影响:
- 涉及注单数量
- 涉及派彩金额
- 关联串关注单
↓
确认二次结算
↓
执行二次结算准备:
- 回滚盘口状态为「待结算」
- 标记已派彩注单为「待追回」
- 更新关联串关状态
↓
记录二次结算日志6.3 二次结算影响处理
| 影响类型 | 处理方式 |
|---|---|
| 已派彩用户 | 标记待追回,冻结余额 |
| 关联串关(子单二次结算) | 整单状态回滚为「进行中」 |
| 关联串关(已派彩) | 串关整单标记待追回 |
七、盘口取消操作
7.1 操作定义
| 操作 | 说明 | 派彩处理 |
|---|---|---|
| 取消盘口 | 盘口整体取消(赛前/赛中/赛后) | 全额退款 |
7.2 取消条件
- 数据源下发取消指令
- 赛事异常(腰斩、延期等)
- 发现赔率异常(人工判定)
- 数据错误导致结算错误
7.3 取消流程
触发取消(数据源/人工)
↓
填写取消原因
↓
系统计算影响范围:
- 涉及注单
- 涉及金额
- 关联串关
↓
执行取消:
- 更新盘口状态为「取消」
- 生成退款记录
- 更新关联串关(该场视为取消)
↓
记录取消日志八、结算赛事确认流程
8.1 「结算赛事」按钮逻辑
点击「结算赛事」按钮
↓
系统检查所有可操盘盘口状态
↓
┌─────────────────────────────────────────┐
│ 是否存在待结算盘口? │
│ │
│ 是 → 弹窗提示: │
│ "以下盘口尚未结算: │
│ - BT1 全场让球 (待结算) │
│ - BT2-1H 上半场大小 (待结算) │
│ 请先完成所有盘口结算后再确认。" │
│ [返回处理] [强制结算(取消待结算盘口)]│
│ │
│ 否 → 确认结算: │
│ "确认将赛事标记为已结算? │
│ - 已结算盘口: 20个 │
│ - 已取消盘口: 0个 │
│ - 总派彩金额: ¥892,000" │
│ [取消] [确认结算] │
└─────────────────────────────────────────┘
↓
确认后更新赛事状态为「已结算」
↓
记录结算完成日志8.2 结算确认前置检查
| 检查项 | 未通过处理 |
|---|---|
| 存在待结算盘口 | 提示盘口列表,阻止或强制 |
| 存在异常盘口 | 必须先处理异常 |
| 存在未同步数据源结果 | 提示等待同步 |
| 存在关联串关待处理 | 仅提示,不阻止 |
九、潜在逻辑漏洞与解决方案
9.1 已识别漏洞
| 漏洞 | 风险 | 解决方案 |
|---|---|---|
| 单选项录入赛果 | 同一盘口线两选项结果不一致 | 改为盘口线级录入 |
| 缺少二次结算机制 | 结算错误无法纠正 | 新增二次结算功能 |
| 缺少盘口取消 | 异常盘口无法处理 | 新增取消操作 |
| 串关混合结算 | 本地与数据源结算时序问题 | 明确各场独立结算 |
| 赛事结算状态缺失 | 无法判断赛事整体结算进度 | 新增赛事级状态 |
| 日志标记不清 | 系统vs数据源区分不明 | 修正日志来源标记 |
| 强制结算风险 | 待结算盘口被强制结算 | 强制结算需二次确认 |
9.2 边界情况处理
| 边界情况 | 处理规则 |
|---|---|
| 0-0 比分 | 总进球=0,单双=双,波胆匹配0-0 |
| 加时赛进球 | 默认不计入常规时间结算 |
| 点球大战 | 仅用于晋级判定,不计入进球数 |
| 赛事腰斩 | 人工决策:按当前比分结算或全部取消 |
| 红牌弃赛 | 按当前比分结算 |
| 数据源断连 | 转为自收结算模式 |
十、日志规范
10.1 日志来源标记
| 标记 | 说明 |
|---|---|
| 数据源 | IM下发数据触发的自动操作 |
| 人工 | 结算人员手动操作 |
| 系统 | 系统自动计算(如派彩计算) |
10.2 日志内容模板
[时间] [来源] [操作人(若人工)]
操作内容描述
- 影响盘口: BT1全场让球
- 影响注单: 156单
- 影响金额: ¥892,000附录:状态流转图
A1. 盘口状态流转
待结算 ─────┬──────→ 已结算 ───→ 二次结算 ───→ 待结算
│ ↑
│ │
└──→ 取消 ──┘(恢复后)A2. 赛事状态流转
待结算 ─────────→ 已结算
↑ │
│ │
└── 二次结算任一盘口 ─┘A3. 串关状态流转
进行中 ───┬──→ 全中 ───→ 已派彩
│
├──→ 已输 ───→ 已结算
│
├──→ 部分取消 ───→ 重算派彩 ───→ 已派彩
│
└──→ 全部取消 ───→ 全额退款十一、17种玩法赛果录入深度评估
11.1 数据录入需求矩阵(写死)
| 玩法ID | 玩法名称 | 必需数据 | 可选数据 | 录入粒度 | 自动计算能力 |
|---|---|---|---|---|---|
| BT1 | 让球 | 全场比分(主/客) | - | 盘口线级 | ✓ 可根据比分自动判定 |
| BT2 | 大小 | 全场比分(总进球) | - | 盘口线级 | ✓ 可根据总球自动判定 |
| BT3 | 独赢 | 全场比分(主/客) | - | 玩法级 | ✓ 可根据比分自动判定 |
| BT5 | 单双 | 全场比分(总进球) | - | 玩法级 | ✓ 总进球%2自动判定 |
| BT6 | 波胆 | 精确比分(主-客) | - | 选项级 | ✓ 精确匹配自动判定 |
| BT7 | 总进球 | 全场比分(总进球) | - | 选项级 | ✓ 区间匹配自动判定 |
| BT8 | 双重机会 | 全场比分(主/客) | - | 玩法级 | ✓ 可根据比分自动判定 |
| BT9 | 半全场 | 半场比分 + 全场比分 | - | 选项级 | ✓ 组合匹配自动判定 |
| BT158 | 反波胆 | 精确比分(主-客) | - | 选项级 | ✓ 不等于即中自动判定 |
| BT159 | 第X粒入球 | 进球详情列表 | - | 选项级 | ✓ 需逐粒进球归属 |
| BT160 | 主队大小 | 主队进球数 | - | 盘口线级 | ✓ 可根据主队进球判定 |
| BT161 | 客队大小 | 客队进球数 | - | 盘口线级 | ✓ 可根据客队进球判定 |
11.2 基础数据字段(17种玩法必需)
基础赛果数据 {
// === 比分数据(必填)===
fullTimeScore: {
home: number, // 主队全场得分
away: number // 客队全场得分
},
halfTimeScore: {
home: number, // 主队半场得分
away: number // 客队半场得分
}
}字段用途映射:
| 数据字段 | 支持的玩法 |
|---|---|
| fullTimeScore.home | BT1, BT3, BT6, BT8, BT9, BT158, BT160 |
| fullTimeScore.away | BT1, BT3, BT6, BT8, BT9, BT158, BT161 |
| fullTimeScore.home + away | BT2, BT5, BT7 |
| halfTimeScore.home | BT9 |
| halfTimeScore.away | BT9 |
11.3 扩展数据字段(BT159及数据源玩法需要)
扩展赛果数据 {
// === 进球详情(BT159 第X粒入球必需)===
goals: [
{
goalNumber: number, // 进球序号(1, 2, 3...)
team: 'home' | 'away', // 进球球队
minute: number, // 进球时间(分钟)
scorer: string // 进球球员(可选)
}
],
// === 角球统计(数据源角球玩法需要)===
corners: {
home: number, // 主队角球数
away: number, // 客队角球数
firstCorner: 'home' | 'away' | 'none', // 首个角球归属
halfTimeHome: number, // 半场主队角球
halfTimeAway: number // 半场客队角球
},
// === 红黄牌统计(数据源罚牌玩法需要)===
cards: {
homeYellow: number, // 主队黄牌
homeRed: number, // 主队红牌
awayYellow: number, // 客队黄牌
awayRed: number, // 客队红牌
firstCard: { // 首张牌信息
team: 'home' | 'away',
type: 'yellow' | 'red',
minute: number
} | null
},
// === 特殊事件标记 ===
specialEvents: {
ownGoals: number, // 乌龙球数
penalties: number, // 点球数(不含点球大战)
extraTime: boolean, // 是否进入加时
penaltyShootout: { // 点球大战(不计入进球)
home: number,
away: number
} | null,
matchAbandoned: boolean, // 是否腰斩
abandonedMinute: number // 腰斩时间点
}
}11.4 BT159 第X粒入球特殊处理
问题:第X粒入球需要知道每粒进球由哪队打入,而非简单的比分。
数据录入要求:
| 总进球数 | 需要录入的进球详情 |
|---|---|
| 0 | 无进球,所有选项退款 |
| 1 | 第1粒进球归属 |
| 2 | 第1、第2粒进球归属 |
| 3 | 第1、第2、第3粒进球归属 |
| N | 第1至第N粒进球归属 |
结算判定规则:
| 选项 | 判定逻辑 | 无该进球处理 |
|---|---|---|
| 首球主队 | goals[0].team === 'home' | 退款 |
| 首球客队 | goals[0].team === 'away' | 退款 |
| 首球无进球 | goals.length === 0 | 中奖 |
| 第2球主队 | goals[1].team === 'home' | 退款 |
| 第2球客队 | goals[1].team === 'away' | 退款 |
| 第2球无进球 | goals.length < 2 | 中奖(若提供该选项) |
UI录入方式:
进球详情录入(根据总进球数动态生成):
┌─────────────────────────────────────────────────────────────┐
│ 总进球: 3球 │
├─────────────────────────────────────────────────────────────┤
│ 第1球: [主队 ▼] 23' 进球球员: [ 拉什福德 ] │
│ 第2球: [主队 ▼] 56' 进球球员: [ 布鲁诺 ] │
│ 第3球: [客队 ▼] 78' 进球球员: [ 萨拉赫 ] │
└─────────────────────────────────────────────────────────────┘11.5 数据源玩法结算依据(串关关联)
当串关包含非本地17种玩法的数据源盘口时,需要额外数据:
| 数据源玩法类型 | 结算依据数据 | 是否支持自动计算 |
|---|---|---|
| 角球大小 | corners.home + corners.away | ✓ |
| 角球让球 | corners.home vs corners.away | ✓ |
| 首个角球 | corners.firstCorner | ✓ |
| 总牌数 | cards总和 | ✓ |
| 红牌大小 | cards.homeRed + cards.awayRed | ✓ |
| 首张牌 | cards.firstCard | ✓ |
| 首球时间 | goals[0].minute | ✓ |
| 最后进球 | goals[last].minute | ✓ |
| 点球判罚 | specialEvents.penalties | 需人工确认 |
| 乌龙球 | specialEvents.ownGoals | 需人工确认 |
11.6 完整数据录入UI设计
┌─────────────────────────────────────────────────────────────────────────────┐
│ 📊 赛果数据录入 [展开/收起] │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─── 基础比分(必填)───────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 全场比分: 主队 [ 2 ] - [ 1 ] 客队 总进球: 3 │ │
│ │ 半场比分: 主队 [ 1 ] - [ 0 ] 客队 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── 进球详情(BT159第X粒入球需要)─────────────────────────────────────┐ │
│ │ │ │
│ │ ☑ 启用进球详情录入 │ │
│ │ │ │
│ │ 进球序号 │ 进球球队 │ 时间 │ 球员(选填) │ │
│ │ ────────┼─────────┼──────┼───────────── │ │
│ │ 1 │ [主队▼] │ 23' │ [ 拉什福德 ] │ │
│ │ 2 │ [主队▼] │ 56' │ [ 布鲁诺 ] │ │
│ │ 3 │ [客队▼] │ 78' │ [ 萨拉赫 ] │ │
│ │ │ │
│ │ [+ 添加进球] [- 删除末行] │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── 扩展统计(数据源玩法需要)─────────────────────────────────────────┐ │
│ │ │ │
│ │ 角球统计: 主队 [ 6 ] 客队 [ 4 ] 首角球 [主队▼] │ │
│ │ 黄牌统计: 主队 [ 2 ] 客队 [ 3 ] │ │
│ │ 红牌统计: 主队 [ 0 ] 客队 [ 1 ] │ │
│ │ 首张牌: [客队▼] [黄牌▼] 32分钟 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── 特殊事件标记 ─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ☐ 含乌龙球 数量: [ 0 ] │ │
│ │ ☐ 含点球 数量: [ 0 ] │ │
│ │ ☐ 加时赛 │ │
│ │ ☐ 点球大战 主队: [ _ ] 客队: [ _ ] │ │
│ │ ☐ 赛事腰斩 腰斩时间: [ _ ]分钟 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ 数据来源: ○ 数据源同步 ● 人工录入 │
│ │
│ [ 重置 ] [ 保存数据 ] [ 根据数据自动计算结算结果 ] │
│ │
└─────────────────────────────────────────────────────────────────────────────┘11.7 自动计算与人工覆盖
自动计算规则:
- 录入基础比分后,系统自动计算所有17种本地玩法的结算结果
- 录入进球详情后,系统自动计算BT159第X粒入球的结算结果
- 录入扩展统计后,系统自动计算数据源玩法的结算结果
人工覆盖场景:
| 场景 | 处理方式 |
|---|---|
| 自动计算错误 | 允许人工覆盖,记录覆盖日志 |
| 特殊规则确认 | 人工判定后录入,标记为人工 |
| 争议情况 | 暂停结算,等待官方确认 |
11.8 数据完整性校验(写死)
| 校验项 | 规则 | 错误提示 |
|---|---|---|
| 比分非负 | home >= 0 && away >= 0 | "比分不能为负数" |
| 半场不超全场 | halfTime <= fullTime | "半场比分不能超过全场比分" |
| 进球数一致 | goals.length === totalGoals | "进球详情数量与总进球不一致" |
| 角球非负 | corners >= 0 | "角球数不能为负数" |
| 牌数非负 | cards >= 0 | "牌数不能为负数" |
| 必填项检查 | 基础比分必填 | "请填写全场比分" |
十二、验证清单
12.1 17种玩法结算验证
- [x] BT1 让球:比分录入 → 自动计算各盘口线结果
- [x] BT2 大小:总进球 → 自动计算各盘口线结果
- [x] BT3 独赢:比分录入 → 自动判定主胜/和/客胜
- [x] BT5 单双:总进球 → 自动判定单/双
- [x] BT6 波胆:精确比分 → 自动匹配中奖选项
- [x] BT7 总进球:总进球 → 自动匹配区间选项
- [x] BT8 双重机会:比分录入 → 自动判定结果
- [x] BT9 半全场:半场+全场比分 → 自动匹配组合
- [x] BT158 反波胆:精确比分 → 自动排除匹配项
- [x] BT159 第X粒入球:进球详情 → 自动匹配归属
- [x] BT160 主队大小:主队进球 → 自动计算各盘口线
- [x] BT161 客队大小:客队进球 → 自动计算各盘口线
12.2 边界情况验证
- [x] 0-0 比分:总进球=0,单双=双,波胆匹配0-0
- [x] 无进球场景:BT159所有选项退款
- [x] 半赢/半输:亚盘0.25线正确计算
- [x] 走水情况:整数盘口线正确处理
- [x] 数据源玩法:角球/红黄牌统计正确计算