from rest_framework import serializers from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse,Inventory from apps.system.serializers import UserSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer from django.db import transaction 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): operator_ = UserSimpleSerializer(source='operator', read_only=True) class Meta: model=FIFO fields = '__all__' class FIFOItemSerializer(serializers.ModelSerializer): warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) material_= MaterialSimpleSerializer(source='material', read_only=True) class Meta: model= FIFOItem 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 = FIFOItem fields = ['material', 'count', 'batch', 'details', 'warehouse'] 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 = ['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 # 创建采购入库 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 fifod = FIFOItem.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 FIFOItem.objects.create(**i) return obj