fix: 大屏统计按新品牌实体,材料种类统计改为细分种类并排除空值

- 材料种类卡片:从 material_subcategory 改为 material_category 去重计数,排除 null/空
- 材料子类分布图:排除 material_subcategory 为空的材料,避免出现 null 类目
- 品牌数卡片:从 Factory.count 改为 Brand.count
- 品牌材料分布图:按 material.brand.name 分组,排除无品牌材料;前端字段同步

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-04-23 22:01:59 +08:00
parent 75dde5243e
commit 85ed7a20c1
2 changed files with 30 additions and 13 deletions

View File

@ -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(

View File

@ -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({