from django.shortcuts import render from rest_framework import serializers from rest_framework.exceptions import APIException from rest_framework.mixins import DestroyModelMixin, ListModelMixin, RetrieveModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.inm.filters import MbFilterSet from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse,Inventory from apps.inm.serializers import FIFODetailSerializer, FIFOInPurSerializer, FIFOListSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer from apps.inm.signals import update_inm from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response # Create your views here. class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet): """ 仓库-增删改查 """ perms_map = {'*': '*'} queryset = WareHouse.objects.select_related('create_by').all() serializer_class = WareHouseSerializer search_fields = ['name', 'number', 'place'] filterset_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] def get_serializer_class(self): if self.action in ['create', 'update']: return WareHouseCreateUpdateSerializer return WareHouseSerializer class InventoryViewSet(ListModelMixin, GenericViewSet): """ 仓库物料表 """ perms_map = {'*': '*'} queryset = Inventory.objects.select_related('material', 'warehouse').all() serializer_class = InventorySerializer filterset_fields = ['material', 'warehouse'] search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] class MaterialBatchViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = MaterialBatch.objects.select_related('material', 'warehouse').all() serializer_class = MaterialBatchSerializer # filterset_fields = ['material', 'warehouse'] filterset_class = MbFilterSet search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=MaterialBatchQuerySerializer) def query(self, request, pk=None): """ 复杂查询 """ data = request.data serializer = MaterialBatchQuerySerializer(data=data) serializer.is_valid(raise_exception=True) queryset = self.queryset.filter(warehouse__id=data['warehouse'], material__id__in=data['materials']) return Response(MaterialBatchSerializer(instance=queryset, many=True).data) class FIFODetailViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): """ 出入库记录详情表 """ perms_map = {'*': '*'} queryset = FIFODetail.objects.select_related('material', 'fifo').all() serializer_class = FIFODetailSerializer filterset_fields = ['material', 'fifo'] search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] def perform_destroy(self, instance): if instance.fifo.is_audited: raise APIException('该出入库记录已通过审核, 无法删除') return super().perform_destroy(instance) class FIFOViewSet(ListModelMixin, GenericViewSet): """ 出入库记录 """ perms_map = {'*': '*'} queryset = FIFO.objects.select_related('warehouse', 'operator') serializer_class = FIFOListSerializer filterset_fields = '__all__' ordering_fields = '__all__' search_fields = ['warehouse__name', 'warehouse__number'] ordering = ['-pk'] def get_serializer_class(self): if self.action == 'list': return FIFOListSerializer return super().get_serializer_class() @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=FIFOInPurSerializer) def in_pur(self, request, pk=None): """ 采购入库 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save(create_by=request.user) return Response() @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) def audit(self, request, pk=None): """ 审核通过 """ obj = self.get_object() for i in FIFODetail.objects.filter(fifo=obj): if not i.is_testok: raise APIException('未检验通过, 不可审核') if obj.is_audited: raise APIException('该入库记录已审核通过') obj.is_audited = True obj.save() update_inm(obj) # 更新库存 return Response()