diff --git a/apps/qm/migrations/0010_auto_20231103_1620.py b/apps/qm/migrations/0010_auto_20231103_1620.py new file mode 100644 index 00000000..76eb96e6 --- /dev/null +++ b/apps/qm/migrations/0010_auto_20231103_1620.py @@ -0,0 +1,54 @@ +# Generated by Django 3.2.12 on 2023-11-03 08:20 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('qm', '0009_auto_20231102_1758'), + ] + + operations = [ + migrations.AddField( + model_name='testitem', + name='number', + field=models.CharField(blank=True, default='', max_length=20, verbose_name='编号'), + ), + migrations.CreateModel( + name='Ptest', + 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='删除标记')), + ('test_date', models.DateField(verbose_name='实验日期')), + ('sample_number', models.CharField(max_length=20, verbose_name='样品编号')), + ('sample_count', models.PositiveIntegerField(blank=True, null=True, verbose_name='样品数量')), + ('sample_density', models.FloatField(blank=True, null=True, verbose_name='样品密度')), + ('specification', models.CharField(blank=True, max_length=20, null=True, verbose_name='型号规格')), + ('equip_state', models.CharField(choices=[('R', '正常'), ('T', '异常')], default='R', help_text=[('R', '正常'), ('T', '异常')], max_length=10, verbose_name='仪器状态')), + ('note', models.TextField(blank=True, default='', verbose_name='备注')), + ('val_hd', models.FloatField(blank=True, help_text='mm', null=True, verbose_name='厚度')), + ('val_zsl', models.FloatField(blank=True, help_text='589nm', null=True, verbose_name='折射率')), + ('val_tgl', models.FloatField(blank=True, help_text='550nm', null=True, verbose_name='透过率')), + ('val_ts', models.FloatField(blank=True, help_text='℃', null=True, verbose_name='Ts')), + ('val_tg', models.FloatField(blank=True, help_text='℃', null=True, verbose_name='Tg')), + ('val_tf', models.FloatField(blank=True, help_text='℃', null=True, verbose_name='Tf')), + ('val_xj', models.CharField(choices=[('S', '析晶'), ('R', '不析晶'), ('θ', '未化')], default='S', help_text=[('S', '析晶'), ('R', '不析晶'), ('θ', '未化')], max_length=10, verbose_name='析晶')), + ('val_pzxs', models.FloatField(blank=True, help_text='30-300℃', null=True, verbose_name='膨胀系数')), + ('val_zgwd', models.FloatField(blank=True, null=True, verbose_name='升至最高温度')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ptest_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('test_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='检验员')), + ('testitem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.testitem', verbose_name='测试项目')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ptest_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/qm/models.py b/apps/qm/models.py index 05831107..61406eff 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -10,6 +10,7 @@ class TestItem(CommonAModel): 检验项目 """ name = models.CharField('名称', max_length=100) + number = models.CharField('编号', max_length=20, default='', blank=True) sort = models.PositiveSmallIntegerField('排序', default=1) description = models.TextField('描述', default='') @@ -63,3 +64,45 @@ class FtestItem(BaseModel): TestItem, verbose_name='质检项目', on_delete=models.CASCADE) test_val = models.FloatField('测量值', default=0, blank=True) check_val = models.FloatField('专检测量值', null=True, blank=True) + + +class Ptest(CommonAModel): + """ + 性能测试记录 + """ + PTEST_EQUIP_STATES = ( + ('R', '正常'), + ('T', '异常') + ) + PTEST_XJ_VALS = ( + ('S', '析晶'), + ('R', '不析晶'), + ('θ', '未化') + ) + test_date = models.DateField('实验日期') + test_user = models.ForeignKey( + User, verbose_name='检验员', on_delete=models.CASCADE) + testitem = models.ForeignKey( + TestItem, verbose_name='测试项目', on_delete=models.CASCADE) + sample_number = models.CharField('样品编号', max_length=20) + sample_count = models.PositiveIntegerField('样品数量', null=True, blank=True) + sample_density = models.FloatField('样品密度', null=True, blank=True) + specification = models.CharField( + '型号规格', max_length=20, null=True, blank=True) + equip_state = models.CharField( + '仪器状态', max_length=10, default='R', choices=PTEST_EQUIP_STATES, help_text=list(PTEST_EQUIP_STATES)) + note = models.TextField('备注', default='', blank=True) + + val_hd = models.FloatField('厚度', help_text='mm', null=True, blank=True) + val_zsl = models.FloatField( + '折射率', help_text='589nm', null=True, blank=True) + val_tgl = models.FloatField( + '透过率', help_text='550nm', null=True, blank=True) + val_ts = models.FloatField("Ts", help_text='℃', null=True, blank=True) + val_tg = models.FloatField("Tg", help_text='℃', null=True, blank=True) + val_tf = models.FloatField("Tf", help_text='℃', null=True, blank=True) + val_xj = models.CharField( + '析晶', max_length=10, default='S', choices=PTEST_XJ_VALS, help_text=list(PTEST_XJ_VALS)) + val_pzxs = models.FloatField( + '膨胀系数', help_text='30-300℃', null=True, blank=True) + val_zgwd = models.FloatField('升至最高温度', null=True, blank=True) diff --git a/apps/qm/serializers.py b/apps/qm/serializers.py index 9ad0644c..4b12271b 100644 --- a/apps/qm/serializers.py +++ b/apps/qm/serializers.py @@ -1,4 +1,4 @@ -from apps.qm.models import QuaStat, TestItem, Ftest, FtestItem +from apps.qm.models import QuaStat, TestItem, Ftest, FtestItem, Ptest from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers @@ -104,3 +104,12 @@ class FtestSerializer(CustomModelSerializer): ftestitem.check_val = item['check_val'] ftestitem.save() return instance + + +class PtestSerializer(CustomModelSerializer): + testitem_name = serializers.CharField( + source='testitem.name', read_only=True) + + class Meta: + model = Ptest + fields = '__all__' diff --git a/apps/qm/urls.py b/apps/qm/urls.py index bf5de1df..88cb217c 100644 --- a/apps/qm/urls.py +++ b/apps/qm/urls.py @@ -1,7 +1,7 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.qm.views import QuaStatViewSet, TestItemViewSet, FtestViewSet +from apps.qm.views import QuaStatViewSet, TestItemViewSet, FtestViewSet, PtestViewSet API_BASE_URL = 'api/qm/' HTML_BASE_URL = 'qm/' @@ -9,8 +9,8 @@ HTML_BASE_URL = 'qm/' router = DefaultRouter() router.register('quastat', QuaStatViewSet, basename='quastat') router.register('testitem', TestItemViewSet, basename='testitem') -router.register('ftest', FtestViewSet, basename='Ftest') - +router.register('ftest', FtestViewSet, basename='fest') +router.register('ptest', PtestViewSet, basename='ptest') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/qm/views.py b/apps/qm/views.py index 49efdb35..e4bc3111 100644 --- a/apps/qm/views.py +++ b/apps/qm/views.py @@ -1,8 +1,8 @@ from django.shortcuts import render from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin from rest_framework.decorators import action -from apps.qm.models import QuaStat, TestItem, Ftest -from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer +from apps.qm.models import QuaStat, TestItem, Ftest, Ptest +from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer from apps.qm.tasks import cal_quastat_sflog from rest_framework.response import Response from apps.utils.mixins import BulkCreateModelMixin, BulkUpdateModelMixin @@ -62,3 +62,15 @@ class FtestViewSet(CustomModelViewSet): queryset = Ftest.objects.all() serializer_class = FtestSerializer select_related_fields = ['test_user', 'check_user'] + + +class PtestViewSet(CustomModelViewSet): + """ + list:性能测试 + + 性能测试 + """ + queryset = Ptest.objects.all() + serializer_class = PtestSerializer + select_related_fields = ['testitem'] + filterset_fields = ['testitem', 'test_date']