diff --git a/backend/apps/statistics/views.py b/backend/apps/statistics/views.py index bee28a7..f62fa41 100644 --- a/backend/apps/statistics/views.py +++ b/backend/apps/statistics/views.py @@ -4,6 +4,7 @@ from rest_framework.response import Response from django.db.models import Count from apps.material.models import Material from apps.factory.models import Factory +from apps.brand.models import Brand def _build_brochure_url(request, brochure_field): @@ -27,26 +28,42 @@ def overview_statistics(request): # 材料总数 total_materials = approved_materials.count() - # 材料种类(材料子类数量) - total_material_categories = approved_materials.values('material_subcategory').distinct().count() + # 材料种类(细分种类数量,排除空值) + total_material_categories = ( + approved_materials + .exclude(material_category__isnull=True) + .exclude(material_category='') + .values('material_category') + .distinct() + .count() + ) - # 品牌数(工厂数) - total_brands = Factory.objects.count() + # 品牌数 + total_brands = Brand.objects.count() # 按专业类别的材料数量分布 major_category_stats = approved_materials.values('major_category').annotate( count=Count('id') ).order_by('-count') - # 按材料子类的材料数量分布 - material_subcategory_stats = approved_materials.values('material_subcategory').annotate( - count=Count('id') - ).order_by('-count')[:10] + # 按材料子类的材料数量分布(排除空值) + material_subcategory_stats = ( + approved_materials + .exclude(material_subcategory__isnull=True) + .exclude(material_subcategory='') + .values('material_subcategory') + .annotate(count=Count('id')) + .order_by('-count')[:10] + ) - # 按所属品牌的材料数量分布 - brand_stats = approved_materials.values('factory__factory_name').annotate( - count=Count('id') - ).order_by('-count') + # 按所属品牌的材料数量分布(排除无品牌的材料) + brand_stats = ( + approved_materials + .exclude(brand__isnull=True) + .values('brand__name') + .annotate(count=Count('id')) + .order_by('-count') + ) # 按省份的工厂数量分布 region_stats = Factory.objects.values('province').annotate( diff --git a/frontend/src/views/screen/ScreenOverview.vue b/frontend/src/views/screen/ScreenOverview.vue index 44742f3..1f51f6b 100644 --- a/frontend/src/views/screen/ScreenOverview.vue +++ b/frontend/src/views/screen/ScreenOverview.vue @@ -113,7 +113,7 @@ const updateCharts = () => { }) const brandData = (stats.value.brand_stats || []).map((item) => ({ - name: item.factory__factory_name, + name: item.brand__name, value: item.count })) charts[2].setOption({