feat: qct 重构
This commit is contained in:
parent
796cdbc615
commit
b289c7813e
|
@ -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.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
@ -31,6 +31,22 @@ class Migration(migrations.Migration):
|
||||||
'abstract': False,
|
'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(
|
migrations.CreateModel(
|
||||||
name='QctMat',
|
name='QctMat',
|
||||||
fields=[
|
fields=[
|
||||||
|
@ -47,18 +63,17 @@ class Migration(migrations.Migration):
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='QctItem',
|
name='QctDefect',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')),
|
('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='创建时间')),
|
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
|
||||||
('update_time', models.DateTimeField(auto_now=True, 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='删除标记')),
|
('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='判定表达式')),
|
('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='排序')),
|
('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='质检模板')),
|
('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={
|
options={
|
||||||
'abstract': False,
|
'abstract': False,
|
||||||
|
@ -67,7 +82,7 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='qct',
|
model_name='qct',
|
||||||
name='defects',
|
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(
|
migrations.AddField(
|
||||||
model_name='qct',
|
model_name='qct',
|
||||||
|
@ -77,7 +92,7 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='qct',
|
model_name='qct',
|
||||||
name='testitems',
|
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(
|
migrations.AddField(
|
||||||
model_name='qct',
|
model_name='qct',
|
|
@ -138,16 +138,21 @@ class Qct(CommonAModel):
|
||||||
name = models.CharField(max_length=50, verbose_name="名称")
|
name = models.CharField(max_length=50, verbose_name="名称")
|
||||||
number = models.CharField(max_length=20, verbose_name="编号")
|
number = models.CharField(max_length=20, verbose_name="编号")
|
||||||
tags = models.JSONField('检测类型', default=list, blank=True)
|
tags = models.JSONField('检测类型', default=list, blank=True)
|
||||||
testitems = models.ManyToManyField(TestItem, 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.qctItem')
|
defects = models.ManyToManyField(Defect, verbose_name="缺陷项", blank=True, through='qm.qctdefect')
|
||||||
materials = models.ManyToManyField(Material, verbose_name="物料", blank=True, through='qm.qctmat')
|
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)
|
qct = models.ForeignKey(Qct, verbose_name="质检模板", on_delete=models.CASCADE)
|
||||||
testitem = models.ForeignKey(TestItem, verbose_name="检测项", on_delete=models.CASCADE, null=True, blank=True)
|
testitem = models.ForeignKey(TestItem, verbose_name="检测项", on_delete=models.CASCADE, null=True, blank=True)
|
||||||
note = models.TextField('备注', 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)
|
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)
|
sort = models.FloatField('排序', default=1)
|
||||||
|
|
||||||
class QctMat(BaseModel):
|
class QctMat(BaseModel):
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from apps.qm.models import (QuaStat, TestItem, Ftest, FtestItem, FtestWork, Ptest,
|
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.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
|
||||||
from apps.utils.serializers import CustomModelSerializer
|
from apps.utils.serializers import CustomModelSerializer
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
@ -36,11 +36,16 @@ class QctSerializer(CustomModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
read_only_fields = EXCLUDE_FIELDS
|
read_only_fields = EXCLUDE_FIELDS
|
||||||
|
|
||||||
class QctItemSerializer(CustomModelSerializer):
|
class QctTestItemSerializer(CustomModelSerializer):
|
||||||
defect_name = serializers.StringRelatedField(source='defect', read_only=True)
|
|
||||||
testitem_name = serializers.CharField(source='testitem.name', read_only=True)
|
testitem_name = serializers.CharField(source='testitem.name', read_only=True)
|
||||||
class Meta:
|
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__'
|
fields = '__all__'
|
||||||
|
|
||||||
class QctMatSerializer(CustomModelSerializer):
|
class QctMatSerializer(CustomModelSerializer):
|
||||||
|
@ -50,7 +55,8 @@ class QctMatSerializer(CustomModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class QctDetailSerializer(CustomModelSerializer):
|
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)
|
defects_ = DefectSerializer(source="defects", many=True, read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Qct
|
model = Qct
|
||||||
|
|
|
@ -3,7 +3,7 @@ from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
from apps.qm.views import (QuaStatViewSet, TestItemViewSet,
|
from apps.qm.views import (QuaStatViewSet, TestItemViewSet,
|
||||||
FtestWorkViewSet, FtestViewSet, PtestViewSet,
|
FtestWorkViewSet, FtestViewSet, PtestViewSet,
|
||||||
NotOkOptionView, DefectViewSet, QctViewSet, QctItemViewSet, QctMatViewSet)
|
NotOkOptionView, DefectViewSet, QctViewSet, QctTestItemViewSet, QctDefectViewSet, QctMatViewSet)
|
||||||
|
|
||||||
API_BASE_URL = 'api/qm/'
|
API_BASE_URL = 'api/qm/'
|
||||||
HTML_BASE_URL = 'qm/'
|
HTML_BASE_URL = 'qm/'
|
||||||
|
@ -16,7 +16,8 @@ router.register('ftestwork', FtestWorkViewSet, basename='ftestwork')
|
||||||
router.register('ptest', PtestViewSet, basename='ptest')
|
router.register('ptest', PtestViewSet, basename='ptest')
|
||||||
router.register("defect", DefectViewSet, basename="defect")
|
router.register("defect", DefectViewSet, basename="defect")
|
||||||
router.register('qct', QctViewSet, basename='qct')
|
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')
|
router.register('qctmat', QctMatViewSet, basename='qctmat')
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path(API_BASE_URL, include(router.urls)),
|
path(API_BASE_URL, include(router.urls)),
|
||||||
|
|
|
@ -5,7 +5,7 @@ from rest_framework.views import APIView
|
||||||
from rest_framework.serializers import Serializer
|
from rest_framework.serializers import Serializer
|
||||||
from apps.qm.models import QuaStat, TestItem, Ftest, Ptest, FtestWork
|
from apps.qm.models import QuaStat, TestItem, Ftest, Ptest, FtestWork
|
||||||
from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \
|
from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \
|
||||||
FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer, QctSerializer, QctItemSerializer, QctMatSerializer, \
|
FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer, QctSerializer, QctTestItemSerializer, QctDefectSerializer, QctMatSerializer, \
|
||||||
QctDetailSerializer
|
QctDetailSerializer
|
||||||
from apps.qm.tasks import cal_quastat_sflog
|
from apps.qm.tasks import cal_quastat_sflog
|
||||||
from rest_framework.response import Response
|
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.wpm.models import SfLog
|
||||||
from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter, QctFilter
|
from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter, QctFilter
|
||||||
from django.db import transaction
|
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.qm.services import ftestwork_submit
|
||||||
from apps.utils.thread import MyThread
|
from apps.utils.thread import MyThread
|
||||||
from apps.wpm.services_2 import get_alldata_with_batch_and_store
|
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):
|
class DefectViewSet(CustomModelViewSet):
|
||||||
"""
|
"""
|
||||||
list: 缺陷项
|
缺陷项
|
||||||
|
|
||||||
缺陷项
|
缺陷项
|
||||||
"""
|
"""
|
||||||
|
@ -36,7 +36,7 @@ class DefectViewSet(CustomModelViewSet):
|
||||||
|
|
||||||
class QctViewSet(CustomModelViewSet):
|
class QctViewSet(CustomModelViewSet):
|
||||||
"""
|
"""
|
||||||
list: 检测模板
|
检测模板
|
||||||
|
|
||||||
检测模板
|
检测模板
|
||||||
"""
|
"""
|
||||||
|
@ -46,15 +46,26 @@ class QctViewSet(CustomModelViewSet):
|
||||||
filterset_class = QctFilter
|
filterset_class = QctFilter
|
||||||
search_fields = ["name", "number"]
|
search_fields = ["name", "number"]
|
||||||
|
|
||||||
class QctItemViewSet(CustomModelViewSet):
|
class QctTestItemViewSet(CustomModelViewSet):
|
||||||
"""检测模板项
|
"""检测模板项
|
||||||
|
|
||||||
检测模板项
|
检测模板项
|
||||||
"""
|
"""
|
||||||
perms_map = {"get": "*", "post": "qct.update", "put": "qct.update", "delete": "qct.update"}
|
perms_map = {"get": "*", "post": "qct.update", "put": "qct.update", "delete": "qct.update"}
|
||||||
queryset = QctItem.objects.all()
|
queryset = QctTestItem.objects.all()
|
||||||
serializer_class = QctItemSerializer
|
serializer_class = QctTestItemSerializer
|
||||||
filterset_fields = ["qct", "testitem", "defect"]
|
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"]
|
ordering = ["qct", "sort"]
|
||||||
|
|
||||||
class QctMatViewSet(CustomModelViewSet):
|
class QctMatViewSet(CustomModelViewSet):
|
||||||
|
|
Loading…
Reference in New Issue