From 52ebac68a0e7228effd3d253e32bbea74e667dee Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sun, 4 Jan 2026 10:10:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=87=BA=E5=85=A5=E5=BA=93=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E8=BF=94=E5=9B=9E=E5=AD=90=E8=A1=A8=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/serializers.py | 9 ++++++++ apps/inm/views.py | 47 +++++++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index a1a6a6e6..3f8fdce5 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -247,6 +247,15 @@ class MIOItemAListSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS_BASE +class MIOItemListSimpleSerializer(CustomModelSerializer): + warehouse_name = serializers.CharField(source='warehouse.name', read_only=True) + material_name = serializers.StringRelatedField( + source='material', read_only=True) + + class Meta: + model = MIOItem + fields = ["id", "mio", "material", "warehouse", "material_name", "warehouse_name", "batch", "count", "test_date", "count_notok"] + class MIOItemSerializer(CustomModelSerializer): warehouse_name = serializers.CharField(source='warehouse.name', read_only=True) material_ = MaterialSerializer(source='material', read_only=True) diff --git a/apps/inm/views.py b/apps/inm/views.py index e1a3c988..a5d35267 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -14,7 +14,7 @@ from apps.inm.serializers import ( MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer, MioItemAnaSerializer, MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer, MIOItemPurInTestSerializer, - MIOItemwSerializer, MioItemDetailSerializer, PackSerializer, PackMioSerializer) + MIOItemwSerializer, MioItemDetailSerializer, PackSerializer, PackMioSerializer, MIOItemListSimpleSerializer) from apps.inm.serializers2 import MIOItemwCreateUpdateSerializer from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService @@ -163,20 +163,39 @@ class MIOViewSet(CustomModelViewSet): return mio def add_info_for_list(self, data): - # 获取检验状态 - mio_dict = {} + # 1. 收集所有mio的ID + mio_ids = [item['id'] for item in data] + + # 2. 预初始化mio字典和items列表 + mio_dict = {item['id']: { + **item, + 'is_tested': False, # 默认值设为False + 'mioitems': [] + } for item in data} + + # 3. 批量查询MIOItem数据 + if mio_ids: # 避免空查询 + mioitems = MIOItemListSimpleSerializer( + instance=MIOItem.objects.filter( + mio__id__in=mio_ids + ).select_related("warehouse", "material"), + many=True + ).data + + # 4. 单次循环处理所有item + for item in mioitems: + mio_id = item['mio'] + if mio_id in mio_dict: + mio_dict[mio_id]['mioitems'].append(item) + # 更新is_tested状态(只要有一个item有test_date就为True) + if item.get('test_date'): + mio_dict[mio_id]['is_tested'] = True + + # 5. 直接返回原始data列表,避免额外转换 for item in data: - item['is_tested'] = None - mio_dict[item['id']] = item - mioitems = list(MIOItem.objects.filter(mio__id__in=mio_dict.keys()).values_list("mio__id", "test_date")) - for item in mioitems: - mioId, test_date = item - is_tested = False - if test_date: - is_tested = True - mio_dict[mioId]['is_tested'] = is_tested - datax = [mio_dict[key] for key in mio_dict.keys()] - return datax + item.update(mio_dict[item['id']]) + + return data def get_serializer_class(self): if self.action in ['create', 'update', 'partial_update']: