diff --git a/hb_client/.env.development b/hb_client/.env.development index 003a43c..ef83e12 100644 --- a/hb_client/.env.development +++ b/hb_client/.env.development @@ -2,8 +2,8 @@ ENV = 'development' # base api -#VUE_APP_BASE_API = 'http://127.0.0.1:8000/api' -VUE_APP_BASE_API = 'http://47.95.0.242:2222/api' +VUE_APP_BASE_API = 'http://127.0.0.1:8000/api' +#VUE_APP_BASE_API = 'http://47.95.0.242:2222/api' # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, diff --git a/hb_client/package.json b/hb_client/package.json index 21eedd0..1382831 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", "d3": "^5.14.2", "dagre-d3": "^0.6.4", diff --git a/hb_client/src/api/equipment.js b/hb_client/src/api/equipment.js index 0256eb9..2eadc6b 100644 --- a/hb_client/src/api/equipment.js +++ b/hb_client/src/api/equipment.js @@ -34,3 +34,37 @@ export function deleteEquipment(id, data) { data }) } +export function getEquipmentrecordList(query) { + return request({ + url: '/em/equipmentrecord/', + method: 'get', + params: query + }) +} +export function getEquipmentrecordAll() { + return request({ + url: '/em/equipmentrecord/', + method: 'get' + }) +} +export function createEquipmentrecord(data) { + return request({ + url: '/em/equipmentrecord/', + method: 'post', + data + }) +} +export function updateEquipmentrecord(id, data) { + return request({ + url: `/em/equipmentrecord/${id}/`, + method: 'put', + data + }) +} +export function deleteEquipmentrecord(id, data) { + return request({ + url: `/em/equipmentrecord/${id}/`, + method: 'delete', + data + }) +} \ No newline at end of file diff --git a/hb_client/src/api/qm.js b/hb_client/src/api/qm.js new file mode 100644 index 0000000..b362dce --- /dev/null +++ b/hb_client/src/api/qm.js @@ -0,0 +1,59 @@ +import request from '@/utils/request' +//标准规范 +export function getStandardList(query) { + return request({ + url: '/qm/standard/', + method: 'get', + params: query + }) +} +export function createStandard(data) { + return request({ + url: '/qm/standard/', + method: 'post', + data + }) +} +export function updateStandard(id, data) { + return request({ + url: `/qm/standard/${id}/`, + method: 'put', + data + }) +} +export function deleteStandard(id, data) { + return request({ + url: `/qm/standard/${id}/`, + method: 'delete', + data + }) +} +//检测项目 +export function getTestitemList(query) { + return request({ + url: '/qm/testitem/', + method: 'get', + params: query + }) +} +export function createTestitem(data) { + return request({ + url: '/qm/testitem/', + method: 'post', + data + }) +} +export function updateTestitem(id, data) { + return request({ + url: `/qm/testitem/${id}/`, + method: 'put', + data + }) +} +export function deleteTestitem(id, data) { + return request({ + url: `/qm/testitem/${id}/`, + method: 'delete', + data + }) +} diff --git a/hb_client/src/api/sam.js b/hb_client/src/api/sam.js index 67998a3..451942a 100644 --- a/hb_client/src/api/sam.js +++ b/hb_client/src/api/sam.js @@ -57,3 +57,33 @@ export function deleteContract(id, data) { data }) } +//订单 +//合同 +export function getOrderList(query) { + return request({ + url: '/sam/order/', + method: 'get', + params: query + }) +} +export function createOrder(data) { + return request({ + url: '/sam/order/', + method: 'post', + data + }) +} +export function updateOrder(id, data) { + return request({ + url: `/sam/order/${id}/`, + method: 'put', + data + }) +} +export function deleteOrder(id, data) { + return request({ + url: `/sam/order/${id}/`, + method: 'delete', + data + }) +} diff --git a/hb_client/src/router/index.js b/hb_client/src/router/index.js index 047f841..87508ea 100644 --- a/hb_client/src/router/index.js +++ b/hb_client/src/router/index.js @@ -143,9 +143,9 @@ export const asyncRoutes = [ meta: { title: '监视和测量设备', icon: 'example', perms: ['index_manage'] } }, { - path: 'equipment', - name: 'equipment', - component: () => import('@/views/em/equipment'), + path: 'record', + name: 'record', + component: () => import('@/views/em/record'), meta: { title: '校准检定记录', icon: 'example', perms: ['index_manage'] } }, { @@ -175,6 +175,35 @@ export const asyncRoutes = [ component: () => import('@/views/sam/contract'), meta: { title: '合同信息', icon: 'example', perms: ['index_manage'] } } + , + { + path: 'order', + name: 'order', + component: () => import('@/views/sam/order'), + meta: { title: '订单信息', icon: 'example', perms: ['index_manage'] } + } + ] + } + , + { + path: '/qm', + component: Layout, + redirect: '/qm/standard', + name: 'qm', + meta: { title: '质量管理', icon: 'example', perms: ['equipment_set'] }, + children: [ + { + path: 'standard', + name: 'standard', + component: () => import('@/views/qm/standard'), + meta: { title: '标准', icon: 'example', perms: ['index_manage'] } + }, + { + path: 'testitem', + name: 'testitem', + component: () => import('@/views/qm/testitem'), + meta: { title: '检测项目', icon: 'example', perms: ['index_manage'] } + } ] }, { diff --git a/hb_client/src/views/em/detection.vue b/hb_client/src/views/em/detection.vue index d4cb95b..e46d5f6 100644 --- a/hb_client/src/views/em/detection.vue +++ b/hb_client/src/views/em/detection.vue @@ -73,7 +73,7 @@ - state_ + diff --git a/hb_client/src/views/em/record.vue b/hb_client/src/views/em/record.vue new file mode 100644 index 0000000..a862578 --- /dev/null +++ b/hb_client/src/views/em/record.vue @@ -0,0 +1,336 @@ + + diff --git a/hb_client/src/views/mtm/material.vue b/hb_client/src/views/mtm/material.vue index 921507d..f56d69b 100644 --- a/hb_client/src/views/mtm/material.vue +++ b/hb_client/src/views/mtm/material.vue @@ -170,6 +170,7 @@ import Pagination from "@/components/Pagination"; // secondary package based on const defaultmaterial = { name: "", number: "", + processes:[], }; export default { components: { Pagination }, diff --git a/hb_client/src/views/mtm/productprocess.vue b/hb_client/src/views/mtm/productprocess.vue index e7f6676..e810968 100644 --- a/hb_client/src/views/mtm/productprocess.vue +++ b/hb_client/src/views/mtm/productprocess.vue @@ -33,7 +33,7 @@ - + @@ -546,13 +546,12 @@ export default { { this.process = id; // alert(this.process) - this.getInputmaterialLists(); + this.getInputmaterialLists();//输入物料 - this.getmaterialList(); - this.getOutputmaterialLists(); - this.getstepList(); - this. getUsedstepLists(); - this.gettechdocLists(); + this.getOutputmaterialLists();//输出物料 + this.getstepList();//子工序 + this. getUsedstepLists();// + this.gettechdocLists();//技术文件 }, diff --git a/hb_client/src/views/qm/standard.vue b/hb_client/src/views/qm/standard.vue new file mode 100644 index 0000000..ffd426d --- /dev/null +++ b/hb_client/src/views/qm/standard.vue @@ -0,0 +1,286 @@ + + diff --git a/hb_client/src/views/qm/testitem.vue b/hb_client/src/views/qm/testitem.vue new file mode 100644 index 0000000..1c92b00 --- /dev/null +++ b/hb_client/src/views/qm/testitem.vue @@ -0,0 +1,258 @@ + + diff --git a/hb_client/src/views/sam/contract.vue b/hb_client/src/views/sam/contract.vue index 0ceeb5d..a268f51 100644 --- a/hb_client/src/views/sam/contract.vue +++ b/hb_client/src/views/sam/contract.vue @@ -33,7 +33,7 @@ - + - - + + - - + + - - + + + + + @@ -82,8 +85,8 @@ - + + + + + + + + @@ -126,7 +146,7 @@ diff --git a/hb_server/apps/em/migrations/0007_equipmentrecord.py b/hb_server/apps/em/migrations/0007_equipmentrecord.py new file mode 100644 index 0000000..f4022d1 --- /dev/null +++ b/hb_server/apps/em/migrations/0007_equipmentrecord.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.6 on 2021-09-15 01:49 + +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), + ('system', '0003_auto_20210812_0909'), + ('em', '0006_auto_20210914_1335'), + ] + + operations = [ + migrations.CreateModel( + name='Equipmentrecord', + 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='删除标记')), + ('recentlydate', models.DateField(blank=True, null=True, verbose_name='最近一次校准/检定日期')), + ('nextdate', models.DateField(blank=True, null=True, verbose_name='下次应校准或检定日期')), + ('description', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipmentrecord_belong_dept', to='system.organization', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipmentrecord_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('equipment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='em.equipment', verbose_name='校准检定设备')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipmentrecord_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/hb_server/apps/em/migrations/0008_auto_20210916_1054.py b/hb_server/apps/em/migrations/0008_auto_20210916_1054.py new file mode 100644 index 0000000..902de86 --- /dev/null +++ b/hb_server/apps/em/migrations/0008_auto_20210916_1054.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.6 on 2021-09-16 02:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('em', '0007_equipmentrecord'), + ] + + operations = [ + migrations.RemoveField( + model_name='equipmentrecord', + name='nextdate', + ), + migrations.AddField( + model_name='equipment', + name='nextdate', + field=models.DateField(blank=True, null=True, verbose_name='下次应校准或检定日期'), + ), + migrations.AddField( + model_name='equipment', + name='recentlydate', + field=models.DateField(blank=True, null=True, verbose_name='最近一次校准/检定日期'), + ), + migrations.AlterField( + model_name='equipmentrecord', + name='recentlydate', + field=models.DateField(blank=True, null=True, verbose_name='校准/检定日期'), + ), + ] diff --git a/hb_server/apps/em/migrations/0009_auto_20210916_1108.py b/hb_server/apps/em/migrations/0009_auto_20210916_1108.py new file mode 100644 index 0000000..c451677 --- /dev/null +++ b/hb_server/apps/em/migrations/0009_auto_20210916_1108.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.6 on 2021-09-16 03:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('em', '0008_auto_20210916_1054'), + ] + + operations = [ + migrations.RemoveField( + model_name='equipment', + name='nextdate', + ), + migrations.RemoveField( + model_name='equipment', + name='recentlydate', + ), + migrations.AddField( + model_name='equipmentrecord', + name='nextdate', + field=models.DateField(blank=True, null=True, verbose_name='下次应校准或检定日期'), + ), + migrations.AlterField( + model_name='equipmentrecord', + name='recentlydate', + field=models.DateField(blank=True, null=True, verbose_name='最近一次校准/检定日期'), + ), + ] diff --git a/hb_server/apps/em/models.py b/hb_server/apps/em/models.py index 961e429..f2cb67c 100644 --- a/hb_server/apps/em/models.py +++ b/hb_server/apps/em/models.py @@ -75,3 +75,8 @@ class Equipment(CommonBModel): def __str__(self): return self.number + '-' + self.name +class Equipmentrecord(CommonBModel): + equipment = models.ForeignKey(Equipment, verbose_name='校准检定设备', on_delete=models.CASCADE, null=True, blank=True) + recentlydate = models.DateField('最近一次校准/检定日期',blank=True, null=True) + nextdate = models.DateField('下次应校准或检定日期',blank=True, null=True) + description = models.CharField('描述', max_length=200, blank=True, null=True) \ No newline at end of file diff --git a/hb_server/apps/em/serializers.py b/hb_server/apps/em/serializers.py index dcf4262..b17e860 100644 --- a/hb_server/apps/em/serializers.py +++ b/hb_server/apps/em/serializers.py @@ -1,6 +1,6 @@ from rest_framework.serializers import ModelSerializer -from .models import Equipment +from .models import Equipment,Equipmentrecord from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer @@ -20,4 +20,18 @@ class EquipmentSerializer(ModelSerializer): class EquipmentSimpleSerializer(ModelSerializer): class Meta: model = Equipment - fields = ['id', 'number', 'name'] \ No newline at end of file + fields = ['id', 'number', 'name'] + + + +class EquipmentrecordSerializer(ModelSerializer): + equipment_ = EquipmentSerializer(source='equipment', read_only=True) + class Meta: + model = Equipmentrecord + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('equipment') + return queryset \ No newline at end of file diff --git a/hb_server/apps/em/urls.py b/hb_server/apps/em/urls.py index 0df0ee8..a2f58d8 100644 --- a/hb_server/apps/em/urls.py +++ b/hb_server/apps/em/urls.py @@ -1,11 +1,12 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.em.views import EquipmentViewSet +from apps.em.views import EquipmentViewSet,EquipmentrecordViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('equipment', EquipmentViewSet, basename='equipment') +router.register('equipmentrecord', EquipmentrecordViewSet, basename='equipmentrecord') urlpatterns = [ path('', include(router.urls)), ] diff --git a/hb_server/apps/em/views.py b/hb_server/apps/em/views.py index 386ff7f..64ad57d 100644 --- a/hb_server/apps/em/views.py +++ b/hb_server/apps/em/views.py @@ -1,8 +1,10 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet -from apps.em.models import Equipment -from apps.em.serializers import EquipmentSerializer +from rest_framework import serializers, status +from rest_framework.response import Response +from apps.em.models import Equipment,Equipmentrecord +from apps.em.serializers import EquipmentSerializer,EquipmentrecordSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin @@ -19,3 +21,40 @@ class EquipmentViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet) filterset_fields = ['belong_dept', 'keeper', 'type'] ordering_fields = ['create_time'] ordering = ['-create_time'] + + +# Create your views here. +class EquipmentrecordViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet): + """ + 设备校准-增删改查 + """ + perms_map = {'get': '*', 'post': 'equipmentrecord_create', + 'put': 'equipmentrecord_update', 'delete': 'equipmentrecord_delete'} + queryset = Equipmentrecord.objects.all() + serializer_class = EquipmentrecordSerializer + filterset_fields = ['equipment'] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + + def create(self, request, *args, **kwargs): + + data = request.data + if data.get('equipment', None): + equipment = Equipment.objects.get(pk=data['equipment']) + equipment.statedm = data['state'] + equipment.save() + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(status=status.HTTP_200_OK) + def update(self, request, *args, **kwargs): + data = request.data + if data.get('equipment', None): + equipment = Equipment.objects.get(pk=data['equipment']) + equipment.statedm = data['state'] + equipment.save() + id = self.get_object() + serializer = self.get_serializer(id, data=data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(status=status.HTTP_200_OK) \ No newline at end of file diff --git a/hb_server/apps/mtm/migrations/0014_alter_material_processes.py b/hb_server/apps/mtm/migrations/0014_alter_material_processes.py new file mode 100644 index 0000000..3d10764 --- /dev/null +++ b/hb_server/apps/mtm/migrations/0014_alter_material_processes.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-09-16 08:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0013_auto_20210914_1049'), + ] + + operations = [ + migrations.AlterField( + model_name='material', + name='processes', + field=models.JSONField(blank=True, default=list, null=True, verbose_name='工艺流程'), + ), + ] diff --git a/hb_server/apps/mtm/migrations/0015_alter_material_name.py b/hb_server/apps/mtm/migrations/0015_alter_material_name.py new file mode 100644 index 0000000..64cddd6 --- /dev/null +++ b/hb_server/apps/mtm/migrations/0015_alter_material_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-09-17 00:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0014_alter_material_processes'), + ] + + operations = [ + migrations.AlterField( + model_name='material', + name='name', + field=models.CharField(blank=True, max_length=100, null=True, unique=True, verbose_name='物料名称'), + ), + ] diff --git a/hb_server/apps/mtm/migrations/0016_auto_20210917_0900.py b/hb_server/apps/mtm/migrations/0016_auto_20210917_0900.py new file mode 100644 index 0000000..a4555f9 --- /dev/null +++ b/hb_server/apps/mtm/migrations/0016_auto_20210917_0900.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.6 on 2021-09-17 01:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0015_alter_material_name'), + ] + + operations = [ + migrations.AlterField( + model_name='material', + name='name', + field=models.CharField(default=1, max_length=100, unique=True, verbose_name='物料名称'), + preserve_default=False, + ), + migrations.AlterField( + model_name='material', + name='processes', + field=models.JSONField(blank=True, default=list, verbose_name='工艺流程'), + ), + ] diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 43e5bb8..68b214b 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -50,7 +50,7 @@ class StepSimpleSerializer(serializers.ModelSerializer): fields = ['id', 'name', 'sort'] class StepDetailSerializer(serializers.ModelSerializer): - + equipments_ = EquipmentSimpleSerializer(source='equipments', many=True) class Meta: model = Step fields = '__all__' 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/0002_alter_analysisitem_rules.py b/hb_server/apps/qm/migrations/0002_alter_analysisitem_rules.py new file mode 100644 index 0000000..d0899af --- /dev/null +++ b/hb_server/apps/qm/migrations/0002_alter_analysisitem_rules.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-09-16 02:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('qm', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='analysisitem', + name='rules', + field=models.JSONField(default=list, 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/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 4d608b0..00efa54 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -2,6 +2,8 @@ from rest_framework import serializers from .models import Contract, Customer, Order +from apps.mtm.serializers import MaterialSimpleSerializer + class CustomerSerializer(serializers.ModelSerializer): class Meta: model = Customer @@ -14,10 +16,11 @@ class CustomerCreateUpdateSerializer(serializers.ModelSerializer): class CustomerSimpleSerializer(serializers.ModelSerializer): class Meta: + model = Customer fields = ['id', 'name'] class ContractSerializer(serializers.ModelSerializer): - + customer_ = CustomerSimpleSerializer(source='customer', read_only=True) class Meta: model = Contract fields = '__all__' @@ -41,6 +44,7 @@ class OrderCreateUpdateSerializer(serializers.ModelSerializer): class OrderSerializer(serializers.ModelSerializer): contract_ = ContractSimpleSerializer(source='contract', read_only=True) customer_ = CustomerSimpleSerializer(source='customer', read_only=True) + product_ = MaterialSimpleSerializer(source='product', read_only=True) class Meta: model = Order fields = '__all__' diff --git a/hb_server/apps/sam/urls.py b/hb_server/apps/sam/urls.py index fda60b5..4aa607f 100644 --- a/hb_server/apps/sam/urls.py +++ b/hb_server/apps/sam/urls.py @@ -1,12 +1,13 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.sam.views import CustomerViewSet,ContractViewSet +from apps.sam.views import CustomerViewSet,ContractViewSet,OrderViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('customer', CustomerViewSet, basename='customer') router.register('contract', ContractViewSet, basename='contract') +router.register('order', OrderViewSet, basename='order') urlpatterns = [ path('', include(router.urls)), 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()),