Skip to content
🚫 本页面不支持以下人工操作开盘 / 重新开盘 / 关盘 —— 统一由数据源推送触发(唯一来源)。关盘 = 绝对终态,无人工回退路径。
⚠️ 一期范围调整(2026-04-23) 已结算盘口赛果变化、VAR 改判等场景,一期不做自动重结算,系统仅在受影响的已结算盘口上标记提示"⚠️ 结算比分已发生变化,请检查盘口赛果",由结算人员主动发起「盘口二次结算」处理。正文相关章节规则保留作为二期设计参考。

结算系统逻辑完整梳理 v1.0(已归档)

⚠️ 已归档文档(2026-04-21):本文档为 2026-02 前的历史技术梳理版本,多处状态枚举、业务流程已与当前 PRD 口径不一致(如旧版盘口状态用"部分结算/取消"业务态、赛事状态缺"已取消"枚举、引用"强制结算"路径、延期超 24h 自动转取消等)。

不作为业务参照依据。以各章节正式 PRD 为准:

仅保留本文档供历史演进参考,新功能设计 / 开发 / 测试均以 PRD 正式章节为准。

一、核心概念层级定义

1.1 结算层级架构(四层)

赛事结算状态

盘口结算状态(17种玩法 + 数据源玩法)

盘口线结算状态(仅让球/大小类玩法)

选项结算结果(最终中奖判定)

1.2 各层级状态定义

层级状态枚举说明
赛事待结算、已结算、异常基于下属盘口状态自动计算
盘口待结算、已结算、部分结算、取消玩法维度
盘口线待结算、已结算、走水、取消仅MultiLineTable玩法
选项赢、输、赢半、输半、走水、取消、退款最终派彩依据

1.3 赛事结算状态判定规则(写死)

条件赛事状态
所有可操盘盘口均为「已结算」或「取消」已结算
存在任一盘口为「待结算」或「部分结算」待结算
存在任一盘口为「异常」状态异常

二、结算来源与流程

2.1 两种结算来源

来源触发方式结算权限审批流程
数据源结算(IM)IM下发赛果自动触发系统自动执行无需审批
自收结算(本地)结算人员手动录入赛果结算人员执行无需审批(风险自担)

2.2 数据源结算流程

IM下发赛果数据

系统解析赛果(比分、角球、红黄牌等)

系统自动计算各盘口线中奖结果

自动更新选项结算状态

记录结算日志(标记来源:数据源)

等待结算人员点击「结算赛事」确认

2.3 自收结算流程

赛事完赛

结算人员录入赛果数据(按盘口线维度)

系统自动计算该盘口线下所有选项结果

结算人员确认结算结果

更新盘口线及选项状态

记录结算日志(标记来源:人工 + 操作人)

所有盘口结算完成后,点击「结算赛事」

三、17种玩法结算规则详解

3.1 玩法分类与结算粒度

渲染器玩法结算粒度赛果录入维度
MultiLineTableBT1让球、BT2大小、BT160主队大小、BT161客队大小盘口线级按盘口线录入
SingleLineTableBT3独赢、BT5单双、BT8双重机会、BT159第X粒入球玩法级按玩法整体录入
MatrixBT6波胆、BT158反波胆、BT9半全场选项级按精确比分录入
LongListBT7总进球选项级按总进球数录入

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.53 > 2.5
2.52 < 2.5
3.03 = 3.0走水走水
2.252 < 2.25
2.253 > 2.25
2.753 = 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.homeBT1, BT3, BT6, BT8, BT9, BT158, BT160
fullTimeScore.awayBT1, BT3, BT6, BT8, BT9, BT158, BT161
fullTimeScore.home + awayBT2, BT5, BT7
halfTimeScore.homeBT9
halfTimeScore.awayBT9

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 自动计算与人工覆盖

自动计算规则

  1. 录入基础比分后,系统自动计算所有17种本地玩法的结算结果
  2. 录入进球详情后,系统自动计算BT159第X粒入球的结算结果
  3. 录入扩展统计后,系统自动计算数据源玩法的结算结果

人工覆盖场景

场景处理方式
自动计算错误允许人工覆盖,记录覆盖日志
特殊规则确认人工判定后录入,标记为人工
争议情况暂停结算,等待官方确认

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] 数据源玩法:角球/红黄牌统计正确计算

体育操盘系统产品文档