Pārlūkot izejas kodu

会员显示上级

doge 1 dienu atpakaļ
vecāks
revīzija
58bbd3d4ab

+ 3 - 2
app/Services/UserService.php

@@ -178,12 +178,13 @@ class UserService extends BaseService
 
     /**
      * 列表「上级」列:会员属于独立代理(合营 / 入股)时显示代理账号;否则显示邀请人会员;都没有为 null。
-     * type:agent 代理 / member 会员;label 直接展示,如「合营:agent01」「入股:agent02」「邀请人:member01」。
+     * type:agent 代理 / member 会员;label 直接展示,如「合营:agent01」「邀请人:member01」;入股代理不显示。
      */
     public static function superior($user): ?array
     {
+        // 只显示合营代理;入股代理是平台股东(按利润分成),名下会员不显示为它的下级
         $agent = $user->relationLoaded('systemAgent') ? $user->systemAgent : null;
-        if ($agent) {
+        if ($agent && (int) $agent->type !== \App\Models\Agent\Agent::TYPE_EQUITY) {
             return ['type' => 'agent', 'type_text' => '代理', 'id' => (int) $agent->id, 'account' => (string) $agent->username,
                 'label' => $agent->type_text . ':' . $agent->username . ((int) ($agent->is_test ?? 0) === 1 ? '(测试)' : ''),
                 'agent_type' => (int) $agent->type, 'agent_type_text' => (string) $agent->type_text, 'is_test' => (int) ($agent->is_test ?? 0)];

+ 36 - 6
docs/前端交付/会员列表上级显示代理-前端修改单.md

@@ -2,11 +2,11 @@
 
 ## 现象
 
-通过合营(或入股)代理的域名、邀请码注册的会员,在总后台会员列表里「上级邀请人」一列是空的。
+通过合营代理的域名、邀请码注册的会员,在总后台会员列表里「上级邀请人」一列是空的。
 
 ## 原因
 
-这一列原来用的是返回里的 `agent` 字段。它的名字像代理,实际上是**邀请自己注册的会员**(会员之间的邀请关系)。独立代理(合营 / 入股)的会员没有邀请人会员,只记录了所属代理,所以这一列是空的。
+这一列原来用的是返回里的 `agent` 字段。它的名字像代理,实际上是**邀请自己注册的会员**(会员之间的邀请关系)。合营代理的会员没有邀请人会员,只记录了所属代理,所以这一列是空的。
 
 ## 修改
 
@@ -21,11 +21,41 @@
 
 | 情况 | `superior` |
 |---|---|
-| 会员属于独立代理(合营 / 入股) | `{"type":"agent","type_text":"代理","id":6,"account":"agent06","label":"合营:agent06","agent_type":1,"agent_type_text":"合营","is_test":0}` |
-| 会员由其他会员邀请注册 | `{"type":"member","type_text":"会员","id":101,"account":"inviter01","label":"邀请人:inviter01","member_id":"1001"}` |
+| 会员属于**合营**代理 | `type=agent`,见下面示例 |
+| 会员由其他会员邀请注册 | `type=member`,见下面示例 |
 | 都没有 | `null` |
 
-- `label`:**直接显示**,例如「合营:agent06」「入股:agent07」「邀请人:inviter01」;测试代理会加「(测试)」,例如「合营:agent08(测试)」。
+**入股代理不显示**:入股是平台股东,和平台一起按利润分成,不算会员的上级。入股代理名下的会员,有邀请人时显示邀请人,没有就是 `null`。
+
+合营示例:
+
+```json
+"superior": {
+  "type": "agent",
+  "type_text": "代理",
+  "id": 6,
+  "account": "agent06",
+  "label": "合营:agent06",
+  "agent_type": 1,
+  "agent_type_text": "合营",
+  "is_test": 0
+}
+```
+
+会员邀请示例:
+
+```json
+"superior": {
+  "type": "member",
+  "type_text": "会员",
+  "id": 101,
+  "account": "inviter01",
+  "label": "邀请人:inviter01",
+  "member_id": "1001"
+}
+```
+
+- `label`:**直接显示**,例如「合营:agent06」「邀请人:inviter01」;测试代理会加「(测试)」,例如「合营:agent08(测试)」。
 - 会员同时有代理和邀请人时,`superior` 显示**代理**;邀请人仍然在原来的 `agent` 字段里。(2026-11-10 起注册时以会员邀请码为主,新会员不会再同时有两者,见[会员绑定上级-前端修改单](会员绑定上级-前端修改单.md)。)
 - 原来的 `agent` 字段不变(仍然是邀请人会员)。
 
@@ -40,6 +70,6 @@
 ## 验收
 
 1. 从合营代理 agent06 的域名注册的会员,会员列表「上级」显示「合营:agent06」。
-2. 入股代理的会员显示「入股:账号」;测试代理的会员后面有「(测试)」。
+2. 入股代理的会员不显示入股代理(有邀请人显示邀请人,否则「-」);合营测试代理的会员后面有「(测试)」。
 3. 通过会员邀请链接注册的会员显示「邀请人:账号」。
 4. 直接注册的会员显示「-」。

+ 3 - 2
tests/Integration/AdminRealtimeSummaryTest.php

@@ -190,13 +190,14 @@ class AdminRealtimeSummaryTest extends TestCase
         });
         DB::table('agents')->insert([['id' => 6, 'username' => 'agent06', 'type' => 1, 'is_test' => 0], ['id' => 7, 'username' => 'holder07', 'type' => 2, 'is_test' => 1]]);
         DB::table('users')->where('member_id', '1001')->update(['user_code' => 'INV1001', 'account' => 'inviter1001']);
-        foreach ([['1002', 6, null], ['1003', 7, null], ['1004', null, 'INV1001']] as [$member, $agent, $code]) {
+        foreach ([['1002', 6, null], ['1003', 7, null], ['1004', null, 'INV1001'], ['1005', 7, 'INV1001']] as [$member, $agent, $code]) {
             DB::table('users')->insert(['user_id' => 'u' . $member, 'member_id' => $member, 'agent_id' => $agent, 'agent_user_code' => $code, 'account' => 'm' . $member]);
         }
         $rows = collect(UserService::paginate(['limit' => 10])['data'])->keyBy('member_id');
         $this->assertSame(['agent', '合营:agent06', 'agent06', '合营'], [$rows['1002']['superior']['type'], $rows['1002']['superior']['label'],
             $rows['1002']['superior']['account'], $rows['1002']['superior']['agent_type_text']]);
-        $this->assertSame('入股:holder07(测试)', $rows['1003']['superior']['label']);
+        $this->assertNull($rows['1003']['superior'], 'equity agents are not shown as superior');
+        $this->assertSame('邀请人:inviter1001', $rows['1005']['superior']['label'], 'equity agent member falls back to the inviter');
         $this->assertSame(['member', '邀请人:inviter1001'], [$rows['1004']['superior']['type'], $rows['1004']['superior']['label']]);
         $this->assertNull($rows['1001']['superior'], 'no agent and no inviter');
         $this->assertSame('agent06', $rows['1002']->toArray()['system_agent']['username']);