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()) |