From 5f88433a25fb281a2749efa1eb2c2ef02d112935 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 8 Jan 2025 16:21:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mlogbw=E5=A2=9E=E5=8A=A0=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/models.py | 5 +++++ apps/wpm/serializers.py | 19 +++++++++++++------ apps/wpm/views.py | 18 +++++++++--------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 88e53bec..b41b4127 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -346,6 +346,11 @@ class Mlogb(BaseModel): count_notok_json = models.JSONField('不合格情况', default=list, blank=True) defects = models.ManyToManyField("qm.defect", verbose_name='不合格缺陷', through="wpm.mlogbdefect", blank=True) + def get_tracking(self): + if self.material_in: + return "in", self.material_in.tracking + elif self.material_out: + return "out", self.material_out.tracking def cal_count(self): self.count_notok = MlogbDefect.objects.filter( diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index c3a0a953..71be5ffb 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -580,12 +580,12 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): def validate(self, attrs): mlogb:Mlogb = attrs["mlogb"] - material_in:Material = mlogb.material_in - material_out:Material = mlogb.material_out - if material_in and material_in.tracking != Material.MA_TRACKING_SINGLE: - raise ParseError("非追踪单件无需填写") - if material_out and material_out.tracking != Material.MA_TRACKING_SINGLE: - raise ParseError("非追踪单件无需填写") + wpr:Wpr = attrs.get("wpr", None) + in_or_out, tracking = mlogb.get_tracking() + if tracking != Material.MA_TRACKING_SINGLE: + raise ValidationError('非单件追踪不可使用') + if in_or_out == 'in' and not wpr: + raise ValidationError('请选择相应产品') return attrs def update(self, instance, validated_data): @@ -887,3 +887,10 @@ class MlogbDefectSerializer(CustomModelSerializer): model = MlogbDefect fields = "__all__" read_only_fields = EXCLUDE_FIELDS_BASE + + def create(self, validated_data): + defect = validated_data["defect"] + mlogb = validated_data["mlogb"] + if MlogbDefect.objects.filter(mlogb=mlogb, defect=defect).exists(): + raise ParseError('该缺陷已填写') + return super().create(validated_data) \ No newline at end of file diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 981f1320..45223a8f 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -586,18 +586,18 @@ class MlogbwViewSet(CustomModelViewSet): def filter_queryset(self, queryset): if not self.detail and not self.request.query_params.get('mlogb', None): - raise ParseError('请指定所属日志明细') + raise ParseError('请指定所属消耗/产出明细') return super().filter_queryset(queryset) def cal_mlogb_count(self, mlogb): count = Mlogbw.objects.filter(mlogb=mlogb).count() # 此处先不管检验问题 - # todo if mlogb.material_in: mlogb.count_use = count elif mlogb.material_out: mlogb.count_real = count mlogb.count_ok = count + mlogb.count_notok = 0 mlogb.save() @transaction.atomic @@ -613,10 +613,13 @@ class MlogbwViewSet(CustomModelViewSet): mlogb_to = mlogb.mlogb_to material_out:Material = mlogb.mlog.material_out if mlogb_to and material_out.tracking == Material.MA_TRACKING_SINGLE: - for item in Mlogbw.objects.filter(mlogb=mlogb).order_by("number"): - Mlogbw.objects.get_or_create(mlogb=mlogb_to, wpr=item.wpr, defaults={"number": item.number}) + Mlogbw.objects.get_or_create(mlogb=mlogb_to, wpr=ins.wpr, defaults={"number": ins.number}) self.cal_mlogb_count(mlogb_to) + @transaction.atomic + def perform_update(self, serializer): + mlogbw = serializer.save() + @transaction.atomic def perform_destroy(self, instance:Mlogbw): mlogb = instance.mlogb @@ -626,16 +629,13 @@ class MlogbwViewSet(CustomModelViewSet): if instance.ftest: instance.ftest.delete() self.cal_mlogb_count(mlogb) - # 如果是输入且输出追踪到个,需同步创建 + # 如果是输入且输出追踪到个,需同步删除 material_in: Material = mlogb.material_in if material_in is not None: mlogb_to = mlogb.mlogb_to material_out: Material = mlogb.mlog.material_out if mlogb_to and material_out.tracking == Material.MA_TRACKING_SINGLE: - number_list = Mlogbw.objects.filter(mlogb=mlogb).values_list("number", flat=True) - wprId_list = Mlogbw.objects.filter(mlogb=mlogb).values_list("wpr__id", flat=True) - Mlogbw.objects.filter(mlogb=mlogb_to, number__in=number_list).delete() - Mlogbw.objects.filter(mlogb=mlogb_to, wpr__id__in=wprId_list).delete() + Mlogbw.objects.filter(mlogb=mlogb_to, wpr=instance.wpr).delete() self.cal_mlogb_count(mlogb_to)