263 lines
11 KiB
Python
263 lines
11 KiB
Python
from django.shortcuts import render
|
|
from rest_framework.viewsets import ModelViewSet, GenericViewSet
|
|
from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin
|
|
from apps.mtm.filters import MaterialFilterSet, TechDocFilterset
|
|
|
|
from apps.mtm.models import Material, PackItem, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction
|
|
from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, PackItemCreateSerializer, PackItemSerializer, PackItemUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionCreateUpdateSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer
|
|
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
|
|
from rest_framework.decorators import action
|
|
from rest_framework.response import Response
|
|
from utils.pagination import PageOrNot
|
|
from rest_framework.exceptions import APIException
|
|
from django.db import transaction
|
|
|
|
# Create your views here.
|
|
class MaterialViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
物料表-增删改查
|
|
"""
|
|
perms_map = {'get': '*', 'post': 'material_create',
|
|
'put': 'material_update', 'delete': 'material_delete'}
|
|
queryset = Material.objects.all()
|
|
serializer_class = MaterialSerializer
|
|
search_fields = ['name', 'number']
|
|
filterset_class = MaterialFilterSet
|
|
ordering_fields = ['number', 'sort_str']
|
|
ordering = ['number']
|
|
|
|
def get_serializer_class(self, *args, **kwargs):
|
|
if self.action == 'retrieve':
|
|
return MaterialDetailSerializer
|
|
return MaterialSerializer
|
|
|
|
class PackItemViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
装箱项目-增删改查
|
|
"""
|
|
perms_map = {'get': '*', 'post': 'packitem_create',
|
|
'put': 'packitem_update', 'delete': 'packitem_delete'}
|
|
queryset = PackItem.objects.all()
|
|
serializer_class = PackItemSerializer
|
|
search_fields = ['name', 'number']
|
|
filterset_fields = ['material', 'product']
|
|
ordering = ['sort']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'create':
|
|
return PackItemCreateSerializer
|
|
elif self.action == 'update':
|
|
return PackItemUpdateSerializer
|
|
return super().get_serializer_class()
|
|
|
|
|
|
class ProcessViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
工序表-增删改查
|
|
"""
|
|
perms_map = {'get': '*', 'post': 'process_create',
|
|
'put': 'process_update', 'delete': 'process_delete'}
|
|
queryset = Process.objects.select_related('instruction', 'workshop').all()
|
|
serializer_class = ProcessSerializer
|
|
search_fields = ['name', 'number']
|
|
filterset_fields = ['number', 'workshop', 'type']
|
|
ordering_fields = ['number']
|
|
ordering = ['number']
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'*'}, pagination_class=None, serializer_class=StepDetailSerializer)
|
|
def steps(self, request, pk=None):
|
|
"""
|
|
工序下的子工序
|
|
"""
|
|
process = self.get_object()
|
|
serializer = self.serializer_class(instance=Step.objects.prefetch_related('equipments').filter(process=process, is_deleted=False), many=True)
|
|
return Response(serializer.data)
|
|
|
|
class StepViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
子工序-增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'process_update',
|
|
'put':'process_update', 'delete':'process_update'}
|
|
queryset = Step.objects.all()
|
|
serializer_class = StepSerializer
|
|
search_fields = ['name', 'number']
|
|
filterset_fields = ['process']
|
|
ordering = ['sort']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'retrieve':
|
|
return StepDetailSerializer
|
|
return StepSerializer
|
|
|
|
class SubProductionViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
产品生产分解增删改查
|
|
"""
|
|
perms_map={'get':'*', 'post':'subproduction_create',
|
|
'put':'subproduction_update', 'delete':'subproduction_delete'}
|
|
queryset = SubProduction.objects.select_related('process').all()
|
|
filterset_fields = ['product', 'process']
|
|
search_fields = ['name']
|
|
serializer_class = SubProductionSerializer
|
|
ordering = ['sort']
|
|
def get_serializer_class(self):
|
|
if self.action in ['create', 'update']:
|
|
return SubProductionCreateUpdateSerializer
|
|
return super().get_serializer_class()
|
|
|
|
class InputMaterialViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
输入物料-增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'subproduction_update',
|
|
'put':'subproduction_update', 'delete':'subproduction_update'}
|
|
queryset = SubprodctionMaterial.objects.select_related('material').filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN)
|
|
serializer_class = InputMaterialSerializer
|
|
filterset_fields = ['subproduction']
|
|
ordering = ['sort', '-create_time']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'list':
|
|
return SubprodctionMaterialListSerializer
|
|
elif self.action == 'update':
|
|
return InputMaterialUpdateSerializer
|
|
return InputMaterialSerializer
|
|
|
|
class OutputMaterialViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
输出物料-增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'subproduction_update',
|
|
'put':'subproduction_update', 'delete':'subproduction_update'}
|
|
queryset = SubprodctionMaterial.objects.select_related('material').filter(type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
|
serializer_class = OutputMaterialSerializer
|
|
filterset_fields = ['subproduction']
|
|
ordering = ['sort', '-create_time']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'list':
|
|
return SubprodctionMaterialListSerializer
|
|
elif self.action == 'update':
|
|
return OutputMaterialUpdateSerializer
|
|
return OutputMaterialSerializer
|
|
|
|
class OtherMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, DestroyModelMixin, CreateModelMixin, GenericViewSet):
|
|
"""
|
|
其他物料-增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'subproduction_update',
|
|
'put':'subproduction_update', 'delete':'subproduction_update'}
|
|
queryset = SubprodctionMaterial.objects.select_related('material').filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL)
|
|
serializer_class = OutputMaterialSerializer
|
|
filterset_fields = ['subproduction']
|
|
ordering = ['sort', '-create_time']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'list':
|
|
return SubprodctionMaterialListSerializer
|
|
return OtherMaterialSerializer
|
|
|
|
class UsedStepViewSet(OptimizationMixin, CreateModelMixin, DestroyModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet):
|
|
"""
|
|
产品生产子工序表
|
|
"""
|
|
perms_map = {'get':'*', 'post':'subproduction_update',
|
|
'put':'subproduction_update', 'delete':'subproduction_update'}
|
|
queryset = UsedStep.objects.all()
|
|
filterset_fields = ['subproduction', 'step']
|
|
ordering = ['step__sort', '-step__create_time']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action =='create':
|
|
return UsedStepCreateSerializer
|
|
elif self.action == 'update':
|
|
return UsedStepUpdateSerializer
|
|
return UsedStepListSerializer
|
|
|
|
class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
记录表格增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'recordform_create',
|
|
'put':'recordform_update', 'delete':'recordform_delete'}
|
|
queryset = RecordForm.objects.all()
|
|
filterset_fields = ['step', 'type', 'material', 'number', 'enabled']
|
|
search_fields = ['name']
|
|
ordering='id'
|
|
|
|
|
|
def get_serializer_class(self):
|
|
if self.action =='create':
|
|
return RecordFormCreateSerializer
|
|
elif self.action == 'update':
|
|
return RecordFormUpdateSerializer
|
|
elif self.action == 'retrieve':
|
|
return RecordFormDetailSerializer
|
|
return RecordFormSerializer
|
|
|
|
@action(methods=['get'], detail=True, perms_map={'get':'*'}, pagination_class=None, serializer_class=RecordFormFieldSerializer)
|
|
def fields(self, request, pk=None):
|
|
"""
|
|
表格下的字段
|
|
"""
|
|
instance = self.get_object()
|
|
serializer = self.serializer_class(instance=RecordFormField.objects.filter(form=instance, is_deleted=False), many=True)
|
|
return Response(serializer.data)
|
|
|
|
@transaction.atomic
|
|
def create(self, request, *args, **kwargs):
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
vdata = serializer.validated_data
|
|
form = vdata.pop('form', None)
|
|
instance = RecordForm(**vdata)
|
|
instance.create_by = request.user
|
|
instance.save()
|
|
if form:
|
|
for i in RecordFormField.objects.filter(form=form, is_deleted=False):
|
|
i.pk = None
|
|
i.form = instance
|
|
i.parent = None
|
|
i.save()
|
|
return Response()
|
|
|
|
|
|
|
|
|
|
class RecordFormFieldViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
表格字段表 增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'recordform_update',
|
|
'put':'recordform_update', 'delete':'recordform_update'}
|
|
queryset = RecordFormField.objects.all()
|
|
filterset_fields = ['field_type', 'form']
|
|
search_fields = ['field_name', 'field_key']
|
|
ordering = 'sort'
|
|
ordering_fields = ['sort', 'id']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action =='create':
|
|
return RecordFormFieldCreateSerializer
|
|
elif self.action == 'update':
|
|
return RecordFormFieldUpdateSerializer
|
|
return RecordFormFieldSerializer
|
|
|
|
class TechDocViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet):
|
|
"""
|
|
技术文件增删改查
|
|
"""
|
|
perms_map = {'get':'*', 'post':'subproduction_update',
|
|
'put':'subproduction_update', 'delete':'subproduction_update'}
|
|
queryset = TechDoc.objects.select_related('file').all()
|
|
filterset_class = TechDocFilterset
|
|
search_fields = ['name']
|
|
ordering = ['-id']
|
|
|
|
def get_serializer_class(self):
|
|
if self.action =='create':
|
|
return TechDocCreateSerializer
|
|
elif self.action == 'update':
|
|
return TechDocUpdateSerializer
|
|
return TechDocListSerializer |