Skip to content

Commit e7ffc9d

Browse files
authored
fix: Homepage TopN statistics error (#6122)
1 parent 9df8254 commit e7ffc9d

1 file changed

Lines changed: 53 additions & 29 deletions

File tree

apps/homepage/serializers/homepage.py

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -176,19 +176,17 @@ class ApplicationUserTokenRanking(serializers.Serializer):
176176
end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time"))
177177

178178
def get_queryset(self, auth):
179-
workspace_id = self.validated_data.get("workspace_id")
180-
user_id = self.validated_data.get("user_id")
179+
workspace_id = self.data.get("workspace_id")
180+
user_id = self.data.get("user_id")
181181
start_time = get_format_time(self.data.get("start_time"))
182182
end_time = get_format_time(self.data.get("end_time"))
183183
name = self.data.get("name")
184184

185-
# ---- 基础查询 ----
185+
# ---- 基础查询:不再按 Chat.create_time 过滤 ----
186186
base_queryset = (
187187
Chat.objects.filter(
188188
is_deleted=False,
189189
chat_user_id__isnull=False,
190-
create_time__gte=start_time,
191-
create_time__lte=end_time,
192190
)
193191
.exclude(chat_user_id="")
194192
)
@@ -204,17 +202,28 @@ def get_queryset(self, auth):
204202
# ---- 窗口函数:一次查询拿到每个用户最新的 asker ----
205203
asker_map = self._build_asker_map(base_queryset)
206204

205+
# ---- 时间条件针对 ChatRecord ----
206+
record_time_filter = Q(
207+
chatrecord__create_time__gte=start_time,
208+
chatrecord__create_time__lte=end_time,
209+
)
210+
207211
# ---- 聚合统计 ----
208212
queryset = (
209213
base_queryset
214+
.filter(record_time_filter)
210215
.values("chat_user_id", "chat_user_type")
211216
.annotate(
212217
total_tokens=Coalesce(
213-
Sum(TOKEN_EXPR),
218+
Sum(TOKEN_EXPR, filter=record_time_filter),
214219
Value(0),
215220
output_field=BigIntegerField(),
216221
),
217-
chat_record_count=Count("chatrecord__id", distinct=True),
222+
chat_record_count=Count(
223+
"chatrecord__id",
224+
filter=record_time_filter,
225+
distinct=True,
226+
),
218227
)
219228
.order_by("-total_tokens")
220229
)
@@ -320,17 +329,14 @@ class ApplicationQuestionRanking(serializers.Serializer):
320329
end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time"))
321330

322331
def get_queryset(self, auth):
323-
workspace_id = self.validated_data.get("workspace_id")
324-
user_id = self.validated_data.get("user_id")
325-
queryset = Application.objects.filter(workspace_id=workspace_id)
332+
workspace_id = self.data.get("workspace_id")
333+
user_id = self.data.get("user_id")
326334
name = self.data.get("name")
327-
if name:
328-
queryset = queryset.filter(name__contains=name)
329335
start_time = get_format_time(self.data.get("start_time"))
330336
end_time = get_format_time(self.data.get("end_time"))
331-
queryset = queryset.filter(
332-
create_time__gte=start_time,
333-
create_time__lte=end_time)
337+
queryset = Application.objects.filter(workspace_id=workspace_id)
338+
if name:
339+
queryset = queryset.filter(name__contains=name)
334340
workspace_manage = is_workspace_manage(auth, workspace_id)
335341
if not workspace_manage:
336342
permission_list = (
@@ -353,12 +359,17 @@ def get_queryset(self, auth):
353359
.values_list("target_uuid", flat=True)
354360
)
355361

362+
record_time_filter = (
363+
Q(chat__is_deleted=False)
364+
& Q(chat__chatrecord__create_time__gte=start_time)
365+
& Q(chat__chatrecord__create_time__lte=end_time)
366+
)
356367
return queryset.annotate(
357-
# 问题数 / 对话轮次数量
368+
# 问题数(按 ChatRecord 条数统计)
358369
chat_record_count_total=Coalesce(
359-
Sum(
360-
"chat__chat_record_count",
361-
filter=Q(chat__is_deleted=False),
370+
Count(
371+
"chat__chatrecord__id",
372+
filter=record_time_filter,
362373
),
363374
Value(0),
364375
output_field=BigIntegerField(),
@@ -368,7 +379,7 @@ def get_queryset(self, auth):
368379
chat_user_count=Count(
369380
"chat__chat_user_id",
370381
filter=(
371-
Q(chat__is_deleted=False)
382+
record_time_filter
372383
& Q(chat__chat_user_id__isnull=False)
373384
& ~Q(chat__chat_user_id="")
374385
),
@@ -435,17 +446,20 @@ def get_queryset(self, auth):
435446
output_field=BigIntegerField()
436447
)
437448

438-
queryset = Application.objects.filter(
439-
create_time__gte=start_time,
440-
create_time__lte=end_time)
449+
# 时间条件针对 ChatRecord
450+
record_time_filter = (
451+
Q(chat__is_deleted=False)
452+
& Q(chat__chatrecord__create_time__gte=start_time)
453+
& Q(chat__chatrecord__create_time__lte=end_time)
454+
)
455+
456+
queryset = Application.objects.filter(workspace_id=workspace_id)
441457
if name:
442458
queryset = queryset.filter(name__contains=name)
443459

444460
workspace_manage = is_workspace_manage(auth, workspace_id)
445461

446-
if workspace_manage:
447-
queryset = queryset.filter(workspace_id=workspace_id)
448-
else:
462+
if not workspace_manage:
449463
permission_list = ["VIEW", "MANAGE", "ROLE"] if hasPermission(
450464
auth,
451465
"APPLICATION:READ"
@@ -467,16 +481,25 @@ def get_queryset(self, auth):
467481
total_tokens=Coalesce(
468482
Sum(
469483
token_expr,
470-
filter=Q(chat__is_deleted=False)
484+
filter=record_time_filter
471485
),
472486
Value(0),
473487
output_field=BigIntegerField()
474488
),
475489
chat_record_count_total=Count(
476490
"chat__chatrecord__id",
477-
filter=Q(chat__is_deleted=False),
491+
filter=record_time_filter,
478492
output_field=IntegerField()
479-
)
493+
),
494+
chat_user_count=Count(
495+
"chat__chat_user_id",
496+
filter=(
497+
record_time_filter
498+
& Q(chat__chat_user_id__isnull=False)
499+
& ~Q(chat__chat_user_id="")
500+
),
501+
distinct=True,
502+
),
480503
).order_by("-total_tokens")
481504

482505
def ranking(self, auth, current_page, page_size, with_valid=True):
@@ -492,6 +515,7 @@ def ranking(self, auth, current_page, page_size, with_valid=True):
492515
"name": a.name,
493516
"total_tokens": a.total_tokens,
494517
"chat_record_count": a.chat_record_count_total,
518+
"chat_user_count": a.chat_user_count
495519
}
496520
)
497521

0 commit comments

Comments
 (0)