hberp/hb_server/apps/qm/views.py

129 lines
5.8 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 WpmService
# 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 = {'get': '*', 'put':'testrecord_update', 'delete':'testrecord_delete'}
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 update(self, request, *args, **kwargs):
obj = self.get_object()
if obj.is_submited and obj.is_midtesting is False:
raise exceptions.APIException('该记录已提交不可编辑')
return super().update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.is_submited:
raise exceptions.APIException('该记录已提交不可删除')
WpmService.add_wproduct_flow_log(obj.wproduct, 'test_delete')
return super().destroy(request, *args, **kwargs)
@action(methods=['post'], detail=True, perms_map={'post':'testrecord_submit'}, serializer_class=serializers.Serializer)
def submit(self, request, pk=None):
obj = self.get_object()
if obj.is_submited and obj.is_midtesting is False:
raise exceptions.APIException('该记录已提交')
# 校验是否有未填项目
if obj.type != TestRecord.TEST_PROCESS_RE and obj.is_midtesting is False:
items_not = TestRecordItem.objects.filter(field_value__isnull=True, is_hidden=False, test_record=obj)
if items_not.exists():
raise exceptions.APIException('存在未填写项目:'+ ','.join(list(items_not.values_list('form_field__field_name', flat=True))))
with transaction.atomic():
obj.is_submited=True
obj.save()
if obj.wproduct:
WpmService.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)