142 lines
6.2 KiB
Python
142 lines
6.2 KiB
Python
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)
|
|
|
|
|
|
|