进行了完整的视图拆分,同步了 merchant_ops 的修改

This commit is contained in:
2026-07-05 10:01:09 +08:00
parent 9d98ac9e83
commit c5ae30507b
46 changed files with 32768 additions and 188172 deletions

View File

@@ -188,57 +188,73 @@ class KhgglView(APIView):
end = start + page_size
shenheguan_list = queryset.order_by('-CreateTime')[start:end]
from collections import defaultdict
from jituan.services.shenhe_club import yonghu_chenghao_qs_for_request
# ---------- 预计算每个板块打手数量 ----------
bankuai_dashou_count_map = {}
all_banquai = Bankuai.query.all()
for bk in all_banquai:
tag_ids = Chenghao.query.filter(bankuai=bk, leixing='dashou').values_list('id', flat=True)
count = yonghu_chenghao_qs_for_request(
YonghuChenghao.query.filter(
chenghao_id__in=tag_ids,
yonghu__DashouProfile__isnull=False,
),
request,
).values('yonghu').distinct().count()
bankuai_dashou_count_map[bk.bankuai_id] = count
# ---------- 优化:板块打手数量1 次 annotate 替代 2N 次循环查询)----------
# 原逻辑:每板块查 dashou 标签 ID再统计关联的不同用户数要求有 DashouProfile
bankuai_dashou_qs = yonghu_chenghao_qs_for_request(
YonghuChenghao.query.filter(
chenghao__leixing='dashou',
yonghu__DashouProfile__isnull=False,
),
request,
)
bankuai_dashou_count_map = {
item['chenghao__bankuai_id']: item['user_count']
for item in bankuai_dashou_qs.values('chenghao__bankuai_id').annotate(
user_count=Count('yonghu', distinct=True)
)
}
# ---------- 新增:板块标签统计 ----------
bankuai_tags_data = []
for bk in all_banquai:
tags = Chenghao.query.filter(bankuai=bk, leixing='dashou')
tag_list = []
for tag in tags:
user_count = yonghu_chenghao_qs_for_request(
YonghuChenghao.query.filter(chenghao=tag),
request,
).values('yonghu').distinct().count()
tag_list.append({
'id': tag.id,
'name': tag.mingcheng,
'user_count': user_count,
})
bankuai_tags_data.append({
# ---------- 优化:板块标签统计1 次 annotate 替代 N*M 次循环查询)----------
# 原逻辑:每板块每标签分别统计关联的不同用户数(不要求 DashouProfile
tag_counts_qs = yonghu_chenghao_qs_for_request(
YonghuChenghao.query.filter(chenghao__leixing='dashou'),
request,
).values(
'chenghao_id', 'chenghao__bankuai_id', 'chenghao__mingcheng'
).annotate(user_count=Count('yonghu', distinct=True))
tags_by_bankuai = defaultdict(list)
for item in tag_counts_qs:
tags_by_bankuai[item['chenghao__bankuai_id']].append({
'id': item['chenghao_id'],
'name': item['chenghao__mingcheng'],
'user_count': item['user_count'],
})
all_banquai = Bankuai.query.all()
bankuai_tags_data = [
{
'bankuai_id': bk.bankuai_id,
'mingcheng': bk.mingcheng,
'tags': tag_list,
})
'tags': tags_by_bankuai.get(bk.bankuai_id, []),
}
for bk in all_banquai
]
# ---------- 优化审核官板块关联1 次批量查询替代 P 次循环查询)----------
shenheguan_user_uids = [sg.user.UserUID for sg in shenheguan_list]
all_kgs = KaoheguanBankuai.query.filter(
kaoheguan_id__in=shenheguan_user_uids
).select_related('bankuai')
kg_map = defaultdict(list)
for kg in all_kgs:
kg_map[kg.kaoheguan_id].append(kg)
# 构造返回数据(审核官列表)
data_list = []
for sg in shenheguan_list:
user = sg.user
# 获取该审核官关联的板块
bk_qs = KaoheguanBankuai.query.filter(kaoheguan_id=user.UserUID).select_related('bankuai')
bankuai_info = []
for bk in bk_qs:
bid = bk.bankuai.bankuai_id
bankuai_info.append({
'bankuai_id': bid,
'mingcheng': bk.bankuai.mingcheng,
'dashou_count': bankuai_dashou_count_map.get(bid, 0)
})
bankuai_info = [
{
'bankuai_id': kg.bankuai.bankuai_id,
'mingcheng': kg.bankuai.mingcheng,
'dashou_count': bankuai_dashou_count_map.get(kg.bankuai.bankuai_id, 0),
}
for kg in kg_map.get(user.UserUID, [])
]
dashou_nick = user.DashouProfile.nicheng if hasattr(user, 'DashouProfile') and user.DashouProfile else ''