84 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| from rest_framework import serializers
 | |
| from rest_framework.serializers import ModelSerializer
 | |
| from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse
 | |
| from apps.inm.signals import update_inm
 | |
| from apps.mtm.models import Material, 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
 | |
| 
 | |
| 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')
 | |
|             FIFODetail.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 DoFormInitSerializer(serializers.Serializer):
 | |
|     action = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all()) |