From cf19c022fae5830f7ea032369de4a7d8ad9f1d18 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 20 Jan 2022 10:47:31 +0800 Subject: [PATCH] =?UTF-8?q?em=20=E6=9B=B4=E6=96=B0=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=20=E6=9C=AA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/em/models.py | 20 +++++++--- hb_server/apps/em/serializers.py | 26 +++++++++--- hb_server/apps/em/services.py | 7 ++++ hb_server/apps/em/views.py | 68 +++++++++++++++++--------------- hb_server/apps/pm/views.py | 4 +- 5 files changed, 80 insertions(+), 45 deletions(-) create mode 100644 hb_server/apps/em/services.py diff --git a/hb_server/apps/em/models.py b/hb_server/apps/em/models.py index 6b330e2..194474f 100644 --- a/hb_server/apps/em/models.py +++ b/hb_server/apps/em/models.py @@ -3,7 +3,7 @@ from django.contrib.auth.models import AbstractUser from django.db.models.base import Model import django.utils.timezone as timezone from django.db.models.query import QuerySet -from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File +from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords @@ -24,6 +24,13 @@ class Equipment(CommonAModel): (EQUIP_STATE_DISABLE, '禁用') ) + state2_choices = ( + (EQUIP_STATE_OK, '合格'), + (EQUIP_STATE_DISABLE, '禁用') + + ) + EQUIP_TYPE_PRO = 1 + EQUIP_TYPE_TEST = 2 type_choices = ( (1, '生产设备'), (2, '检验工具') @@ -59,10 +66,11 @@ class Equipment(CommonAModel): mgmtype = models.IntegerField('管理类别', choices=mgmtype_choices, default=1) way = models.IntegerField('校准或检定方式', choices=way_choices, default=1) standard = models.CharField('溯源标准或依据', max_length=200, blank=True, null=True) - cycle = models.IntegerField('校准或检定周期', default=0) + cycle = models.IntegerField('校准或检定周期(月)', null=True, blank=True) usetype = models.IntegerField('使用类别', choices=usetype_choices, default=1) - next_check_date = models.DateField('下次校准检查日期',blank=True, null=True) + check_date = models.DateField('最近校准检查日期', blank=True, null=True) + next_check_date = models.DateField('预计下次校准检查日期',blank=True, null=True) class Meta: verbose_name = '设备信息' verbose_name_plural = verbose_name @@ -70,10 +78,10 @@ class Equipment(CommonAModel): def __str__(self): return self.number + '-' + self.name -class ECheckRecord(CommonAModel): +class ECheckRecord(CommonADModel): """ 校准鉴定记录 """ - equipment = models.ForeignKey(Equipment, verbose_name='校准检定设备', on_delete=models.CASCADE, null=True, blank=True) - check_date = models.DateField('校准检查日期',blank=True, null=True) + equipment = models.ForeignKey(Equipment, verbose_name='校准检定设备', on_delete=models.CASCADE) + check_date = models.DateField('校准检查日期') 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 ce3908e..89900d3 100644 --- a/hb_server/apps/em/serializers.py +++ b/hb_server/apps/em/serializers.py @@ -1,12 +1,12 @@ from apps.mtm.models import Step from rest_framework import serializers from rest_framework.serializers import ModelSerializer - +from rest_framework import exceptions from .models import Equipment, ECheckRecord from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer -class EquipmentSerializer(ModelSerializer): +class EquipmentListSerializer(ModelSerializer): belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True) keeper_ = UserSimpleSerializer(source='keeper', read_only=True) step_ = serializers.SerializerMethodField() @@ -24,15 +24,26 @@ class EquipmentSerializer(ModelSerializer): return Step.objects.filter(equipments=obj).values('id', 'name', 'number') +class EquipmentCreateUpdateSerializer(ModelSerializer): + class Meta: + model = Equipment + exclude = ['create_by', 'update_by', 'create_time', 'update_time'] + + def validate(self, attrs): + if attrs['type'] == Equipment.EQUIP_TYPE_TEST: + if attrs['state'] not in [Equipment.EQUIP_STATE_OK, Equipment.EQUIP_STATE_DISABLE]: + raise exceptions.APIException('设备状态错误') + return super().validate(attrs) + class EquipmentSimpleSerializer(ModelSerializer): class Meta: model = Equipment - fields = ['id', 'number', 'name', 'state'] + fields = ['id', 'number', 'name', 'state', 'model'] -class EquipmentrecordSerializer(ModelSerializer): - equipment_ = EquipmentSerializer(source='equipment', read_only=True) +class ECheckRecordListSerializer(ModelSerializer): + equipment_ = EquipmentSimpleSerializer(source='equipment', read_only=True) class Meta: model = ECheckRecord fields = '__all__' @@ -43,6 +54,11 @@ class EquipmentrecordSerializer(ModelSerializer): queryset = queryset.select_related('equipment') return queryset +class EChcekRecordCreateSerializer(ModelSerializer): + class Meta: + model = ECheckRecord + fields = ['equipment', 'check_date', 'description'] + class DaqCreateSerializer(serializers.Serializer): number = serializers.CharField() file = serializers.FileField() \ No newline at end of file diff --git a/hb_server/apps/em/services.py b/hb_server/apps/em/services.py new file mode 100644 index 0000000..0f05e39 --- /dev/null +++ b/hb_server/apps/em/services.py @@ -0,0 +1,7 @@ +from apps.em.models import Equipment +class EmService: + + @classmethod + def update_check_date(cls, equip:Equipment): + # 根据校准检定记录变更下次日期 + pass \ No newline at end of file diff --git a/hb_server/apps/em/views.py b/hb_server/apps/em/views.py index 7e526bf..0d19abe 100644 --- a/hb_server/apps/em/views.py +++ b/hb_server/apps/em/views.py @@ -1,14 +1,20 @@ +from datetime import timedelta from django.shortcuts import render +from numpy import delete from rest_framework.exceptions import APIException from rest_framework.views import APIView -from rest_framework.viewsets import ModelViewSet - +from rest_framework.viewsets import ModelViewSet, GenericViewSet +from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, ListModelMixin, DestroyModelMixin from rest_framework import serializers, status from rest_framework.response import Response from apps.em.models import Equipment, ECheckRecord -from apps.em.serializers import DaqCreateSerializer, EquipmentSerializer,EquipmentrecordSerializer +from apps.em.serializers import DaqCreateSerializer, EChcekRecordCreateSerializer, ECheckRecordListSerializer, \ + EquipmentCreateUpdateSerializer, EquipmentListSerializer +from apps.em.services import EmService from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin - +from dateutil.relativedelta import relativedelta +from django.utils import timezone +from django.db import transaction # Create your views here. class EquipmentViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet): @@ -18,49 +24,47 @@ class EquipmentViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet) perms_map = {'get': '*', 'post': 'equipment_create', 'put': 'equipment_update', 'delete': 'equipment_delete'} queryset = Equipment.objects.all() - serializer_class = EquipmentSerializer + serializer_class = EquipmentListSerializer search_fields = ['number', 'name','description'] - filterset_fields = ['belong_dept', 'keeper', 'type'] + filterset_fields = ['keeper', 'type'] ordering_fields = ['create_time'] ordering = ['-create_time'] + def get_serializer_class(self): + if self.action in ['create', 'update']: + return EquipmentCreateUpdateSerializer + return super().get_serializer_class() # Create your views here. -class EChcekRecordViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet): +class EChcekRecordViewSet(CreateUpdateModelAMixin, OptimizationMixin, + CreateModelMixin, RetrieveModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet): """ 设备校准-增删改查 """ - perms_map = {'get': '*', 'post': 'equipmentrecord_create', - 'put': 'equipmentrecord_update', 'delete': 'equipmentrecord_delete'} + perms_map = {'get': '*', 'post': 'echeckrecord_create', 'delete': 'echeckrecord_delete'} queryset = ECheckRecord.objects.all() - serializer_class = EquipmentrecordSerializer + serializer_class = ECheckRecordListSerializer filterset_fields = ['equipment'] - ordering_fields = ['create_time'] - ordering = ['-create_time'] + ordering = ['-id'] + def get_serializer_class(self): + if self.action in ['create']: + return EChcekRecordCreateSerializer + return super().get_serializer_class() + + @transaction.atomic 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) + instance = serializer.save(create_by=request.user) + EmService.update_check_date(equip=instance) + return Response() + + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + EmService.update_check_date(equip=instance) + instance.delete() + return super().destroy(request, *args, **kwargs) import uuid import os diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 3fe8799..3761ead 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -4,7 +4,7 @@ from django.db import transaction from rest_framework import serializers from rest_framework.views import APIView from apps.em.models import Equipment -from apps.em.serializers import EquipmentSerializer +from apps.em.serializers import EquipmentSimpleSerializer from apps.inm.models import MaterialBatch from apps.inm.serializers import MaterialBatchSerializer from apps.mtm.models import Step, SubProduction, SubprodctionMaterial, UsedStep @@ -248,5 +248,5 @@ class ResourceViewSet(GenericViewSet): subproductions = SubProduction.objects.filter(product__id__in=rdata_l, is_deleted=False) steps = Step.objects.filter(usedstep__is_deleted=False, usedstep__subproduction__in=subproductions) equips = Equipment.objects.filter(step_equips__in=steps, is_deleted=False).distinct() - serializer = EquipmentSerializer(instance=equips, many=True) + serializer = EquipmentSimpleSerializer(instance=equips, many=True) return Response(serializer.data)