Skip to content

Commit b0a9934

Browse files
committed
feat: add authorized user count to chat user groups and refresh logic
1 parent 92db9f8 commit b0a9934

6 files changed

Lines changed: 47 additions & 12 deletions

File tree

‎apps/system_manage/serializers/resource_chat_user_group.py‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from common.exception.app_exception import AppApiException
1010
from common.utils.common import get_file_content
1111
from maxkb.conf import PROJECT_DIR
12-
from system_manage.models import ResourceChatUserGroupAuthorize, UserGroup
12+
from system_manage.models import ResourceChatUserAuthorize, ResourceChatUserGroupAuthorize, UserGroup
1313

1414

1515
class ResourceChatUserGroupQuerySerializer(serializers.Serializer):
@@ -29,20 +29,30 @@ def get_query_set(self):
2929
resource_chat_user_group_authorize_query_set = QuerySet(ResourceChatUserGroupAuthorize).filter(
3030
resource_id=resource_id, resource_type=resource_type
3131
)
32+
resource_chat_user_authorize_query_set = QuerySet(ResourceChatUserAuthorize).filter(
33+
resource_id=resource_id, resource_type=resource_type
34+
)
3235
query_set = QuerySet(UserGroup)
3336
if user_group_name is not None:
3437
query_set = query_set.filter(name__contains=user_group_name)
3538
if workspace_id is not None:
3639
resource_chat_user_group_authorize_query_set = resource_chat_user_group_authorize_query_set.filter(
3740
workspace_id=workspace_id
3841
)
42+
resource_chat_user_authorize_query_set = resource_chat_user_authorize_query_set.filter(
43+
workspace_id=workspace_id
44+
)
3945
else:
4046
resource_chat_user_group_authorize_query_set = resource_chat_user_group_authorize_query_set.filter(
4147
workspace_id__isnull=True
4248
)
49+
resource_chat_user_authorize_query_set = resource_chat_user_authorize_query_set.filter(
50+
workspace_id__isnull=True
51+
)
4352
return {
4453
"default_query_set": query_set,
4554
"resource_chat_user_group_authorize_query_set": resource_chat_user_group_authorize_query_set,
55+
"resource_chat_user_authorize_query_set": resource_chat_user_authorize_query_set,
4656
}
4757

4858
def list(self):
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
SELECT user_group.*, COALESCE(resource_chat_user_group_authorize.is_auth,false) as is_auth
1+
SELECT user_group.*, COALESCE(resource_chat_user_group_authorize.is_auth,false) as is_auth,
2+
(SELECT COUNT(DISTINCT resource_chat_user_authorize.user_id)
3+
FROM user_group_relation
4+
JOIN (SELECT * FROM resource_chat_user_authorize ${resource_chat_user_authorize_query_set}) resource_chat_user_authorize
5+
ON resource_chat_user_authorize.user_id = user_group_relation.user_id
6+
AND resource_chat_user_authorize.user_group_id = user_group_relation.group_id
7+
WHERE user_group_relation.group_id = user_group.id
8+
AND resource_chat_user_authorize.is_auth = true) AS authorized_count
29
FROM "user_group"
310
LEFT JOIN (SELECT * FROM resource_chat_user_group_authorize ${resource_chat_user_group_authorize_query_set}) resource_chat_user_group_authorize
411
ON user_group.id = resource_chat_user_group_authorize.user_group_id
5-
${default_query_set}
12+
${default_query_set}

‎ui/src/api/types/chat-user.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ export interface ChatUserAuthorizationGroup {
112112
id: string
113113
name: string
114114
is_auth: boolean
115+
/** 用户组内已授权对话用户数。 */
116+
authorized_count: number
115117
}
116118

117119
/** 用户组内的对话用户资源授权状态。 */

‎ui/src/views/VIEW_README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1389,7 +1389,7 @@ API 地址、调用示例及 MCP 配置只读;后两个展示区参考工具 M
13891389
使用对应路由 ID 及 `RESOURCE_TYPE.APPLICATION / KNOWLEDGE`;授权类型必须大写,与后台授权记录及对话端查询一致。
13901390
两页通过 `hideHeader: true` 隐藏详情标题栏,使用普通 Flex 双栏容器,不嵌套 `MkViewLayout`。
13911391
外层 `ResourceDetailLayout` 统一管理整体滚动;侧栏复用 `w-sidebar-expanded`、`MkSearchList` 的搜索、选中和空态。
1392-
“按用户组”列表通过插槽展示名称及自动授权状态;接口尚未返回组已授权人数,手动授权组显示“已授权 —”,不以当前页勾选数代替。
1392+
“按用户组”列表通过插槽展示名称及自动授权状态;接口返回组已授权人数 `authorized_count`,自动授权组显示“(自动授权)”,手动授权组显示“(已授权 N)”,不以当前页勾选数代替。
13931393
右侧第一行展示组名和用户查询总数;下方工具栏左侧为默认按姓名查询的 `MkComplexSearch` 及自动授权开关,右侧为保存。
13941394
顶部 `MkComplexSearch` 按姓名、用户名排列;用户来源只在表头使用 `MkTableFilter mode="single"` 筛选,向接口传 `source`。
13951395
用户名、姓名搜索与表头来源可组合查询,清空一处条件不影响另一处,不额外重置搜索组件。

‎ui/src/views/application-detail/chat-user/index.vue‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ function loadChatUserGroups() {
3939
})
4040
}
4141
42+
// 仅刷新用户组列表及已授权人数,保留当前选中的用户组。
43+
function refreshChatUserGroups() {
44+
return ChatUserApi.getUserGroupList(resource.value).then((groups) => {
45+
const currentId = currentGroup.value?.id
46+
chatUserGroups.value = groups
47+
currentGroup.value = groups.find((group) => group.id === currentId) ?? groups[0]
48+
})
49+
}
50+
4251
function handleSelectGroup(group: ChatUserAuthorizationGroup) {
4352
if (loading.value || currentGroup.value?.id === group.id) return
4453
currentGroup.value = group
@@ -130,7 +139,7 @@ function handleSave() {
130139
// 先记住已保存结果,列表刷新失败时不重复提示未保存。
131140
savedAuthorization.value = Object.fromEntries(payload.map(({ chat_user_id, is_auth }) => [chat_user_id, is_auth]))
132141
MsgSuccess('保存成功')
133-
return loadChatUsers()
142+
return loadChatUsers().then(refreshChatUserGroups)
134143
})
135144
.finally(() => {
136145
loading.value = false
@@ -149,7 +158,7 @@ function handleAutoAuthorizationChange(value: string | number | boolean) {
149158
chatUsers.value = []
150159
savedAuthorization.value = {}
151160
MsgSuccess('保存成功')
152-
return loadChatUsers()
161+
return loadChatUsers().then(refreshChatUserGroups)
153162
})
154163
.finally(() => {
155164
loading.value = false
@@ -170,8 +179,7 @@ onMounted(() => loadChatUserGroups())
170179
<template #default="{ row }">
171180
<span class="min-w-0 truncate" :title="row.name">{{ row.name }}</span>
172181
<span class="shrink-0 font-normal text-N500">
173-
<!-- TODO:接入用户组已授权人数,当前接口未返回统计字段。 -->
174-
{{ row.is_auth ? '(自动授权)' : '(已授权 —)' }}
182+
{{ row.is_auth ? '(自动授权)' : `(已授权 ${row.authorized_count ?? 0})` }}
175183
</span>
176184
</template>
177185
</MkSearchList>

‎ui/src/views/knowledge-detail/chat-user/index.vue‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ function loadChatUserGroups() {
3939
})
4040
}
4141
42+
// 仅刷新用户组列表及已授权人数,保留当前选中的用户组。
43+
function refreshChatUserGroups() {
44+
return ChatUserApi.getUserGroupList(resource.value).then((groups) => {
45+
const currentId = currentGroup.value?.id
46+
chatUserGroups.value = groups
47+
currentGroup.value = groups.find((group) => group.id === currentId) ?? groups[0]
48+
})
49+
}
50+
4251
function handleSelectGroup(group: ChatUserAuthorizationGroup) {
4352
if (loading.value || currentGroup.value?.id === group.id) return
4453
currentGroup.value = group
@@ -130,7 +139,7 @@ function handleSave() {
130139
// 先记住已保存结果,列表刷新失败时不重复提示未保存。
131140
savedAuthorization.value = Object.fromEntries(payload.map(({ chat_user_id, is_auth }) => [chat_user_id, is_auth]))
132141
MsgSuccess('保存成功')
133-
return loadChatUsers()
142+
return loadChatUsers().then(refreshChatUserGroups)
134143
})
135144
.finally(() => {
136145
loading.value = false
@@ -149,7 +158,7 @@ function handleAutoAuthorizationChange(value: string | number | boolean) {
149158
chatUsers.value = []
150159
savedAuthorization.value = {}
151160
MsgSuccess('保存成功')
152-
return loadChatUsers()
161+
return loadChatUsers().then(refreshChatUserGroups)
153162
})
154163
.finally(() => {
155164
loading.value = false
@@ -170,8 +179,7 @@ onMounted(() => loadChatUserGroups())
170179
<template #default="{ row }">
171180
<span class="min-w-0 truncate" :title="row.name">{{ row.name }}</span>
172181
<span class="shrink-0 font-normal text-N500">
173-
<!-- TODO:接入用户组已授权人数,当前接口未返回统计字段。 -->
174-
{{ row.is_auth ? '(自动授权)' : '(已授权 —)' }}
182+
{{ row.is_auth ? '(自动授权)' : `(已授权 ${row.authorized_count ?? 0})` }}
175183
</span>
176184
</template>
177185
</MkSearchList>

0 commit comments

Comments
 (0)