146 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
| from rest_framework import exceptions, serializers
 | |
| from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
 | |
| from apps.mtm.models import RecordFormField
 | |
| from apps.qm.export import exprot_test_record
 | |
| 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
 | |
| from rest_framework.exceptions import ParseError
 | |
| # 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()
 | |
| 
 | |
|     @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer)
 | |
|     def export(self, request, pk=None):
 | |
|         """
 | |
|         按模板导出
 | |
|         """
 | |
|         instance = self.get_object()
 | |
|         # tm = instance.form.export_template
 | |
|         tm = '/media/default/tmp.docx'
 | |
|         if tm:
 | |
|             path = exprot_test_record(tr=instance, tm=tm)
 | |
|             return Response({'path':path})
 | |
|         raise ParseError('未配置导出模板')
 | |
| 
 | |
|     # 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) |