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.update_by = request.user 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)