diff --git a/saiadmin-artd/package.json b/saiadmin-artd/package.json index 97947bd..80e0207 100644 --- a/saiadmin-artd/package.json +++ b/saiadmin-artd/package.json @@ -8,7 +8,8 @@ }, "scripts": { "dev": "vite --open", - "build": "vue-tsc --noEmit && vite build", + "sync:flowcharts": "node scripts/sync-dice-flowcharts.mjs", + "build": "node scripts/sync-dice-flowcharts.mjs && vue-tsc --noEmit && vite build", "serve": "vite preview", "lint": "eslint", "fix": "eslint --fix", diff --git a/saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.html b/saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.html new file mode 100644 index 0000000..3d80a8d --- /dev/null +++ b/saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.html @@ -0,0 +1,192 @@ + + + + + + 为何最终抽到该奖励 + + + + +
+

为何最终抽到的是这个奖励

+

业务说明:一局抽奖从开局到到账的决策顺序(仅用本项目菜单与业务用语)

+
+ +

复制方式:展开下方「Mermaid 源码」全选复制,粘贴到 ProcessOn / draw.io / 飞书文档等支持 Mermaid 的流程图工具;或直接用浏览器打开本页看图。

+ +
+
+flowchart TD
+  Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
+  Dir --> Ante[选择底注倍数]
+  Ante --> Type{本局是否使用免费抽奖券?}
+
+  Type -->|是| Free[免费局]
+  Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
+
+  Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
+  Paid --> KillCheck{彩金池已开启杀分
且彩金池累计盈利 ≥ 安全线?} + KillCheck -->|是| PoolKill + KillCheck -->|否| PlayerW[按该玩家在「玩家管理」
配置的 T1~T5 档位概率抽签] + + PoolKill --> DrawTier[随机抽出档位 T1~T5] + PlayerW --> DrawTier + + DrawTier --> PickRow[在「色子奖励权重」中
取该档位 + 本局方向的所有行
按行权重随机一条] + PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位] + + Got --> KillMode{本局是否走杀分档位概率?} + KillMode -->|是| NoLeo[不发放豹子大奖
且不会抽到仅能豹子的点数 5、30] + KillMode -->|否| NormalPath[按普通规则继续] + NoLeo --> DiceShow[生成五颗骰子并结算] + + NormalPath --> Leopard{色子点数是否为
5 / 10 / 15 / 20 / 25 / 30?} + Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数
奖金 = 结算金额 × 底注] + Leopard -->|是| LeoRule{点数?} + LeoRule -->|5 或 30| MustBig[必定豹子大奖] + LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」
该点数权重决定真豹子或普通展示] + MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注
本局不再发该点数的普通奖] + BigRate -->|命中豹子| BigPay + BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合
奖金 = 结算金额 × 底注] + + NormalWin --> T5Check + NonLeo --> T5Check + BigPay --> EndBig([本局结束:以豹子大奖为准]) + DiceShow --> T5Check{档位为 T5 再来一次?} + T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券
下次免费局须相同底注] + T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准]) + FreeTicket --> EndNormal + + style Start fill:#e8f4fc + style EndNormal fill:#e8fce8 + style EndBig fill:#fff3e0 +
+
+ +
+ Mermaid 源码(可复制,与同目录 .mmd 文件一致) +
flowchart TD
+  Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
+  Dir --> Ante[选择底注倍数]
+  Ante --> Type{本局是否使用免费抽奖券?}
+
+  Type -->|是| Free[免费局]
+  Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
+
+  Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
+  Paid --> KillCheck{彩金池已开启杀分
且彩金池累计盈利 ≥ 安全线?} + KillCheck -->|是| PoolKill + KillCheck -->|否| PlayerW[按该玩家在「玩家管理」
配置的 T1~T5 档位概率抽签] + + PoolKill --> DrawTier[随机抽出档位 T1~T5] + PlayerW --> DrawTier + + DrawTier --> PickRow[在「色子奖励权重」中
取该档位 + 本局方向的所有行
按行权重随机一条] + PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位] + + Got --> KillMode{本局是否走杀分档位概率?} + KillMode -->|是| NoLeo[不发放豹子大奖
且不会抽到仅能豹子的点数 5、30] + KillMode -->|否| NormalPath[按普通规则继续] + NoLeo --> DiceShow[生成五颗骰子并结算] + + NormalPath --> Leopard{色子点数是否为
5 / 10 / 15 / 20 / 25 / 30?} + Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数
奖金 = 结算金额 × 底注] + Leopard -->|是| LeoRule{点数?} + LeoRule -->|5 或 30| MustBig[必定豹子大奖] + LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」
该点数权重决定真豹子或普通展示] + MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注
本局不再发该点数的普通奖] + BigRate -->|命中豹子| BigPay + BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合
奖金 = 结算金额 × 底注] + + NormalWin --> T5Check + NonLeo --> T5Check + BigPay --> EndBig([本局结束:以豹子大奖为准]) + DiceShow --> T5Check{档位为 T5 再来一次?} + T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券
下次免费局须相同底注] + T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准]) + FreeTicket --> EndNormal + + style Start fill:#e8f4fc + style EndNormal fill:#e8fce8 + style EndBig fill:#fff3e0
+
+ +
+

读图要点

+ +
+ + + + diff --git a/saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.mmd b/saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.mmd new file mode 100644 index 0000000..2ed59a3 --- /dev/null +++ b/saiadmin-artd/public/docs/flowcharts/dice-为何抽到该奖励.mmd @@ -0,0 +1,44 @@ +flowchart TD + Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针] + Dir --> Ante[选择底注倍数] + Ante --> Type{本局是否使用免费抽奖券?} + + Type -->|是| Free[免费局] + Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币] + + Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签] + Paid --> KillCheck{彩金池已开启杀分
且彩金池累计盈利 ≥ 安全线?} + KillCheck -->|是| PoolKill + KillCheck -->|否| PlayerW[按该玩家在「玩家管理」
配置的 T1~T5 档位概率抽签] + + PoolKill --> DrawTier[随机抽出档位 T1~T5] + PlayerW --> DrawTier + + DrawTier --> PickRow[在「色子奖励权重」中
取该档位 + 本局方向的所有行
按行权重随机一条] + PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位] + + Got --> KillMode{本局是否走杀分档位概率?} + KillMode -->|是| NoLeo[不发放豹子大奖
且不会抽到仅能豹子的点数 5、30] + KillMode -->|否| NormalPath[按普通规则继续] + NoLeo --> DiceShow[生成五颗骰子并结算] + + NormalPath --> Leopard{色子点数是否为
5 / 10 / 15 / 20 / 25 / 30?} + Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数
奖金 = 结算金额 × 底注] + Leopard -->|是| LeoRule{点数?} + LeoRule -->|5 或 30| MustBig[必定豹子大奖] + LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」
该点数权重决定真豹子或普通展示] + MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注
本局不再发该点数的普通奖] + BigRate -->|命中豹子| BigPay + BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合
奖金 = 结算金额 × 底注] + + NormalWin --> T5Check + NonLeo --> T5Check + BigPay --> EndBig([本局结束:以豹子大奖为准]) + DiceShow --> T5Check{档位为 T5 再来一次?} + T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券
下次免费局须相同底注] + T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准]) + FreeTicket --> EndNormal + + style Start fill:#e8f4fc + style EndNormal fill:#e8fce8 + style EndBig fill:#fff3e0 diff --git a/saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.html b/saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.html new file mode 100644 index 0000000..ec6c76d --- /dev/null +++ b/saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.html @@ -0,0 +1,219 @@ + + + + + + 后台如何配置中奖逻辑 + + + + +
+

后台如何配置中奖逻辑

+

按「一局真实抽奖」顺序:每个环节对应左侧菜单与页面按钮(与前台逻辑一致)

+
+ +

菜单根目录:大富翁-色子游戏。多渠道后台请先选顶部渠道,再改该渠道数据。

+

复制:展开「Mermaid 源码」粘贴到流程图工具;日常维护也可打开同目录 dice-后台中奖逻辑配置.mmd

+ +
+

主流程图(抽奖环节 → 去哪点哪个按钮)

+
+flowchart TD
+  O([按一局抽奖的真实顺序配置后台]) --> L1
+
+  L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置
按钮:新增 / 行内编辑 → 提交] + L1A --> L2 + + L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?} + L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore] + L2Q -->|付费且彩金池杀分生效| L2F + L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重] + + L2F --> M2F[大富翁-色子游戏 → 彩金池配置
按钮:行内「编辑」→ 名称 killScore
填写 T1池权重~T5池权重 合计 100%
按钮:「提交」] + L2P --> M2P[大富翁-色子游戏 → 玩家管理
按钮:行内「编辑」
填写 T1池权重~T5池权重 或 选择「彩金池配置」
按钮:「提交」] + + M2F --> L2K + M2P --> L2K + L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置
按钮:「查看当前彩金池」
填写「安全线」· 开关「开启杀分」
按钮:「保存安全线」] + + M2K --> L3 + L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则] + M3A --> M3B[大富翁-色子游戏 → 奖励配置
页签「奖励索引」→ 填写结算金额等
按钮:「保存」] + M3B --> M3C[奖励配置 → 按钮「创建奖励对照」
弹窗 → 按钮「确认导入」] + M3C --> M3D[大富翁-色子游戏 → 色子奖励权重
按钮:「权重配比」→ 页签顺时针/逆时针
按 T1~T5 填各点数权重 → 按钮「提交」] + + M3D --> L4 + L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?} + L4Q -->|是| L4N[不触发豹子大奖] + L4Q -->|否| L4Y[可能触发豹子大奖] + L4Y --> M4[大富翁-色子游戏 → 奖励配置
页签「大奖权重」→ 拖动权重滑条
按钮:「保存」
说明:点数 5、30 固定必中;10/15/20/25 可调] + + L4N --> L5 + M4 --> L5 + L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」
弹窗 → 按钮「开始测试」] + M5A --> M5B[权重测试记录 → 按钮「查看详情」
按钮「导入到当前配置」→「确认导入」] + M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对]) + + style O fill:#e8f4fc + style Done fill:#e8fce8 + style M2F fill:#fdf6ec + style M2P fill:#fdf6ec + style M3D fill:#fde2e2 + style M4 fill:#e1f3d8 +
+
+ +
+ Mermaid 源码(可复制,与同目录 .mmd 文件一致) +
flowchart TD
+  O([按一局抽奖的真实顺序配置后台]) --> L1
+
+  L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置
按钮:新增 / 行内编辑 → 提交] + L1A --> L2 + + L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?} + L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore] + L2Q -->|付费且彩金池杀分生效| L2F + L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重] + + L2F --> M2F[大富翁-色子游戏 → 彩金池配置
按钮:行内「编辑」→ 名称 killScore
填写 T1池权重~T5池权重 合计 100%
按钮:「提交」] + L2P --> M2P[大富翁-色子游戏 → 玩家管理
按钮:行内「编辑」
填写 T1池权重~T5池权重 或 选择「彩金池配置」
按钮:「提交」] + + M2F --> L2K + M2P --> L2K + L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置
按钮:「查看当前彩金池」
填写「安全线」· 开关「开启杀分」
按钮:「保存安全线」] + + M2K --> L3 + L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则] + M3A --> M3B[大富翁-色子游戏 → 奖励配置
页签「奖励索引」→ 填写结算金额等
按钮:「保存」] + M3B --> M3C[奖励配置 → 按钮「创建奖励对照」
弹窗 → 按钮「确认导入」] + M3C --> M3D[大富翁-色子游戏 → 色子奖励权重
按钮:「权重配比」→ 页签顺时针/逆时针
按 T1~T5 填各点数权重 → 按钮「提交」] + + M3D --> L4 + L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?} + L4Q -->|是| L4N[不触发豹子大奖] + L4Q -->|否| L4Y[可能触发豹子大奖] + L4Y --> M4[大富翁-色子游戏 → 奖励配置
页签「大奖权重」→ 拖动权重滑条
按钮:「保存」
说明:点数 5、30 固定必中;10/15/20/25 可调] + + L4N --> L5 + M4 --> L5 + L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」
弹窗 → 按钮「开始测试」] + M5A --> M5B[权重测试记录 → 按钮「查看详情」
按钮「导入到当前配置」→「确认导入」] + M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对]) + + style O fill:#e8f4fc + style Done fill:#e8fce8 + style M2F fill:#fdf6ec + style M2P fill:#fdf6ec + style M3D fill:#fde2e2 + style M4 fill:#e1f3d8
+
+ +
+

首次搭建推荐顺序(与上图环节对应)

+
+flowchart TD
+  O([开始配置]) --> R1[奖励配置 · 页签「奖励索引」· 按钮「保存」]
+  R1 --> R2[奖励配置 · 页签「大奖权重」· 按钮「保存」]
+  R2 --> R3[奖励配置 · 按钮「创建奖励对照」·「确认导入」]
+  R3 --> W[色子奖励权重 · 按钮「权重配比」· 按钮「提交」]
+  W --> P1[彩金池配置 · 行内「编辑」default / killScore ·「提交」]
+  P1 --> P2[彩金池配置 ·「查看当前彩金池」·「保存安全线」]
+  P2 --> PL[玩家管理 · 行内「编辑」· 档位权重 ·「提交」]
+  PL --> T{要仿真?}
+  T -->|是| Test[色子奖励权重 ·「一键测试权重」·「开始测试」]
+  Test --> Imp[权重测试记录 ·「查看详情」·「导入到当前配置」·「确认导入」]
+  T -->|否| Live([上线])
+  Imp --> Live
+
+  style O fill:#e8f4fc
+  style Live fill:#e8fce8
+    
+
+ +
+
档位含义:T1 大奖 · T2 小赚 · T3 抽水 · T4 惩罚 · T5 再来一次(由「奖励索引」结算金额规则决定,见页内说明)。
+
改「奖励索引」后:必须再点「创建奖励对照」→「确认导入」,否则抽奖仍用旧对照表。
+
核对真实对局:大富翁-色子游戏 → 玩家抽奖记录(看奖励档位、色子点数、摇色子中奖平台币、中大奖平台币、底注、方向)。
+
+ + + + diff --git a/saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.mmd b/saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.mmd new file mode 100644 index 0000000..f492426 --- /dev/null +++ b/saiadmin-artd/public/docs/flowcharts/dice-后台中奖逻辑配置.mmd @@ -0,0 +1,42 @@ +flowchart TD + O([按一局抽奖的真实顺序配置后台]) --> L1 + + L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置
按钮:新增 / 行内编辑 → 提交] + L1A --> L2 + + L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?} + L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore] + L2Q -->|付费且彩金池杀分生效| L2F + L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重] + + L2F --> M2F[大富翁-色子游戏 → 彩金池配置
按钮:行内「编辑」→ 名称 killScore
填写 T1池权重~T5池权重 合计 100%
按钮:「提交」] + L2P --> M2P[大富翁-色子游戏 → 玩家管理
按钮:行内「编辑」
填写 T1池权重~T5池权重 或 选择「彩金池配置」
按钮:「提交」] + + M2F --> L2K + M2P --> L2K + L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置
按钮:「查看当前彩金池」
填写「安全线」· 开关「开启杀分」
按钮:「保存安全线」] + + M2K --> L3 + L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则] + M3A --> M3B[大富翁-色子游戏 → 奖励配置
页签「奖励索引」→ 填写结算金额等
按钮:「保存」] + M3B --> M3C[奖励配置 → 按钮「创建奖励对照」
弹窗 → 按钮「确认导入」] + M3C --> M3D[大富翁-色子游戏 → 色子奖励权重
按钮:「权重配比」→ 页签顺时针/逆时针
按 T1~T5 填各点数权重 → 按钮「提交」] + + M3D --> L4 + L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?} + L4Q -->|是| L4N[不触发豹子大奖] + L4Q -->|否| L4Y[可能触发豹子大奖] + L4Y --> M4[大富翁-色子游戏 → 奖励配置
页签「大奖权重」→ 拖动权重滑条
按钮:「保存」
说明:点数 5、30 固定必中;10/15/20/25 可调] + + L4N --> L5 + M4 --> L5 + L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」
弹窗 → 按钮「开始测试」] + M5A --> M5B[权重测试记录 → 按钮「查看详情」
按钮「导入到当前配置」→「确认导入」] + M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对]) + + style O fill:#e8f4fc + style Done fill:#e8fce8 + style M2F fill:#fdf6ec + style M2P fill:#fdf6ec + style M3D fill:#fde2e2 + style M4 fill:#e1f3d8 diff --git a/saiadmin-artd/scripts/sync-dice-flowcharts.mjs b/saiadmin-artd/scripts/sync-dice-flowcharts.mjs new file mode 100644 index 0000000..81f6d12 --- /dev/null +++ b/saiadmin-artd/scripts/sync-dice-flowcharts.mjs @@ -0,0 +1,26 @@ +/** + * 将 server/docs/flowcharts 同步到 saiadmin-artd/public/docs/flowcharts + * 构建前执行,保证部署包内含最新流程图 HTML/MMD + */ +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const artdRoot = path.resolve(__dirname, '..') +const repoRoot = path.resolve(artdRoot, '..') +const srcDir = path.join(repoRoot, 'server', 'docs', 'flowcharts') +const destDir = path.join(artdRoot, 'public', 'docs', 'flowcharts') + +if (!fs.existsSync(srcDir)) { + console.warn('[sync-dice-flowcharts] 源目录不存在,跳过:', srcDir) + process.exit(0) +} + +fs.mkdirSync(destDir, { recursive: true }) +const names = fs.readdirSync(srcDir).filter((n) => /\.(html|mmd)$/i.test(n)) +for (const name of names) { + fs.copyFileSync(path.join(srcDir, name), path.join(destDir, name)) + console.log('[sync-dice-flowcharts] copied', name) +} +console.log('[sync-dice-flowcharts] done,', names.length, 'file(s)') diff --git a/saiadmin-artd/src/utils/navigation/jump.ts b/saiadmin-artd/src/utils/navigation/jump.ts index 4fde1e8..ba2f583 100644 --- a/saiadmin-artd/src/utils/navigation/jump.ts +++ b/saiadmin-artd/src/utils/navigation/jump.ts @@ -16,10 +16,11 @@ */ import { AppRouteRecord } from '@/types/router' import { router } from '@/router' +import { resolveAppAssetUrl } from '@/utils/navigation/resolveAppAssetUrl' -// 打开外部链接 +// 打开外部链接(含站内静态页,自动拼接部署 base) export const openExternalLink = (link: string) => { - window.open(link, '_blank') + window.open(resolveAppAssetUrl(link), '_blank', 'noopener,noreferrer') } /** diff --git a/saiadmin-artd/src/utils/navigation/resolveAppAssetUrl.ts b/saiadmin-artd/src/utils/navigation/resolveAppAssetUrl.ts new file mode 100644 index 0000000..5236430 --- /dev/null +++ b/saiadmin-artd/src/utils/navigation/resolveAppAssetUrl.ts @@ -0,0 +1,19 @@ +/** + * 解析菜单外链 / 静态资源路径(兼容 VITE_BASE_URL 子目录部署) + */ +export function resolveAppAssetUrl(relativeOrAbsolute: string): string { + const link = relativeOrAbsolute.trim() + if (!link) { + return link + } + if (/^https?:\/\//i.test(link)) { + return link + } + const base = import.meta.env.BASE_URL || '/' + const normalizedBase = base.endsWith('/') ? base : `${base}/` + const path = link.startsWith('/') ? link.slice(1) : link + if (typeof window === 'undefined') { + return `${normalizedBase}${path}` + } + return `${window.location.origin}${normalizedBase}${path}` +} diff --git a/server/docs/flowcharts/dice-为何抽到该奖励.html b/server/docs/flowcharts/dice-为何抽到该奖励.html new file mode 100644 index 0000000..3d80a8d --- /dev/null +++ b/server/docs/flowcharts/dice-为何抽到该奖励.html @@ -0,0 +1,192 @@ + + + + + + 为何最终抽到该奖励 + + + + +
+

为何最终抽到的是这个奖励

+

业务说明:一局抽奖从开局到到账的决策顺序(仅用本项目菜单与业务用语)

+
+ +

复制方式:展开下方「Mermaid 源码」全选复制,粘贴到 ProcessOn / draw.io / 飞书文档等支持 Mermaid 的流程图工具;或直接用浏览器打开本页看图。

+ +
+
+flowchart TD
+  Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
+  Dir --> Ante[选择底注倍数]
+  Ante --> Type{本局是否使用免费抽奖券?}
+
+  Type -->|是| Free[免费局]
+  Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
+
+  Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
+  Paid --> KillCheck{彩金池已开启杀分
且彩金池累计盈利 ≥ 安全线?} + KillCheck -->|是| PoolKill + KillCheck -->|否| PlayerW[按该玩家在「玩家管理」
配置的 T1~T5 档位概率抽签] + + PoolKill --> DrawTier[随机抽出档位 T1~T5] + PlayerW --> DrawTier + + DrawTier --> PickRow[在「色子奖励权重」中
取该档位 + 本局方向的所有行
按行权重随机一条] + PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位] + + Got --> KillMode{本局是否走杀分档位概率?} + KillMode -->|是| NoLeo[不发放豹子大奖
且不会抽到仅能豹子的点数 5、30] + KillMode -->|否| NormalPath[按普通规则继续] + NoLeo --> DiceShow[生成五颗骰子并结算] + + NormalPath --> Leopard{色子点数是否为
5 / 10 / 15 / 20 / 25 / 30?} + Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数
奖金 = 结算金额 × 底注] + Leopard -->|是| LeoRule{点数?} + LeoRule -->|5 或 30| MustBig[必定豹子大奖] + LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」
该点数权重决定真豹子或普通展示] + MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注
本局不再发该点数的普通奖] + BigRate -->|命中豹子| BigPay + BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合
奖金 = 结算金额 × 底注] + + NormalWin --> T5Check + NonLeo --> T5Check + BigPay --> EndBig([本局结束:以豹子大奖为准]) + DiceShow --> T5Check{档位为 T5 再来一次?} + T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券
下次免费局须相同底注] + T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准]) + FreeTicket --> EndNormal + + style Start fill:#e8f4fc + style EndNormal fill:#e8fce8 + style EndBig fill:#fff3e0 +
+
+ +
+ Mermaid 源码(可复制,与同目录 .mmd 文件一致) +
flowchart TD
+  Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针]
+  Dir --> Ante[选择底注倍数]
+  Ante --> Type{本局是否使用免费抽奖券?}
+
+  Type -->|是| Free[免费局]
+  Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币]
+
+  Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签]
+  Paid --> KillCheck{彩金池已开启杀分
且彩金池累计盈利 ≥ 安全线?} + KillCheck -->|是| PoolKill + KillCheck -->|否| PlayerW[按该玩家在「玩家管理」
配置的 T1~T5 档位概率抽签] + + PoolKill --> DrawTier[随机抽出档位 T1~T5] + PlayerW --> DrawTier + + DrawTier --> PickRow[在「色子奖励权重」中
取该档位 + 本局方向的所有行
按行权重随机一条] + PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位] + + Got --> KillMode{本局是否走杀分档位概率?} + KillMode -->|是| NoLeo[不发放豹子大奖
且不会抽到仅能豹子的点数 5、30] + KillMode -->|否| NormalPath[按普通规则继续] + NoLeo --> DiceShow[生成五颗骰子并结算] + + NormalPath --> Leopard{色子点数是否为
5 / 10 / 15 / 20 / 25 / 30?} + Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数
奖金 = 结算金额 × 底注] + Leopard -->|是| LeoRule{点数?} + LeoRule -->|5 或 30| MustBig[必定豹子大奖] + LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」
该点数权重决定真豹子或普通展示] + MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注
本局不再发该点数的普通奖] + BigRate -->|命中豹子| BigPay + BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合
奖金 = 结算金额 × 底注] + + NormalWin --> T5Check + NonLeo --> T5Check + BigPay --> EndBig([本局结束:以豹子大奖为准]) + DiceShow --> T5Check{档位为 T5 再来一次?} + T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券
下次免费局须相同底注] + T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准]) + FreeTicket --> EndNormal + + style Start fill:#e8f4fc + style EndNormal fill:#e8fce8 + style EndBig fill:#fff3e0
+
+ +
+

读图要点

+ +
+ + + + diff --git a/server/docs/flowcharts/dice-为何抽到该奖励.mmd b/server/docs/flowcharts/dice-为何抽到该奖励.mmd new file mode 100644 index 0000000..2ed59a3 --- /dev/null +++ b/server/docs/flowcharts/dice-为何抽到该奖励.mmd @@ -0,0 +1,44 @@ +flowchart TD + Start([玩家开始一局抽奖]) --> Dir[选择方向:顺时针 或 逆时针] + Dir --> Ante[选择底注倍数] + Ante --> Type{本局是否使用免费抽奖券?} + + Type -->|是| Free[免费局] + Type -->|否且平台币足够| Paid[付费局:扣除底注对应平台币] + + Free --> PoolKill[按「杀分奖池」的 T1~T5 档位概率抽签] + Paid --> KillCheck{彩金池已开启杀分
且彩金池累计盈利 ≥ 安全线?} + KillCheck -->|是| PoolKill + KillCheck -->|否| PlayerW[按该玩家在「玩家管理」
配置的 T1~T5 档位概率抽签] + + PoolKill --> DrawTier[随机抽出档位 T1~T5] + PlayerW --> DrawTier + + DrawTier --> PickRow[在「色子奖励权重」中
取该档位 + 本局方向的所有行
按行权重随机一条] + PickRow --> Got[得到:色子点数、结算金额、所属档位、落点格位] + + Got --> KillMode{本局是否走杀分档位概率?} + KillMode -->|是| NoLeo[不发放豹子大奖
且不会抽到仅能豹子的点数 5、30] + KillMode -->|否| NormalPath[按普通规则继续] + NoLeo --> DiceShow[生成五颗骰子并结算] + + NormalPath --> Leopard{色子点数是否为
5 / 10 / 15 / 20 / 25 / 30?} + Leopard -->|否| NormalWin[五颗骰子点数和 = 该点数
奖金 = 结算金额 × 底注] + Leopard -->|是| LeoRule{点数?} + LeoRule -->|5 或 30| MustBig[必定豹子大奖] + LeoRule -->|10 / 15 / 20 / 25| BigRate[按「奖励配置」页签「大奖权重」
该点数权重决定真豹子或普通展示] + MustBig --> BigPay[豹子奖金 = 大奖结算金额 × 底注
本局不再发该点数的普通奖] + BigRate -->|命中豹子| BigPay + BigRate -->|未中豹子| NonLeo[五颗骰子为非豹子组合
奖金 = 结算金额 × 底注] + + NormalWin --> T5Check + NonLeo --> T5Check + BigPay --> EndBig([本局结束:以豹子大奖为准]) + DiceShow --> T5Check{档位为 T5 再来一次?} + T5Check -->|是| FreeTicket[赠送 1 次免费抽奖券
下次免费局须相同底注] + T5Check -->|否| EndNormal([本局结束:以普通奖或惩罚为准]) + FreeTicket --> EndNormal + + style Start fill:#e8f4fc + style EndNormal fill:#e8fce8 + style EndBig fill:#fff3e0 diff --git a/server/docs/flowcharts/dice-后台中奖逻辑配置.html b/server/docs/flowcharts/dice-后台中奖逻辑配置.html new file mode 100644 index 0000000..ec6c76d --- /dev/null +++ b/server/docs/flowcharts/dice-后台中奖逻辑配置.html @@ -0,0 +1,219 @@ + + + + + + 后台如何配置中奖逻辑 + + + + +
+

后台如何配置中奖逻辑

+

按「一局真实抽奖」顺序:每个环节对应左侧菜单与页面按钮(与前台逻辑一致)

+
+ +

菜单根目录:大富翁-色子游戏。多渠道后台请先选顶部渠道,再改该渠道数据。

+

复制:展开「Mermaid 源码」粘贴到流程图工具;日常维护也可打开同目录 dice-后台中奖逻辑配置.mmd

+ +
+

主流程图(抽奖环节 → 去哪点哪个按钮)

+
+flowchart TD
+  O([按一局抽奖的真实顺序配置后台]) --> L1
+
+  L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置
按钮:新增 / 行内编辑 → 提交] + L1A --> L2 + + L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?} + L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore] + L2Q -->|付费且彩金池杀分生效| L2F + L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重] + + L2F --> M2F[大富翁-色子游戏 → 彩金池配置
按钮:行内「编辑」→ 名称 killScore
填写 T1池权重~T5池权重 合计 100%
按钮:「提交」] + L2P --> M2P[大富翁-色子游戏 → 玩家管理
按钮:行内「编辑」
填写 T1池权重~T5池权重 或 选择「彩金池配置」
按钮:「提交」] + + M2F --> L2K + M2P --> L2K + L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置
按钮:「查看当前彩金池」
填写「安全线」· 开关「开启杀分」
按钮:「保存安全线」] + + M2K --> L3 + L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则] + M3A --> M3B[大富翁-色子游戏 → 奖励配置
页签「奖励索引」→ 填写结算金额等
按钮:「保存」] + M3B --> M3C[奖励配置 → 按钮「创建奖励对照」
弹窗 → 按钮「确认导入」] + M3C --> M3D[大富翁-色子游戏 → 色子奖励权重
按钮:「权重配比」→ 页签顺时针/逆时针
按 T1~T5 填各点数权重 → 按钮「提交」] + + M3D --> L4 + L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?} + L4Q -->|是| L4N[不触发豹子大奖] + L4Q -->|否| L4Y[可能触发豹子大奖] + L4Y --> M4[大富翁-色子游戏 → 奖励配置
页签「大奖权重」→ 拖动权重滑条
按钮:「保存」
说明:点数 5、30 固定必中;10/15/20/25 可调] + + L4N --> L5 + M4 --> L5 + L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」
弹窗 → 按钮「开始测试」] + M5A --> M5B[权重测试记录 → 按钮「查看详情」
按钮「导入到当前配置」→「确认导入」] + M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对]) + + style O fill:#e8f4fc + style Done fill:#e8fce8 + style M2F fill:#fdf6ec + style M2P fill:#fdf6ec + style M3D fill:#fde2e2 + style M4 fill:#e1f3d8 +
+
+ +
+ Mermaid 源码(可复制,与同目录 .mmd 文件一致) +
flowchart TD
+  O([按一局抽奖的真实顺序配置后台]) --> L1
+
+  L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置
按钮:新增 / 行内编辑 → 提交] + L1A --> L2 + + L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?} + L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore] + L2Q -->|付费且彩金池杀分生效| L2F + L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重] + + L2F --> M2F[大富翁-色子游戏 → 彩金池配置
按钮:行内「编辑」→ 名称 killScore
填写 T1池权重~T5池权重 合计 100%
按钮:「提交」] + L2P --> M2P[大富翁-色子游戏 → 玩家管理
按钮:行内「编辑」
填写 T1池权重~T5池权重 或 选择「彩金池配置」
按钮:「提交」] + + M2F --> L2K + M2P --> L2K + L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置
按钮:「查看当前彩金池」
填写「安全线」· 开关「开启杀分」
按钮:「保存安全线」] + + M2K --> L3 + L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则] + M3A --> M3B[大富翁-色子游戏 → 奖励配置
页签「奖励索引」→ 填写结算金额等
按钮:「保存」] + M3B --> M3C[奖励配置 → 按钮「创建奖励对照」
弹窗 → 按钮「确认导入」] + M3C --> M3D[大富翁-色子游戏 → 色子奖励权重
按钮:「权重配比」→ 页签顺时针/逆时针
按 T1~T5 填各点数权重 → 按钮「提交」] + + M3D --> L4 + L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?} + L4Q -->|是| L4N[不触发豹子大奖] + L4Q -->|否| L4Y[可能触发豹子大奖] + L4Y --> M4[大富翁-色子游戏 → 奖励配置
页签「大奖权重」→ 拖动权重滑条
按钮:「保存」
说明:点数 5、30 固定必中;10/15/20/25 可调] + + L4N --> L5 + M4 --> L5 + L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」
弹窗 → 按钮「开始测试」] + M5A --> M5B[权重测试记录 → 按钮「查看详情」
按钮「导入到当前配置」→「确认导入」] + M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对]) + + style O fill:#e8f4fc + style Done fill:#e8fce8 + style M2F fill:#fdf6ec + style M2P fill:#fdf6ec + style M3D fill:#fde2e2 + style M4 fill:#e1f3d8
+
+ +
+

首次搭建推荐顺序(与上图环节对应)

+
+flowchart TD
+  O([开始配置]) --> R1[奖励配置 · 页签「奖励索引」· 按钮「保存」]
+  R1 --> R2[奖励配置 · 页签「大奖权重」· 按钮「保存」]
+  R2 --> R3[奖励配置 · 按钮「创建奖励对照」·「确认导入」]
+  R3 --> W[色子奖励权重 · 按钮「权重配比」· 按钮「提交」]
+  W --> P1[彩金池配置 · 行内「编辑」default / killScore ·「提交」]
+  P1 --> P2[彩金池配置 ·「查看当前彩金池」·「保存安全线」]
+  P2 --> PL[玩家管理 · 行内「编辑」· 档位权重 ·「提交」]
+  PL --> T{要仿真?}
+  T -->|是| Test[色子奖励权重 ·「一键测试权重」·「开始测试」]
+  Test --> Imp[权重测试记录 ·「查看详情」·「导入到当前配置」·「确认导入」]
+  T -->|否| Live([上线])
+  Imp --> Live
+
+  style O fill:#e8f4fc
+  style Live fill:#e8fce8
+    
+
+ +
+
档位含义:T1 大奖 · T2 小赚 · T3 抽水 · T4 惩罚 · T5 再来一次(由「奖励索引」结算金额规则决定,见页内说明)。
+
改「奖励索引」后:必须再点「创建奖励对照」→「确认导入」,否则抽奖仍用旧对照表。
+
核对真实对局:大富翁-色子游戏 → 玩家抽奖记录(看奖励档位、色子点数、摇色子中奖平台币、中大奖平台币、底注、方向)。
+
+ + + + diff --git a/server/docs/flowcharts/dice-后台中奖逻辑配置.mmd b/server/docs/flowcharts/dice-后台中奖逻辑配置.mmd new file mode 100644 index 0000000..f492426 --- /dev/null +++ b/server/docs/flowcharts/dice-后台中奖逻辑配置.mmd @@ -0,0 +1,42 @@ +flowchart TD + O([按一局抽奖的真实顺序配置后台]) --> L1 + + L1[① 玩家选方向 + 底注] --> L1A[可选:大富翁-色子游戏 → 底注配置
按钮:新增 / 行内编辑 → 提交] + L1A --> L2 + + L2[② 先随机抽出档位 T1~T5] --> L2Q{本局类型?} + L2Q -->|免费抽奖券| L2F[概率来源:杀分奖池 killScore] + L2Q -->|付费且彩金池杀分生效| L2F + L2Q -->|付费且未杀分| L2P[概率来源:该玩家档位权重] + + L2F --> M2F[大富翁-色子游戏 → 彩金池配置
按钮:行内「编辑」→ 名称 killScore
填写 T1池权重~T5池权重 合计 100%
按钮:「提交」] + L2P --> M2P[大富翁-色子游戏 → 玩家管理
按钮:行内「编辑」
填写 T1池权重~T5池权重 或 选择「彩金池配置」
按钮:「提交」] + + M2F --> L2K + M2P --> L2K + L2K[杀分何时对付费局生效] --> M2K[大富翁-色子游戏 → 彩金池配置
按钮:「查看当前彩金池」
填写「安全线」· 开关「开启杀分」
按钮:「保存安全线」] + + M2K --> L3 + L3[③ 在档位内随机一条奖励行] --> M3A[须先有盘面金额与档位规则] + M3A --> M3B[大富翁-色子游戏 → 奖励配置
页签「奖励索引」→ 填写结算金额等
按钮:「保存」] + M3B --> M3C[奖励配置 → 按钮「创建奖励对照」
弹窗 → 按钮「确认导入」] + M3C --> M3D[大富翁-色子游戏 → 色子奖励权重
按钮:「权重配比」→ 页签顺时针/逆时针
按 T1~T5 填各点数权重 → 按钮「提交」] + + M3D --> L4 + L4[④ 若抽到豹子点数 5/10/15/20/25/30] --> L4Q{本局是否杀分档位?} + L4Q -->|是| L4N[不触发豹子大奖] + L4Q -->|否| L4Y[可能触发豹子大奖] + L4Y --> M4[大富翁-色子游戏 → 奖励配置
页签「大奖权重」→ 拖动权重滑条
按钮:「保存」
说明:点数 5、30 固定必中;10/15/20/25 可调] + + L4N --> L5 + M4 --> L5 + L5[⑤ 验证后上线] --> M5A[色子奖励权重 → 按钮「一键测试权重」
弹窗 → 按钮「开始测试」] + M5A --> M5B[权重测试记录 → 按钮「查看详情」
按钮「导入到当前配置」→「确认导入」] + M5B --> Done([可对玩家开放;用「玩家抽奖记录」核对]) + + style O fill:#e8f4fc + style Done fill:#e8fce8 + style M2F fill:#fdf6ec + style M2P fill:#fdf6ec + style M3D fill:#fde2e2 + style M4 fill:#e1f3d8