Appearance
第十四章 操作流程与权限
14.0 与其他章节的关系说明
| 维度 | 相关章节 | 本章职责 |
|---|---|---|
| 角色与权限定义 | 操盘列表第12章(单一真源) | 本章引用权限定义,不重复定义 |
| 赔率编辑交互 | 第7章赔率编辑与计算 | 本章定义操作流程的入口、步骤、权限校验 |
| 状态控制 | 第8章控制层级体系 | 本章定义状态操作的完整流程 |
| 弹窗交互 | 第13章弹窗与模态框 | 本章定义弹窗触发的流程上下文 |
| 审计日志 | 操盘列表第12章12.6节(单一真源) | 本章定义操盘页特有的日志记录规则 |
本章定位:定义操盘详情页内所有操作的完整流程(从触发到落库),权限规则引用操盘列表第12章。
14.1 权限规则引用
14.1.1 角色定义(引用操盘列表第12章12.1节)
操盘页使用与操盘列表相同的三种角色,定义详见操盘列表第12章12.1节。
| 角色 | 角色代码 | 操盘页职责概述 |
|---|---|---|
| 普通操盘手 | TRADER | 负责自己赛事的赔率调整、盘口隐藏/取消隐藏 |
| 主管 | SUPERVISOR | 可操作所有赛事,可执行锁盘/解锁 |
| 风控 | RISK_CONTROL | 最高权限,可执行一键锁盘 |
14.1.2 操盘页功能权限矩阵
与操盘列表第12章12.2.3节保持一致:盘口操作(隐藏/取消隐藏/锁盘/解锁)统一在操盘详情页进行。
赔率编辑权限:
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 编辑自己负责赛事的赔率 | ✅ | ✅ | ✅ | 双击单元格进入编辑 |
| 编辑他人负责赛事的赔率 | ❌ | ✅ | ✅ | 仅主管和风控可操作 |
| 批量调整赔率(同玩法内) | ✅ | ✅ | ✅ | 仅限自己负责的赛事 |
| 调整偏离IM超过告警阈值 | ⚠️ 需确认 | ⚠️ 需确认 | ✅ | 触发偏离确认弹窗 |
盘口状态操作权限(与操盘列表第12章12.2.3节一致):
| 功能 | 普通操盘手 | 主管 | 风控 | 操作层级 |
|---|---|---|---|---|
| 隐藏盘口(自己的) | ✅ | ✅ | ✅ | 玩法级/盘口线级/选项级 |
| 隐藏盘口(他人的) | ❌ | ✅ | ✅ | 玩法级/盘口线级/选项级 |
| 取消隐藏盘口(自己的) | ✅ | ✅ | ✅ | 玩法级/盘口线级/选项级 |
| 取消隐藏盘口(他人的) | ❌ | ✅ | ✅ | 玩法级/盘口线级/选项级 |
| 锁定盘口 | ❌ | ✅ | ✅ | 玩法级/盘口线级/选项级 |
| 解锁盘口 | ❌ | ✅ | ✅ | 玩法级/盘口线级/选项级 |
| 一键锁盘 | ❌ | ✅ | ✅ | 赛事级 |
数据源开关控制权限:
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 开启/关盘数据源开关(自己的) | ✅ | ✅ | ✅ | 赛事级/玩法级 |
| 开启/关盘数据源开关(他人的) | ❌ | ✅ | ✅ | 仅主管和风控 |
其他操作权限:
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 盘口线显示/隐藏 | ✅ | ✅ | ✅ | 仅限自己负责的赛事 |
| 查看操盘日志 | ✅ | ✅ | ✅ | 全部角色可查看 |
| 导出操盘日志 | ❌ | ✅ | ✅ | 与操盘列表第12章12.6.1节一致 |
14.1.2.1 权限变更生效时机(写死)
实时生效规则(默认值为实时生效,系统级写死,修改需发版):
| 规则项 | 规则内容 | 生效时机 | 验证方式 |
|---|---|---|---|
| 权限变更 | 权限变更后实时生效 | 立即 | 权限变更操作提交后,系统立即更新内存中的权限状态 |
| 已打开页面 | 已打开的操盘页无需刷新页面 | 下次操作时校验 | 用户在当前页面执行任何操作(如双击编辑赔率)时,系统重新校验当前权限,若权限已变更则拒绝操作或显示提示 |
| 权限校验位置 | 权限校验发生在操作执行时 | 实时 | 编辑赔率、锁盘/解锁等操作触发时,系统调用权限检查接口验证当前用户权限 |
| 降级保护 | 若用户权限被降级,已进行但未提交的编辑操作需要重新校验 | 提交时 | 用户编辑赔率后,若权限已变更,提交时校验失败,提示「权限已变更,请刷新页面重新操作」 |
示例流程:
时刻T1:操盘手张三有「赔率编辑」权限
└─> 打开操盘页面,中间栏显示所有赔率编辑入口可用
时刻T2:管理员修改张三权限为「仅查看」
└─> 系统立即更新权限,但不主动通知张三
时刻T3:张三继续在已打开的页面上操作(未刷新)
└─> 张三双击赔率单元格准备编辑
└─> 系统在提交编辑(按Enter)时校验权限
└─> 权限校验失败(当前权限=仅查看)
└─> 拒绝保存,提示「您的权限已被变更,无法编辑赔率,请刷新页面」
时刻T4:张三刷新页面
└─> 页面重新加载,赔率编辑入口全部禁用
└─> 张三现在只能查看,无法操作14.1.3 详情页访问权限(与操盘列表第12章12.2.5节一致)
| 场景 | 普通操盘手 | 主管 | 风控 | 页面状态 |
|---|---|---|---|---|
| 进入自己负责的赛事 | ✅ | ✅ | ✅ | 可操作 |
| 进入未分配的赛事 | ✅ | ✅ | ✅ | 只读模式 |
| 进入他人负责的赛事 | ❌ | ✅ | ✅ | 主管/风控可操作 |
只读模式说明:普通操盘手访问未分配赛事时,页面可见但所有操作按钮禁用,顶部显示「只读模式」标签。
「自己负责赛事」判定条件:
系统通过以下条件判定赛事是否为当前用户负责:
判定条件 技术实现 说明 当前登录用户ID = 赛事操盘手ID CurrentUserId == Event.TraderId赛事的 TraderId字段记录负责操盘手该判定适用于本章所有「自己负责」「他人负责」的权限区分场景。
14.2 赔率调整操作
14.2.1 操作入口
| 入口位置 | 操作方式 | 适用场景 |
|---|---|---|
| 盘口卡片赔率单元格 | 双击进入编辑态 | 单选项赔率调整 |
| 盘口卡片工具栏 | 点击「批量调整」按钮 | 同玩法内批量调整 |
| 快捷键 | F2(选中单元格时) | 快速进入编辑态 |
14.2.1A 状态前置条件校验(写死)
赔率编辑操作执行前,必须先校验当前层级的状态。若任何层级不满足条件,则禁用编辑入口并显示对应提示。规则如下:
| 检查层级 | 状态 | 允许编辑赔率 | 用户提示文案 |
|---|---|---|---|
| 赛事 | 开盘 | 是 | 无 |
| 赛事 | 隐藏 | 否 | 「赛事已隐藏,无法编辑赔率」 |
| 赛事 | 锁定 | 否 | 「赛事已锁定,无法编辑赔率」 |
| 赛事 | 关盘 | 否 | 「赛事已关盘,无法编辑赔率」 |
| 玩法 | 开盘 | 是 | 无 |
| 玩法 | 隐藏 | 否 | 「该玩法已隐藏,无法编辑赔率」 |
| 玩法 | 锁定 | 否 | 「该玩法已锁定,无法编辑赔率」 |
| 盘口线(仅MultiLineTable) | 开盘 | 是 | 无 |
| 盘口线(仅MultiLineTable) | 隐藏 | 否 | 「该盘口线已隐藏,无法编辑赔率」 |
| 盘口线(仅MultiLineTable) | 锁定 | 否 | 「该盘口线已锁定,无法编辑赔率」 |
| 选项 | 开盘 | 是 | 无 |
| 选项 | 隐藏 | 否 | 「该选项已隐藏,无法编辑赔率」 |
| 选项 | 锁定 | 否 | 「该选项已锁定,无法编辑赔率」 |
继承规则(写死):上层状态是下层上限。若赛事或玩法为隐藏/锁定/关盘,则其下所有子级赔率编辑入口自动禁用,无需逐级判断。
校验顺序:赛事 → 玩法 → 盘口线(若有) → 选项,任一层级不满足则拒绝,不继续向下检查。
实现表现:
| 状态不满足 | 界面表现 | 交互反馈 |
|---|---|---|
| 赛事或玩法层级 | 该玩法下所有赔率单元格禁用(灰显),不可双击 | 鼠标悬停显示Tooltip「该玩法已隐藏,无法编辑赔率」 |
| 盘口线或选项层级 | 该行/单元格禁用(灰显),不可双击 | 鼠标悬停显示Tooltip「该盘口线已隐藏,无法编辑赔率」 |
| 赔率单元格禁用时 | F2快捷键无效,点击不进入编辑态 | 显示提示Tooltip |
与第13章的衔接:本节状态前置校验在编辑入口处执行,防止用户进入编辑态。第13章的赔率调整校验弹窗(13.8)仅处理编辑完成后的赔率值域问题(RTP、HK范围、配对边界),不重复检查状态。
14.2.2 单选项赔率调整流程
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 双击赔率单元格 | 单元格进入编辑态,显示输入框,原值选中 |
| 2 | 输入新HK赔率值 | 实时显示配对计算结果(若为配对玩法) |
| 3 | 按Enter或点击外部 | 触发校验流程 |
| 4 | 校验通过 | 保存成功,单元格绿色闪烁0.5秒 |
| 4' | 校验失败 | 显示错误提示,保持编辑态 |
流程图:
┌─────────────────┐
│ 双击赔率单元格 │
└────────┬────────┘
│
▼
┌─────────────────┐ 否
│ 盘口状态=开盘? │────────→ 提示「盘口已隐藏/锁定,无法编辑」
└────────┬────────┘
│ 是
▼
┌─────────────────┐ 否
│ 有编辑权限? │────────→ 提示「无权限编辑此赛事」
└────────┬────────┘
│ 是
▼
┌─────────────────┐
│ 进入编辑态 │
│ 输入新赔率值 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 按Enter确认 │
└────────┬────────┘
│
▼
┌─────────────────────────────────┐
│ 【子流程A】赔率校验流程 │
└────────┬────────────────────────┘
│
┌────┴────┐
│ 校验结果 │
└────┬────┘
┌────┴────┐
通过 失败
│ │
▼ ▼
┌─────────┐ ┌─────────────────┐
│ 保存成功 │ │ 显示错误,保持编辑态 │
│ 绿色闪烁 │ └─────────────────┘
└─────────┘14.2.2A IM推送与本地编辑冲突仲裁规则(写死)
定义:操盘手正在编辑某选项赔率时,IM推送了同一选项的新赔率,系统需要仲裁哪个值应该生效。
仲裁规则(三种场景,优先级递减):
| 场景 | 触发条件 | 系统行为 | 用户表现 |
|---|---|---|---|
| 场景1:编辑框聚焦中 | 用户已双击进入编辑态,输入框获得焦点 | IM推送不覆盖编辑框内容;系统在编辑框下方实时显示「IM最新值:X.XX」供参考 | 用户可继续编辑,不被打断;灰显的参考值帮助用户决策 |
| 场景2:编辑框已提交 | 用户按Enter或点击外部,编辑已提交 | 以操盘手提交值为准落库,不被IM后续推送覆盖 | 单元格绿色闪烁后返回展示态,显示用户提交值 |
| 场景3:编辑框失焦且未修改 | 用户双击进入编辑态后,鼠标点击编辑框外,且输入值=原值 | IM推送正常覆盖当前显示值 | 编辑框失焦,显示更新后的最新值 |
超时规则(写死):
| 规则项 | 规则内容 | 默认值 | 归属 |
|---|---|---|---|
| 编辑框超时 | 编辑框聚焦超过N秒未提交,系统弹出提示 | 60秒(默认值为60秒) | 系统级写死,修改需发版 |
| 超时弹窗 | 弹窗文案:"赔率已更新,是否继续编辑?",提示用户当前值与IM最新值的对比,用户可选择「放弃编辑」或「继续编辑」 | 60秒时触发 | 系统级写死,修改需发版 |
冲突仲裁流程图:
┌─────────────────┐
│ 用户双击编辑赔率 │
└────────┬────────┘
│
▼
┌──────────────────────────┐
│ 编辑框获焦,进入编辑态 │
└────────┬─────────────────┘
│
┌────┴──────────┐
│ │
▼ ▼
┌─────────────┐ ┌────────────────┐
│ IM推送新值? │ │ 用户继续输入? │
└─┬────────┬─┘ └────────┬───────┘
│ 是 否 │ │
▼ │ ▼
┌──────┐ │ ┌────────────────────────┐
│显示参│ │ │ 超过60秒未提交? │
│考值 │ │ └────────┬────────┬──────┘
└──────┘ │ │ 是 否 │
│ │ ▼ │
│ ▼ ┌──────────────┐ │
│ ┌──┴──────────────┐ │
│ │ 继续编辑/提交? │ │
│ └──┬───────────┬──┘ │
│ │ 是 否 │ │
│ ▼ ▼ │
│ ┌───────┐ ┌──────┐ │
│ │保存成 │ │放弃修│ │
│ │功 │ │改 │ │
│ └───────┘ └──────┘ │
│ │
└───────────┬───────────┘
▼
┌──────────────┐
│ 显示最终结果 │
└──────────────┘
超时弹窗:【赔率已更新】
标题:赔率已更新,是否继续编辑?
消息:当前编辑框中的值与IM最新值不一致
展示对比:您编辑的值:X.XX | IM最新值:Y.YY
按钮:【放弃编辑】【继续编辑】14.2.3 赔率校验流程(子流程A)
校验按顺序执行,任一步骤失败则中断后续校验。
| 顺序 | 校验项 | 规则 | 校验类型 | 失败提示 |
|---|---|---|---|---|
| 1 | 数值格式 | 必须为正数,最多2位小数 | 硬拦截 | 请输入有效的赔率值 |
| 2 | 最小赔率 | 大于等于 0.01(默认值为 0.01,系统写死) | 硬拦截 | 赔率不能低于0.01 |
| 3 | 最大赔率 | 小于等于 50.00(默认值为 50.00,系统写死) | 硬拦截 | 赔率不能超过50.00 |
| 4 | 单次调幅 | 绝对值不超过 0.20(默认值为 0.20,系统写死) | 硬拦截 | 单次调幅超出限制0.20 |
| 5 | RTP下限 | 大于等于 85%(默认值为 85%,系统写死) | 硬拦截 | RTP低于下限85% |
| 6 | RTP上限 | 小于等于 99%(默认值为 99%,系统写死) | 硬拦截 | RTP超过上限99% |
| 7 | 偏离IM | 绝对值超过 0.10(默认值为 0.10,风控管理配置) | 软确认 | 弹出偏离确认弹窗 |
硬拦截 vs 软确认:
| 校验类型 | 含义 | 用户体验 |
|---|---|---|
| 硬拦截 | 不允许保存,必须修改 | 显示红色错误提示,保持编辑态 |
| 软确认 | 允许保存但需确认 | 弹出确认弹窗,确认后保存 |
14.2.4 偏离确认弹窗
弹窗标题:⚠️ 赔率偏离确认
┌────────────────────────────────────────┐
│ ⚠️ 赔率偏离确认 ✕ │
├────────────────────────────────────────┤
│ │
│ 当前调整的赔率与IM数据源偏离较大: │
│ │
│ ┌──────────────────────────────────┐ │
│ │ 选项:主胜 │ │
│ │ IM赔率:0.85 │ │
│ │ 目标赔率:0.72 │ │
│ │ 偏离值:-0.13(超出阈值0.10) │ │
│ └──────────────────────────────────┘ │
│ │
│ 确认要保存此赔率吗? │
│ │
├────────────────────────────────────────┤
│ [ 取消 ] [ 确认保存 ] │
└────────────────────────────────────────┘| 字段 | 类型 | 说明 |
|---|---|---|
| 选项 | 展示 | 被编辑的投注项名称 |
| IM赔率 | 展示 | 当前IM数据源的HK赔率 |
| 目标赔率 | 展示 | 用户输入的目标HK赔率 |
| 偏离值 | 展示 | 目标赔率减IM赔率,红色显示 |
14.2.5 赔率调整失败处理
| 失败原因 | 系统提示 | 处理方式 |
|---|---|---|
| 数值格式错误 | 请输入有效的赔率值 | 保持编辑态 |
| 超出赔率范围 | 赔率不能低于0.01/超过50.00 | 保持编辑态 |
| 超出单次调幅 | 单次调幅超出限制0.20 | 保持编辑态 |
| RTP越界 | RTP低于下限85%/超过上限99% | 保持编辑态 |
| 盘口状态变更 | 盘口已隐藏/锁定,无法保存 | 退出编辑态,刷新数据 |
| 并发冲突 | 赔率已被其他用户修改 | 弹出冲突处理弹窗 |
| 网络异常 | 网络异常,请重试 | 保持编辑态,允许重试 |
14.2.6 配对玩法赔率调整
配对玩法(让球盘、大小球)调整一方赔率时,系统自动计算配对方赔率以维持RTP。
自动配对计算规则(引用第7章7.3节):
| 步骤 | 计算内容 |
|---|---|
| 1 | 确定目标RTP:使用当前盘口的RTP作为目标RTP |
| 2 | 计算调整后的隐含概率:P_edited 等于 1 ÷ D_edited |
| 3 | 计算配对方新隐含概率:P_pair_new 等于 S_target 减 P_edited |
| 4 | 计算配对方新赔率:D_pair_new 等于 1 ÷ P_pair_new |
交互反馈:
| 状态 | 显示内容 |
|---|---|
| 编辑中 | 配对方单元格显示灰色预览值,带虚线边框 |
| 保存成功 | 两个单元格同时绿色闪烁0.5秒 |
| 保存失败 | 仅编辑方显示错误,配对方恢复原值 |
14.2.7 批量编辑限制(写死)
| 限制项 | 默认值 | 归属模块 | 说明 |
|---|---|---|---|
| 单次批量编辑最大选项数 | 同一玩法内所有选项(系统级写死,修改需发版) | 系统级 | 无上限,允许在同玩法内同时编辑所有选项的赔率 |
| 单次批量状态变更最大范围 | 同一玩法内所有盘口线/选项(系统级写死,修改需发版) | 系统级 | 无上限,允许在同玩法内同时变更所有盘口线或选项的状态 |
| 跨玩法批量 | 禁止(操盘页仅支持本场内同玩法批量) | 宪法§9.1 | 操盘页不支持跨玩法选择,仅在同玩法内批量;跨玩法批量仅在操盘列表页支持 |
| 跨赛事批量 | 禁止(操盘页不支持) | 宪法§9.1 | 操盘页聚焦单场操盘,不支持跨赛事操作;跨赛事批量仅在操盘列表页支持 |
批量操作作用范围:
| 操作类型 | 作用范围 | 示例 |
|---|---|---|
| 批量赔率调整 | 同玩法内多个选项/盘口线 | 在「全场让球」玩法内同时调整 -0.5、-0.75、-1.0 三条线的所有选项赔率 |
| 批量状态变更 | 同玩法内多个选项/盘口线 | 在「全场让球」玩法内同时隐藏所有副线;或同时锁定所有选项 |
| 权限约束 | 仅限自己负责的赛事 | 普通操盘手仅能对自己负责的赛事进行批量操作;主管和风控可操作所有赛事 |
14.3 盘口状态操作
14.3.1 操作入口
| 操作层级 | 入口位置 | 操作方式 |
|---|---|---|
| 玩法级 | 盘口卡片顶部状态按钮组 | 点击「隐藏」「取消隐藏」「锁定」「解锁」按钮 |
| 盘口线级 | 盘口线行首的状态图标 | 点击图标切换状态 |
| 选项级 | 选项单元格内的状态图标 | 点击图标切换状态 |
14.3.2 隐藏操作流程
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 点击「隐藏」按钮 | 弹出隐藏确认弹窗 |
| 2 | 选择隐藏范围(若玩法级) | 显示影响的盘口线/选项数量 |
| 3 | 点击「确认隐藏」 | 执行隐藏,关闭弹窗 |
| 4 | - | 状态按钮变为「取消隐藏」,受影响区域变为橙色背景 |
隐藏确认弹窗(玩法级):
┌────────────────────────────────────────┐
│ ⏸️ 确认隐藏盘口 ✕ │
├────────────────────────────────────────┤
│ 玩法:让球盘 │
│ 影响范围: │
│ • 盘口线:5 条 │
│ • 投注项:10 个 │
│ │
│ 隐藏后该玩法下所有盘口将停止接受投注 │
├────────────────────────────────────────┤
│ [ 取消 ] [ 确认隐藏 ] │
└────────────────────────────────────────┘14.3.3 取消隐藏操作流程
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 点击「取消隐藏」按钮 | 检查上级状态和数据源状态 |
| 2 | 条件满足 | 直接取消隐藏,无需弹窗确认 |
| 2' | 条件不满足 | 显示阻止提示 |
取消隐藏操作的前置条件:
| 条件 | 不满足时的提示 |
|---|---|
| 上级未隐藏/锁定 | 「上级玩法/盘口线已隐藏,请先取消隐藏上级」 |
| 数据源未关盘 | 「数据源已关盘,无法取消隐藏」 |
| 赛事未延期 | 「赛事延期中,盘口无法取消隐藏」 |
14.3.4 锁定操作流程
权限要求:仅主管和风控可执行(与操盘列表第12章12.2.3节一致)
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 点击「锁定」按钮 | 弹出锁定确认弹窗(高危操作) |
| 2 | 点击「确认锁定」 | 执行锁定,关闭弹窗 |
| 3 | - | 状态按钮变为「解锁」,受影响区域变为红色背景 |
锁定确认弹窗:与操盘页锁定弹窗一致,保持状态同步
┌────────────────────────────────────────┐
│ 🔒 确认锁定盘口 ✕ │
├────────────────────────────────────────┤
│ ⚠️ 锁定是高危操作,锁定后: │
│ • 该盘口将停止接受投注 │
│ • 数据源状态变更不会自动解锁 │
│ • 必须由主管或风控手动解锁 │
├────────────────────────────────────────┤
│ [ 取消 ] [ 确认锁定 ] │
└────────────────────────────────────────┘14.3.5 解锁操作流程
权限要求:仅主管和风控可执行(与操盘列表第12章12.2.3节一致)
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 点击「解锁」按钮 | 检查数据源状态和跟随配置 |
| 2 | 根据条件显示不同结果 | 见下表 |
解锁后盘口状态规则(与操盘列表第11章11.3.1节一致):
| 数据源状态 | 联赛跟随配置 | 解锁后盘口状态 | 说明 |
|---|---|---|---|
| 开盘 | 是/否 | 开盘 | 正常恢复 |
| 暂停 | 是 | 隐藏 | Toast「解锁成功,数据源暂停中」 |
| 暂停 | 否 | 弹出选择对话框 | 操盘手选择「开盘」或「隐藏」 |
| 维护 | 是/否 | 隐藏 | 维护状态强制隐藏 |
| 关盘 | 是/否 | 阻止解锁 | Toast「数据源已关盘,无法解锁」 |
不跟随配置下的解锁选择对话框(与操盘列表第11章11.3.1节一致):
┌────────────────────────────────────────┐
│ 🔓 解锁后盘口状态选择 ✕ │
├────────────────────────────────────────┤
│ 当前数据源状态:暂停 │
│ 联赛跟随配置:否 │
│ │
│ 请选择解锁后的盘口状态: │
│ ○ 开盘(接受投注,告警列显示 │
│ 「数据源暂停」) │
│ ○ 隐藏(等待数据源恢复后再开盘) │
│ │
├────────────────────────────────────────┤
│ [ 取消 ] [ 确认解锁 ] │
└────────────────────────────────────────┘14.3.6 一键锁盘操作(赛事级)
权限要求:仅风控可执行(与权限矩阵 14.1.2 节一致)
一期定位:一键锁盘作为一期功能,仅支持【单赛事内】的快速锁定操作,不支持跨赛事批量锁盘。
操作特性说明:
| 维度 | 详情 |
|---|---|
| 作用对象 | 仅当前操盘中的【单赛事】,不支持跨赛事选择 |
| 生效范围 | 该赛事下所有玩法/盘口线/选项进入不可投注状态(受上级上限约束) |
| 解锁策略 | 不提供自动解锁;必须人工解锁(由主管或风控执行) |
| 审计字段 | 操作者、触发入口(一键锁盘)、影响范围统计 |
一键锁盘流程:
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 点击顶部栏「一键锁盘」按钮 | 弹出确认弹窗(包含影响范围提示) |
| 2 | 点击「确认一键锁盘」 | 执行赛事级锁定 |
| 3 | - | 所有玩法变为红色锁定态,显示Toast「赛事已锁定」 |
14.3.7 盘口状态操作失败处理
| 失败原因 | 系统提示 | 处理方式 |
|---|---|---|
| 权限不足 | 锁盘/解锁操作仅限主管和风控执行 | 阻止操作 |
| 非负责赛事 | 该赛事由{操盘手姓名}负责,您无权操作 | 阻止操作 |
| 上级已隐藏/锁定 | 上级玩法/盘口线已隐藏,请先取消隐藏上级 | 阻止恢复操作 |
| 数据源已关盘 | 数据源已关盘,无法取消隐藏/解锁 | 阻止操作 |
| 赛事延期中 | 赛事延期中,盘口无法取消隐藏 | 阻止恢复操作 |
| 并发冲突 | 该盘口状态已被其他用户修改 | 刷新页面 |
14.4 本场内批量操作
14.4.1 批量操作范围边界
| 场景 | 是否允许 | 说明 |
|---|---|---|
| 同玩法内批量调整赔率 | ✅ | 选中多个选项后统一调整 |
| 同盘口线内批量隐藏 | ✅ | 隐藏整条盘口线 |
| 同玩法内批量锁定 | ✅ | 锁定整个玩法 |
| 跨玩法批量操作 | ❌ | 不支持 |
| 跨赛事批量操作 | ❌ | 操盘页不支持,需在操盘列表执行 |
14.4.2 批量赔率调整操作入口
| 入口位置 | 操作方式 | 适用场景 |
|---|---|---|
| 盘口卡片工具栏 | 点击「批量调整」按钮 | 同玩法内批量调整 |
| 快捷键 | Ctrl+Shift+E | 快速进入批量模式 |
14.4.3 批量赔率调整流程
| 步骤 | 用户操作 | 系统响应 |
|---|---|---|
| 1 | 点击「批量调整」按钮 | 进入批量选择模式,显示复选框 |
| 2 | 勾选目标选项 | 选中项高亮,底部显示已选数量 |
| 3 | 选择调整模式并输入值 | 实时预览各选项调整后赔率 |
| 4 | 点击「应用」 | 对所有选中项执行校验 |
| 5 | 全部通过 | 批量保存成功,显示成功数量 |
| 5' | 部分失败 | 显示失败项及原因,成功项已保存 |
批量调整模式:
| 模式 | 说明 | 示例 |
|---|---|---|
| 偏移量 | 所有选中项统一加减 | 输入+0.05,所有选中项赔率加0.05 |
| 目标值 | 所有选中项统一设为目标值 | 输入0.90,所有选中项赔率设为0.90 |
14.4.4 批量操作失败详情
当批量操作存在部分失败时,弹出失败详情弹窗(与操盘列表第14章14.9节结构一致)。
弹窗结构:
| 元素 | 内容 |
|---|---|
| 标题 | 批量操作结果 |
| 汇总信息 | 成功 X 项,失败 Y 项 |
| 失败列表 | 表格形式展示(选项名称、原赔率、目标赔率、失败原因) |
| 按钮 | 「关盘」 |
失败原因与建议操作映射:
| 失败原因 | 建议操作 |
|---|---|
| 超出赔率范围 | 调整目标值在0.01-50.00范围内 |
| 超出单次调幅 | 分次调整,每次不超过0.20 |
| RTP越界 | 调整目标值使RTP在85%-99%范围内 |
| 盘口已隐藏/锁定 | 先取消隐藏/解锁盘口 |
| 并发冲突 | 刷新后重试 |
14.5 权限校验流程
14.5.1 前端权限校验
进入操盘页时,前端根据当前用户角色和赛事归属决定UI元素的可用性。
UI元素权限控制(与操盘列表第12章12.4.1节一致):
| 场景 | 处理方式 | 视觉表现 |
|---|---|---|
| 无编辑权限 | 赔率单元格不可点击 | 无hover样式,cursor: default |
| 无状态操作权限 | 状态按钮禁用 | 灰色50%透明度,cursor: not-allowed |
| 无锁盘权限 | 锁定/解锁按钮隐藏 | 按钮不显示 |
| Hover禁用按钮 | 显示Tooltip提示原因 | 「您无权限执行此操作」 |
| 只读模式 | 所有操作按钮禁用 | 顶部显示「只读模式」标签 |
14.5.2 后端权限校验
所有操作请求在后端再次校验权限(与操盘列表第12章12.4.2节一致)。
后端校验规则:
| 校验项 | 校验逻辑 | 失败响应 |
|---|---|---|
| Token有效性 | JWT Token未过期 | 401 Unauthorized,跳转登录 |
| 角色权限 | 角色有对应操作权限 | 403 Forbidden |
| 数据权限 | 赛事归属当前用户或为主管/风控 | 403 Forbidden |
| 操作前置条件 | 盘口状态允许当前操作 | 400 Bad Request |
权限校验流程:
14.5.3 权限提示文案(与操盘列表第12章12.4.3节一致)
| 场景 | 提示文案 |
|---|---|
| 编辑他人赛事赔率 | 该赛事由{操盘手姓名}负责,您无权操作 |
| 执行锁盘/解锁 | 锁盘/解锁操作仅限主管和风控执行 |
| 操作未分配赛事 | 该赛事尚未分配操盘手,当前为只读模式 |
| 操作隐藏/锁定状态的盘口 | 盘口已隐藏/锁定,无法编辑赔率 |
14.6 审计日志记录规则
14.6.1 需记录日志的操作类型
日志字段定义引用操盘列表第12章12.6.2节,本节仅定义操盘页特有的操作类型。
14.6.1.1 赔率调整审计流程
赔率调整从提交到落库的完整审计链路如下:
审计字段记录(赔率调整):
| 字段 | 来源 | 说明 |
|---|---|---|
| 操作人ID | 当前登录用户 | 谁执行的调整 |
| 操作人姓名 | 用户信息 | 便于审阅 |
| 赛事ID | 当前赛事 | 哪场赛事 |
| 赛事名称 | 赛事信息 | 便于审阅 |
| 玩法ID | 盘口信息 | 哪个玩法 |
| 玩法名称 | 盘口信息 | 便于审阅 |
| 选项ID | 盘口信息 | 哪个选项 |
| 选项名称 | 盘口信息 | 便于审阅 |
| 调整前HK赔率 | 内存/数据库 | 原值(3位小数落库值) |
| 调整后HK赔率 | 用户输入 | 新值(3位小数落库值) |
| 调整时间戳 | 系统时间 | 精确到秒 |
| 是否超偏离告警 | 校验结果 | 是否触发偏离确认 |
| 操作类型 | 日志类型代码 | 风险等级 | 说明 |
|---|---|---|---|
| 赔率调整 | odds_adjust | 中 | 手动或批量调整赔率 |
| 玩法级状态变更 | market_status_change | 中 | 隐藏/取消隐藏/锁定/解锁整个玩法 |
| 盘口线级状态变更 | line_status_change | 低 | 隐藏/取消隐藏/锁定/解锁单条盘口线 |
| 选项级状态变更 | option_status_change | 低 | 隐藏/取消隐藏/锁定/解锁单个选项 |
| 数据源开关变更 | data_source_toggle | 低 | 数据源开关开启/关盘 |
| 盘口线显示设置 | line_visibility | 低 | 显示/隐藏盘口线 |
14.6.2 赔率调整日志字段
| 字段 | 数据类型 | 说明 | 示例 |
|---|---|---|---|
| 日志编号 | 字符串 | 唯一标识 | LOG-20260122-001 |
| 操作时间 | 时间戳 | 精确到毫秒 | 2026-01-22 14:30:25.123 |
| 操作人编号 | 字符串 | 操作人用户编号 | USR-001 |
| 操作人姓名 | 字符串 | 操作人姓名 | 张三 |
| 操作人角色 | 枚举 | TRADER/SUPERVISOR/RISK_CONTROL | TRADER |
| 操作类型 | 枚举 | odds_adjust | odds_adjust |
| 赛事ID | 字符串 | 关联赛事 | 48291037 |
| 盘口ID | 字符串 | BetTypeMarketId | MKT-4829-1-001 |
| 选项ID | 字符串 | SelectionId | OPT-1-001-H |
| 原赔率 | 数值 | 调整前HK赔率(3位小数) | 0.900 |
| 新赔率 | 数值 | 调整后HK赔率(3位小数) | 0.920 |
| 调整幅度 | 数值 | 差值 | +0.020 |
| 偏离确认 | 布尔 | 是否触发偏离确认 | true |
| 操作来源 | 枚举 | manual/batch/ao | manual |
| 操作结果 | 枚举 | SUCCESS/FAILED | SUCCESS |
| IP地址 | 字符串 | 操作来源IP | 192.168.1.100 |
14.6.2.1 安全审计字段补充(写死)
赔率调整日志的安全审计字段必须记录以下内容:
| 字段 | 数据类型 | 说明 | 示例 |
|---|---|---|---|
| User-Agent | 字符串 | 浏览器及设备信息 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...Chrome/120.0 |
| 会话ID | 字符串 | Session ID,用于追踪同一用户会话 | sess_USR001_20260122_143025_abc123 |
| 操作来源平台 | 枚举 | 操作发起于Web界面或第三方API | Web / API |
这三个字段与IP地址字段一起构成完整的安全审计链,用于事后溯源和审计。
14.6.3 状态变更日志字段
| 字段 | 数据类型 | 说明 | 示例 |
|---|---|---|---|
| 日志编号 | 字符串 | 唯一标识 | LOG-20260122-002 |
| 操作时间 | 时间戳 | 精确到毫秒 | 2026-01-22 14:30:25.456 |
| 操作人编号 | 字符串 | 操作人用户编号 | USR-001 |
| 操作人姓名 | 字符串 | 操作人姓名 | 张三 |
| 操作人角色 | 枚举 | TRADER/SUPERVISOR/RISK_CONTROL | TRADER |
| 操作类型 | 枚举 | market_pause/market_open/market_lock/market_unlock | market_pause |
| 赛事ID | 字符串 | 关联赛事 | 48291037 |
| 操作层级 | 枚举 | market/line/option | market |
| 对象ID | 字符串 | 被操作对象的ID | MKT-4829-1-001 |
| 原状态 | 枚举 | 操作前状态(开盘/隐藏/锁定/关盘) | 开盘 |
| 新状态 | 枚举 | 操作后状态(开盘/隐藏/锁定/关盘) | 隐藏 |
| 操作原因 | 字符串 | 锁定时必填 | 单边比例超80% |
| 操作来源 | 枚举 | manual/ao/risk_control/data_source/system/inherit | manual |
| 操作结果 | 枚举 | SUCCESS/FAILED/REJECTED | SUCCESS |
| IP地址 | 字符串 | 操作来源IP | 192.168.1.100 |
14.6.3.1 状态变更日志安全审计字段补充(写死)
状态变更日志同样必须记录以下安全审计字段(与赔率调整日志字段保持一致):
| 字段 | 数据类型 | 说明 | 示例 |
|---|---|---|---|
| User-Agent | 字符串 | 浏览器及设备信息 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...Chrome/120.0 |
| 会话ID | 字符串 | Session ID,用于追踪同一用户会话 | sess_USR001_20260122_143025_abc123 |
| 操作来源平台 | 枚举 | 操作发起于Web界面或第三方API | Web / API |
14.6.4 批量操作日志规则
批量操作记录一条汇总日志和N条明细日志。
汇总日志字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| batch_id | 批量操作唯一标识 | batch_20260122143025_001 |
| 操作类型 | batch_odds_adjust / batch_hide 等 | batch_odds_adjust |
| 选中数量 | 本次选中的选项数量 | 10 |
| 成功数量 | 执行成功的数量 | 8 |
| 失败数量 | 执行失败的数量 | 2 |
明细日志:每个被操作的选项单独记录一条日志,关联汇总日志的batch_id。
14.6.5 日志保留与查询(与操盘列表第12章12.6.1节一致)
| 配置项 | 值 | 说明 |
|---|---|---|
| 保留时间 | 180天 | 超过180天自动归档 |
| 查询入口 | 操盘页顶部栏「操盘日志」按钮、盘口卡片📋图标 | 自动携带当前赛事/盘口筛选 |
| 查询权限 | 全部角色 | 普通操盘手可查看自己负责赛事的日志 |
| 导出权限 | 仅主管/风控 | 普通操盘手无导出权限 |
14.7 操作时序与并发控制
14.7.1 乐观锁机制(与操盘列表第14章14.4节一致)
赔率调整采用乐观锁机制防止并发冲突。
实现方式:
| 字段 | 说明 |
|---|---|
| version | 每次更新递增的版本号 |
| updated_at | 最后更新时间戳 |
并发冲突检测流程:
┌─────────────────┐
│ 提交赔率调整 │
└────────┬────────┘
│
▼
┌─────────────────────────┐ 否
│ 提交的version = 当前version?│────────→ 返回冲突错误
└────────┬────────────────┘
│ 是
▼
┌─────────────────┐
│ 更新赔率,version+1 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 返回成功 │
└─────────────────┘14.7.2 并发冲突处理弹窗
┌────────────────────────────────────────┐
│ ⚠️ 数据已被其他用户修改 │
├────────────────────────────────────────┤
│ │
│ 您编辑的赔率已被其他操盘手修改: │
│ │
│ 您的输入值:0.92 │
│ 当前最新值:0.88(由李四于14:30更新) │
│ │
│ 请选择处理方式: │
│ │
├────────────────────────────────────────┤
│ [ 放弃修改 ] [ 强制覆盖 ] │
└────────────────────────────────────────┘| 按钮 | 行为 |
|---|---|
| 放弃修改 | 退出编辑态,刷新显示最新值 |
| 强制覆盖 | 使用用户输入值覆盖最新值(需权限) |
14.7.3 操作时序约束
| 约束 | 规则 | 说明 |
|---|---|---|
| 状态前置 | 编辑赔率前盘口必须为「开盘」状态 | 隐藏/锁定状态下不可编辑 |
| 层级继承 | 上级隐藏时下级不可单独取消隐藏 | 玩法隐藏时,不可单独取消隐藏某个选项 |
| 数据源互斥 | 数据源开启时手动调整会自动关闭数据源跟随 | 手动覆盖优先 |
14.7.4 并发操作优先级(与操盘列表第14章14.8.6节一致)
| 优先级 | 操作类型 | 说明 |
|---|---|---|
| 1(最高) | 下架 | 涉及客户端可见性,影响最大 |
| 2 | 锁盘 | 主动风控行为,优先保障 |
| 3 | 解锁 | 需确认数据源状态后执行 |
| 4(最低) | 隐藏/取消隐藏 | 临时状态变更 |
修订记录
| 版本 | 日期 | 修订内容 |
|---|---|---|
| v1.0 | 2026-01-22 | 初稿 |
| v1.1 | 2026-01-22 | 【颗粒度对齐】1) 权限定义改为引用操盘列表第12章,不重复定义;2) 盘口状态术语统一为「开盘/暂停/锁定/关盘」;3) 补充只读模式说明;4) 审计日志导出权限与第12章12.6.1节对齐;5) 每个操作补充入口、弹窗、流程、失败处理(与第11章颗粒度一致) |
| v1.2 | 2026-01-28 | 【P2修复】14.1.3节增加「自己负责赛事」判定条件定义(CurrentUserId == Event.TraderId) |
| v1.3 | 2026-01-29 | 【术语一致性】本地控制操作术语统一:「暂停盘口」→「隐藏盘口」、「恢复盘口」→「取消隐藏盘口」;权限矩阵、操作流程(14.3.2/14.3.3)、弹窗文案、并发操作优先级表同步更新;与宪法v1.6及第8章保持一致 |