From 50c2191a65f443b1f491af1d4d9aa628d924025f Mon Sep 17 00:00:00 2001 From: wanjia Date: Fri, 23 May 2025 13:49:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96session=E6=91=98=E8=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/discovery/views.py | 267 ++++++++++++++++++---------------------- 1 file changed, 123 insertions(+), 144 deletions(-) diff --git a/apps/discovery/views.py b/apps/discovery/views.py index 289eff8..4412c27 100644 --- a/apps/discovery/views.py +++ b/apps/discovery/views.py @@ -95,6 +95,27 @@ class SearchSessionViewSet(viewsets.ModelViewSet): return self.get_paginated_response(serializer.data) serializer = CreatorSerializer(creators, many=True) return ApiResponse.success(serializer.data, "获取会话创作者列表成功") + + @action(detail=False, methods=['get']) + def summary(self, request): + """获取所有会话的摘要数据,用于展示在表格中""" + queryset = self.filter_queryset(self.get_queryset()) + + # 格式化响应数据 + result = [] + for session in queryset: + result.append({ + 'id': session.id, + 'session_number': session.session_number, + 'date': session.date_created, + 'creator_count': session.creator_count, + 'shoppable_creators': session.shoppable_creators, + 'avg_followers': session.avg_followers, + 'avg_gmv': session.avg_gmv, + 'avg_video_views': session.avg_video_views + }) + + return ApiResponse.success(result, "获取会话摘要列表成功") class CreatorDiscoveryViewSet(viewsets.ReadOnlyModelViewSet): @@ -132,149 +153,107 @@ class CreatorDiscoveryViewSet(viewsets.ReadOnlyModelViewSet): ecommerce_level = request.data.get('ecommerce_level', None) exposure_level = request.data.get('exposure_level', None) - # 创建模拟搜索会话 - session = self._create_mock_search_session() - - # 生成模拟搜索结果 - creators = self._generate_mock_creators(session, query, category, ecommerce_level, exposure_level) - - # 返回会话详情 - serializer = SearchSessionDetailSerializer(session) - return ApiResponse.success(serializer.data, "搜索创作者成功") - - def _create_mock_search_session(self): - """创建模拟搜索会话""" - # 获取当前最大会话编号并加1 - max_session_number = SearchSession.objects.all().order_by('-session_number').first() - session_number = 1 - if max_session_number: - session_number = max_session_number.session_number + 1 + try: + # 导入CreatorProfile模型 + from apps.daren_detail.models import CreatorProfile + import logging + logger = logging.getLogger(__name__) - # 创建新会话 - session = SearchSession.objects.create( - session_number=session_number, - creator_count=100, - shoppable_creators=26, - avg_followers=162.2, - avg_gmv=534.1, - avg_video_views=1.9, - date_created=timezone.now().date() # 将datetime转换为date类型 - ) - return session - - def _generate_mock_creators(self, session, query, category=None, ecommerce_level=None, exposure_level=None): - """生成模拟创作者数据""" - # 模拟数据 - 这里可以根据实际需求调整 - mock_creators = [ - { - "name": "Mock Creator 1", - "category": "Phones & Electronics", - "ecommerce_level": "L2", - "exposure_level": "KOC-1", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": True - }, - { - "name": "Mock Creator 2", - "category": "Womenswear & Underwear", - "ecommerce_level": "L3", - "exposure_level": "KOL-3", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": False - }, - { - "name": "Mock Creator 3", - "category": "Sports & Outdoor", - "ecommerce_level": "L4", - "exposure_level": "KOC-2", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": True - }, - { - "name": "Mock Creator 4", - "category": "Food & Beverage", - "ecommerce_level": "L1", - "exposure_level": "KOC-2", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": True - }, - { - "name": "Mock Creator 5", - "category": "Health", - "ecommerce_level": "L5", - "exposure_level": "KOL-2", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": False - }, - { - "name": "Mock Creator 6", - "category": "Kitchenware", - "ecommerce_level": "New tag", - "exposure_level": "New tag", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": True - }, - { - "name": "Mock Creator 7", - "category": "Furniture", - "ecommerce_level": "New tag", - "exposure_level": "New tag", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": False - }, - { - "name": "Mock Creator 8", - "category": "Shoes", - "ecommerce_level": "New tag", - "exposure_level": "New tag", - "followers": 162.2, - "gmv": 534.1, - "items_sold": 18.1, - "avg_video_views": 1.9, - "has_ecommerce": True - }, - ] - - # 根据查询条件过滤模拟数据 - filtered_creators = mock_creators - if category: - filtered_creators = [c for c in filtered_creators if c['category'] == category] - if ecommerce_level: - filtered_creators = [c for c in filtered_creators if c['ecommerce_level'] == ecommerce_level] - if exposure_level: - filtered_creators = [c for c in filtered_creators if c['exposure_level'] == exposure_level] - - # 创建创作者记录 - for creator_data in filtered_creators: - Creator.objects.create( - session=session, - **creator_data - ) + # 获取或创建当天的session + today = timezone.now().date() + today_session = SearchSession.objects.filter(date_created=today).first() - # 更新会话统计信息 - session.creator_count = len(filtered_creators) - session.shoppable_creators = len([c for c in filtered_creators if c['has_ecommerce']]) - session.save() - - return filtered_creators + if not today_session: + # 如果当天没有session,创建一个 + max_session_number = SearchSession.objects.all().order_by('-session_number').first() + session_number = 1 + if max_session_number: + session_number = max_session_number.session_number + 1 + + today_session = SearchSession.objects.create( + session_number=session_number, + creator_count=0, + shoppable_creators=0, + avg_followers=0, + avg_gmv=0, + avg_video_views=0, + date_created=today + ) + + # 构建查询条件 + query_filters = {} + if query: + query_filters['name__icontains'] = query + if category: + query_filters['category'] = category + if ecommerce_level: + if isinstance(ecommerce_level, str) and ecommerce_level.startswith('L') and len(ecommerce_level) > 1: + try: + ecommerce_level_num = int(ecommerce_level[1:]) + query_filters['e_commerce_level'] = ecommerce_level_num + except ValueError: + pass + else: + query_filters['e_commerce_level'] = ecommerce_level + if exposure_level: + query_filters['exposure_level'] = exposure_level + + # 查询CreatorProfile表 + creator_profiles = CreatorProfile.objects.filter(**query_filters) + + # 对每个找到的CreatorProfile创建Creator记录 + for profile in creator_profiles: + # 检查是否已经在当前session中存在相同creator + existing_creator = Creator.objects.filter( + session=today_session, + name=profile.name + ).first() + + if not existing_creator: + # 确定电商等级字符串 + ecommerce_level_str = "New tag" + if profile.e_commerce_level is not None: + ecommerce_level_str = f"L{profile.e_commerce_level}" + + # 创建Creator记录 + Creator.objects.create( + session=today_session, + name=profile.name, + avatar=profile.avatar_url if profile.avatar_url else None, + category=profile.category if profile.category else "Other", + ecommerce_level=ecommerce_level_str, + exposure_level=profile.exposure_level if profile.exposure_level else "New tag", + followers=float(profile.followers) if profile.followers else 0, + gmv=float(profile.gmv) if profile.gmv else 0, + items_sold=float(profile.items_sold) if profile.items_sold else 0, + avg_video_views=float(profile.avg_video_views) if profile.avg_video_views else 0, + has_ecommerce=profile.e_commerce_level is not None, + tiktok_url=profile.tiktok_link if profile.tiktok_link else None + ) + + # 更新session统计信息 + all_creators = today_session.creators.all() + total_creators = all_creators.count() + + if total_creators > 0: + # 计算平均值 + total_followers = sum(creator.followers for creator in all_creators) + total_gmv = sum(creator.gmv for creator in all_creators) + total_video_views = sum(creator.avg_video_views for creator in all_creators) + + today_session.creator_count = total_creators + today_session.shoppable_creators = all_creators.filter(has_ecommerce=True).count() + today_session.avg_followers = round(total_followers / total_creators, 1) + today_session.avg_gmv = round(total_gmv / total_creators, 1) + today_session.avg_video_views = round(total_video_views / total_creators, 1) + today_session.save() + + # 返回session详情 + serializer = SearchSessionDetailSerializer(today_session) + return ApiResponse.success(serializer.data, "搜索创作者成功") + + except Exception as e: + import traceback + logger.error(f"搜索创作者时发生错误: {str(e)}") + logger.error(traceback.format_exc()) + return ApiResponse.error(f"搜索创作者失败: {str(e)}")