diff --git a/hb_client/package.json b/hb_client/package.json index 4a4ab4c..7cf7fbf 100644 --- a/hb_client/package.json +++ b/hb_client/package.json @@ -18,6 +18,7 @@ "dependencies": { "@riophae/vue-treeselect": "^0.4.0", "axios": "^0.21.1", + "cache-loader": "^4.1.0", "compression-webpack-plugin": "^5.0.1", "element-ui": "^2.15.5", "file-saver": "^2.0.2", diff --git a/hb_server/apps/qm/__init__.py b/hb_server/apps/qm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/qm/admin.py b/hb_server/apps/qm/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/hb_server/apps/qm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/hb_server/apps/qm/apps.py b/hb_server/apps/qm/apps.py new file mode 100644 index 0000000..9ccd83f --- /dev/null +++ b/hb_server/apps/qm/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class QmConfig(AppConfig): + name = 'apps.qm' + verbose_name = '质量管理' diff --git a/hb_server/apps/qm/migrations/0001_initial.py b/hb_server/apps/qm/migrations/0001_initial.py new file mode 100644 index 0000000..b7a67d7 --- /dev/null +++ b/hb_server/apps/qm/migrations/0001_initial.py @@ -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': '检验分析项', + }, + ), + ] diff --git a/hb_server/apps/qm/migrations/__init__.py b/hb_server/apps/qm/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/qm/models.py b/hb_server/apps/qm/models.py new file mode 100644 index 0000000..4e667cd --- /dev/null +++ b/hb_server/apps/qm/models.py @@ -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 = '检验分析项' \ No newline at end of file diff --git a/hb_server/apps/qm/serializers.py b/hb_server/apps/qm/serializers.py new file mode 100644 index 0000000..a656332 --- /dev/null +++ b/hb_server/apps/qm/serializers.py @@ -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 diff --git a/hb_server/apps/qm/tests.py b/hb_server/apps/qm/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/hb_server/apps/qm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/hb_server/apps/qm/urls.py b/hb_server/apps/qm/urls.py new file mode 100644 index 0000000..070d39b --- /dev/null +++ b/hb_server/apps/qm/urls.py @@ -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)), +] + diff --git a/hb_server/apps/qm/views.py b/hb_server/apps/qm/views.py new file mode 100644 index 0000000..da02e97 --- /dev/null +++ b/hb_server/apps/qm/views.py @@ -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 diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index c88922b..652d71e 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -53,7 +53,8 @@ INSTALLED_APPS = [ 'apps.wf', 'apps.mtm', 'apps.inm', - 'apps.sam' + 'apps.sam', + 'apps.qm' ] MIDDLEWARE = [ diff --git a/hb_server/server/urls.py b/hb_server/server/urls.py index 607412d..e27e660 100644 --- a/hb_server/server/urls.py +++ b/hb_server/server/urls.py @@ -66,6 +66,8 @@ urlpatterns = [ path('api/mtm/', include('apps.mtm.urls')), path('api/inm/', include('apps.inm.urls')), path('api/sam/', include('apps.sam.urls')), + path('api/qm/', include('apps.qm.urls')), + # 工具 path('api/utils/signature/', GenSignature.as_view()),