增加标准和检测项目表
This commit is contained in:
parent
adb2ec2471
commit
c27a77bac9
|
@ -18,6 +18,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@riophae/vue-treeselect": "^0.4.0",
|
"@riophae/vue-treeselect": "^0.4.0",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
|
"cache-loader": "^4.1.0",
|
||||||
"compression-webpack-plugin": "^5.0.1",
|
"compression-webpack-plugin": "^5.0.1",
|
||||||
"element-ui": "^2.15.5",
|
"element-ui": "^2.15.5",
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class QmConfig(AppConfig):
|
||||||
|
name = 'apps.qm'
|
||||||
|
verbose_name = '质量管理'
|
|
@ -0,0 +1,73 @@
|
||||||
|
# Generated by Django 3.2.6 on 2021-09-15 14:06
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('system', '0003_auto_20210812_0909'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Standard',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('number', models.CharField(max_length=100, verbose_name='标准编号')),
|
||||||
|
('name', models.CharField(max_length=100, verbose_name='标准名称')),
|
||||||
|
('enabled', models.BooleanField(default=True, verbose_name='是否启用')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='standard_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.file', verbose_name='文件')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='standard_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': '标准库',
|
||||||
|
'verbose_name_plural': '标准库',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='TestItem',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('name', models.CharField(max_length=100, verbose_name='名称')),
|
||||||
|
('term_number', models.CharField(max_length=100, verbose_name='条款号')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('standard', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.standard', verbose_name='关联标准')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='testitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': '检验项目',
|
||||||
|
'verbose_name_plural': '检验项目',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='AnalysisItem',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('name', models.CharField(max_length=100, verbose_name='名称')),
|
||||||
|
('rules', models.JSONField(default=dict, verbose_name='判定规则')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='analysisitem_create_by', 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='analysisitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': '检验分析项',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,41 @@
|
||||||
|
from django.db import models
|
||||||
|
from apps.system.models import CommonAModel, File
|
||||||
|
# Create your models here.
|
||||||
|
class Standard(CommonAModel):
|
||||||
|
"""
|
||||||
|
标准
|
||||||
|
"""
|
||||||
|
number = models.CharField('标准编号', max_length=100)
|
||||||
|
name = models.CharField('标准名称', max_length=100)
|
||||||
|
enabled = models.BooleanField('是否启用', default=True)
|
||||||
|
file = models.ForeignKey(File, verbose_name='文件', null=True, blank=True, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = '标准库'
|
||||||
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.number + '-' + self.name
|
||||||
|
|
||||||
|
class TestItem(CommonAModel):
|
||||||
|
"""
|
||||||
|
检验项目
|
||||||
|
"""
|
||||||
|
name = models.CharField('名称', max_length=100)
|
||||||
|
standard = models.ForeignKey(Standard, verbose_name='关联标准', on_delete=models.CASCADE)
|
||||||
|
term_number = models.CharField('条款号', max_length=100)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = '检验项目'
|
||||||
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
|
class AnalysisItem(CommonAModel):
|
||||||
|
"""
|
||||||
|
检验分析项
|
||||||
|
"""
|
||||||
|
name = models.CharField('名称', max_length=100)
|
||||||
|
testitem = models.ForeignKey(TestItem, on_delete=models.CASCADE, verbose_name='关联检验项目')
|
||||||
|
rules =models.JSONField('判定规则', default=list)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = '检验分析项'
|
|
@ -0,0 +1,33 @@
|
||||||
|
from rest_framework import serializers
|
||||||
|
from apps.system.serializers import FileSimpleSerializer
|
||||||
|
from .models import Standard, TestItem
|
||||||
|
|
||||||
|
class StandardCreateUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Standard
|
||||||
|
fields = ['name', 'file', 'enabled', 'number']
|
||||||
|
|
||||||
|
class StandardSerializer(serializers.ModelSerializer):
|
||||||
|
file_ = FileSimpleSerializer(source='file', read_only=True)
|
||||||
|
class Meta:
|
||||||
|
model = Standard
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
class StandardSimpleSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Standard
|
||||||
|
fields = ['id', 'name', 'number']
|
||||||
|
|
||||||
|
class TestItemCreateUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = TestItem
|
||||||
|
fields = ['name', 'standard', 'term_number']
|
||||||
|
|
||||||
|
class TestItemSerializer(serializers.ModelSerializer):
|
||||||
|
standard_ = StandardSimpleSerializer(source='standard', read_only=True)
|
||||||
|
class Meta:
|
||||||
|
model = TestItem
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
class AnalysisItemSerializer(serializers.ModelSerializer):
|
||||||
|
pass
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
|
@ -0,0 +1,13 @@
|
||||||
|
from apps.qm.views import StandardViewSet, TestItemViewSet
|
||||||
|
from django.db.models import base
|
||||||
|
from rest_framework import urlpatterns
|
||||||
|
from django.urls import path, include
|
||||||
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
|
router = DefaultRouter()
|
||||||
|
router.register('standard', StandardViewSet, basename='standard')
|
||||||
|
router.register('testitem', TestItemViewSet, basename='testitem')
|
||||||
|
urlpatterns = [
|
||||||
|
path('', include(router.urls)),
|
||||||
|
]
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer
|
||||||
|
from apps.qm.models import Standard, TestItem
|
||||||
|
from django.shortcuts import render
|
||||||
|
from rest_framework.viewsets import ModelViewSet
|
||||||
|
from apps.system.mixins import CreateUpdateModelAMixin
|
||||||
|
# Create your views here.
|
||||||
|
class StandardViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||||
|
"""
|
||||||
|
标准规范-增删改查
|
||||||
|
"""
|
||||||
|
perms_map = {'*': '*'}
|
||||||
|
queryset = Standard.objects.select_related('file').all()
|
||||||
|
serializer_class = StandardSerializer
|
||||||
|
search_fields = ['name', 'number']
|
||||||
|
filterset_fields = []
|
||||||
|
ordering_fields = ['number']
|
||||||
|
ordering = ['id']
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action in ['create', 'update']:
|
||||||
|
return StandardCreateUpdateSerializer
|
||||||
|
return StandardSerializer
|
||||||
|
|
||||||
|
class TestItemViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||||
|
"""
|
||||||
|
检验项目增删改查
|
||||||
|
"""
|
||||||
|
perms_map = {'*': '*'}
|
||||||
|
queryset = TestItem.objects.select_related('standard').all()
|
||||||
|
serializer_class = TestItemSerializer
|
||||||
|
search_fields = ['name', 'standard__name', 'standard__number']
|
||||||
|
filterset_fields = ['standard']
|
||||||
|
ordering_fields = ['id']
|
||||||
|
ordering = ['id']
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action in ['create', 'update']:
|
||||||
|
return TestItemCreateUpdateSerializer
|
||||||
|
return TestItemSerializer
|
|
@ -53,7 +53,8 @@ INSTALLED_APPS = [
|
||||||
'apps.wf',
|
'apps.wf',
|
||||||
'apps.mtm',
|
'apps.mtm',
|
||||||
'apps.inm',
|
'apps.inm',
|
||||||
'apps.sam'
|
'apps.sam',
|
||||||
|
'apps.qm'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|
|
@ -66,6 +66,8 @@ urlpatterns = [
|
||||||
path('api/mtm/', include('apps.mtm.urls')),
|
path('api/mtm/', include('apps.mtm.urls')),
|
||||||
path('api/inm/', include('apps.inm.urls')),
|
path('api/inm/', include('apps.inm.urls')),
|
||||||
path('api/sam/', include('apps.sam.urls')),
|
path('api/sam/', include('apps.sam.urls')),
|
||||||
|
path('api/qm/', include('apps.qm.urls')),
|
||||||
|
|
||||||
# 工具
|
# 工具
|
||||||
path('api/utils/signature/', GenSignature.as_view()),
|
path('api/utils/signature/', GenSignature.as_view()),
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue