from rest_framework import serializers from rest_framework.serializers import ModelSerializer from apps.inm.models import FIFO, FIFOItem, MaterialBatch, WareHouse from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, Step from apps.mtm.serializers import MaterialSimpleSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from django.utils import timezone from apps.wpm.models import WMaterial, WProduct, WProductRecord, WProductRecordItem 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.state not in [1,2]: raise serializers.ValidationError('该子计划状态错误') 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 i['count'] = i.pop('pick_count') i['is_teskok'] = True FIFOItem.objects.create(**i) # 更新车间物料 wm, _ = WMaterial.objects.get_or_create(material=i['material'], batch=i['batch'], \ subproduction_plan=sp,defaults={ 'material':i['material'], 'batch':i['batch'], 'subproduction_plan':sp, 'count':0 }) wm.count = wm.count + i['count'] wm.save() # 更新子计划物料情况 spp = SubProductionProgress.objects.get(material=i['material'], subproduction_plan=sp, type=1) spp.count_pick = spp.count_pick + i['count'] spp.save() sp.is_picked=True sp.state = 3 #生产中 sp.state_date_real = timezone.now() #实际开工日期 sp.save() # 更新库存 fifo.is_audited = True fifo.save() update_inm(fifo) return fifo class WMaterialListSerializer(serializers.ModelSerializer): """ 车间物料 """ material_ = MaterialSimpleSerializer(source='material', read_only=True) class Meta: model = WMaterial fields = '__all__' class WActionInitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") wproducts = serializers.ListField(child= serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False) def validate(self, data): subproduction_plan = data['subproduction_plan'] step = data['step'] stepIds=[i['id'] for i in subproduction_plan.steps] if step.id not in stepIds: raise serializers.ValidationError('请选择正确的子工序操作') if 'wproducts' in data: for i in data['wproducts']: if i.subproduction_plan != subproduction_plan: raise serializers.ValidationError('半成品所属子计划不一致') if i.step != step: raise serializers.ValidationError('半成品所属子工序不一致') else: if WProduct.objects.filter(subproduction_plan__production_plan=subproduction_plan.production_plan, is_deleted=False).exists(): # 存在动态半成品 # 这里后续需要更改比如报废状态 raise serializers.ValidationError('请选择半成品进行操作') return data class DoInputSerializer(serializers.Serializer): id = serializers.PrimaryKeyRelatedField(queryset=WMaterial.objects.all(), label='车间物料ID') count_input = serializers.IntegerField(min_value=0, label='消耗数量') class DoOutputSerializer(serializers.Serializer): material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label='物料ID') count_output = serializers.IntegerField(min_value=0, label='产出数量') class WProductRecordItemSerializer(serializers.ModelSerializer): class Meta: model = WProductRecordItem fields = ['form_field', 'field_value'] class WProductRecordSerializer(serializers.ModelSerializer): record_data = WProductRecordItemSerializer(many=True) class Meta: model = WProductRecord fields = ['form', 'record_data'] class WActionSubmitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") wproducts = serializers.ListField(child= serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False) input = DoInputSerializer(many=True, required=False) output = DoOutputSerializer(many=True, required=False) forms = WProductRecordSerializer(many=True, required=False)