From 098bea3d5b008f9e87bf786f60eea46ea9a275cf Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 20 Aug 2026 03:43:17 +0000 Subject: [PATCH] =?UTF-8?q?fix(messenger):=20=E4=BF=AE=E5=A4=8D=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E6=88=90=E5=91=98=E5=AF=BC=E8=87=B4=E7=BE=A4=E4=BA=BA?= =?UTF-8?q?=E6=95=B0=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/WebSocketDialog.php | 10 ++-- resources/ai-kb/zh/howto/messenger/member.md | 3 +- tests/Feature/DialogPeopleCountTest.php | 53 ++++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 tests/Feature/DialogPeopleCountTest.php diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index f7641e5ad..ec558ff0c 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -456,9 +456,13 @@ class WebSocketDialog extends AbstractModel */ public static function generatePeople($dialogId) { - $counts = WebSocketDialogUser::whereDialogId($dialogId) - ->groupBy('bot') - ->selectRaw('bot, COUNT(*) as count') + $counts = DB::table('web_socket_dialog_users as du') + ->join('users', 'users.userid', '=', 'du.userid') + ->where('du.dialog_id', $dialogId) + ->whereNull('users.disable_at') + ->groupBy('du.bot') + ->select('du.bot') + ->selectRaw('COUNT(*) as count') ->pluck('count', 'bot'); $userCount = $counts->get(0, 0); // 非机器人数量 $botCount = $counts->get(1, 0); // 机器人数量 diff --git a/resources/ai-kb/zh/howto/messenger/member.md b/resources/ai-kb/zh/howto/messenger/member.md index 0c34f1fbe..ddd1a5435 100644 --- a/resources/ai-kb/zh/howto/messenger/member.md +++ b/resources/ai-kb/zh/howto/messenger/member.md @@ -21,7 +21,7 @@ negative: - 群主不能被踢,只能先转让群主再退群 - 任务参与人、项目成员对应的群成员不能在群里直接移除,需到任务 / 项目里调整 - 一次最多批量传 userids 数组,但接口未硬限制条数,前端按 200 人内体验最佳 -last_verified: v1.7.90 +last_verified: v1.8.89 --- # 添加和移除群成员 @@ -49,6 +49,7 @@ last_verified: v1.7.90 - 有群主时:仅群主 / 群管理员可加人或踢人 - 没有群主(如旧群):任意成员可加人 - 群主、任务参与人、项目成员对应的成员不可踢 +- 群成员列表和人数只统计当前有效账号;已离职或已删除账号不显示,也不计入人数 ## 不支持 diff --git a/tests/Feature/DialogPeopleCountTest.php b/tests/Feature/DialogPeopleCountTest.php new file mode 100644 index 000000000..07ee58bcd --- /dev/null +++ b/tests/Feature/DialogPeopleCountTest.php @@ -0,0 +1,53 @@ + $email, + 'userimg' => '', + 'nickname' => 'TestUser', + 'profession' => '', + 'password' => md5('123456'), + 'bot' => $bot, + ]); + $user->save(); + return $user; + } + + public function test_generate_people_ignores_deleted_and_disabled_users(): void + { + $owner = $this->makeUser('people-owner@test.local'); + $active = $this->makeUser('people-active@test.local'); + $disabled = $this->makeUser('people-disabled@test.local'); + $deleted = $this->makeUser('people-deleted@test.local'); + $bot = $this->makeUser('people-bot@test.local', 1); + $dialog = WebSocketDialog::createGroup( + 'People count', + [$owner->userid, $active->userid, $disabled->userid, $deleted->userid, $bot->userid], + 'user', + $owner->userid + ); + + $disabled->disable_at = now(); + $disabled->save(); + DB::table('users')->where('userid', $deleted->userid)->delete(); + + $this->assertSame([ + 'people' => 3, + 'people_user' => 2, + 'people_bot' => 1, + ], WebSocketDialog::generatePeople($dialog->id)); + } +}