hberp/hb_server/apps/inm/serializers.py

119 lines
4.2 KiB
Python

from rest_framework import serializers
from apps.inm.models import FIFO, FIFODetail, IProduct, MaterialBatch, WareHouse,Inventory
from apps.system.serializers import UserSimpleSerializer
from apps.mtm.serializers import MaterialSimpleSerializer
class WareHouseSerializer(serializers. ModelSerializer):
create_by_=UserSimpleSerializer('create_by', read_only=True)
class Meta:
model = WareHouse
fields = '__all__'
class WareHouseCreateUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = WareHouse
fields = ['name', 'number', 'place']
class WareHouseSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = WareHouse
fields = ['name', 'number', 'place']
class InventorySerializer(serializers. ModelSerializer):
material_= MaterialSimpleSerializer(source='material', read_only=True)
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
class Meta:
model = Inventory
fields = '__all__'
class MaterialBatchSerializer(serializers. ModelSerializer):
material_= MaterialSimpleSerializer(source='material', read_only=True)
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
class Meta:
model = MaterialBatch
fields = '__all__'
class FIFOListSerializer(serializers.ModelSerializer):
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
operator_ = UserSimpleSerializer(source='operator', read_only=True)
class Meta:
model=FIFO
fields = '__all__'
class FIFODetailSerializer(serializers.ModelSerializer):
material_= MaterialSimpleSerializer(source='material', read_only=True)
class Meta:
model=FIFODetail
fields = '__all__'
class IProductInPurSerializer(serializers.ModelSerializer):
class Meta:
model = IProduct
fields = ['number']
class FIFODetailInPurSerializer(serializers.ModelSerializer):
details = IProductInPurSerializer(many=True, required=False)
class Meta:
model = FIFODetail
fields = ['material', 'count', 'batch', 'details']
class MaterialBatchQuerySerializer(serializers.Serializer):
warehouse = serializers.IntegerField(label="仓库ID", required=False)
materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False)
class FIFOInPurSerializer(serializers.ModelSerializer):
"""
采购入库序列化
"""
details = FIFODetailInPurSerializer(many=True)
class Meta:
model = FIFO
fields = ['warehouse', 'operator', 'details', 'inout_date']
def create(self, validated_data):
details = validated_data.pop('details')
if len(details)>0:
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
# 创建采购入库
validated_data['type'] = 3
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
fifod = FIFODetail.objects.create(**i)
p_list = []
for x in p_details:
x['state'] = 1
x['material'] = i['material']
x['warehouse'] = validated_data['warehouse']
x['batch'] = i['batch']
x['fifos'] = [fifod.id]
p_list.append(IProduct(**x))
IProduct.objects.bulk_create(p_list)
else:
i['fifo'] = obj
FIFODetail.objects.create(**i)
return obj