|
|
@@ -160,25 +160,190 @@
|
|
|
- 奖励记录 `amount` 为本次发出的券抵扣总额,状态为 `paid`;记录页直接展示,会员钱包不增加现金。
|
|
|
7. 券只能在 F1 自有游戏(F1体育、F1彩票)下注时使用;退款后的可用状态以券包接口返回为准。
|
|
|
|
|
|
-## 参与、发奖与优惠券记录
|
|
|
+## 记录查询:申请、发奖、已发优惠券
|
|
|
|
|
|
-`GET /admin/promotion/records?activity_id=1&kind=accounts&page=1&limit=20` 查看申请记录,`kind=rewards` 查看奖金,可追加会员 ID `user_id`(使用会员列表返回的 `id`)。返回 `total/data`。
|
|
|
+记录区为只读展示,返回的字段不要提交给保存接口。三个列表共用一个接口,`activity_id` 取 `detail` 返回的 `id`。申请记录 ID 和发奖记录 ID 都不是活动 ID。
|
|
|
|
|
|
-申请记录包含 `applied_at/application_snapshot`;奖金有 `reserved/locked/paid` 状态和资金流水关联(优惠券模式无流水)。没有有效申请前不允许领奖,重复领取不会重复入账或发券。停止活动使用下架,不删除参与历史。
|
|
|
+| 页签 | 请求 |
|
|
|
+|---|---|
|
|
|
+| 申请记录 | `GET /admin/promotion/records?activity_id=1&kind=accounts&page=1&limit=20` |
|
|
|
+| 发奖记录 | `GET /admin/promotion/records?activity_id=1&kind=rewards&page=1&limit=20` |
|
|
|
+| 已发优惠券 | `GET /admin/promotion/records?activity_id=1&kind=coupons&page=1&limit=20` |
|
|
|
+
|
|
|
+- 返回:成功 `code=0`,列表在 `data.data`,总数在 `data.total`。总数按申请或发奖记录计算,不是被邀请人数或券张数。
|
|
|
+- `limit` 最大 100。
|
|
|
+- `user_id` 按会员筛选,取会员列表返回的 `id`:
|
|
|
+ - 申请、发奖列表:筛选该邀请人。
|
|
|
+ - 已发券列表:匹配持券人或邀请人。
|
|
|
+- `status=unused/used` 仅已发券列表支持。申请、发奖列表不提供奖励状态筛选。
|
|
|
+
|
|
|
+所有列名使用中文,嵌套对象和 JSON 字段不要按原文渲染。会员 ID 与账号按文本展示,不套用金额格式,保留账号可能有的前导零。
|
|
|
+
|
|
|
+### 申请记录 `kind=accounts`
|
|
|
+
|
|
|
+| 字段 | 中文列名 | 展示建议 |
|
|
|
+|---|---|---|
|
|
|
+| id | 申请记录 ID | 显示 |
|
|
|
+| activity_id | 活动 ID | 可隐藏(页面已在本活动内) |
|
|
|
+| user_id | 申请会员 ID | 与 `inviter.account` 合并显示为"ID / 账号" |
|
|
|
+| round_no | 参与轮次 | 固定为 1,隐藏 |
|
|
|
+| spins | 剩余抽奖次数 | 转盘专用,隐藏 |
|
|
|
+| applied_at | 申请时间 | 为空时显示"未申请" |
|
|
|
+| application_snapshot | 申请时规则 | 按下方摘要展示,不显示原始 JSON |
|
|
|
+| reward_mode | 奖励方式 | `cash` 现金 / `coupon` 优惠券;`null` 显示"—" |
|
|
|
+| reward_id | 关联发奖记录 ID | 未发奖时为 `null`,显示"—" |
|
|
|
+| reward_status | 发奖状态 | 枚举同发奖记录 `status`;`null` 显示"暂无发奖记录" |
|
|
|
+| inviter / invitees | 邀请人、被邀请人及获券 | 见下方[名单与获券](#名单与获券申请发奖共用) |
|
|
|
+| created_at / updated_at | 创建时间 / 更新时间 | 显示 |
|
|
|
+
|
|
|
+`application_snapshot` 目前是 JSON 字符串,先解析再展示,也要兼容已是对象的情况:
|
|
|
+
|
|
|
+| 解析后字段 | 中文名称 |
|
|
|
+|---|---|
|
|
|
+| loss | 申请时净亏 |
|
|
|
+| from | 统计开始时间 |
|
|
|
+| rules.loss_amount | 申请所需净亏 |
|
|
|
+| rules.invite_count | 需邀请有效会员数 |
|
|
|
+| rules.reward_amount | 现金奖励金额 / 邀请人券总额上限,按奖励方式显示 |
|
|
|
+| rules.turnover_ratio | 解冻投注倍数,仅现金模式展示 |
|
|
|
+
|
|
|
+摘要示例:"申请时净亏 550、申请门槛 500、需邀请 3 人、现金奖励 500"。`policy`、`invite_user_cursor` 为内部核对字段,不展示。
|
|
|
+
|
|
|
+### 发奖记录 `kind=rewards`
|
|
|
|
|
|
-`kind=coupons` 查看已发优惠券,可加 `user_id`(匹配持券人或邀请人)和 `status=unused/used`:
|
|
|
+| 字段 | 中文列名 | 展示建议 |
|
|
|
+|---|---|---|
|
|
|
+| id | 发奖记录 ID | 显示 |
|
|
|
+| activity_id | 活动 ID | 可隐藏 |
|
|
|
+| user_id | 领奖会员 ID(邀请人) | 与 `inviter.account` 合并显示 |
|
|
|
+| account_id | 关联申请记录 ID | 对应申请记录的 `id` |
|
|
|
+| round_no | 发奖轮次 | 固定为 1,隐藏 |
|
|
|
+| amount | 现金奖励金额 / 优惠券抵扣总额 | 列名随本行 `reward_mode` 切换 |
|
|
|
+| required_flow | 解冻所需有效投注额 | 现金模式为 0 时显示"无需解冻";券模式隐藏 |
|
|
|
+| status | 发奖状态 | 见下表 |
|
|
|
+| credited_log_id | 奖励入账流水 ID | 券模式隐藏;无值显示"—" |
|
|
|
+| unlocked_log_id | 解冻流水 ID | 无值显示"—" |
|
|
|
+| unlocked_at | 解冻时间 | 无值显示"—" |
|
|
|
+| rule_snapshot | 发奖时规则 | 不显示原始 JSON;名单和获券使用新增字段 |
|
|
|
+| flow_snapshot | 流水统计快照 | 内部字段,隐藏 |
|
|
|
+| reward_mode | 奖励方式 | 同申请记录 |
|
|
|
+| inviter / invitees | 邀请人、被邀请人及获券 | 见下方名单与获券 |
|
|
|
+| created_at / updated_at | 创建时间 / 更新时间 | 显示;`created_at` 不要改称"实际发奖时间" |
|
|
|
+
|
|
|
+| status / reward_status | 中文 |
|
|
|
+|---|---|
|
|
|
+| reserved | 待发放 |
|
|
|
+| locked | 待解冻(已入冻结余额) |
|
|
|
+| paid | 已发放 |
|
|
|
+
|
|
|
+即使金额为 0 或无需解冻,也按 `status` 展示状态,不要当作已发放。每名会员只能领取一次,重复领取不会重复入账或发券。停止活动用下架,参与历史不会删除。
|
|
|
+
|
|
|
+### 名单与获券(申请、发奖共用)
|
|
|
+
|
|
|
+净亏邀请(类型 7)的申请、发奖记录每行附带下面这组名单字段,其他活动类型不返回:
|
|
|
|
|
|
| 字段 | 含义 |
|
|
|
|---|---|
|
|
|
-| id / activity_id / reward_id | 券ID、活动、来源奖励记录 |
|
|
|
-| user_id / member_id | 持券会员 |
|
|
|
-| role | `inviter` 邀请人券 / `invitee` 被邀请人券 |
|
|
|
-| inviter_user_id | 发起邀请的会员 |
|
|
|
-| min_amount / discount | 使用门槛、抵扣金额 |
|
|
|
-| categories | 可用游戏数组 |
|
|
|
-| valid_from / valid_until | 可用时间 |
|
|
|
-| status | `unused` 未使用 / `used` 已使用 |
|
|
|
-| used_source / used_stake / used_at | 使用的注单类型、下注毛额、使用时间 |
|
|
|
+| inviter.id / inviter.account | 邀请人会员 ID / 账号 |
|
|
|
+| inviter.coupons | 邀请人本次获得的券 |
|
|
|
+| invitees[] | 本次关联的被邀请人,每项 `id / account / coupons` |
|
|
|
+
|
|
|
+`coupons` 为数组,按档位合并,每项字段如下:
|
|
|
+
|
|
|
+| 字段 | 中文名称 | 类型 |
|
|
|
+|---|---|---|
|
|
|
+| min_amount | 使用门槛 | 金额字符串 |
|
|
|
+| discount | 抵扣金额 | 金额字符串 |
|
|
|
+| quantity | 本次发放张数 | 整数 |
|
|
|
+
|
|
|
+建议在申请、发奖两个列表中都增加以下列:
|
|
|
+
|
|
|
+| 列名 | 展示示例 |
|
|
|
+|---|---|
|
|
|
+| 奖励方式 | 现金 / 优惠券 |
|
|
|
+| 邀请人(ID / 账号) | `164 / demo164` |
|
|
|
+| 邀请人获得的券 | `满100抵50 × 2张;满200抵100 × 1张` |
|
|
|
+| 被邀请人及获券 | 每人一行:`168 / demo168:满100抵100 × 1张` |
|
|
|
+
|
|
|
+各情况的展示:
|
|
|
+
|
|
|
+| 情况 | 返回 | 显示 |
|
|
|
+|---|---|---|
|
|
|
+| 现金记录 | `invitees` 为发奖时达标的会员,双方 `coupons=[]` | 列出名单,获券显示"本次未发券";不要把被邀请人显示成现金收款人 |
|
|
|
+| 优惠券记录 | `invitees` 为本次计入发券的会员 | 列出每人账号与获券 |
|
|
|
+| 尚未发奖的申请 | `reward_id=null`、`reward_status=null`、`invitees=[]` | 显示"尚未生成发奖名单"(不代表没有下级或邀请数为 0) |
|
|
|
+| 账号未设置或会员已删除 | `account=null`,ID 保留 | 账号显示"—" |
|
|
|
+| 被邀请人未配置券 | 该人 `coupons=[]` | 显示"本次未发券" |
|
|
|
+
|
|
|
+- 会员 ID 对应记录的 `user_id`,不是会员编号 `member_id`。
|
|
|
+- 账号取会员当前账号,不是发奖时的快照。
|
|
|
+- `quantity` 是实际发出的张数,券已使用或已过期仍计入,不等于当前可用张数。
|
|
|
+- 每行只包含这笔发奖的券。获券摘要直接用本行数据,不要用"已发优惠券"分页数据拼总数,也不要按活动当前配置推算档位。
|
|
|
+- 历史记录缺少奖励方式时按现金兼容,不要用活动当前配置覆盖旧记录的奖励方式和券档位。
|
|
|
+
|
|
|
+优惠券模式发奖记录示例(账号为示例值):
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "code": 0,
|
|
|
+ "data": {
|
|
|
+ "total": 1,
|
|
|
+ "data": [
|
|
|
+ {
|
|
|
+ "id": 3003,
|
|
|
+ "activity_id": 1,
|
|
|
+ "user_id": 164,
|
|
|
+ "account_id": 20001,
|
|
|
+ "amount": "500",
|
|
|
+ "status": "paid",
|
|
|
+ "reward_mode": "coupon",
|
|
|
+ "inviter": {
|
|
|
+ "id": 164,
|
|
|
+ "account": "demo164",
|
|
|
+ "coupons": [
|
|
|
+ {"min_amount": "100", "discount": "50", "quantity": 2},
|
|
|
+ {"min_amount": "200", "discount": "100", "quantity": 1}
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ "invitees": [
|
|
|
+ {"id": 168, "account": "demo168", "coupons": [{"min_amount": "100", "discount": "100", "quantity": 1}]},
|
|
|
+ {"id": 169, "account": "demo169", "coupons": [{"min_amount": "100", "discount": "100", "quantity": 1}]},
|
|
|
+ {"id": 170, "account": "demo170", "coupons": [{"min_amount": "100", "discount": "100", "quantity": 1}]}
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 已发优惠券 `kind=coupons`
|
|
|
+
|
|
|
+每行是一张券:
|
|
|
+
|
|
|
+| 字段 | 中文名称 |
|
|
|
+|---|---|
|
|
|
+| id | 券 ID |
|
|
|
+| activity_id / reward_id | 活动 ID / 来源发奖记录 ID |
|
|
|
+| user_id / account | 持券会员 ID / 账号 |
|
|
|
+| member_id | 持券会员编号(内部关联用,可隐藏) |
|
|
|
+| inviter_user_id / inviter_account | 邀请人 ID / 账号 |
|
|
|
+| role | `inviter` 邀请人奖励券 / `invitee` 被邀请人奖励券 |
|
|
|
+| seq | 发放序号,内部字段,隐藏 |
|
|
|
+| min_amount / discount | 使用门槛 / 抵扣金额,显示为"满 X 抵 Y" |
|
|
|
+| categories | 可用游戏:`self:sport` F1体育、`self:lottery` F1彩票 |
|
|
|
+| valid_from / valid_until | 可用时间(UTC+8) |
|
|
|
+| status | `unused` 未使用 / `used` 已使用;未使用不代表仍在可用时间内 |
|
|
|
+| used_source | 使用的注单类型:`sport_order` 体育、`sport_game_order` 足球小游戏、`lhc_order` 彩票 |
|
|
|
+| used_stake / used_at | 使用时的下注金额 / 使用时间;未使用为空,显示"—" |
|
|
|
+| created_at / updated_at | 发放时间 / 更新时间 |
|
|
|
+
|
|
|
+### 记录页验收
|
|
|
+
|
|
|
+- 列名全为中文;不展示 `spins`、固定轮次和内部快照字段。
|
|
|
+- 现金记录显示邀请人和达标会员的 ID、账号,获券显示"本次未发券"。
|
|
|
+- 优惠券记录在同一行显示邀请人和每名被邀请人的 ID、账号、满减档位和张数。
|
|
|
+- 未发奖的申请显示"尚未生成发奖名单";账号缺失显示"—",保留会员 ID。
|
|
|
+- 券使用或过期后,记录页获得张数不变;分页总数仍为主记录数。
|
|
|
|
|
|
## 权限
|
|
|
|