hberp/hb_server/apps/wpm/serializers.py

71 lines
3.0 KiB
Python

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__'