inm 原入库改为其他入库

This commit is contained in:
caoqianming 2022-01-27 17:05:10 +08:00
parent 2b5e54ed03
commit 2d260e694d
5 changed files with 103 additions and 25 deletions

View File

@ -2,7 +2,7 @@ from django.db import models
from django.db.models.base import Model
import django.utils.timezone as timezone
from django.db.models.query import QuerySet
from apps.pum.models import PuOrder
from apps.pum.models import PuOrder, Vendor
from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File
from utils.model import SoftModel, BaseModel
from simple_history.models import HistoricalRecords
@ -79,6 +79,8 @@ class FIFO(CommonADModel):
User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True)
inout_date = models.DateField('出入库日期', null=True, blank=True)
remark = models.CharField('备注', max_length=1000, default='')
vendor = models.ForeignKey(Vendor, verbose_name='供应商',
on_delete=models.CASCADE, null=True, blank=True)
pu_order = models.ForeignKey(PuOrder, verbose_name='关联采购订单',
null=True, blank=True, on_delete=models.CASCADE)

View File

@ -2,6 +2,7 @@ from rest_framework import exceptions
from rest_framework import serializers
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory
from apps.pum.models import Vendor
from apps.qm.models import TestRecord, TestRecordItem
from apps.sam.serializers import OrderSimpleSerializer
@ -73,6 +74,15 @@ class FIFOListSerializer(serializers.ModelSerializer):
model = FIFO
fields = '__all__'
class FIFOItemCreateSerializer(serializers.ModelSerializer):
class Meta:
model = FIFOItem
fields = ['warehouse', 'material', 'batch', 'fifo', 'files']
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = FIFOItem
fields = ['warehouse', 'batch', 'files']
class FIFOItemSerializer(serializers.ModelSerializer):
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
@ -101,6 +111,49 @@ class MaterialBatchQuerySerializer(serializers.Serializer):
warehouse = serializers.IntegerField(label="仓库ID", required=False)
materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False)
class FIFOInOtherSerializer(serializers.ModelSerializer):
"""
其他入库序列化
"""
details = FIFODetailInPurSerializer(many=True, required=False)
vendor = serializers.PrimaryKeyRelatedField(label='供应商ID',
queryset=Vendor.objects.all())
class Meta:
model = FIFO
fields = ['details', 'vendor']
def create(self, validated_data):
details = validated_data.pop('details')
with transaction.atomic():
validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN
obj = FIFO(**validated_data)
obj.save()
for i in details:
if 'details' in i:
p_details = i.pop('details')
if len(p_details) != i['count']:
raise serializers.ValidationError('数目对不上')
else:
i['fifo'] = obj
fifoitem = FIFOItem.objects.create(**i)
p_list0 = []
for x in p_details:
x['material'] = i['material']
x['fifoitem'] = fifoitem
p_list0.append(FIFOItemProduct(**x))
FIFOItemProduct.objects.bulk_create(p_list0)
p_list = []
for x in p_details:
x['material'] = i['material']
x['warehouse'] = validated_data['warehouse']
x['batch'] = i['batch']
p_list.append(IProduct(**x))
IProduct.objects.bulk_create(p_list)
else:
i['fifo'] = obj
FIFOItem.objects.create(**i)
return obj
class FIFOInPurSerializer(serializers.ModelSerializer):
"""
@ -118,18 +171,6 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
pass
else:
raise serializers.ValidationError('没有入库内容')
# for i in details:
# # 校验批次
# try:
# if i['batch']:
# obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material'])
# if obj.warehouse != validated_data['warehouse']:
# raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch']))
# except:
# pass
# 创建采购入库
with transaction.atomic():
validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN
obj = FIFO(**validated_data)

View File

@ -1,12 +1,12 @@
from rest_framework import serializers
from rest_framework import exceptions
from rest_framework.exceptions import APIException
from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin
from rest_framework.exceptions import APIException, ValidationError
from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin, CreateModelMixin
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.inm.filters import IProductFilterSet, MbFilterSet
from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory
from apps.inm.serializers import FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, IProductListSerializer, \
from apps.inm.serializers import FIFOInOtherSerializer, FIFOItemCreateSerializer, FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, IProductListSerializer, \
InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, \
WareHouseCreateUpdateSerializer, InventorySerializer
from apps.inm.signals import update_inm
@ -77,7 +77,7 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet):
return Response(MaterialBatchSerializer(instance=queryset, many=True).data)
class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
class FIFOItemViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
"""
出入库记录详情表
"""
@ -93,12 +93,27 @@ class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, Gener
def get_serializer_class(self):
if self.action == 'update':
return FIFOItemUpdateSerializer
elif self.action == 'create':
return FIFOItemCreateSerializer
return super().get_serializer_class()
def perform_destroy(self, instance):
if instance.fifo.is_audited:
raise APIException('该出入库记录已通过审核, 无法删除')
return super().perform_destroy(instance)
def create(self, request, *args, **kwargs):
obj = self.get_object()
if obj.fifo.is_audited:
raise ValidationError('该出入库记录已审核')
return super().create(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
obj = self.get_object()
if obj.fifo.is_audited:
raise ValidationError('该出入库记录已审核')
return super().update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if obj.fifo.is_audited:
raise ValidationError('该出入库记录已审核')
return super().destroy(request, *args, **kwargs)
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=InmTestRecordCreateSerializer)
def test(self, request, pk=None):
@ -161,12 +176,25 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
serializer.save(create_by=request.user)
return Response()
@action(methods=['post'], detail=False, perms_map={'post': '*'},
serializer_class=FIFOInOtherSerializer)
def in_other(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()
if not FIFOItem.objects.filter(fifo=obj).exists():
raise ValidationError('出入库条目为空')
for i in FIFOItem.objects.filter(fifo=obj, need_test=True):
if not i.is_testok:
raise APIException('未检验通过, 不可审核')

View File

@ -19,7 +19,12 @@ class PuOrderItemSerializer(ModelSerializer):
model = PuOrderItem
fields = '__all__'
class PuOrderItemCreateUpdateSerializer(ModelSerializer):
class PuOrderItemCreateSerializer(ModelSerializer):
class Meta:
model = PuOrderItem
fields = ['count', 'delivery_date', 'pu_order', 'material']
class PuOrderItemUpdateSerializer(ModelSerializer):
class Meta:
model = PuOrderItem
fields = ['count', 'delivery_date']

View File

@ -5,7 +5,7 @@ from rest_framework.viewsets import ModelViewSet
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin
from rest_framework.viewsets import GenericViewSet
from apps.pum.models import PuOrder, PuOrderItem, Vendor
from apps.pum.serializers import PuOrderCreateUpdateSerializer, PuOrderItemCreateUpdateSerializer, PuOrderItemSerializer, PuOrderSerializer, VendorSerializer
from apps.pum.serializers import PuOrderCreateUpdateSerializer, PuOrderItemCreateSerializer, PuOrderItemSerializer, PuOrderItemUpdateSerializer, PuOrderSerializer, VendorSerializer
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
from rest_framework.exceptions import APIException, ValidationError
from rest_framework.decorators import action
@ -80,8 +80,10 @@ class PuOrderItemViewSet(CreateModelMixin, DestroyModelMixin, GenericViewSet):
ordering = ['-create_time']
def get_serializer_class(self):
if self.action in ['create', 'update']:
return PuOrderItemCreateUpdateSerializer
if self.action == 'create':
return PuOrderItemCreateSerializer
elif self.action == 'update':
return PuOrderItemUpdateSerializer
return super().get_serializer_class()
def create(self, request, *args, **kwargs):