|
|
@@ -1,75 +1,185 @@
|
|
|
# 净亏邀请-后台接口
|
|
|
|
|
|
-业务类型固定为 `7`。本页为该活动的完整后台接入说明。
|
|
|
+本文面向管理后台前端,说明净亏邀请配置表单和记录查询的接入方式。
|
|
|
|
|
|
-本活动使用独立的 `promotion_activities` 配置和 `/admin/promotion` 接口,不加入原活动列表或原活动类型目录。以下接口使用现有后台登录和按钮权限,成功 `code=0`,参数或业务错误 `code=-3`,展示实际 `msg`。
|
|
|
+业务类型固定为 `7`。这是固定活动,只有一条配置,仅编辑、上架或下架,不提供新增、复制或另存为活动入口。
|
|
|
+
|
|
|
+本活动使用独立的 `/admin/promotion` 接口,不加入原活动列表或原活动类型目录。以下接口使用现有后台登录和按钮权限,成功 `code=0`,参数或业务错误 `code=-3`,展示实际 `msg`。
|
|
|
+
|
|
|
+金额以字符串返回,直接使用接口值展示:整数不带小数,小数保留两位;超过两位的小数截去,不四舍五入。例如 `200.00000000 → 200`、`200.12000000 → 200.12`、`200.1 → 200.10`、`200.129 → 200.12`。页面不再统一补齐多位小数。
|
|
|
+
|
|
|
+## 页面形式:单页平铺表单
|
|
|
+
|
|
|
+净亏邀请不再使用"列表 → 编辑"。菜单进入后直接展示一张平铺表单:
|
|
|
+
|
|
|
+1. 进入页面时并行请求 `GET /admin/promotion/options` 和 `GET /admin/promotion/detail?type=7`。
|
|
|
+2. 用详情回填全部输入框,保存的 `id` 取详情返回值,不写死。
|
|
|
+3. 页面底部"保存"调用 `POST /admin/promotion/submit`;上下架可以是表单内的开关,也可以是单独按钮调用 `POST /admin/promotion/status`。
|
|
|
+4. 参与和发奖记录、已发优惠券放在同页的 Tab 或折叠区,按需请求 `GET /admin/promotion/records`。
|
|
|
+
|
|
|
+不再请求 `GET /admin/promotion?type=7` 列表。
|
|
|
|
|
|
## 配置接口
|
|
|
|
|
|
| 方法 | 路径 | 参数与用途 |
|
|
|
|---|---|---|
|
|
|
-| GET | `/admin/promotion?type=7` | 仅查看本活动类型;可选 `page/limit/status/title` |
|
|
|
-| GET | `/admin/promotion/options` | 读取 `defaults["7"]` 默认规则 |
|
|
|
-| GET | `/admin/promotion/detail?id=1` | 配置详情,返回 `params` 对象及 `first_published_at` |
|
|
|
-| POST | `/admin/promotion/submit` | 新增或编辑本活动,固定 `type=7` |
|
|
|
+| GET | `/admin/promotion/detail?type=7` | 读取唯一的净亏邀请配置,返回 `id`、`params` 对象及 `first_published_at`;也可用 `id` 读取 |
|
|
|
+| GET | `/admin/promotion/options` | 默认规则 `defaults["7"]`、奖励模式 `reward_modes`、券可用游戏 `coupon_categories` |
|
|
|
+| POST | `/admin/promotion/submit` | 保存,必须带详情返回的 `id`,固定 `type=7` |
|
|
|
| POST | `/admin/promotion/status` | 传 `id/status` 上下架 |
|
|
|
-| GET | `/admin/promotion/records` | 查看参与或发奖记录 |
|
|
|
+| GET | `/admin/promotion/records` | 查看参与、发奖及已发优惠券 |
|
|
|
+
|
|
|
+`detail` 的 `id` 和 `type` 二选一,`type` 只接受 `7`(净亏邀请)或 `9`(转盘)。不带 `id` 保存会返回 `code=-3`,提示"净亏和转盘活动不支持新增,请编辑现有活动"。
|
|
|
+
|
|
|
+`options` 新增:
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "reward_modes": [{"value": "cash", "label": "现金"}, {"value": "coupon", "label": "优惠券"}],
|
|
|
+ "coupon_categories": [{"value": "self:sport", "label": "F1体育"}, {"value": "self:lottery", "label": "F1彩票"}]
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 表单字段
|
|
|
+
|
|
|
+### 通用字段(与原来相同)
|
|
|
+
|
|
|
+保存必填根字段:`id/title/type/status/start_time/end_time` 及三语 `translations`。时间按UTC+8填写,结束必须晚于开始。可选 `lang/sort/content/publish_platforms`;平台为 `PC/H5/APP`,空数组表示全部。
|
|
|
|
|
|
-列表默认 `page=1/limit=20`,`limit` 最大100。`status=0` 为下架、`1` 为上架,不能丢弃0值筛选。新增省略 `id`,编辑带 `id`;创建后不能改变业务类型。
|
|
|
+可选通用资格:`register_time_limited/register_start_time/register_end_time/register_platforms`、`deposit_limited/deposit_min/deposit_max`、`show_ineligible`。可选 `reward_quota` 限制不同获奖会员数,`budget` 限制累计奖励金额;`null` 为不限制,0为无剩余额度。`rewarded_count/budget_used/first_published_at` 为服务端字段,只展示不提交。
|
|
|
|
|
|
-保存必填根字段:`title/type/status/start_time/end_time`。时间按UTC+8填写,结束必须晚于开始。可选 `sub_title/lang/sort/content/image/publish_platforms`;平台为 `PC/H5/APP`,空数组表示全部。`params` 传对象,未知规则键报错;新增省略的项使用默认值,编辑局部规则保留其余原值。
|
|
|
+净亏邀请没有图片字段,不展示图片上传/预览,也不校验或提交 `image`。
|
|
|
|
|
|
-可选通用资格:`register_time_limited/register_start_time/register_end_time/register_platforms`、`deposit_limited/deposit_min/deposit_max`、`show_ineligible`。新增默认不限制,编辑省略字段保留原值。
|
|
|
+### 规则 `params`
|
|
|
|
|
|
-可选 `reward_quota` 限制不同获奖会员数,`budget` 限制累计奖励金额;`null` 为不限制,0为无剩余额度。`rewarded_count/budget_used/first_published_at` 为服务端字段,不能手动改写。
|
|
|
+`params` 传对象,未知键报错;只传部分键时其余保留原值。表单以详情返回的当前值回填,保存时建议整组提交。
|
|
|
|
|
|
-## 保存示例
|
|
|
+| 字段 | 默认值 | 显示条件 | 含义 |
|
|
|
+|---|---|---|---|
|
|
|
+| loss_amount | 500.00 | 始终 | 申请所需累计净亏 |
|
|
|
+| invite_count | 3 | 始终 | 申请后需新增的有效直属会员数,1–1000 |
|
|
|
+| reward_amount | 500.00 | 始终 | 现金模式为发放金额;优惠券模式为邀请人券抵扣总额上限 |
|
|
|
+| reward_mode | `cash` | 始终 | 奖励模式切换:`cash` 现金 / `coupon` 优惠券 |
|
|
|
+| turnover_ratio | 0.00 | 仅现金模式 | 奖金所需有效投注倍数;优惠券模式不使用 |
|
|
|
+| coupon_valid_from | null | 仅优惠券模式 | 所有券统一的可用开始时间,`Y-m-d H:i:s`(UTC+8) |
|
|
|
+| coupon_valid_until | null | 仅优惠券模式 | 所有券统一的可用结束时间,须晚于开始 |
|
|
|
+| coupon_categories | [] | 仅优惠券模式 | 可用游戏,多选,取值 `self:sport` / `self:lottery`(只限 F1 自有游戏,第三方不可用) |
|
|
|
+| inviter_coupons | [] | 仅优惠券模式 | 邀请人券档位数组,见下 |
|
|
|
+| invitee_coupons | [] | 仅优惠券模式 | 每名被邀请人券档位数组,见下;可为空 |
|
|
|
+
|
|
|
+券档位每一行三个输入框,可增删行,每组最多10行:
|
|
|
+
|
|
|
+| 字段 | 示例 | 校验 |
|
|
|
+|---|---|---|
|
|
|
+| min_amount | 100 | 使用门槛:单次下注满该金额可用,最多两位小数 |
|
|
|
+| discount | 50 | 抵扣金额,大于0且不高于 `min_amount` |
|
|
|
+| quantity | 2 | 份数,1–100 的整数 |
|
|
|
+
|
|
|
+例如邀请人券配置"满100抵50 × 2、满200抵100 × 1":
|
|
|
+
|
|
|
+```json
|
|
|
+[
|
|
|
+ {"min_amount": "100", "discount": "50", "quantity": 2},
|
|
|
+ {"min_amount": "200", "discount": "100", "quantity": 1}
|
|
|
+]
|
|
|
+```
|
|
|
+
|
|
|
+### 模式切换规则
|
|
|
+
|
|
|
+- 切到 `cash` 时隐藏券相关输入框,但保存时**原样提交**已填写的券配置;服务端保留这些值,切回 `coupon` 时无需重填。现金模式下券配置只校验格式(档位数值合法),不校验必填。
|
|
|
+- 切到 `coupon` 时隐藏 `turnover_ratio`,以下为必填:
|
|
|
+ - `inviter_coupons` 至少一行
|
|
|
+ - `coupon_valid_from`、`coupon_valid_until`
|
|
|
+ - `coupon_categories` 至少选一个
|
|
|
+- 优惠券模式下邀请人券的 `Σ(discount × quantity)` 不得超过 `reward_amount`。页面可实时显示"已配置抵扣总额 / 奖励金额",服务端以同样规则校验。被邀请人券不计入这个上限。
|
|
|
+
|
|
|
+常见错误提示(`code=-3`,直接展示 `msg`):
|
|
|
+
|
|
|
+| msg | 原因 |
|
|
|
+|---|---|
|
|
|
+| 优惠券抵扣总额不能超过奖励金额 | 邀请人券抵扣×份数之和超过 `reward_amount` |
|
|
|
+| 请至少配置一档邀请人优惠券 | 优惠券模式下邀请人券为空 |
|
|
|
+| 请填写优惠券可用时间 | 缺开始或结束时间 |
|
|
|
+| 优惠券结束时间必须晚于开始时间 | 时间顺序错误 |
|
|
|
+| 请选择优惠券可用游戏类型 | 未勾选游戏 |
|
|
|
+| inviter_coupons参数错误:抵扣金额须大于0且不高于使用门槛,份数为1至100 | 某行数值不合法 |
|
|
|
+| reward_mode参数错误 / coupon_categories参数错误 | 取值不在选项内 |
|
|
|
+
|
|
|
+### 保存示例(优惠券模式)
|
|
|
+
|
|
|
+`id` 使用详情返回值,下面的 1 仅为示例。
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
+ "id": 1,
|
|
|
"title": "净亏邀请奖励",
|
|
|
"type": 7,
|
|
|
- "status": 0,
|
|
|
- "start_time": "2026-10-26 00:00:00",
|
|
|
- "end_time": "2027-10-26 23:59:59",
|
|
|
- "publish_platforms": [
|
|
|
- "PC",
|
|
|
- "H5",
|
|
|
- "APP"
|
|
|
- ],
|
|
|
+ "status": 1,
|
|
|
+ "start_time": "2026-11-03 00:00:00",
|
|
|
+ "end_time": "2027-11-03 23:59:59",
|
|
|
+ "publish_platforms": ["PC", "H5", "APP"],
|
|
|
+ "translations": {
|
|
|
+ "zh": {"title": "净亏邀请奖励", "content": "<p>…</p>"},
|
|
|
+ "en": {"title": "Net loss invite", "content": "<p>…</p>"},
|
|
|
+ "vi": {"title": "Mời bạn hoàn lỗ", "content": "<p>…</p>"}
|
|
|
+ },
|
|
|
"params": {
|
|
|
- "loss_amount": "500.00",
|
|
|
+ "loss_amount": "500",
|
|
|
"invite_count": 3,
|
|
|
- "reward_amount": "500.00",
|
|
|
- "turnover_ratio": "0.00"
|
|
|
+ "reward_amount": "500",
|
|
|
+ "reward_mode": "coupon",
|
|
|
+ "turnover_ratio": "0",
|
|
|
+ "coupon_valid_from": "2026-11-03 00:00:00",
|
|
|
+ "coupon_valid_until": "2026-12-31 23:59:59",
|
|
|
+ "coupon_categories": ["self:sport", "self:lottery"],
|
|
|
+ "inviter_coupons": [
|
|
|
+ {"min_amount": "100", "discount": "50", "quantity": 4},
|
|
|
+ {"min_amount": "200", "discount": "100", "quantity": 3}
|
|
|
+ ],
|
|
|
+ "invitee_coupons": [
|
|
|
+ {"min_amount": "100", "discount": "50", "quantity": 1},
|
|
|
+ {"min_amount": "200", "discount": "100", "quantity": 1}
|
|
|
+ ]
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 业务规则与字段
|
|
|
+邀请人券抵扣总额 `50×4 + 100×3 = 500`,等于奖励金额,可以保存。
|
|
|
|
|
|
-| params字段 | 默认值 | 含义 |
|
|
|
-|---|---|---|
|
|
|
-| loss_amount | 500.00 | 申请所需累计净亏 |
|
|
|
-| invite_count | 3 | 申请后需新增的有效直属会员数 |
|
|
|
-| reward_amount | 500.00 | 达标后领取奖金 |
|
|
|
-| turnover_ratio | 0.00 | 奖金所需有效投注倍数 |
|
|
|
+## 业务规则
|
|
|
+
|
|
|
+1. 净亏和有效邀请人数直接使用接口返回值。
|
|
|
+2. 达到净亏门槛后会员点击申请;申请成功时固定当时的整套规则(包括奖励模式、券档位、券时间与游戏),之后修改配置不影响已申请的会员。无效申请不消耗机会,重复有效申请返回原进度。
|
|
|
+3. 会员是否达到活动条件由服务端判断,记录页显示对应状态。
|
|
|
+4. 新增有效直属会员达到人数后,会员自行领取。每名会员在本活动只能领取一次,下架再上架不重置机会或首次上架时间。
|
|
|
+5. **现金模式**:记录页显示接口返回的奖励金额和状态。
|
|
|
+6. **优惠券模式**:领取时不发现金,改为发券:
|
|
|
+ - 邀请人按 `inviter_coupons` 每份一张券。
|
|
|
+ - 计入人数的被邀请人每人按 `invitee_coupons` 一套券。如果有效下级多于 `invite_count`,按注册先后取前 `invite_count` 名。
|
|
|
+ - 所有券使用同一可用时间和可用游戏。
|
|
|
+ - 奖励记录 `amount` 为本次发出的券抵扣总额,状态为 `paid`;记录页直接展示,会员钱包不增加现金。
|
|
|
+7. 券只能在 F1 自有游戏(F1体育、F1彩票)下注时使用;退款后的可用状态以券包接口返回为准。
|
|
|
|
|
|
-1. 从本活动第一次上架后下单的真实注单累计净亏:`max(0,-已结算且未撤销注单净输赢合计)`,盈亏相抵。充值、提现、赠送和转账不算游戏损益。
|
|
|
-2. 达到净亏门槛后会员点击申请;申请成功固定当时的奖励规则、净亏快照及申请时间。无效申请不消耗机会,重复有效申请返回原进度。
|
|
|
-3. 只计申请后新注册且建立直属关系的下级。必须同时达到系统累计真实充值、累计有效投注双门槛;使用当日已生效政策,系统修改门槛按既有规则次日生效,不写死截图200。
|
|
|
-4. 有效投注逐笔按 `min(本金, |净输赢|)` 计算,只计已结算未撤销的真实注单。人工上分、活动赠送不计真实充值。
|
|
|
-5. 新增有效直属会员达到人数后,会员自行领取。每名会员在本活动只能领取一次,下架再上架不重置机会或首次上架时间。
|
|
|
-6. 奖金按申请时保存的规则发放。`turnover_ratio=0` 直接进入可用余额,大于0进入冻结余额,发放后新增有效投注达到“奖金×倍数”后自动解冻,各笔奖金独立计算。
|
|
|
+## 参与、发奖与优惠券记录
|
|
|
|
|
|
-## 参与与发奖记录
|
|
|
+`GET /admin/promotion/records?activity_id=1&kind=accounts&page=1&limit=20` 查看申请记录,`kind=rewards` 查看奖金,可追加会员 ID `user_id`(使用会员列表返回的 `id`)。返回 `total/data`。
|
|
|
|
|
|
-`GET /admin/promotion/records?activity_id=1&kind=accounts&page=1&limit=20` 查看申请记录,`kind=rewards` 查看奖金,可追加会员数据库ID `user_id`。返回 `total/data`。
|
|
|
+申请记录包含 `applied_at/application_snapshot`;奖金有 `reserved/locked/paid` 状态和资金流水关联(优惠券模式无流水)。没有有效申请前不允许领奖,重复领取不会重复入账或发券。停止活动使用下架,不删除参与历史。
|
|
|
|
|
|
-申请记录包含 `applied_at/application_snapshot`;奖金有 `reserved/locked/paid` 状态和资金流水关联。没有有效申请前不允许领奖,重复领取不会重复入账。停止活动使用下架,不删除参与历史。
|
|
|
+`kind=coupons` 查看已发优惠券,可加 `user_id`(匹配持券人或邀请人)和 `status=unused/used`:
|
|
|
|
|
|
-## 权限与上线
|
|
|
+| 字段 | 含义 |
|
|
|
+|---|---|
|
|
|
+| 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 | 使用的注单类型、下注毛额、使用时间 |
|
|
|
|
|
|
-独立活动菜单(`promotion`)和按钮由后台前端自行添加;配置、保存与上下架、记录权限分别为 `admin/promotion`、`admin/promotion/submit`、`admin/promotion/records`。上线执行新增迁移 `2026_10_26_160000_create_promotion_activities.php`,该迁移仅创建活动业务表,不新增或删除菜单数据。计划任务每分钟运行 `promotions:sync`;有效投注沿用已有分享注单同步。
|
|
|
+## 权限
|
|
|
|
|
|
-对应会员端文档:[《净亏邀请-会员接口》](../../../melbet_sport-api/前台/独立活动/净亏邀请-会员接口.md)。
|
|
|
+独立活动菜单和按钮由后台前端配置;读取、保存与上下架、记录权限分别为 `admin/promotion`、`admin/promotion/submit`、`admin/promotion/records`,本次没有新增权限。
|