From 767896f3dc6a0d30bab4ac616cb3665bdcd450a9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 6 Mar 2025 15:26:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20qct=20get=5Fqs=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/qm/models.py | 26 +++++++++++++++++++------- apps/qm/serializers.py | 3 +++ apps/qm/views.py | 10 +++++++++- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/apps/qm/models.py b/apps/qm/models.py index dc0c3458..7c0f3570 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -151,7 +151,7 @@ QC_TRACE_CHOICES = ( class Qct(CommonAModel): name = models.CharField(max_length=50, verbose_name="名称") number = models.CharField(max_length=20, verbose_name="编号") - tags = models.JSONField('检测类型', default=list, blank=True) # process 和 inm + tags = models.JSONField('检测类型', default=list, blank=True) # process/inm/default testitems = models.ManyToManyField(TestItem, verbose_name="检测项", blank=True, through='qm.qcttestitem') defects = models.ManyToManyField(Defect, verbose_name="缺陷项", blank=True, through='qm.qctdefect') materials = models.ManyToManyField(Material, verbose_name="物料", blank=True, through='qm.qctmat') @@ -169,14 +169,26 @@ class Qct(CommonAModel): return QctMat.objects.filter(qct=self) @classmethod - def get(self, material:Material, cate:str): + def get(cls, material:Material, tag:str): try: - qctmat = QctMat.objects.get(material=material, qct__is_deleted=False, qct__tags__contains=cate) - except QctMat.DoesNotExist: - qctmat = None - except QctMat.MultipleObjectsReturned: + qct = Qct.objects.filter(qctmat__material=material, tags__contains=tag) + except Qct.DoesNotExist: + try: + qct = Qct.objects.get(tags__contains="default") + except Qct.DoesNotExist: + qct = None + except Qct.MultipleObjectsReturned: + raise ParseError("存在多个通用质检表,请手动选择") + except Qct.MultipleObjectsReturned: raise ParseError("存在多个质检表,请手动选择") - return qctmat.qct if qctmat else None + return qct + + @classmethod + def get_qs(cls, materialId:str, tag:str): + qct_qs = Qct.objects.filter(qctmat__material__id=materialId, tags__contains=tag) + if not qct_qs.exists(): + qct_qs = Qct.objects.filter(tags__contains="default") + return qct_qs class QctTestItem(BaseModel): qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE, related_name="qcttestitem") diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 5238ac83..9cc375ac 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -25,6 +25,9 @@ class DefectSerializer(CustomModelSerializer): # def update(self, instance, validated_data): # validated_data.pop("code", None) # return super().update(instance, validated_data) +class QctGetSerializer(CustomModelSerializer): + material = serializers.CharField(label="物料ID") + tag = serializers.CharField(label="标签") class TestItemSerializer(CustomModelSerializer): process_name = serializers.CharField(source="process.name", read_only=True) diff --git a/apps/qm/views.py b/apps/qm/views.py index eb018487..a60ff3fb 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -7,7 +7,7 @@ from apps.qm.models import QuaStat, NotOkOption, Ftest, Ptest, FtestWork, FtestI from apps.qm.models import TestItem, Defect, Qct, QctTestItem, QctMat, QctDefect from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \ FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer, QctSerializer, QctTestItemSerializer, QctDefectSerializer, QctMatSerializer, \ - QctDetailSerializer, UpdateRatePassTSerializer + QctDetailSerializer, UpdateRatePassTSerializer, QctGetSerializer from apps.qm.tasks import cal_quastat_sflog from rest_framework.response import Response from apps.utils.mixins import BulkUpdateModelMixin @@ -46,6 +46,14 @@ class QctViewSet(CustomModelViewSet): filterset_class = QctFilter search_fields = ["name", "number"] + @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=QctGetSerializer) + @transaction.atomic + def get_qs(self, request, *args, **kwargs): + data = request.data + qct_qs = Qct.get_qs(data["material"], data["tag"]) + return QctSerializer(instance=qct_qs, many=True).data + + class QctTestItemViewSet(CustomModelViewSet): """检测模板项