From d732652c9ff85e394f00011511de14cc1399a3b5 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 18 Jul 2025 16:01:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20qctmat=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E4=BB=A5=E6=94=AF=E6=8C=81=E6=B6=88=E8=80=97=E7=89=A9?= =?UTF-8?q?=E6=96=99=E5=8F=82=E6=95=B0=E5=A1=AB=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/inm/services_daoru.py | 2 +- apps/qm/migrations/0052_auto_20250718_1558.py | 23 +++++++++++++++++++ apps/qm/models.py | 17 +++++++++++--- apps/qm/serializers.py | 12 ++++++---- apps/qm/views.py | 2 +- apps/wpm/serializers.py | 2 +- apps/wpm/views.py | 2 +- 7 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 apps/qm/migrations/0052_auto_20250718_1558.py diff --git a/apps/inm/services_daoru.py b/apps/inm/services_daoru.py index 3063b54b..3f3f59c1 100644 --- a/apps/inm/services_daoru.py +++ b/apps/inm/services_daoru.py @@ -67,7 +67,7 @@ def daoru_mioitem_test(path:str, mioitem:MIOItem): from openpyxl import load_workbook from apps.qm.models import TestItem, Ftest, Qct, FtestItem, FtestDefect - qct = Qct.get(mioitem.material, tag="inm") + qct = Qct.get(mioitem.material, tag="inm", type="in") if qct is None: raise ParseError("未找到检验表") diff --git a/apps/qm/migrations/0052_auto_20250718_1558.py b/apps/qm/migrations/0052_auto_20250718_1558.py new file mode 100644 index 00000000..0d56c14f --- /dev/null +++ b/apps/qm/migrations/0052_auto_20250718_1558.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2025-07-18 07:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('qm', '0051_alter_ftestwork_batch'), + ] + + operations = [ + migrations.AddField( + model_name='qctmat', + name='use_for_in', + field=models.BooleanField(default=True, verbose_name='可用于消耗'), + ), + migrations.AddField( + model_name='qctmat', + name='use_for_out', + field=models.BooleanField(default=True, verbose_name='可用于产出'), + ), + ] diff --git a/apps/qm/models.py b/apps/qm/models.py index 2dceb076..5ec00882 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -172,9 +172,14 @@ class Qct(CommonAModel): return QctMat.objects.filter(qct=self) @classmethod - def get(cls, material:Material, tag:str): + def get(cls, material:Material, tag:str, type:str=None): try: - qct = Qct.objects.get(qctmat__material=material, tags__contains=tag) + if type == "in": + qct = Qct.objects.get(qctmat__material=material, tags__contains=tag, qctmat__use_for_in=True) + elif type == "out": + qct = Qct.objects.get(qctmat__material=material, tags__contains=tag, qctmat__use_for_out=True) + else: + qct = Qct.objects.get(qctmat__material=material, tags__contains=tag) except Qct.DoesNotExist: try: qct = Qct.objects.get(name="默认检验表") @@ -195,8 +200,12 @@ class Qct(CommonAModel): return None @classmethod - def get_qs(cls, materialId:str, tag:str): + def get_qs(cls, materialId:str, tag:str, type:str): qct_qs = Qct.objects.filter(qctmat__material__id=materialId, tags__contains=tag) + if type == "in": + qct_qs = qct_qs.filter(qctmat__use_for_in=True) + elif type == "out": + qct_qs = qct_qs.filter(qctmat__use_for_out=True) if not qct_qs.exists(): qct_qs = Qct.objects.filter(name="默认检验表") return qct_qs @@ -224,6 +233,8 @@ class QctMat(BaseModel): material = models.ForeignKey(Material, verbose_name="物料", on_delete=models.CASCADE) tracing = models.CharField('追溯层级', default=QC_T, choices=QC_TRACE_CHOICES, max_length=20, help_text=str(QC_TRACE_CHOICES)) + use_for_in = models.BooleanField("可用于消耗", default=True) + use_for_out = models.BooleanField("可用于产出", default=True) max_defect_rate = models.FloatField('最大不合格率', default=0.5, null=True, blank=True) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index e17bc21e..6f985d9e 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -37,6 +37,7 @@ class DefectSerializer(CustomModelSerializer): class QctGetSerializer(serializers.Serializer): material = serializers.CharField(label="物料ID") tag = serializers.CharField(label="标签") + type = serializers.CharField(label="类型(in/out)", required=False) class TestItemSerializer(CustomModelSerializer): process_name = serializers.CharField(source="process.name", read_only=True) @@ -53,6 +54,7 @@ class QctSerializer(CustomModelSerializer): class QctTestItemSerializer(CustomModelSerializer): testitem_name = serializers.CharField(source='testitem.name', read_only=True) + testitem_type = serializers.CharField(source='testitem.type', read_only=True) testitem_description = serializers.CharField(source='testitem.description', read_only=True) testitem_field_type = serializers.CharField(source='testitem.field_type', read_only=True) testitem_choices = serializers.CharField(source='testitem.choices', read_only=True) @@ -61,11 +63,11 @@ class QctTestItemSerializer(CustomModelSerializer): model = QctTestItem fields = '__all__' - def validate(self, attrs): - testitem:TestItem = attrs.get("testitem") - if testitem.type != TestItem.T_TEST: - raise ParseError("只可选择检测项") - return attrs + # def validate(self, attrs): + # testitem:TestItem = attrs.get("testitem") + # if testitem.type != TestItem.T_TEST: + # raise ParseError("只可选择检测项") + # return attrs class QctDefectSerializer(CustomModelSerializer): defect_name = serializers.CharField(source='defect.name', read_only=True) diff --git a/apps/qm/views.py b/apps/qm/views.py index 0c597d16..6a391296 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -63,7 +63,7 @@ class QctViewSet(CustomModelViewSet): sr = QctGetSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data - qct = Qct.get(vdata["material"], vdata["tag"]) + qct = Qct.get(vdata["material"], vdata["tag"], vdata.get("tag", None)) return Response(QctDetailSerializer(instance=qct).data) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 89c45fed..23347ca1 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -678,7 +678,7 @@ class MlogInitSerializer(CustomModelSerializer): attrs['handle_date'] = localdate(attrs['work_end_time']) # 如果已经确定产出,则自动获取qct if attrs.get("material_out", None): - attrs["qct"] = Qct.get(attrs["material_out"], "process") + attrs["qct"] = Qct.get(attrs["material_out"], "process", "out") return attrs class MlogChangeSerializer(CustomModelSerializer): diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 40be2044..c44f41a6 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -623,7 +623,7 @@ class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, Cust "material_out": material_out, "batch": mlogbin.batch, "batch_ofrom": wm_in.batch_ofrom, "material_ofrom": wm_in.material_ofrom, - "qct": Qct.get(material_out, "process") + "qct": Qct.get(material_out, "process", "out") } if mtype == Process.PRO_DIV and material_in.tracking == Material.MA_TRACKING_SINGLE: pass