diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 606d47aa..6dd2144f 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -26,6 +26,7 @@ import logging from apps.qm.models import Defect from apps.utils.snowflake import idWorker from decimal import Decimal +from apps.em.models import Equipment mylogger = logging.getLogger("log") class OtherLogSerializer(CustomModelSerializer): @@ -895,6 +896,143 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): ftest.delete() return mlogbw + +class MlogbwStartTestSerializer(serializers.Serializer): + mlogbw_ids = serializers.ListField(child=serializers.CharField(), label="mlogbwId列表") + test_equip = serializers.CharField(label="测试设备", allow_null=True, required=False) + test_user = serializers.CharField(label="测试人员") + defects = serializers.ListField(child=serializers.CharField(), required=False, allow_null=True, label="缺陷项列表") + testitems = serializers.ListField(child=serializers.CharField(), required=False, allow_null=True, label="测试项列表") + test_date = serializers.DateField(label="测试日期") + qct = serializers.CharField(label="检测表id") + + def save(self, **kwargs): + from apps.qm.models import Ftest, FtestDefect, FtestItem + + validated_data = self.validated_data + mlogbw_ids = validated_data["mlogbw_ids"] + test_equip_id = validated_data.get("test_equip") + test_user_id = validated_data["test_user"] + defect_ids = validated_data.get("defects", []) + testitem_ids = validated_data.get("testitems", []) + test_date = validated_data["test_date"] + qct_id = validated_data["qct"] + + # 预加载相关对象 + test_equip = Equipment.objects.get(id=test_equip_id) if test_equip_id else None + test_user = User.objects.get(id=test_user_id) + qct = Qct.objects.get(id=qct_id) + + # 批量获取所有mlogbw对象 + mlogbws = Mlogbw.objects.filter(id__in=mlogbw_ids).select_related('ftest') + + # 预加载缺陷和测试项 + defects = Defect.objects.filter(id__in=defect_ids) if defect_ids else [] + testitems = FtestItem.objects.filter(id__in=testitem_ids) if testitem_ids else [] + + existing_ftests = {} + new_ftests = [] + mlogbws_to_update = [] + + # 分离已存在和需要新建的ftest + for mlogbw in mlogbws: + if mlogbw.ftest: + existing_ftests[mlogbw.ftest_id] = mlogbw.ftest + else: + ftest = Ftest(mlogbw=mlogbw, test_date=test_date, qct=qct) + new_ftests.append(ftest) + mlogbws_to_update.append(mlogbw) + + # 批量创建新的ftest + if new_ftests: + Ftest.objects.bulk_create(new_ftests) + + # 更新mlogbw的ftest关系 + for mlogbw, ftest in zip(mlogbws_to_update, new_ftests): + mlogbw.ftest = ftest + Mlogbw.objects.bulk_update(mlogbws_to_update, ['ftest']) + + # 将新创建的ftest添加到existing_ftests中 + for ftest in new_ftests: + existing_ftests[ftest.id] = ftest + + # 批量处理缺陷项(需要更新test_user) + if defects and existing_ftests: + # 获取所有现有的FtestDefect记录 + existing_defect_ids = FtestDefect.objects.filter( + ftest_id__in=existing_ftests.keys(), + defect_id__in=[d.id for d in defects] + ).values_list('defect_id', 'ftest_id') + + existing_defect_map = {(defect_id, ftest_id) for defect_id, ftest_id in existing_defect_ids} + + defects_to_create = [] + defects_to_update = [] + + for ftest in existing_ftests.values(): + for defect in defects: + if (defect.id, ftest.id) in existing_defect_map: + # 已有记录,需要更新 + defects_to_update.append((ftest.id, defect.id)) + else: + # 新记录,需要创建 + defects_to_create.append( + FtestDefect(ftest=ftest, defect=defect, test_user=test_user) + ) + + # 批量创建新记录 + if defects_to_create: + FtestDefect.objects.bulk_create(defects_to_create) + + # 批量更新已有记录的test_user + if defects_to_update: + FtestDefect.objects.filter( + ftest_id__in=[item[0] for item in defects_to_update], + defect_id__in=[item[1] for item in defects_to_update] + ).update(test_user=test_user) + + # 批量处理测试项(需要更新test_user和test_equip) + if testitems and existing_ftests: + # 获取所有现有的FtestItem记录 + existing_testitem_ids = FtestItem.objects.filter( + ftest_id__in=existing_ftests.keys(), + testitem_id__in=[t.id for t in testitems] + ).values_list('testitem_id', 'ftest_id') + + existing_testitem_map = {(testitem_id, ftest_id) for testitem_id, ftest_id in existing_testitem_ids} + + testitems_to_create = [] + testitems_to_update_condition = Q() + + for ftest in existing_ftests.values(): + for testitem in testitems: + if (testitem.id, ftest.id) in existing_testitem_map: + # 已有记录,添加到更新条件 + testitems_to_update_condition |= Q(ftest=ftest, testitem=testitem) + else: + # 新记录,需要创建 + testitems_to_create.append( + FtestItem( + ftest=ftest, + testitem=testitem, + test_user=test_user, + test_equip=test_equip + ) + ) + + # 批量创建新记录 + if testitems_to_create: + FtestItem.objects.bulk_create(testitems_to_create) + + # 批量更新已有记录的test_user和test_equip + if testitems_to_update_condition: + FtestItem.objects.filter(testitems_to_update_condition).update( + test_user=test_user, + test_equip=test_equip + ) + + return super().save(**kwargs) + class MlogbOutUpdateSerializer(CustomModelSerializer): mlogbdefect = MlogbDefectSerializer(many=True, required=False) count_json = CountJsonSerializer(required=False, many=True) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index effe351c..385d04da 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -26,7 +26,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, - MlogbSerializer, MlogUserSerializer, BatchLogSerializer, MlogQuickSerializer) + MlogbSerializer, MlogUserSerializer, BatchLogSerializer, MlogQuickSerializer, MlogbwStartTestSerializer) from .services import mlog_submit, handover_submit, mlog_revert, get_batch_dag, handover_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wf.models import State, Ticket @@ -38,6 +38,7 @@ from apps.utils.tools import convert_ordereddict, update_dict from django.db.models import Count from datetime import datetime, timedelta from apps.utils.lock import lock_model_record_d_method +from apps.em.models import Equipment # Create your views here. @@ -1006,6 +1007,14 @@ class MlogbwViewSet(CustomModelViewSet): mlog = mlogb.mlog mlog.cal_mlog_count_from_mlogb() + @action(methods=['post'], detail=False, perms_map={'post': 'mlog.update'}, serializer_class=MlogbwStartTestSerializer) + @transaction.atomic + def start_test(self, request, *args, **kwargs): + sr = self.get_serializer(data=request.data) + sr.is_valid(raise_exception=True) + sr.save() + return Response() + class MlogUserViewSet(BulkCreateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet): perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"} queryset = MlogUser.objects.all()