Appearance
第十九章 异常与边界处理
关盘口径(2026-04-21 生效):关盘来源统一为数据源推送(唯一来源);关盘 = 绝对终态,操盘页与结算详情页均不提供人工开盘入口。
一期调整(2026-04-23 生效):第 19.3.3 节"已结算(赛事待结算)+ 赛果发生变化 → 按 11.7 自动重新计算并执行二次结算"一期不实装。已结算盘口赛果变化(无论赛事处于待结算还是终态),系统仅标记提示"⚠️ 结算比分已发生变化,请检查盘口赛果",由结算人员主动发起「盘口二次结算」处理;标记仅在执行完盘口二次结算后自动清除(不支持手动关闭)。正文规则保留作为二期设计参考。
19.1 页面级异常
| 场景 | 页面表现 | 提示文案 |
|---|---|---|
| 页面加载失败 | 全页错误 + 重试按钮 | 「加载失败,请重试」 |
| 数据源离线 | 顶部红色提示条 | 「数据源离线,部分数据暂未更新」 |
| 网络超时 | 全页错误 + 重试按钮 | 「请求超时,请检查网络连接」 |
19.2 结算操作异常
| 场景 | 行为 |
|---|---|
| 结算提交失败 | 盘口卡片展示错误提示 + 重试按钮 |
| 二次结算提交失败 | 弹窗保留 + 错误原因 |
| 该盘口所需赛果未到位 | 该盘口跳过结算,不阻塞其他盘口;赛果录入弹窗中未到位的字段允许留空,不强制校验、不报错 |
| 比分拉取中 / 拉取失败 | 赛果录入按钮灰置 + 提示等待同步(数据源异常边界,与盘口结算前置无关) |
| 赛果录入校验失败 | 弹窗内字段红色高亮 + 提示文案 |
| 赛事级确认失败 | 弹窗保留 + 错误原因 |
19.3 并发与竞态
19.3.1 并发控制策略(操作版本校验 + 500ms 请求去重窗口)
两层机制:
- 操作版本校验(版本号):冲突控制主机制,版本号不匹配直接拒绝(无时间窗口,先到先得)
- 请求去重窗口:500ms 内同一
操作标识只执行 1 次(防网络抖动 / 用户双击重复请求)
完整定义见第 15 章 15.6c。
| 场景 | 行为 |
|---|---|
| 两人同时结算同一盘口 | 版本号比对:先到的成功,后到的版本号不匹配 → 返回「该盘口已被他人操作,请刷新后重试」 |
| 两人同时操作同一赛事不同盘口 | 允许并行(不同盘口独立版本号) |
| 赛事级操作与盘口级操作并发 | 赛事级和盘口级各自版本号独立;有依赖关系时按前置校验拒绝(如"结算赛事"要求所有盘口已结算) |
| 同一用户网络抖动双发请求 | 500ms 内同一 操作标识 仅执行 1 次(防重复保护,避免重复扣款 / 重复派彩) |
| 结算人员结算时盘口被二次结算 | 提示「该盘口状态已变更,请刷新」 |
| 注单视图和详情页同时操作同一盘口 | 详情页优先。注单视图提示「该盘口正在详情页处理中」 |
| 数据源开关=开 且 IM 推送新比分时结算人员正在录入 | IM 推送的比分覆盖本地录入 |
| 数据源开关=关 | 不自动同步,保留本地录入 |
| IM 推送的比分有误 | 结算人员在详情页对相关盘口执行二次结算 → 重新录入正确比分 → 执行结算 |
19.3.2 系统一致性保障
| 机制 | 说明 |
|---|---|
| 操作版本号(操作版本校验) | 每次盘口 / 赛事状态变更递增版本号。提交时携带版本号,不匹配则拒绝并返回「数据已变更,请刷新」。无时间窗口,已执行的操作永久保护 |
| 请求去重窗口 | 500ms 内同一 操作标识 只执行 1 次(行业常见 100-500ms,取上限容纳典型网络抖动) |
| 状态前置校验 | 结算操作提交时校验盘口当前状态是否为「关盘」,非关盘状态拒绝 |
| 赛事级前置校验 | 二次结算 / 赛事异常处理等操作提交时校验赛事状态是否为「待结算」,不满足则拒绝 |
19.3.3 数据源恢复后赛果同步
| 盘口状态 | 数据源开关 | IM 推送新比分 | 处理 |
|---|---|---|---|
| 待结算 | 开 | 有变化 | 赛果自动填入覆盖本地录入,盘口预填结果刷新,结算人员确认后结算 |
| 待结算 | 关 | 任何 | 不自动同步,保留本地录入 |
| 已结算 | 开 | 赛果与当前一致 | 不触发任何动作 |
| 已结算(赛事待结算) | 开 | 赛果发生变化 | 按 11.7 自动重新计算并执行二次结算,按 15.4 差额矩阵处理派彩差额 |
| 已结算(赛事已结算/已取消/异常) | 开 | 赛果发生变化 | 不自动触发二次结算,仅在赛果录入弹窗提示"比分已更新,如需修正请先执行赛事驳回"。结算人员手动:1) 赛事驳回 → 2) 盘口二次结算 → 3) 重录赛果 → 4) 重新确认 |
| 已结算 | 关 | 任何 | 不自动同步;如需修正由结算人员手动执行盘口二次结算 |
| 本地锁定态 | 开 / 关 | 任何 | 一律不同步;数据源后续赛果仅作告警记录,由结算人员判断是否走盘口二次结算 |
前置条件:该赛事"数据源开关"的状态决定系统是否主动同步 IM 推送的比分数据。开关由赛事创建时配置,赛事进行中可通过操盘页调整。
19.4 数据校验边界
| 场景 | 行为 |
|---|---|
| 比分输入负数 | 字段红色 + 「比分不能为负数」 |
| 半场比分 > 全场比分 | 字段红色 + 「半场比分不能大于全场比分」 |
| 进球详情行数 ≠ 总进球 | 红色提示 + 「应用赛果」按钮禁用 |
| 盘口无注单 | 盘口卡片正常展示,可结算(派彩 = 0) |
19.5 赛事切换边界
| 场景 | 行为 |
|---|---|
| 切换赛事时有弹窗打开 | 弹窗关闭,切换到新赛事 |
| 从结算详情页返回结算列表 | 回到离开时的视图和筛选状态 |
19.6 延期/腰斩暂缓期间的盘口处理(行业通用做法)
赛事进入异常态(延期暂缓 / 腰斩暂缓)时,系统按以下规则处理盘口:
| 规则 | 说明 |
|---|---|
| 立即批量关盘 | 异常态触发时,系统立即关盘该赛事所有开盘中盘口,停止接受新投注 |
| 对应行业做法 | 对应数据源延期 / 腰斩时所有盘口立即关盘的行业通用做法 |
| 已有注单保持待结算 | 延期期间注单状态不变(仍为"待结算"),不退款、不结算 |
| 恢复后重开 | 赛事恢复(赛事驳回 → 待结算)后,等待数据源推送新的开盘信号自动恢复盘口开盘态 |
| 异常态下的结算操作屏蔽 | 异常态期间盘口二次结算 / 人工结算入口全部禁用,须先赛事驳回 |
19.7 数据源推送开盘后新旧注单混合场景
盘口经历"关盘 → 已结算 → 数据源推送开盘(自动回滚)→ 再次关盘 → 结算"路径时,详见第 15 章 15.6b。
| 规则 | 说明 |
|---|---|
| 注单独立判定 | 系统按注单的"下注时比分"字段逐笔独立判定,新旧注单互不干扰 |
| 结果可能不同 | 同一盘口下可能出现"旧注单判输 / 新注单判赢"等不同结果(符合业务预期,因下注时的基准分不同) |
| 派彩独立计算 | 新旧注单派彩独立计算,盘口卡片汇总展示时按注单维度分别统计 |