From b289c7813ee2b6842068326aa2f3a52cbf88e8d3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 19 Dec 2024 15:10:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20qct=20=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...219_1034.py => 0029_auto_20241219_1509.py} | 29 ++++++++++++++----- apps/qm/models.py | 13 ++++++--- apps/qm/serializers.py | 16 ++++++---- apps/qm/urls.py | 5 ++-- apps/qm/views.py | 27 ++++++++++++----- 5 files changed, 64 insertions(+), 26 deletions(-) rename apps/qm/migrations/{0029_auto_20241219_1034.py => 0029_auto_20241219_1509.py} (78%) diff --git a/apps/qm/migrations/0029_auto_20241219_1034.py b/apps/qm/migrations/0029_auto_20241219_1509.py similarity index 78% rename from apps/qm/migrations/0029_auto_20241219_1034.py rename to apps/qm/migrations/0029_auto_20241219_1509.py index 2f2b08f9..6162dcba 100644 --- a/apps/qm/migrations/0029_auto_20241219_1034.py +++ b/apps/qm/migrations/0029_auto_20241219_1509.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.12 on 2024-12-19 02:34 +# Generated by Django 3.2.12 on 2024-12-19 07:09 from django.conf import settings from django.db import migrations, models @@ -31,6 +31,22 @@ class Migration(migrations.Migration): 'abstract': False, }, ), + migrations.CreateModel( + name='QctTestItem', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), + ('sort', models.FloatField(default=1, verbose_name='排序')), + ('qct', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.qct', verbose_name='质检模板')), + ('testitem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='qm.testitem', verbose_name='检测项')), + ], + options={ + 'abstract': False, + }, + ), migrations.CreateModel( name='QctMat', fields=[ @@ -47,18 +63,17 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='QctItem', + name='QctDefect', fields=[ ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), - ('note', models.TextField(blank=True, null=True, verbose_name='备注')), ('rule_expression', models.TextField(blank=True, null=True, verbose_name='判定表达式')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), ('sort', models.FloatField(default=1, verbose_name='排序')), - ('defect', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='qm.defect', verbose_name='缺陷项')), + ('defect', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.defect', verbose_name='缺陷项')), ('qct', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.qct', verbose_name='质检模板')), - ('testitem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='qm.testitem', verbose_name='检测项')), ], options={ 'abstract': False, @@ -67,7 +82,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='qct', name='defects', - field=models.ManyToManyField(blank=True, through='qm.QctItem', to='qm.Defect', verbose_name='缺陷项'), + field=models.ManyToManyField(blank=True, through='qm.QctDefect', to='qm.Defect', verbose_name='缺陷项'), ), migrations.AddField( model_name='qct', @@ -77,7 +92,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='qct', name='testitems', - field=models.ManyToManyField(blank=True, through='qm.QctItem', to='qm.TestItem', verbose_name='检测项'), + field=models.ManyToManyField(blank=True, through='qm.QctTestItem', to='qm.TestItem', verbose_name='检测项'), ), migrations.AddField( model_name='qct', diff --git a/apps/qm/models.py b/apps/qm/models.py index 5b34a674..c811cd1a 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -138,16 +138,21 @@ 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) - testitems = models.ManyToManyField(TestItem, verbose_name="检测项", blank=True, through='qm.qctItem') - defects = models.ManyToManyField(Defect, verbose_name="缺陷项", blank=True, through='qm.qctItem') + 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') -class QctItem(BaseModel): +class QctTestItem(BaseModel): qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE) testitem = models.ForeignKey(TestItem, verbose_name="检测项", on_delete=models.CASCADE, null=True, blank=True) note = models.TextField('备注', null=True, blank=True) + sort = models.FloatField('排序', default=1) + +class QctDefect(BaseModel): + qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE) + defect = models.ForeignKey(Defect, verbose_name="缺陷项", on_delete=models.CASCADE) rule_expression = models.TextField('判定表达式', null=True, blank=True) - defect = models.ForeignKey(Defect, verbose_name="缺陷项", on_delete=models.CASCADE, null=True, blank=True) + note = models.TextField('备注', null=True, blank=True) sort = models.FloatField('排序', default=1) class QctMat(BaseModel): diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 34506f4f..2eb6ccee 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -1,5 +1,5 @@ from apps.qm.models import (QuaStat, TestItem, Ftest, FtestItem, FtestWork, Ptest, - NotOkOption, Defect, Qct, QctItem, QctMat) + NotOkOption, Defect, Qct, QctTestItem, QctMat, QctDefect) from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers @@ -36,11 +36,16 @@ class QctSerializer(CustomModelSerializer): fields = '__all__' read_only_fields = EXCLUDE_FIELDS -class QctItemSerializer(CustomModelSerializer): - defect_name = serializers.StringRelatedField(source='defect', read_only=True) +class QctTestItemSerializer(CustomModelSerializer): testitem_name = serializers.CharField(source='testitem.name', read_only=True) class Meta: - model = QctItem + model = QctTestItem + fields = '__all__' + +class QctDefectSerializer(CustomModelSerializer): + defect_name = serializers.CharField(source='defect.name', read_only=True) + class Meta: + model = QctDefect fields = '__all__' class QctMatSerializer(CustomModelSerializer): @@ -50,7 +55,8 @@ class QctMatSerializer(CustomModelSerializer): fields = '__all__' class QctDetailSerializer(CustomModelSerializer): - testitems_ = QctItemSerializer(source="testitems", many=True, read_only=True) + testitems_ = QctTestItemSerializer(source="testitems", many=True, read_only=True) + defects_ = QctDefectSerializer(source="defects", many=True, read_only=True) defects_ = DefectSerializer(source="defects", many=True, read_only=True) class Meta: model = Qct diff --git a/apps/qm/urls.py b/apps/qm/urls.py index 843cb006..879f266e 100644 --- a/apps/qm/urls.py +++ b/apps/qm/urls.py @@ -3,7 +3,7 @@ from rest_framework.routers import DefaultRouter from apps.qm.views import (QuaStatViewSet, TestItemViewSet, FtestWorkViewSet, FtestViewSet, PtestViewSet, - NotOkOptionView, DefectViewSet, QctViewSet, QctItemViewSet, QctMatViewSet) + NotOkOptionView, DefectViewSet, QctViewSet, QctTestItemViewSet, QctDefectViewSet, QctMatViewSet) API_BASE_URL = 'api/qm/' HTML_BASE_URL = 'qm/' @@ -16,7 +16,8 @@ router.register('ftestwork', FtestWorkViewSet, basename='ftestwork') router.register('ptest', PtestViewSet, basename='ptest') router.register("defect", DefectViewSet, basename="defect") router.register('qct', QctViewSet, basename='qct') -router.register('qctitem', QctItemViewSet, basename='qctitem') +router.register('qcttestitem', QctTestItemViewSet, basename='qcttestitem') +router.register('qctdefect', QctDefectViewSet, basename="qctdefect") router.register('qctmat', QctMatViewSet, basename='qctmat') urlpatterns = [ path(API_BASE_URL, include(router.urls)), diff --git a/apps/qm/views.py b/apps/qm/views.py index d9e03922..522c6cb3 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -5,7 +5,7 @@ from rest_framework.views import APIView from rest_framework.serializers import Serializer from apps.qm.models import QuaStat, TestItem, Ftest, Ptest, FtestWork from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \ - FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer, QctSerializer, QctItemSerializer, QctMatSerializer, \ + FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer, QctSerializer, QctTestItemSerializer, QctDefectSerializer, QctMatSerializer, \ QctDetailSerializer from apps.qm.tasks import cal_quastat_sflog from rest_framework.response import Response @@ -16,7 +16,7 @@ from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.wpm.models import SfLog from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter, QctFilter from django.db import transaction -from apps.qm.models import NotOkOption, Defect, Qct, QctItem, QctMat +from apps.qm.models import NotOkOption, Defect, Qct, QctTestItem, QctMat, QctDefect from apps.qm.services import ftestwork_submit from apps.utils.thread import MyThread from apps.wpm.services_2 import get_alldata_with_batch_and_store @@ -25,7 +25,7 @@ from apps.wf.models import State class DefectViewSet(CustomModelViewSet): """ - list: 缺陷项 + 缺陷项 缺陷项 """ @@ -36,7 +36,7 @@ class DefectViewSet(CustomModelViewSet): class QctViewSet(CustomModelViewSet): """ - list: 检测模板 + 检测模板 检测模板 """ @@ -46,15 +46,26 @@ class QctViewSet(CustomModelViewSet): filterset_class = QctFilter search_fields = ["name", "number"] -class QctItemViewSet(CustomModelViewSet): +class QctTestItemViewSet(CustomModelViewSet): """检测模板项 检测模板项 """ perms_map = {"get": "*", "post": "qct.update", "put": "qct.update", "delete": "qct.update"} - queryset = QctItem.objects.all() - serializer_class = QctItemSerializer - filterset_fields = ["qct", "testitem", "defect"] + queryset = QctTestItem.objects.all() + serializer_class = QctTestItemSerializer + filterset_fields = ["qct", "testitem"] + ordering = ["qct", "sort"] + +class QctDefectViewSet(CustomModelViewSet): + """检测缺陷项 + + 检测缺陷项 + """ + perms_map = {"get": "*", "post": "qct.update", "put": "qct.update", "delete": "qct.update"} + queryset = QctDefect.objects.all() + serializer_class = QctDefectSerializer + filterset_fields = ["qct", "defect"] ordering = ["qct", "sort"] class QctMatViewSet(CustomModelViewSet):