hberp/hb_server/apps/qm/views.py

116 lines
5.0 KiB
Python

from rest_framework import exceptions, serializers
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer, TestRecordCreateSerializer, TestRecordDetailSerializer, TestRecordListSerializer, TestRecordUpdateSerializer
from apps.qm.models import Standard, TestItem, TestRecord, TestRecordItem
from django.shortcuts import render
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.system.mixins import CreateUpdateModelAMixin
from rest_framework.exceptions import APIException
from rest_framework.response import Response
from rest_framework import status
from django.db import transaction
from rest_framework.decorators import action
from apps.wpm.models import WProduct
from apps.wpm.services import WpmServies
# 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
class TestRecordViewSet(ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet):
"""
检测记录
"""
perms_map = {'*': '*'}
queryset = TestRecord.objects.select_related('fifo_item', 'form').prefetch_related('item_test_record').all()
serializer_class = TestRecordListSerializer
filterset_fields = ['wproduct', 'material', 'step', 'subproduction_plan', 'fifo_item', 'origin_test', 'type']
ordering = ['-id']
def get_serializer_class(self):
if self.action == 'list':
return TestRecordListSerializer
elif self.action == 'retrieve':
return TestRecordDetailSerializer
elif self.action == 'update':
return TestRecordUpdateSerializer
return super().get_serializer_class()
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.is_submited:
raise exceptions.APIException('该记录已提交不可删除')
return super().destroy(request, *args, **kwargs)
@action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer)
def submit(self, request, pk=None):
obj = self.get_object()
# 校验是否有未填项目
if obj.type != TestRecord.TEST_PROCESS_RE:
if TestRecordItem.objects.filter(field_value__isnull=True, is_hidden=False).exists():
raise exceptions.APIException('存在未填写项目')
with transaction.atomic():
WpmServies.update_wproduct_by_test(obj, request.user)
return Response()
# def create(self, request, *args, **kwargs):
# serializer = self.get_serializer(data=request.data)
# serializer.is_valid(raise_exception=True)
# vdata = serializer.validated_data
# record_data = vdata.pop('record_data')
# if 'is_testok' not in vdata:
# raise APIException('未填写检测结论')
# with transaction.atomic():
# obj = serializer.save(create_by = self.request.user)
# tris = []
# for m in record_data: # 保存记录详情
# form_field = m['form_field']
# m['field_name'] = form_field.field_name
# m['field_key'] = form_field.field_key
# m['field_type'] = form_field.field_type
# m['field_value'] = m['field_value']
# m['sort'] = form_field.sort
# m['need_judge'] = form_field.need_judge
# m['is_testok'] = m['is_testok'] if 'is_testok' in m else True
# m['test_record'] = obj
# tris.append(TestRecordItem(**m))
# TestRecordItem.objects.bulk_create(tris)
# # 如果检测合格
# if obj.fifo_item:
# obj.fifo_item.is_testok = True if obj.is_testok else False
# obj.fifo_item.is_tested = True
# obj.fifo_item.save()
# return Response(status=status.HTTP_201_CREATED)