diff --git a/application/admin/view/shopro/order/order/detail.html b/application/admin/view/shopro/order/order/detail.html
index f567298..cd0bd63 100644
--- a/application/admin/view/shopro/order/order/detail.html
+++ b/application/admin/view/shopro/order/order/detail.html
@@ -880,7 +880,7 @@
- 合伙股东分成明细
+ 收益中心分成明细
有分成记录
暂无分成记录
@@ -975,7 +975,7 @@
- 暂无合伙股东分成记录(未产生分成、未支付或尚未日结)
+ 暂无收益分成记录(未产生分成、未支付或尚未日结)
diff --git a/docs/partner-api-contract.md b/docs/partner-api-contract.md
index 18238bd..43087ea 100644
--- a/docs/partner-api-contract.md
+++ b/docs/partner-api-contract.md
@@ -1,6 +1,6 @@
# 收益中心前后端接口约定(身份标签与收益资产)
-> 注:本模块为「收益中心」,「合伙股东」为进阶会员的身份标签(创客/酒道馆/区县)。
+> 注:本模块为「收益中心」。「合伙股东」为独立角色身份之一,创客、酒道馆、区县代理各属于独立角色身份,绝不隶属于合伙股东。
## profile `GET user.user/profile` 增补字段
@@ -18,9 +18,14 @@
}
```
-identities 取值:`taster` | `maker` | `venue` | `county`
-is_partner = 含 maker 或 venue 或 county
-identity_text 例:`品酒师` / `合伙股东 · 创客V5 · 酒道馆`
+identities 取值:`taster` | `maker` | `venue` | `county` | `partner`
+各身份平行独立:
+- 品酒师:`taster`
+- 创客:`maker`(对应等级如创客V1~V6)
+- 酒道馆:`venue`
+- 区县代理:`county`
+- 合伙股东:`partner`(独立角色身份)
+identity_text 拼接示例:`品酒师` / `创客V5 · 酒道馆` / `合伙股东 · 区县代理`
## agent `GET commission.agent` 在原 agent 上增补
diff --git a/docs/会员角色与收益体系规格及代码完善分析.md b/docs/会员角色与收益体系规格及代码完善分析.md
index b75ca23..87e075d 100644
--- a/docs/会员角色与收益体系规格及代码完善分析.md
+++ b/docs/会员角色与收益体系规格及代码完善分析.md
@@ -6,19 +6,20 @@
### 1. 角色定义与身份演进体系
-系统包含 **4 个业务层级角色** 与 **1 个核心荣誉身份标识**。
+系统包含 **5 个独立平行的业务角色身份**,各个角色身份权责清晰,**严禁将「合伙股东」作为上位统称**(创客、酒道馆、区县代理均为独立角色身份,绝不隶属于合伙股东):
-| 角色/标识 | 角色性质 | 准入/获得条件 | 互斥与共存规则 | 核心定位 |
+| 角色身份名称 | 身份性质 | 准入/获得条件 | 互斥与共存规则 | 核心定位与业务权益 |
| :--- | :--- | :--- | :--- | :--- |
-| **品酒师** | 基础会员角色 | 所有用户注册默认即为品酒师(系统分销等级 `level = 1`)。
*(注:若启用考核门槛,为直推 3 单或伞下 1 人升级)* | 与创客**互斥**(升级创客后自动脱离品酒师身份) | 基础消费与推广会员 |
-| **创客** | 进阶层级角色 | 由品酒师升级而来,细分为 **V1 ~ V6** 六个等级(对应系统 `level = 2 ~ 7`),后台可灵活设置升级条件与权益 | 与品酒师**互斥**;可与酒道馆、区县代理**叠加共存** | 团队核心骨干 |
-| **酒道馆** | 特殊业务角色 | 后台独立开通/授权(系统标识 `is_venue = 1`) | 独立身份标识,可与创客、区县代理**叠加共存** | 实体/线下业务枢纽 |
-| **区县代理** | 区域代理角色 | 后台独立开通/绑定特定行政区划(系统标识 `is_county = 1`) | 独立身份标识,可与创客、酒道馆**叠加共存** | 区域渠道领头人 |
-| **合伙股东** | **专属身份标识** | 会员只要满足:**创客 (V1~V6)**、**酒道馆**、**区县代理** 中的任意一个或多个,系统自动点亮「合伙股东」复合身份标识 | 纯荣誉与身份标识,非单一职级;品酒师不可获得此标识 | 高阶合伙人象征 |
+| **品酒师** | 基础会员身份 | 所有用户注册默认即为品酒师(系统分销等级 `level = 1`)。
*(注:若启用考核门槛,为直推 3 单或伞下 1 人升级)* | 与创客**互斥**(升级创客后自动覆盖品酒师身份) | **基础消费与推广**:推三返一(398/400/600 循环返现)、每日 GMV 1:1 马豆分红、1.5 倍兑换券释放 |
+| **创客** | 进阶层级身份 | 由品酒师升级而来,细分为 **V1 ~ V6** 六个等级(对应系统 `level = 2 ~ 7`),后台可灵活设置升级门槛 | 与品酒师**互斥**;可与酒道馆、区县代理、合伙股东**独立叠加** | **团队核心骨干**:继承品酒师权益,享创客极差奖(20~120元阶梯)、同级平级奖(10%)、被超越奖(5%) |
+| **酒道馆** | 实体枢纽身份 | 后台独立审核开通/授权(系统标识 `is_venue = 1`) | 独立身份,可与创客、区县代理、合伙股东**独立叠加** | **实体/线下业务枢纽**:享团队订单收益(50元/单)、酒道馆平级奖(10%)、全网每单 100 元平台均分奖池 |
+| **区县代理** | 区域代理身份 | 后台独立开通/绑定特定行政区划(系统标识 `is_county = 1`) | 独立身份,可与创客、酒道馆、合伙股东**独立叠加** | **区域渠道领头人**:享团队拆分奖(独享100元或与馆各50元)、区县平级奖(10%)、全网每单 50 元平台均分奖池 |
+| **合伙股东** | **独立高阶角色身份** | 独立身份,按股东准入标准/后台独立开通授信 | **独立角色身份**,不是创客/馆/县的统称;可与其他身份独立并存 | **资本与顶层合伙身份**:享有股东专属权益与平台顶层红利 |
-> **身份互斥与共存规则总结**:
-> 1. **品酒师 ↔ 创客 严格互斥**:用户等级由低到高演进,升级创客即覆盖品酒师等级,但创客**全额继承品酒师所有权益**。
-> 2. **多重身份可叠加**:同一个会员可以同时兼具「创客 V5 + 酒道馆 + 区县代理」,且系统合并展示为:「合伙股东 · 创客V5 · 酒道馆 · 区县代理」。
+> **身份关系与规范说明**:
+> 1. **严禁概念误导**:**「合伙股东」只是一个独立的角色身份**,创客、酒道馆、区县代理各有其独立的业务逻辑与结算规则,**绝不是所有角色都在合伙股东下**!
+> 2. **品酒师 ↔ 创客 严格互斥**:用户等级由低到高演进,升级创客即覆盖品酒师等级,创客全额继承品酒师基础权益。
+> 3. **多重身份独立叠加**:同一个会员若同时具备多种资格,系统直接按实际身份平行展示(例如:`创客V5 · 酒道馆` 或 `合伙股东 · 区县代理`),严禁无故给所有创客、馆、县强制前缀“合伙股东”。
---
@@ -173,8 +174,8 @@
- **实现机制**:
- 复用了 `fa_shopro_commission_level`,`level = 1` 为品酒师,`level = 2~7` 分别映射为创客 V1~V6。因为同一个用户在表中只有一行 `level` 字段,天然保证了**品酒师与创客绝不可能同时存在**。
- 酒道馆(`is_venue`)与区县代理(`is_county`)作为布尔标记加在 `fa_shopro_commission_agent` 表中,支持多选叠加。
- - `IdentityService::build()` 动态判断:若 `level >= 2` 或 `is_venue=1` 或 `is_county=1`,则自动赋予 `is_partner = true`,并输出拼接文本(如 `合伙股东 · 创客V5 · 酒道馆`)。
-- **完善度**:与业务需求完全吻合。
+ - **重要纠偏与规范**:**「合伙股东」是独立角色身份**,不是创客/馆/县的统称上级。历史代码中若将创客、酒道馆、区县强行赋予 `is_partner=true` 并前缀“合伙股东”属于概念误导,业务规范已澄清:创客即创客、酒道馆即酒道馆、区县即区县、合伙股东即合伙股东,各身份平行独立。
+- **完善度**:已纠正概念定义,业务权责边界已明确。
#### ② 品酒师「推三返一」
- **代码位置**:[`Push3Reward.php`](file:///Users/chen/Desktop/xbiuld/henglianshutong/addons/shopro/service/partner/Push3Reward.php)
diff --git a/docs/收益中心-后台与用户端功能规格.md b/docs/收益中心-后台与用户端功能规格.md
index f4f1ff5..c1aff20 100644
--- a/docs/收益中心-后台与用户端功能规格.md
+++ b/docs/收益中心-后台与用户端功能规格.md
@@ -8,9 +8,10 @@
> [!IMPORTANT]
> ### 核心概念澄清(避免误导)
> 1. **系统定位**:本模块在管理后台与用户端统一命名为**「收益中心」**(原「分销中心」)。
-> 2. **「合伙股东」只是会员的身份标签,不是系统/模块名称**:
-> - **「品酒师」**:注册即是的基础分销会员身份标签(对应分销商 `level = 1`)。
-> - **「合伙股东」**:进阶会员身份标签。当会员升级为创客(`level >= 2`,创客 V1–V6)、被后台开通酒道馆(`is_venue = 1`)或开通区县代理(`is_county = 1`)时,获得「合伙股东」身份标签(例如:“合伙股东 · 创客V5 · 酒道馆”)。
+> 2. **「合伙股东」只是一个独立的角色身份,不是所有角色都在合伙股东下(切勿误导)**:
+> - 系统包含 **品酒师**、**创客 (V1–V6)**、**酒道馆**、**区县代理**、**合伙股东** 等独立平行的角色身份。
+> - **「合伙股东」本身仅是一个独立的高阶角色身份**,创客、酒道馆、区县代理各司其职,**绝不隶属于合伙股东**。
+> - 各角色身份平行独立,严禁将所有进阶角色归属于合伙股东名下,更不可强行加挂“合伙股东·创客”等混淆关系的命名。
> 3. 后台所有菜单、页面表头及用户端导航,均统一按功能命名(如「收益中心」、「成员档案」、「收益流水」),切勿将整套系统误叫为“合伙股东”。
---
@@ -21,7 +22,7 @@
| 角色 | 他要完成的事 |
|---|---|
-| 运营 | 开通酒道馆/区县、改创客等级、查一笔订单钱分给了谁 |
+| 运营 | 开通酒道馆/区县/合伙股东、改创客等级、查一笔订单钱分给了谁 |
| 财务 | 按日对账:GMV、发放合计、均分、马豆、兑换券;导出 |
| 客服 | 用户说「我没收到钱」时,3 分钟内看到原因(不活跃 / 无上级 / 已退款) |
| 超管 | 改规则数字(级差 20、均分 100),改完只影响新单 |
@@ -31,8 +32,9 @@
| 身份 | 他打开 App 要立刻看到 |
|---|---|
| 品酒师 | 我是品酒师;直推满 3 单返一圈钱;我的兑换券还剩多少天 |
-| 创客 V1–V6 | 合伙股东徽章 + 等级;极差/平级进佣金 |
-| 酒道馆 / 区县 | 多一枚身份标;团队奖和平台均分能分开看 |
+| 创客 V1–V6 | 创客专属徽章 + 等级;极差/平级进佣金 |
+| 酒道馆 / 区县 | 独立身份标;团队奖和平台均分能分开看 |
+| 合伙股东 | 专属合伙股东身份徽章与对应权益 |
| 所有人 | 30 天没下单时,收益页明确写「本月无自购,暂停发放」 |
### 1.3 本期不做(避免范围膨胀)
@@ -51,7 +53,7 @@
```
商城
└─ 收益中心(原「分销中心」)
- ├─ 成员档案 原分销商:查人、改上级、开通酒道馆/区县(显示品酒师/合伙股东身份)
+ ├─ 成员档案 原分销商:查人、改上级、开通酒道馆/区县/合伙股东(显示品酒师/创客/酒道馆/区县/合伙股东身份)
├─ 身份等级 原分销商等级:品酒师 / 创客 V1–V6
├─ 计奖商品 原分销商品:是否参与计奖
├─ 收益流水 即时奖 / 均分 / 马豆等入账与补发退回
@@ -62,7 +64,7 @@
└─ 动态日志 原分销动态
商城 → 商城配置
├─ 分销基础 层级/成为条件等底座(勿把层级改成 0)
- └─ 合伙股东规则 Tab:固定金额、均分、马豆、兑换券规则
+ └─ 收益中心规则 Tab:固定金额、均分、马豆、兑换券规则
```
权限节点(写入 `addons/shopro/config/menu.php`,升级菜单):
@@ -79,14 +81,14 @@
## 3. 后台:改现有页
-### 3.1 分销设置 · 新增 Tab「合伙股东」
+### 3.1 分销设置 · 新增 Tab「收益中心规则」
**现有:** `application/admin/view/shopro/config/index.html` + `public/assets/js/backend/shopro/config.js` 已有分销 Tab。
**处理:** 同一页加第三个分组,保存进 `shop.commission.partner.*`,不要新菜单。
| 区块 | 字段 | 控件 | 默认 | 校验 / 说明文案 |
|---|---|---|---|---|
-| 总控 | 启用合伙股东结算 | 开关 | 开 | 关闭后新单不再记即时奖,旧流水不动 |
+| 总控 | 启用收益中心新结算 | 开关 | 开 | 关闭后新单不再记即时奖,旧流水不动 |
| 总控 | 关闭旧百分比分佣 | 开关 `partner_mode` | 开 | 旁注:不要把「分销层级」改成 0,否则用户端收益中心打不开 |
| 计单 | 合格订单口径 | 单选 | 订单头 | 选项:订单头 / 商品件数 |
| 活跃 | 领取窗口天数 | 数字 | 30 | ≥1 |
@@ -144,8 +146,8 @@
**改:**
-1. 「等级佣金比例」三块(commission_1/2/3)在 `partner_mode` 下改成展示文案:「已切换为合伙股东固定金额,旧百分比不再生效。」仍可折叠看历史配置。
-2. 新增卡片「合伙股东资产」:
+1. 「等级佣金比例」三块(commission_1/2/3)在 `partner_mode` 下改成展示文案:「已切换为收益中心固定金额新模式,旧百分比不再生效。」仍可折叠看历史配置。
+2. 新增卡片「收益中心资产」:
| 字段 | 只读 |
|---|---|
@@ -155,7 +157,7 @@
| 直推计奖序号 | 第 14 单,下一单将返 400 |
| 马豆 / 约合 | |
| 兑换券 总额 / 已释放 / 已使用 / 可用 | |
-| 累计合伙股东现金收益 | 从 `partner_reward` 已入账求和 |
+| 累计现金收益 | 从 `partner_reward` 已入账求和 |
3. 新增 Tab 或按钮「TA 的收益流水」:跳到收益流水页并带 `user_id`。
4. 新增按钮「手工补发 / 扣回」(权限 `reissue`),打开 4.1 的弹窗并预填用户。
@@ -189,7 +191,7 @@
**现有:** 权重、名称、徽章、百分比、升级条件。
**改:**
-- 页面顶警告改为:「等级 1 固定为品酒师;2–7 对应创客 V1–V6。百分比佣金在合伙股东模式下不使用。」
+- 页面顶警告改为:「等级 1 固定为品酒师;2–7 对应创客 V1–V6。百分比佣金在收益中心新模式下不使用。」
- 增加只读映射表:level → 单笔极差基数(读配置 `maker_bonus`,点「去规则里改」跳设置 Tab)。
- 升级条件原样保留:运营可配「直推满 N 人升 V2」等,走现成 `agentUpgrade` 队列。
- 初始化数据:上线脚本插入 7 条等级(若库里已有旧等级,提供「迁移说明」:把旧 level=1 改名为品酒师,新增 2–7)。
@@ -197,7 +199,7 @@
### 3.6 分销商品
**现有:** 是否参与分销。
-**改文案:** 「参与分销 / 合伙股东计奖」。
+**改文案:** 「参与分销 / 收益中心计奖」。
关闭的商品:不计入推三返一、极差、拆分、均分、马豆 N、兑换券。
不改表结构。
@@ -309,7 +311,7 @@ ID、入账时间、受益人、买家、订单、奖项、角色、金额、马
### 5.1 上线当天
1. 跑 SQL,插入 7 条等级。
-2. 分销设置:成为分销商 = 注册即是;关掉申请表单;打开合伙股东结算。
+2. 分销设置:成为分销商 = 注册即是;关掉申请表单;打开收益中心结算。
3. 用测试号 A 推荐 B,B 下一单,A 应到账 398。
4. 后台把 A 调成创客 V5 + 酒道馆,再让 C 在 B 下面下单,核对拆账。
@@ -364,17 +366,18 @@ ID、入账时间、受益人、买家、订单、奖项、角色、金额、马
[品酒师]
```
-或
+或多重身份:
```
张三
-[合伙股东] [创客V5] [酒道馆]
+[创客V5] [酒道馆]
```
+(若被授予合伙股东身份,则独立并列显示 `[合伙股东]`)
规则:
- 仅品酒师:一枚灰/棕标签「品酒师」。
-- `is_partner`:先一枚主标「合伙股东」,再跟创客等级、酒道馆、区县。
+- 独立展示:各身份(创客等级、酒道馆、区县、合伙股东)平行独立,按实际资格呈现,**严禁将合伙股东作为其他角色的统称或强制前缀**。
- 最多一行,超出换行不撑破头像区。
- 点击徽章 → `/pages/commission/index`(未登录走登录)。
@@ -477,7 +480,7 @@ ID、入账时间、受益人、买家、订单、奖项、角色、金额、马
```
`filterUserNum` 文案「直推 x 人」可保留。
-顶上「团队分销商人数」改文案为「团队合伙股东人数」可选,避免一次改太多;若改,一级/二级同步改「一级成员」。
+顶上「团队分销商人数」改文案为「团队成员人数」,一级/二级同步改「一级成员」。
数据:`GET commission.agent/team` 已 with agent,后端 agent 加 `is_venue` `is_county` 即可,前端加两个 `v-if`。
@@ -614,9 +617,9 @@ ID、入账时间、受益人、买家、订单、奖项、角色、金额、马
```json
{
- "identity_text": "合伙股东 · 创客V5 · 酒道馆",
+ "identity_text": "创客V5 · 酒道馆",
"identities": ["maker", "venue"],
- "is_partner": true,
+ "is_partner": false,
"maker_level_name": "创客V5",
"madow": "12.50000000",
"madow_rate": "0.00000750",
@@ -681,7 +684,7 @@ export default {
| ID | 任务 | 文件 | 验收 |
|---|---|---|---|
| U1 | store + api | `user.js` `api/partner.js` `api/index.js` | profile 有徽章字段不报错 |
-| U2 | 用户卡片徽章 | `s-user-card.vue` | 我的页能看到品酒师/合伙股东 |
+| U2 | 用户卡片徽章 | `s-user-card.vue` | 我的页能正确显示各独立身份徽章(品酒师/创客/酒道馆/区县/合伙股东) |
| U3 | 钱包五项 | `s-wallet-card.vue` | 能进收益/马豆/券 |
| U4 | 收益中心改名与警示 | `commission/index.vue` `pages.json` | 30 日无单有黄条 |
| U5 | 身份条/账户卡/菜单 | 三个 components | 馆/县标、四指标、新菜单 |
@@ -706,7 +709,7 @@ export default {
|---|---|---|
| 1 注册 X,A 分享 | X 为品酒师,上级 A | X「我的」徽章品酒师 |
| 2 X 下首单 1398 | A 流水 push3=398;X 有券计划 2097 | A 收益 +398;X 兑换券总额 2097、已释放 0 |
-| 3 把 B 调成 V5 | 身份列变化 | B 徽章变合伙股东·创客V5 |
+| 3 把 B 调成 V5 | 身份列变化 | B 徽章变创客V5 |
| 4 再下一单(链上有两个 V5) | B 极差 100,C 平级 10 | 两人收益明细对应文案 |
| 5 开通 D 酒道馆、E 区县 | 拆分 50+50 | D/E 多标,明细有团队奖 |
| 6 把 A 的自购时间改到 31 天前(测) | A 灰点;新单 A 一条 skip | A 顶栏黄条;明细「未发放」 |
@@ -721,7 +724,7 @@ export default {
给运营的一页纸:
1. 用户默认都是品酒师,不用申请。
-2. 创客/酒道馆/区县你在后台开通,用户端只展示。
+2. 创客/酒道馆/区县/合伙股东在后台独立开通管理,用户端平行展示。
3. 钱进「收益」可提现;马豆只能看值;兑换券只能兑货,365 天慢慢出来。
4. 30 天自己不买,推广费停发,不是封号。
5. 改规则只影响以后的单。
@@ -731,6 +734,6 @@ export default {
## 16. 和主技术方案的关系
-- 表结构、钩子、算法:只看 `合伙股东收益体系二次开发文档.md`。
+- 表结构、钩子、算法:只看 `收益中心二次开发文档.md`。
- 页面、字段、文案、验收剧本:只看本文。
- 两边冲突时,以算法文档的「建议默认」为准,本文跟默认走。
diff --git a/docs/收益中心二次开发文档.md b/docs/收益中心二次开发文档.md
index 2c55833..61ce659 100644
--- a/docs/收益中心二次开发文档.md
+++ b/docs/收益中心二次开发文档.md
@@ -10,9 +10,10 @@
> [!IMPORTANT]
> ### 核心概念澄清(避免误导)
> 1. **系统定位**:本模块为**会员收益体系**,后台一级菜单与用户端统一命名为**「收益中心」**(原「分销中心」)。
-> 2. **「合伙股东」只是会员的身份标签,不是系统/模块名称**:
-> - **「品酒师」**:注册即是的基础分销会员身份标签(对应分销商 `level = 1`)。
-> - **「合伙股东」**:进阶会员身份标签。当会员满足创客(`level >= 2`,对应创客 V1–V6)、酒道馆(`is_venue = 1`)或区县代理(`is_county = 1`)时,系统为该会员附加「合伙股东」身份标签(展示为:“合伙股东 · 创客V5 · 酒道馆”)。
+> 2. **「合伙股东」只是一个独立的角色身份,不是所有角色都在合伙股东下(切勿误导)**:
+> - 系统中包含 **品酒师**、**创客 (V1–V6)**、**酒道馆**、**区县代理**、**合伙股东** 等独立平行的角色身份。
+> - **「合伙股东」本身仅是一个独立的高阶角色身份**,创客、酒道馆、区县代理各司其职,**绝不隶属于合伙股东**。
+> - 各角色身份平行独立,严禁将所有进阶角色归属于合伙股东名下,更不可强行加挂“合伙股东·创客”等混淆关系的命名。
> 3. 后台所有菜单、页面表头及用户端导航,均统一按功能命名(如「收益中心」、「成员档案」、「收益流水」),切勿将整套系统误叫为“合伙股东”。
---
@@ -24,7 +25,7 @@
| 商城后端 | `addons/shopro`、`application/admin` | 完整,Shopro Plus 3.2.0 |
| 管理后台前端 | `application/admin/view/shopro` + `public/assets/js/backend/shopro` | 完整,Element Plus + RequireJS |
| 用户端 | **`uniapp/`** | Shopro sheep 3.1.0,接口前缀 `/addons/shopro/`,与后端完全对齐 |
-| 现有分销 UI | `uniapp/pages/commission/*` | 只有等级名徽章 + 百分比分销中心,没有品酒师/合伙股东/马豆/释放券 |
+| 现有分销 UI | `uniapp/pages/commission/*` | 只有等级名徽章 + 百分比分销中心,没有品酒师/创客/酒道馆/区县/合伙股东等新身份/马豆/释放券 |
用户端请求:
@@ -197,20 +198,22 @@ PayOper 支付成功
| level | 名称 | 业务身份 | 单笔极差基数(建议) |
|---|---|---|---|
-| 1 | 品酒师 | 普通会员 | 0(不参与极差) |
-| 2 | 创客V1 | 合伙股东·创客 | 20 |
-| 3 | 创客V2 | 合伙股东·创客 | 40 |
-| 4 | 创客V3 | 合伙股东·创客 | 60 |
-| 5 | 创客V4 | 合伙股东·创客 | 80 |
-| 6 | 创客V5 | 合伙股东·创客 | 100 |
-| 7 | 创客V6 | 合伙股东·创客 | 120 |
+| 1 | 品酒师 | 基础会员 | 0(不参与极差) |
+| 2 | 创客V1 | 进阶骨干·创客 | 20 |
+| 3 | 创客V2 | 进阶骨干·创客 | 40 |
+| 4 | 创客V3 | 进阶骨干·创客 | 60 |
+| 5 | 创客V4 | 进阶骨干·创客 | 80 |
+| 6 | 创客V5 | 进阶骨干·创客 | 100 |
+| 7 | 创客V6 | 进阶骨干·创客 | 120 |
-判定:
+判定说明:
```
-是品酒师 = agent 存在且 level == 1
-是创客 = agent 存在且 level >= 2
-合伙股东 = 创客 或 酒道馆 或 区县代理
+是品酒师 = agent 存在且 level == 1
+是创客 = agent 存在且 level >= 2(细分为创客V1~V6)
+是酒道馆 = is_venue == 1
+是区县代理 = is_county == 1
+是合伙股东 = 独立高阶角色身份(后台独立开通/授予,各角色身份独立平行,绝不把创客/馆/县归为合伙股东)
```
一个人只有一个 `level`,所以**不可能同时是品酒师和创客**,与需求一致。
@@ -653,7 +656,7 @@ CREATE TABLE `fa_shopro_partner_voucher_plan` (
}
```
-`identities` 例:`["maker","venue"]`,`identity_text`:`合伙股东 · 创客V5 · 酒道馆`。
+`identities` 例:`["maker","venue"]`,`identity_text`:`创客V5 · 酒道馆`(各身份独立平行展示)。
徽章继续用 `level_info.name` + `level_info.image`,前端可再画酒道馆/区县小标。
### 9.2 扩展 `GET /addons/shopro/user.user/profile`
@@ -682,7 +685,7 @@ CREATE TABLE `fa_shopro_partner_voucher_plan` (
| 页 | 文件 | 改动 |
|---|---|---|
-| 分销设置 | `view/shopro/config/index.html` + `js/backend/shopro/config.js` | 增加「合伙股东」Tab |
+| 分销设置 | `view/shopro/config/index.html` + `js/backend/shopro/config.js` | 增加「收益中心规则」Tab |
| 分销商编辑 | `commission/agent` 的 edit | `is_venue` `is_county` `county_code` |
| 分销商列表 | `agent.js` / `agent/index.html` | 筛酒道馆/区县,列身份 |
| 等级 | `commission/level/add.html` | 文案改为级差基数;`commission_rules` 可空;展示 `maker_bonus[level]` |
@@ -691,9 +694,9 @@ CREATE TABLE `fa_shopro_partner_voucher_plan` (
| 菜单 | 控制器 | 能力 |
|---|---|---|
-| 合伙股东 / 收益流水 | `shopro/partner/reward` | 筛选、导出、手工补发/扣回 |
-| 合伙股东 / 日结对账 | `shopro/partner/daily` | 按日看池子、重跑昨天 |
-| 合伙股东 / 兑换券 | `shopro/partner/voucher` | 计划、已释放、已使用 |
+| 收益中心 / 收益流水 | `shopro/partner/reward` | 筛选、导出、手工补发/扣回 |
+| 收益中心 / 日结对账 | `shopro/partner/daily` | 按日看池子、重跑昨天 |
+| 收益中心 / 兑换券 | `shopro/partner/voucher` | 计划、已释放、已使用 |
样式、筛选器、导出照抄 `commission/reward`。
@@ -737,7 +740,7 @@ CREATE TABLE `fa_shopro_partner_voucher_plan` (
|---|---|
| `uniapp/sheep/store/user.js` | `defaultUserInfo` 增加 `identities` `identity_text` `madow` `madow_value` `voucher_available`;`getInfo()` 后即可画徽章,不必等 agent |
| `uniapp/sheep/api/partner.js` | **新建**,见 9.3;在 `sheep/api/index.js` 注册 `partner` |
-| `uniapp/sheep/components/s-user-card/s-user-card.vue` | 昵称下方:`品酒师` 或 `合伙股东 · 创客Vx`,可叠加酒道馆/区县 |
+| `uniapp/sheep/components/s-user-card/s-user-card.vue` | 昵称下方:`品酒师` 或 `创客Vx`,可独立叠加酒道馆/区县/合伙股东等身份徽章 |
| `uniapp/sheep/components/s-wallet-card/s-wallet-card.vue` | 恢复佣金入口;加「马豆」「兑换券」两项(点进新页) |
| `uniapp/pages/commission/index.vue` | `title` 改为「收益中心」 |
| `uniapp/pages/commission/components/commission-info.vue` | `level_info` 一枚 + `is_venue`/`is_county` 两枚 |
diff --git a/docs/收益中心多场景收益模拟测算表.md b/docs/收益中心多场景收益模拟测算表.md
index c10953e..070201c 100644
--- a/docs/收益中心多场景收益模拟测算表.md
+++ b/docs/收益中心多场景收益模拟测算表.md
@@ -1,6 +1,6 @@
# 收益中心 · 多维关系场景收益模拟与财务测算报告
-> 本文档依据恒联数通「收益中心」(合伙股东)二次开发核心代码及业务规则编制,用于模拟分析各种会员层级关系、拓扑链路下的即时收益、日结分红、兑换券释放及平台综合现金拨比。
+> 本文档依据恒联数通「收益中心」二次开发核心代码及业务规则编制,用于模拟分析各种会员层级关系、拓扑链路下的即时收益、日结分红、兑换券释放及平台综合现金拨比。
---
@@ -119,7 +119,7 @@
---
-## 场景五:合伙股东完整大链条(创客 + 酒道馆 + 区县代理 + 双平级)
+## 场景五:多重身份完整大链条(创客 + 酒道馆 + 区县代理 + 双平级)
### 1. 业务关系拓扑
```
@@ -138,11 +138,11 @@
| :--- | :--- | :--- | :--- | :--- |
| **买家 A** | 品酒师 | 兑换券发放 | ¥ 0.00 | 获 2097 元兑换券,按 365 天释放 |
| **推荐人 B**| 品酒师 | 推三返一 | **¥ 398.00** | 直推第 1 单,返现 398 元 |
-| **创客 C** | 合伙股东·创客 V4 | 创客极差奖 | **¥ 80.00** | 链上首位创客,独享 V4 极差 80 元 |
-| **酒道馆 1**| 合伙股东·酒道馆 A| **酒道馆团队奖** | **¥ 50.00** | 链上有馆有县,团队奖拆分获得 50 元 |
-| **酒道馆 2**| 合伙股东·酒道馆 B| **酒道馆平级奖** | **¥ 5.00** | 第二个酒道馆,获下级馆团队奖的 10%:$50 \times 10\% = 5$ 元 |
-| **区县代理1**| 合伙股东·区县甲 | **区县团队奖** | **¥ 50.00** | 链上有馆有县,团队奖拆分获得 50 元 |
-| **区县代理2**| 合伙股东·区县乙 | **区县平级奖** | **¥ 5.00** | 第二个区县代理,获下级县团队奖的 10%:$50 \times 10\% = 5$ 元 |
+| **创客 C** | 创客 V4 | 创客极差奖 | **¥ 80.00** | 链上首位创客,独享 V4 极差 80 元 |
+| **酒道馆 1**| 酒道馆 A | **酒道馆团队奖** | **¥ 50.00** | 链上有馆有县,团队奖拆分获得 50 元 |
+| **酒道馆 2**| 酒道馆 B | **酒道馆平级奖** | **¥ 5.00** | 第二个酒道馆,获下级馆团队奖的 10%:$50 \times 10\% = 5$ 元 |
+| **区县代理1**| 区县代理 甲 | **区县团队奖** | **¥ 50.00** | 链上有馆有县,团队奖拆分获得 50 元 |
+| **区县代理2**| 区县代理 乙 | **区县平级奖** | **¥ 5.00** | 第二个区县代理,获下级县团队奖的 10%:$50 \times 10\% = 5$ 元 |
### 3. 财务穿透与拨比测算
- **本单即时现金总支出**:$398 + 80 + 50 + 5 + 50 + 5 = 588.00$ 元。
@@ -165,7 +165,7 @@
| 收益人 | 会员身份 / 标签 | 获得奖项 | 现金收益 | 计算规则与说明 |
| :--- | :--- | :--- | :--- | :--- |
| **推荐人 B** | 品酒师 | 推三返一 | **¥ 400.00** | 第 2 单享受 400 元 |
-| **区县代理甲** | 合伙股东·区县 | **区县团队奖** | **¥ 100.00** | **链上无酒道馆,区县代理独享全额 100 元团队奖** |
+| **区县代理甲** | 区县代理 | **区县团队奖** | **¥ 100.00** | **链上无酒道馆,区县代理独享全额 100 元团队奖** |
- **本单现金分润总额**:$400 + 100 = 500$ 元。
- **本单现金拨比率**:$500 / 1398 \approx 35.77\%$。
@@ -184,12 +184,12 @@
| 收益人 | 身份 | 获得奖项 | 现金收益 | 计算规则与说明 |
| :--- | :--- | :--- | :--- | :--- |
-| **馆主 A (买家)** | 合伙股东·酒道馆 | 推三返一 | ¥ 0.00 | 自购不产生推三返一(记录 skip) |
-| **馆主 A (买家)** | 合伙股东·酒道馆 | **酒道馆团队奖** | **¥ 50.00** | **自购计入团队链头,自购自得馆团队奖 50 元** |
-| **馆主 A (买家)** | 合伙股东·酒道馆 | 兑换券计划 | ¥ 0.00 (券 2097) | 自身获得 2097 元产品兑换券,分 365 天释放 |
-| **上级馆 B** | 合伙股东·酒道馆 | **酒道馆平级奖** | **¥ 5.00** | 获得馆主 A 自购团队奖的 10%:$50 \times 10\% = 5$ 元 |
+| **馆主 A (买家)** | 酒道馆 | 推三返一 | ¥ 0.00 | 自购不产生推三返一(记录 skip) |
+| **馆主 A (买家)** | 酒道馆 | **酒道馆团队奖** | **¥ 50.00** | **自购计入团队链头,自购自得馆团队奖 50 元** |
+| **馆主 A (买家)** | 酒道馆 | 兑换券计划 | ¥ 0.00 (券 2097) | 自身获得 2097 元产品兑换券,分 365 天释放 |
+| **上级馆 B** | 酒道馆 | **酒道馆平级奖** | **¥ 5.00** | 获得馆主 A 自购团队奖的 10%:$50 \times 10\% = 5$ 元 |
-- **财务特征**:合伙股东自购能享受到对应身份的团队奖返点,增强会员自购粘性。
+- **财务特征**:酒道馆主自购能享受到对应身份的团队奖返点,增强会员自购粘性。
---
diff --git a/public/assets/js/backend/shopro/commission/agent.js b/public/assets/js/backend/shopro/commission/agent.js
index af0a298..2d5c623 100644
--- a/public/assets/js/backend/shopro/commission/agent.js
+++ b/public/assets/js/backend/shopro/commission/agent.js
@@ -309,6 +309,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
level: Number(row.level || 1),
is_venue: Number(row.is_venue || 0),
is_county: Number(row.is_county || 0),
+ is_partner: Number(row.is_partner || 0),
county_code: row.county_code || '',
area_arr: row.county_code ? findAreaPath(identity.areaSelect, row.county_code) || [] : [],
upgrade_lock: Number(row.upgrade_lock || 0),
@@ -331,18 +332,14 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
}
}
- function identityLabel(level, isVenue, isCounty) {
+ function identityLabel(level, isVenue, isCounty, isPartner) {
const lv = identity.levels.find(i => Number(i.level) === Number(level))
let name = lv?.name || (Number(level) === 1 ? '品酒师' : `创客V${Number(level) - 1}`)
- const tags = []
- if (Number(level) >= 2) tags.push(name)
- else tags.push(name)
+ const tags = [name]
if (Number(isVenue)) tags.push('酒道馆')
if (Number(isCounty)) tags.push('区县代理')
- if (Number(level) >= 2 || Number(isVenue) || Number(isCounty)) {
- return '合伙股东 · ' + tags.filter((v, i, a) => a.indexOf(v) === i).join(' · ')
- }
- return tags[0]
+ if (Number(isPartner)) tags.push('合伙股东')
+ return tags.filter((v, i, a) => a.indexOf(v) === i).join(' · ')
}
function onSubmitIdentity() {
@@ -351,7 +348,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
return
}
const { ElMessageBox } = ElementPlus
- const afterText = identityLabel(identity.form.level, identity.form.is_venue, identity.form.is_county)
+ const afterText = identityLabel(identity.form.level, identity.form.is_venue, identity.form.is_county, identity.form.is_partner)
const name = identity.form.nickname || identity.form.user_id
ElMessageBox.confirm(
`将「${name}」从 ${identity.form.before_text || '当前身份'} 调整为 ${afterText}。已入账收益不追溯。确定?`,
@@ -544,6 +541,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
level: Number(state.data.level || 1),
is_venue: Number(state.data.is_venue || 0),
is_county: Number(state.data.is_county || 0),
+ is_partner: Number(state.data.is_partner || 0),
county_code: state.data.county_code || '',
area_arr: [],
upgrade_lock: Number(state.data.upgrade_lock || 0),
@@ -563,14 +561,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
}
const { ElMessageBox } = ElementPlus
const lv = identity.levels.find(i => Number(i.level) === Number(identity.form.level))
- let after = lv?.name || '品酒师'
- if (Number(identity.form.is_venue) || Number(identity.form.is_county) || Number(identity.form.level) >= 2) {
- const parts = ['合伙股东']
- if (Number(identity.form.level) >= 2) parts.push(lv?.name || `创客V${identity.form.level - 1}`)
- if (Number(identity.form.is_venue)) parts.push('酒道馆')
- if (Number(identity.form.is_county)) parts.push('区县代理')
- after = parts.join(' · ')
- }
+ const tags = []
+ if (Number(identity.form.level) >= 2) tags.push(lv?.name || `创客V${identity.form.level - 1}`)
+ else tags.push(lv?.name || '品酒师')
+ if (Number(identity.form.is_venue)) tags.push('酒道馆')
+ if (Number(identity.form.is_county)) tags.push('区县代理')
+ if (Number(identity.form.is_partner)) tags.push('合伙股东')
+ const after = tags.filter((v, i, a) => a.indexOf(v) === i).join(' · ')
ElMessageBox.confirm(
`将「${identity.form.nickname}」从 ${identity.form.before_text || '当前身份'} 调整为 ${after}。已入账收益不追溯。确定?`,
'确认调整身份',
diff --git a/public/assets/js/backend/shopro/commission/level.js b/public/assets/js/backend/shopro/commission/level.js
index 91c543b..e97c639 100644
--- a/public/assets/js/backend/shopro/commission/level.js
+++ b/public/assets/js/backend/shopro/commission/level.js
@@ -33,7 +33,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
}
function onGotoPartnerConfig() {
- Fast.api.open('shopro/config?tab=shopro/config/partner', '合伙股东规则')
+ Fast.api.open('shopro/config?tab=shopro/config/partner', '收益中心规则')
}
function onAdd() {
diff --git a/tests/partner/AgentDetailTest.php b/tests/partner/AgentDetailTest.php
index c42c4c6..9c46037 100644
--- a/tests/partner/AgentDetailTest.php
+++ b/tests/partner/AgentDetailTest.php
@@ -133,7 +133,7 @@ class AgentDetailTest
$data = $response->getData();
$this->assert($data['code'] === 1 || $data['code'] === 0, '详情响应格式符合规范 (code/msg/data)');
$this->assert(isset($data['data']['user_id']), '详情数据包含 user_id');
- $this->assert(isset($data['data']['active_status_text']), '详情数据包含合伙股东活跃状态扩展字段');
+ $this->assert(isset($data['data']['active_status_text']), '详情数据包含成员自购活跃状态扩展字段');
}
} catch (\Throwable $e) {
$this->assert(false, '详情接口测试执行异常: ' . $e->getMessage());
diff --git a/tests/partner/DashboardWealthTest.php b/tests/partner/DashboardWealthTest.php
index c8f8a8f..e175536 100644
--- a/tests/partner/DashboardWealthTest.php
+++ b/tests/partner/DashboardWealthTest.php
@@ -110,7 +110,7 @@ class DashboardWealthTest
'total() 返回完整的 voucher_data 消费兑换券杠杆资金池指标');
$this->assert(!empty($network) && isset($network['maker_count'], $network['taster_count'], $network['active_rate']),
- 'total() 返回完整的 partner_network 合伙股东活力分布');
+ 'total() 返回完整的 partner_network 团队成员活力分布');
$this->assert(!empty($network['role_list']) && is_array($network['role_list']),
'total() 返回 role_list 全角色身份矩阵列表');
@@ -182,7 +182,7 @@ class DashboardWealthTest
}
/**
- * 测试 4:排行与对账 ranking() 合伙股东收益排行与最新日结
+ * 测试 4:排行与对账 ranking() 收益排行榜与最新日结
*/
public function testRankingPartnerAndDailyData()
{
@@ -193,7 +193,7 @@ class DashboardWealthTest
$partnerRanking = $data['partner_ranking'] ?? null;
$recentReport = $data['daily_report_recent'] ?? null;
- $this->assert(is_array($partnerRanking), 'ranking() 返回 partner_ranking 合伙股东收益榜');
+ $this->assert(is_array($partnerRanking), 'ranking() 返回 partner_ranking 收益排行榜');
if (!empty($partnerRanking)) {
$top1 = $partnerRanking[0];
$this->assert(isset($top1['user_id'], $top1['nickname'], $top1['total_income'], $top1['identity_text']),
@@ -292,7 +292,7 @@ class DashboardWealthTest
}
/**
- * 测试 8:自购雷达纯净性检验(仅合伙股东身份纳入考核,杜绝品酒师与普通会员混入)
+ * 测试 8:自购雷达纯净性检验(进阶角色创客/馆/县/股东纳入考核,杜绝品酒师与普通会员混入)
*/
public function testPartnerShareholderRadarPurity()
{
@@ -304,30 +304,30 @@ class DashboardWealthTest
$warningList = $operation['warning_list'] ?? [];
$pendingList = $operation['pending_renew_list'] ?? [];
- // 验证预警名单中所有人均为合伙股东(创客V1~V6/酒道馆/区县)
+ // 验证预警名单中所有人均为进阶角色(创客V1~V6/酒道馆/区县/合伙股东)
$hasNonPartnerInWarning = false;
foreach ($warningList as $wUser) {
$levelText = $wUser['level_text'] ?? '';
- if (strpos($levelText, '品酒师') !== false && strpos($levelText, '合伙股东') === false) {
+ if (strpos($levelText, '品酒师') !== false && strpos($levelText, '创客') === false && strpos($levelText, '酒道馆') === false && strpos($levelText, '区县') === false && strpos($levelText, '合伙股东') === false) {
$hasNonPartnerInWarning = true;
}
}
- $this->assert(!$hasNonPartnerInWarning, "自购临期预警名单严禁混入普通会员或品酒师,100%为合伙股东身份");
+ $this->assert(!$hasNonPartnerInWarning, "自购临期预警名单严禁混入普通会员或基础品酒师,100%为进阶角色身份");
- // 验证待续期名单中所有人均为合伙股东
+ // 验证待续期名单中所有人均为进阶角色
$hasNonPartnerInPending = false;
foreach ($pendingList as $pUser) {
$levelText = $pUser['level_text'] ?? '';
- if (strpos($levelText, '品酒师') !== false && strpos($levelText, '合伙股东') === false) {
+ if (strpos($levelText, '品酒师') !== false && strpos($levelText, '创客') === false && strpos($levelText, '酒道馆') === false && strpos($levelText, '区县') === false && strpos($levelText, '合伙股东') === false) {
$hasNonPartnerInPending = true;
}
}
- $this->assert(!$hasNonPartnerInPending, "自购买超期待续期名单严禁混入普通会员或品酒师,100%为合伙股东身份");
+ $this->assert(!$hasNonPartnerInPending, "自购买超期待续期名单严禁混入普通会员或基础品酒师,100%为进阶角色身份");
// 验证 partner_network 中 active_rate 正确性
$partnerNetwork = $data['partner_network'] ?? [];
$activeRate = $partnerNetwork['active_rate'] ?? null;
- $this->assert($activeRate !== null && $activeRate >= 0 && $activeRate <= 100, "合伙股东自购达标率 partner_network.active_rate({$activeRate}%) 合法且在区间内");
+ $this->assert($activeRate !== null && $activeRate >= 0 && $activeRate <= 100, "进阶成员自购达标率 partner_network.active_rate({$activeRate}%) 合法且在区间内");
}
}
diff --git a/uniapp/pages/commission/team.vue b/uniapp/pages/commission/team.vue
index 7ca3219..bc55cb1 100644
--- a/uniapp/pages/commission/team.vue
+++ b/uniapp/pages/commission/team.vue
@@ -54,14 +54,14 @@
-
+
- 合伙股东总数(人)
+ 分销成员总数(人)
{{ headerNum('child_agent_count_all') }}
@@ -70,7 +70,7 @@
:class="{ 'sub-active': state.currentFilter === 'partner' && state.currentLevelTab === '1' }"
@tap.stop="onSelectHeaderTab('1', 'partner')"
>
- 一级合伙
+ 一级成员
{{ headerNum('child_agent_count_1') }}
- 二级合伙
+ 二级成员
{{ headerNum('child_agent_count_2') }}
diff --git a/uniapp/sheep/components/s-user-card/s-user-card.vue b/uniapp/sheep/components/s-user-card/s-user-card.vue
index 8b8a077..f27630e 100644
--- a/uniapp/sheep/components/s-user-card/s-user-card.vue
+++ b/uniapp/sheep/components/s-user-card/s-user-card.vue
@@ -24,13 +24,11 @@
class="identity-row ss-flex ss-col-center ss-flex-wrap"
@tap="onBadgeTap"
>
- 品酒师
-
- 合伙股东
- {{ makerLevelName }}
- 酒道馆
- 区县
-
+ 品酒师
+ {{ makerLevelName }}
+ 酒道馆
+ 区县
+ 合伙股东
@@ -113,18 +111,6 @@
const identityText = computed(() => userInfo.value?.identity_text || '');
- const isPartner = computed(() => {
- if (userInfo.value?.is_partner) return true;
- if (identities.value.some((item) => ['maker', 'venue', 'county'].includes(item))) return true;
- return ['合伙股东', '创客', '酒道馆', '区县'].some((key) => identityText.value.includes(key));
- });
-
- const isTasterOnly = computed(() => {
- if (isPartner.value) return false;
- if (identities.value.includes('taster')) return true;
- return identityText.value === '品酒师';
- });
-
const makerLevelName = computed(() => userInfo.value?.maker_level_name || '');
const hasVenue = computed(
@@ -135,7 +121,27 @@
() => identities.value.includes('county') || identityText.value.includes('区县'),
);
- const showIdentityBadges = computed(() => isTasterOnly.value || isPartner.value);
+ const hasPartner = computed(() => {
+ return (
+ Boolean(userInfo.value?.is_partner) ||
+ identities.value.includes('partner') ||
+ identityText.value.includes('合伙股东')
+ );
+ });
+
+ const hasTaster = computed(() => {
+ if (makerLevelName.value) return false;
+ return identities.value.includes('taster') || identityText.value.includes('品酒师');
+ });
+
+ const showIdentityBadges = computed(
+ () =>
+ hasTaster.value ||
+ !!makerLevelName.value ||
+ hasVenue.value ||
+ hasCounty.value ||
+ hasPartner.value,
+ );
function onBind() {
showAuthModal('changeMobile');