177 lines
7.7 KiB
Python
177 lines
7.7 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, StepSimpleSerializer
|
|
|
|
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
|
from django.utils import timezone
|
|
from django.utils.translation import gettext_lazy as _
|
|
from apps.system.serializers import UserSimpleSerializer
|
|
from apps.wpm.models import Operation, WMaterial, WProduct, OperationRecord, OperationRecordItem
|
|
|
|
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'] = FIFO.FIFO_TYPE_DO_OUT
|
|
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_testok'] = 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 WProductListSerializer(serializers.ModelSerializer):
|
|
"""
|
|
半成品列表
|
|
"""
|
|
m_state_ = MaterialSimpleSerializer(source='m_state', read_only=True)
|
|
p_state_ = StepSimpleSerializer(source='p_state', read_only=True)
|
|
class Meta:
|
|
model = WProduct
|
|
fields = '__all__'
|
|
|
|
class OperationDetailSerializer(serializers.ModelSerializer):
|
|
wproducts_ = serializers.SerializerMethodField()
|
|
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
|
|
m_state_ = MaterialSimpleSerializer(source='m_state', read_only=True)
|
|
p_state_ = StepSimpleSerializer(source='p_state', read_only=True)
|
|
class Meta:
|
|
model = Operation
|
|
fields = '__all__'
|
|
|
|
def get_wproducts_(self, obj):
|
|
return list(WProduct.objects.filter(id__in=obj.wproducts).values('id', 'number'))
|
|
|
|
class OperationListSerializer(serializers.ModelSerializer):
|
|
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
|
|
m_state_ = MaterialSimpleSerializer(source='m_state', read_only=True)
|
|
p_state_ = StepSimpleSerializer(source='p_state', read_only=True)
|
|
class Meta:
|
|
model = Operation
|
|
fields = '__all__'
|
|
|
|
|
|
class OperationInitSerializer(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 and data['wproducts']:
|
|
if step.type == Step.STEP_TYPE_DIV:
|
|
raise serializers.ValidationError(_('不可进行此操作'))
|
|
for i in data['wproducts']:
|
|
if i.is_executed:
|
|
raise serializers.ValidationError('不可进行操作')
|
|
if i.subproduction_plan != subproduction_plan:
|
|
raise serializers.ValidationError('半成品所属子计划不一致')
|
|
if i.p_state != step:
|
|
raise serializers.ValidationError('半成品所属子工序不一致')
|
|
else:
|
|
if step.type != Step.STEP_TYPE_DIV:
|
|
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 OperationRecordItemSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = OperationRecordItem
|
|
fields = ['form_field', 'field_value']
|
|
|
|
class OperationRecordSerializer(serializers.ModelSerializer):
|
|
record_data = OperationRecordItemSerializer(many=True)
|
|
class Meta:
|
|
model = OperationRecord
|
|
fields = ['form', 'record_data']
|
|
|
|
|
|
|
|
class OperationSubmitSerializer(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 = OperationRecordSerializer(many=True, required=False)
|
|
remark = serializers.CharField(required=False, label='操作备注')
|
|
|
|
|
|
|