127 lines
4.8 KiB
Python
127 lines
4.8 KiB
Python
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, FIFOItem, MaterialBatch, WareHouse,Inventory
|
|
from apps.inm.serializers import FIFOItemSerializer, 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
|
|
from django.db import transaction
|
|
|
|
# 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 FIFOItemViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
|
"""
|
|
出入库记录详情表
|
|
"""
|
|
perms_map = {'*': '*'}
|
|
queryset = FIFOItem.objects.select_related('material', 'fifo').all()
|
|
serializer_class = FIFOItemSerializer
|
|
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 FIFOItem.objects.filter(fifo=obj):
|
|
if not i.is_testok:
|
|
raise APIException('未检验通过, 不可审核')
|
|
if obj.is_audited:
|
|
raise APIException('该入库记录已审核通过')
|
|
with transaction.atomic():
|
|
obj.is_audited = True
|
|
obj.save()
|
|
update_inm(obj) # 更新库存
|
|
return Response()
|
|
|