1.修改电话号码格式为60前缀,马来西亚格式

2.优化渠道可以查看分红方式,可以查看游玩详情
This commit is contained in:
2026-05-30 11:09:54 +08:00
parent 28d0100d5a
commit e65c3474bd
37 changed files with 1772 additions and 113 deletions

View File

@@ -138,7 +138,7 @@
### 3.3 注意
`channel` 不承担子代理树结构;子代理层级与邀请码归属下沉到 `admin`除超管外,渠道管理仅可查看当前管理员归属渠道
`channel` 不承担子代理树结构;子代理层级与邀请码归属下沉到 `admin`渠道列表**只读范围**:超管、所属角色组均未绑定 `channel_id`、或拥有 `channel/viewAllChannels` 时可查看全平台渠道;否则仅绑定渠道或本人 `admin.channel_id`。详见 `docs/渠道管理后台说明.md`
---
@@ -316,9 +316,9 @@
### 8.3.1 渠道结算新流程2026-04-232026-05-29 树形拆分)
1. **仅超管可结算**:按渠道结算周期(支持自动任务与手动提前结算)执行渠道结算
1. **结算权限**:超管,或拥有按钮权限 `channel/manualSettle` 且目标渠道在可读范围内,可手动提前结算;**一键批量结算**仍仅超管。自动任务由 `ChannelAutoSettleTicker` 执行
2. **结算即发放**:结算时按 **代理树**`admin.parent_admin_id` + `admin.commission_share_rate`)拆分各管理员实得,直接发放到管理员钱包并写入 `admin_wallet_record``commission_income`),同时写 `agent_settlement_period` / `agent_commission_record`
3. **配置位置**:分红比例在 **管理员管理** 维护,不在渠道管理页维护 flat 分配表。
3. **配置位置**:分红比例在 **管理员管理** 维护,不在渠道管理页维护 flat 分配表。渠道页支持查看直属/分红口径下注记录、已分红记录及筛选,见 `docs/渠道管理后台说明.md`
4. **提前结算规则**:手动提前结算后,新的周期起点从本次结算结束时间开始,后续自动周期归入下个结算段。
5. **停用渠道限制**`channel.status != 1` 时,该渠道不再允许玩家注册与登录。
@@ -407,6 +407,7 @@
| V1.16 | 2026-04-23 | 渠道结算改为单阶段口径(仅超管结算,结算即按比例发放管理员钱包并记录操作人)与管理员钱包提现流程(`admin_wallet` / `admin_wallet_record` / `admin_withdraw_order`,渠道顶级组审核) |
| V1.17 | 2026-05-29 | 代理分红改为树形拆分:`admin.commission_share_rate` + `parent_admin_id`;配置迁移至管理员管理;渠道页移除 `channel_admin_share` 入口;管理员列表树形展示与下级可见范围 |
| V1.18 | 2026-05-29 | 顶级角色组(`admin_group.pid=0`)可配置渠道分红比例;表单禁用上级代理并增加说明 |
| V1.19 | 2026-05-30 | 渠道管理:全平台只读范围、`viewAllChannels`、下注记录弹窗与筛选、移动端适配;`manualSettle` 按权限;`docs/渠道管理后台说明.md` |
---

View File

@@ -1002,7 +1002,7 @@ flowchart TD
## 10. 后台代理分红配置管理端补充2026-05-29
> 分红比例在 **管理员管理** `/admin/auth/admin` 维护,不再使用渠道页「分配比例」弹窗。
> 分红比例在 **管理员管理** `/admin/auth/admin` 维护,不再使用渠道页「分配比例」弹窗。渠道页交互(统计、下注记录、筛选、权限)见 `docs/渠道管理后台说明.md`。
### 10.1 页面与展示

View File

@@ -0,0 +1,88 @@
# Channel Management (Admin)
## 1. Purpose
Documents the **Channel Management** page (`/admin/channel`): summary cards, list scope, button permissions, bet-record dialogs, and APIs. For commission calculation and agent tree split, see [commission-share-guide.md](./commission-share-guide.md).
---
## 2. Summary cards
| Card | Description |
|------|-------------|
| Total channels | Count in **readable scope** |
| Enabled | `status = 1` |
| Pending dividend (count) | `carryover_balance > 0` |
| Pending dividend (amount) | Sum of those balances |
| Paid dividend | Sum of paid `agent_commission_record` in scope; clickable dialog requires `viewDividendRecords` |
List filters: **All / With balance / No balance / Enabled only / Disabled only** (UI search only).
---
## 3. Read scope
`AdminChannelScopeService` applies to list and stats:
**Global read** (all channels) if any of:
- Super admin (`*`)
- No `admin_group.channel_id` bound for the users groups
- Button permission `channel/viewAllChannels`
Otherwise: bound group channel IDs, or `admin.channel_id`, or empty.
**Write** (add/edit/delete/manual settle DB) stays on **writable** channels only; `viewAllChannels` does not expand write scope.
---
## 4. Actions & permissions
| Node | Label | Behavior |
|------|-------|----------|
| `channel/viewAllChannels` | View all channels | Global read scope |
| `channel/viewDividendRecords` | Paid dividend records | Top card + dialog |
| `channel/viewDirectBetRecords` | Direct bet records | Direct bet column click |
| `channel/viewSettlementBetRecords` | Settlement-scope bets | Row action |
| `channel/manualSettle` | Manual settle | Preview + submit (readable channel) |
| `channel/batchSettlePending` | Batch settle | **Super admin only** |
Re-login after role changes to refresh `authNode`.
---
## 5. Manual settlement
- `GET /admin/channel/manualSettlePreview?id=`
- `POST /admin/channel/manualSettle`
- Super admin **or** `channel/manualSettle` with channel in read scope
- Same payout flow as super-admin settle (`ChannelSettlementService::settleBySuperAdmin`)
---
## 6. Bet record dialogs
| Entry | API | Data |
|-------|-----|------|
| Direct bet amount | `directBetRecordList` | All play records for channel |
| View settlement bets | `settlementBetRecordList` | `status = 2` only |
**Filters (GET):** `period_no`, `user_keyword`, `result_number`, `pick_number`, `win_hit` (`won`/`lost`/`pending`), `page`, `limit`.
**Columns:** period, player, channel, picks, winning number, win status, bet amount, win amount.
**Mobile:** ~92% width, scrollable body, 3 summary cards per row, horizontal table scroll.
---
## 7. APIs
See §8 in the Chinese doc `docs/渠道管理后台说明.md` (same paths under `/admin/channel/`).
---
## 8. Changelog
| Date | Note |
|------|------|
| 2026-05-30 | Bet record columns, filters, mobile layout; `viewAllChannels`; manual settle by permission |

View File

@@ -47,11 +47,12 @@ If a sub-agent has further downline, the same rules apply on **their received am
| Capability | Entry | Notes |
|------------|-------|-------|
| Channel commission params | `/admin/channel` | `agent_mode`, turnover/affiliate rates, settlement cycle, etc. |
| Channel commission params | `/admin/channel` | `agent_mode`, turnover/affiliate rates, etc.; see [channel-admin-guide.md](./channel-admin-guide.md) |
| Agent tree & share rates | `/admin/auth/admin` | Tree list; parent agent, share rate, channel |
| Channel filter | Admin list common search | Super admin can filter by channel |
| Channel list read scope | `/admin/channel` | Super admin / unbound groups / `viewAllChannels` → all channels read-only |
| Visibility | Admin list | Nonsuper admin sees **self + all downline** only |
| Settlement | `/admin/channel` manual / cron | **Super admin only**; credits `admin_wallet` on settle |
| Settlement | `/admin/channel` manual / cron | Super admin **or** `channel/manualSettle`; batch still super admin only |
### 3.1 Share rate validation
@@ -80,7 +81,7 @@ If a level totals 100%, the parent at that level keeps **no commission**.
## 4. Settlement Flow
1. Super admin triggers channel settlement (manual or `ChannelAutoSettleTicker`)
1. Super admin or holder of `channel/manualSettle` triggers settlement (manual or cron; batch API still super admin only)
2. `ChannelSettlementService::buildSettlePayload` aggregates bets and computes channel total commission
3. `AdminCommissionDistributionService::distributeChannelCommission` splits by agent tree
4. In one transaction:
@@ -123,6 +124,8 @@ If a level totals 100%, the parent at that level keeps **no commission**.
| Module | Path |
|--------|------|
| Channel settlement | `app/common/service/ChannelSettlementService.php` |
| Channel read scope | `app/common/service/AdminChannelScopeService.php` |
| Channel admin UI | `app/admin/controller/Channel.php` |
| Tree split | `app/common/service/AdminCommissionDistributionService.php` |
| Admin CRUD / validation | `app/admin/controller/auth/Admin.php` |
| Admin UI | `web/src/views/backend/auth/admin/` |
@@ -138,3 +141,4 @@ If a level totals 100%, the parent at that level keeps **no commission**.
| 2026-04-23 | Settle-and-pay to admin wallet; `admin_wallet` system |
| 2026-05-29 | **Agent tree commission** in Administrator Management; removed channel share UI; tree list & downline visibility |
| 2026-05-29 | Top-level role groups (`pid=0`) require channel share rate; parent agent disabled in form |
| 2026-05-30 | Channel UI: view-all, bet/dividend dialogs, filters, mobile; manual settle by permission; `channel-admin-guide.md` |

View File

@@ -47,11 +47,12 @@
| 能力 | 入口 | 说明 |
|------|------|------|
| 渠道分红参数 | `/admin/channel` | `agent_mode`、返水/联营比例、结算周期等 |
| 渠道分红参数 | `/admin/channel` | `agent_mode`、返水/联营比例、结算周期等;详见 [渠道管理后台说明.md](./渠道管理后台说明.md) |
| 代理树与分红比例 | `/admin/auth/admin` | 树形列表;配置上级代理、分红比例、渠道归属 |
| 渠道筛选 | 管理员列表公共搜索 | 超管可按渠道筛选 |
| 渠道列表可见范围 | `/admin/channel` | 超管 / 角色组未绑渠道 / `viewAllChannels` → 全平台只读;否则仅绑定渠道 |
| 数据可见范围 | 管理员列表 | 非超管仅见 **本人 + 全部下级**,不见其他代理线 |
| 结算执行 | `/admin/channel` 手动结算 / 定时任务 | **超管**可结算;结算即发放至 `admin_wallet` |
| 结算执行 | `/admin/channel` 手动结算 / 定时任务 | **超管**`channel/manualSettle`(渠道可读);批量结算仍仅超管;结算即发放至 `admin_wallet` |
### 3.1 分红比例校验
@@ -80,7 +81,7 @@
## 4. 结算执行流程
1. 超管触发渠道结算(手动或 `ChannelAutoSettleTicker` 周期任务)
1. 超管或具备 `channel/manualSettle` 的管理员触发渠道结算(手动或 `ChannelAutoSettleTicker` 周期任务;批量接口仍仅超管
2. `ChannelSettlementService::buildSettlePayload` 汇总注单并计算渠道总佣金
3. `AdminCommissionDistributionService::distributeChannelCommission` 按代理树拆分各管理员实得
4. 事务内写入:
@@ -123,6 +124,8 @@
| 模块 | 路径 |
|------|------|
| 渠道结算 | `app/common/service/ChannelSettlementService.php` |
| 渠道列表范围 | `app/common/service/AdminChannelScopeService.php` |
| 渠道后台 | `app/admin/controller/Channel.php``web/src/views/backend/channel/` |
| 树形拆分 | `app/common/service/AdminCommissionDistributionService.php` |
| 管理员 CRUD / 校验 | `app/admin/controller/auth/Admin.php` |
| 管理员前端 | `web/src/views/backend/auth/admin/` |
@@ -139,3 +142,4 @@
| 2026-05-29 | **改为代理树形分红**:配置迁移至管理员管理 `commission_share_rate` + `parent_admin_id`;移除渠道页分配比例入口;管理员列表树形展示与下级可见范围 |
| 2026-05-29 | 新增英文文档 `docs/en/commission-share-guide.md`;后台切换 `lang=en` 时文档页自动加载英文版 |
| 2026-05-29 | **顶级角色组可配置渠道分红比例**`pid=0` 时禁用上级代理并必填 `commission_share_rate`;结算按顶级比例划入后再向下拆分 |
| 2026-05-30 | 渠道页:查看所有渠道、下注/分红记录弹窗与筛选、移动端适配;`manualSettle` 按按钮权限展示;文档 [渠道管理后台说明.md](./渠道管理后台说明.md) |

View File

@@ -78,12 +78,16 @@
### 3.5 🏢 代理中枢与佣金结算系统 (Agent System)
* **创建总代/子代账号**:在 **管理员管理**`/admin/auth/admin`)维护代理树:`parent_admin_id``commission_share_rate`(顶级角色组从渠道总佣金分得 %,子代理从上级实得抽取 %)、`channel_id`、邀请码。
* **代理树状图 (Tree View)**:管理员列表以树形展示;非超管仅见本人及全部下级。
* **渠道佣金结算**仅超管
* **渠道管理页**`/admin/channel`
* 顶部统计:渠道数、待分红、已分红(可点开记录);列表支持分红余额/启用状态筛选。
* **数据范围**`AdminChannelScopeService`;全平台只读条件见 `docs/渠道管理后台说明.md` §3。
* **操作**:查看总投注金额 / 直属投注记录(弹窗 + 筛选);手动结算(超管或 `channel/manualSettle`)。
* **渠道佣金结算**
* 按渠道 `agent_mode` 与已结算注单计算渠道总佣金(非充值口径)。
* 按代理树拆分各管理员实得,写入 `agent_commission_record`**即时入账** `admin_wallet`
* 支持周期自动结算(`ChannelAutoSettleTicker`手动提前结算。
* 支持周期自动结算(`ChannelAutoSettleTicker`手动提前结算;批量待结算仅超管
* **佣金结算看板**`agent_settlement_period``agent_commission_record` 列表查询与对账。
* 详细口径见 `docs/分红说明文档.md`
* 详细口径见 `docs/分红说明文档.md`;渠道页交互见 `docs/渠道管理后台说明.md`
### 3.6 🤝 联营契约与合营代理管控大厅 (Affiliate Management)
设计为与普通流水分佣系统并行的**客损占成代理模块**方案:

View File

@@ -0,0 +1,158 @@
# 渠道管理后台说明
## 1. 文档目的
说明 **渠道管理**`/admin/channel`)页面的统计卡片、列表数据范围、操作按钮权限、下注记录弹窗与相关接口,便于运营配置权限与开发联调。
分红计算与代理树拆分口径见 [分红说明文档.md](./分红说明文档.md)。
---
## 2. 页面入口与统计卡片
| 卡片 | 说明 |
|------|------|
| 渠道总数 | 当前账号**可读范围**内渠道数量 |
| 启用渠道 | `status = 1` 的渠道数 |
| 待分红渠道 | `carryover_balance > 0` 的渠道数 |
| 待分红总额 | 上述渠道 `carryover_balance` 合计 |
| 已分红金额 | 可读范围内渠道下,已发放佣金(`agent_commission_record.status = 1`)合计;**可点击**打开已分红记录弹窗(需 `viewDividendRecords` 权限) |
列表上方筛选:**全部 / 有分红余额 / 无分红余额 / 仅启用 / 仅停用**(前端 `search` 条件,不改变数据范围规则)。
---
## 3. 数据可见范围(只读)
`app/common/service/AdminChannelScopeService.php` 统一判定,列表与统计均遵守:
| 条件(满足任一即**全平台渠道可读** | 说明 |
|--------------------------------------|------|
| 超管 | 权限含 `*` |
| 角色组均未绑定 `channel_id` | 该管理员所属角色组 `admin_group.channel_id` 均为空 |
| 拥有「查看所有渠道」 | 按钮权限 `channel/viewAllChannels` |
否则仅可读:
- 角色组绑定的 `channel_id` 集合,或
- 本人 `admin.channel_id`(若 > 0
- 无绑定且无账号渠道时返回空列表。
**写操作**(新增/编辑/删除渠道、手动结算写库)仍限制在**可写渠道**:角色组绑定渠道 + 账号 `channel_id`**不**因「查看所有渠道」而扩大写范围。
其它菜单(用户、充值/提现订单、游玩记录、控制台等)在只读全平台时同样可不按 `admin_id` 收窄,逻辑与 `Backend::hasGlobalReadScope()` 一致。
---
## 4. 列表字段与操作
### 4.1 常用列
- 渠道标识、名称、代理模式、联营负结转、契约编号、结算周期等
- **直属投注额**:该渠道下 `game_play_record` 投注合计;**可点击**打开直属下注记录弹窗(需 `viewDirectBetRecords`
- 操作列:**查看总投注金额**、**手动结算**、编辑、删除(后两者受写权限约束)
### 4.2 操作按钮权限
| 按钮权限节点 | 名称 | 行为 |
|--------------|------|------|
| `channel/index` | 查看 | 列表与详情 |
| `channel/viewAllChannels` | 查看所有渠道 | 扩大**只读**范围至全平台渠道 |
| `channel/viewDividendRecords` | 查看已分红记录 | 顶部「已分红金额」卡片与弹窗 |
| `channel/viewDirectBetRecords` | 查看直属投注记录 | 「直属投注额」列点击 |
| `channel/viewSettlementBetRecords` | 查看总投注金额 | 操作列;分红口径已结算注单 |
| `channel/manualSettle` | 手动结算 | 操作列;预览并提交渠道结算(见 §5 |
| `channel/batchSettlePending` | 一键批量结算 | **仅超管**可见;结算全部待结算渠道 |
| `channel/add` / `edit` / `del` | 增删改 | 须对目标渠道具备写权限 |
角色组在 **权限管理 → 角色组** 中勾选对应按钮;保存后管理员需**重新登录**以刷新前端 `authNode`
---
## 5. 手动结算
- **接口**`GET /admin/channel/manualSettlePreview?id={channelId}``POST /admin/channel/manualSettle`
- **权限**:超管,或拥有 `channel/manualSettle` 且目标渠道在**可读范围**内
- **逻辑**:与超管结算相同,调用 `ChannelSettlementService::settleBySuperAdmin`,结算即按代理树发放至 `admin_wallet`
- **周期**:上次结算结束时间 ~ 当前时间;金额来自期内 **已结算** 游玩记录(`game_play_record.status = 2`
- **批量**`POST /admin/channel/batchSettlePending` 仍**仅超管**
---
## 6. 下注记录弹窗
两种入口共用同一套 UI 与筛选(接口不同):
| 入口 | 接口 | 数据范围 |
|------|------|----------|
| 直属投注额 | `GET /admin/channel/directBetRecordList` | 该渠道全部游玩记录 |
| 查看总投注金额 | `GET /admin/channel/settlementBetRecordList` | 该渠道 **已结算** 记录(`status = 2`,参与分红口径) |
### 6.1 顶部统计Card
- 总笔数、总投注额、总中奖额(随筛选条件重算)
### 6.2 列表列
游戏期号、玩家名、渠道、选号、中奖号码、中奖状态(已中奖 / 未中奖 / 待开奖)、投注金额、玩家中奖金额(含 `jackpot_extra_amount`)。
### 6.3 筛选参数GET
| 参数 | 说明 |
|------|------|
| `channel_id` | 必填 |
| `page` / `limit` | 分页,默认 1 / 20最大 200 |
| `period_no` | 期号模糊(`pr.period_no``game_record.period_no` |
| `user_keyword` | 玩家名或手机号模糊 |
| `result_number` | 开奖号码精确匹配 |
| `pick_number` | 选号模糊(匹配 `pick_numbers` JSON 文本) |
| `win_hit` | `won` / `lost` / `pending`(与列表中奖状态一致) |
### 6.4 移动端适配
- 弹窗宽度约 92% 视口,内容区可**纵向滚动**(勿使用 `ba-operate-dialog` 固定高度)
- 统计 Card **一行三列**;筛选项纵向铺满;表格区域可**横向滑动**
---
## 7. 已分红记录弹窗
- **接口**`GET /admin/channel/dividendRecordList`
- **权限**`channel/viewDividendRecords`
- **字段**:结算单号、渠道名、代理账号、分红金额、结算周期、发放时间等
---
## 8. 相关接口一览
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/admin/channel/index` | 渠道列表 |
| GET | `/admin/channel/settleStats` | 顶部统计卡片 |
| GET | `/admin/channel/directBetRecordList` | 直属下注记录 |
| GET | `/admin/channel/settlementBetRecordList` | 分红口径下注记录 |
| GET | `/admin/channel/dividendRecordList` | 已分红记录 |
| GET | `/admin/channel/manualSettlePreview` | 手动结算预览 |
| POST | `/admin/channel/manualSettle` | 提交手动结算 |
| POST | `/admin/channel/batchSettlePending` | 超管批量结算 |
---
## 9. 相关代码
| 模块 | 路径 |
|------|------|
| 渠道控制器 | `app/admin/controller/Channel.php` |
| 数据范围 | `app/common/service/AdminChannelScopeService.php` |
| 渠道结算 | `app/common/service/ChannelSettlementService.php` |
| 前端页面 | `web/src/views/backend/channel/index.vue` |
| 权限迁移 | `database/migrations/20260530120000_*``20260530130000_*` |
---
## 10. 变更记录
| 日期 | 说明 |
|------|------|
| 2026-05-30 | 新增:查看所有渠道、下注/分红查看按钮;下注记录弹窗列与筛选;移动端弹窗适配 |
| 2026-05-30 | 手动结算:拥有 `channel/manualSettle` 且渠道可读即可操作(不再仅限超管展示按钮) |