diff --git a/apps/qm/models.py b/apps/qm/models.py index b5557dfb..48893123 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -168,6 +168,16 @@ class Qct(CommonAModel): def qct_mats(self): return QctMat.objects.filter(qct=self) + @classmethod + def get(self, material:Material, cate:str): + try: + qctmat = QctMat.objects.get(material=material, qct__is_deleted=False, qct__tags__contains=cate) + except QctMat.DoesNotExist: + qctmat = None + except QctMat.MultipleObjectsReturned: + raise ParseError("存在多个质检表,请手动选择") + return qctmat.qct if qctmat else None + class QctTestItem(BaseModel): qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qcttestitem") testitem = models.ForeignKey(TestItem, verbose_name="检测项", on_delete=models.CASCADE, null=True, blank=True) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index df6088c8..9ee1ffa5 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -199,24 +199,30 @@ class FtestWorkCreateUpdateSerializer(CustomModelSerializer): ftestworkdefect = validated_data.pop("ftestworkdefect", []) with transaction.atomic(): ins: FtestWork = super().create(validated_data) + qct = Qct.get(ins.material, "inm") + if qct: + ins.qct = qct + ins.save() for ftestworkdefect in ftestworkdefect: FtestworkDefect.objects.create(ftestwork=ins, **ftestworkdefect) - if ftestworkdefect: + if ins.qct or ftestworkdefect: ins.cal_count() return ins def update(self, instance, validated_data): ftestworkdefect = validated_data.pop("ftestworkdefect", []) - ins = super().update(instance, validated_data) + ins:FtestWork = super().update(instance, validated_data) with transaction.atomic(): for item in ftestworkdefect: try: ins = FtestworkDefect.objects.get(ftestwork=ins, defect=item["defect"]) except FtestworkDefect.DoesNotExist: raise ParseError("新的缺陷项!") + except FtestworkDefect.MultipleObjectsReturned: + raise ParseError("缺陷项重复!") ins.count = item["count"] ins.save() - if ftestworkdefect: + if ins.qct or ftestworkdefect: ins.cal_count() return ins diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 5ed2f485..3ff30245 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -752,7 +752,7 @@ class MlogbOutUpdateSerializer(CustomModelSerializer): def validate(self, attrs): mlogbdefect = attrs.get("mlogbdefect", []) if mlogbdefect: - attrs.pop("count_notok_json") + attrs.pop("count_notok_json", None) for i in attrs: if 'count_n_' in i: attrs.pop(i, None) diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 41464351..330b3e86 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -30,7 +30,7 @@ from .services import mlog_submit, handover_submit, mlog_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wf.models import State from apps.wpmw.models import Wpr -from apps.qm.models import QctMat, Ftest +from apps.qm.models import Qct, Ftest from apps.enm.models import EnStat from django.db.models import Q from apps.utils.tools import convert_ordereddict @@ -596,13 +596,7 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust # 如果是生产返修,则忽略质检 pass elif mlogbout.qct is None: - try: - qctmat = QctMat.objects.get(material=material_out, qct__is_deleted=False, qct__tags__contains="process") - except QctMat.DoesNotExist: - qctmat = None - except QctMat.MultipleObjectsReturned: - raise ParseError("存在多个质检表,请手动选择") - mlogbout.qct = qctmat.qct if qctmat else None + mlogbout.qct = Qct.get(mlogbout.material_out, "process") mlogbout.count_real = d_count_real mlogbout.count_ok = d_count_ok mlogbout.save()