feat: qct 重构

This commit is contained in:
caoqianming 2024-12-19 15:10:12 +08:00
parent 796cdbc615
commit b289c7813e
5 changed files with 64 additions and 26 deletions

View File

@ -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',

View File

@ -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):

View File

@ -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

View File

@ -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)),

View File

@ -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):