from rest_framework import serializers from rest_framework.serializers import ModelSerializer from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse from apps.mtm.models import Material from apps.mtm.serializers import MaterialSimpleSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from django.utils import timezone from apps.wpm.models import WMaterial class PickDetailSerializer(serializers.Serializer): material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID") batch = serializers.CharField(label='物料批次') pick_count = serializers.IntegerField(label="领料数量") class PickSerializer(serializers.Serializer): subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") picks = PickDetailSerializer(many=True) def create(self, validated_data): picks = validated_data.pop('picks') sp = validated_data['subproduction_plan'] if sp.is_picked: raise serializers.ValidationError('该子计划已领料') for i in picks: try: instance = MaterialBatch.objects.get(material=i['material'], batch=i['batch']) if instance.count < i['pick_count']: raise serializers.ValidationError('物料不足') except: raise serializers.ValidationError('物料不存在') # 创建出库记录 operator = self.context['request'].user validated_data['create_by'] = operator validated_data['operator'] = operator validated_data['type'] = 1 validated_data['inout_date'] = timezone.now() fifo = FIFO.objects.create(validated_data) for i in picks: # 更新出库详情 i['fifo'] = fifo FIFODetail.objects.create(**i) # 更新车间物料 wm = WMaterial.objects.get_or_create(material=i['material'], batch=i['batch'], \ process=validated_data['process'],defaults={ 'material':i['material'], 'batch':i['batch'], 'process':validated_data['process'], 'workshop':validated_data['workshop'], 'count':0 }) wm.count = wm.count + i['pick_count'] wm.save() # 更新子计划进度 spp = SubProductionProgress.objects.get(material=i['material'], subproduction_plan=sp, type=1) spp.count_real = spp.count_real + i['pick_count'] spp.save() sp.is_picked=True sp.save() return fifo class WMaterialListSerializer(serializers.ModelSerializer): """ 车间物料 """ material_ = MaterialSimpleSerializer(source='material', read_only=True) class Meta: model = Material fields = '__all__'