hberp/hb_server/apps/inm/serializers.py

233 lines
8.2 KiB
Python

from rest_framework import exceptions
from rest_framework import serializers
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory
from apps.pum.models import PuOrder, Vendor
from apps.qm.models import TestRecord, TestRecordItem
from apps.sam.serializers import OrderSimpleSerializer
from apps.system.serializers import FileSimpleSerializer, UserSimpleSerializer
from apps.mtm.serializers import MaterialSimpleSerializer
from django.db import transaction
from utils.mixins import DynamicFieldsSerializerMixin
from utils.tools import ranstr
from rest_framework.exceptions import ValidationError
class WareHouseSerializer(serializers.ModelSerializer):
create_by_ = UserSimpleSerializer('create_by', read_only=True)
class Meta:
model = WareHouse
fields = '__all__'
class WareHouseCreateUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = WareHouse
fields = ['name', 'number', 'place']
class WareHouseSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = WareHouse
fields = ['name', 'number', 'place']
class InventorySerializer(serializers.ModelSerializer):
material_ = MaterialSimpleSerializer(source='material', read_only=True)
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
class Meta:
model = Inventory
fields = '__all__'
class MaterialBatchSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer):
material_ = MaterialSimpleSerializer(source='material', read_only=True)
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
class Meta:
model = MaterialBatch
fields = '__all__'
class IProductListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer):
material_ = MaterialSimpleSerializer(source='material', read_only=True)
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
need_to_order = serializers.BooleanField(source='wproduct.need_to_order', read_only=True)
is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True)
remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True)
to_order_ = OrderSimpleSerializer(source='wproduct.to_order', read_only=True)
order_ = OrderSimpleSerializer(
source='wproduct.subproduction_plan.production_plan.order', read_only=True)
class Meta:
model = IProduct
fields = '__all__'
class FIFOListSerializer(serializers.ModelSerializer):
auditor_ = UserSimpleSerializer(source='auditor', read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
class Meta:
model = FIFO
fields = '__all__'
class FIFOItemCreateSerializer(serializers.ModelSerializer):
class Meta:
model = FIFOItem
fields = ['warehouse',
'material', 'batch', 'fifo', 'files', 'pu_order_item', 'count']
def create(self, validated_data):
fifo = validated_data['fifo']
if fifo.is_audited:
raise ValidationError('该出入库记录已审核')
pu_order_item = validated_data.get('pu_order_item', None)
if pu_order_item:
if fifo.pu_order != pu_order_item.pu_order:
raise ValidationError('项目与采购订单不一致')
validated_data['material']=pu_order_item.material
else:
if fifo.pu_order is not None:
raise ValidationError('非采购订单')
return super().create(validated_data)
def validate_batch(self, value):
if value == '':
return value
elif len(value) > 6:
return value
raise ValidationError('批次号错误')
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = FIFOItem
fields = ['warehouse', 'batch', 'files', 'count']
class FIFOItemSerializer(serializers.ModelSerializer):
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
material_ = MaterialSimpleSerializer(source='material', read_only=True)
files_ = FileSimpleSerializer(source='files', many=True, read_only=True)
class Meta:
model = FIFOItem
fields = '__all__'
class FIFOItemProductCreateSerializer(serializers.ModelSerializer):
class Meta:
model = IProduct
fields = ['number']
class FIFODetailInPurSerializer(serializers.ModelSerializer):
details = FIFOItemProductCreateSerializer(many=True, required=False)
class Meta:
model = FIFOItem
fields = ['material', 'count', 'batch', 'details', 'warehouse']
def validate_batch(self, value):
if value == '':
return value
elif len(value) > 6:
return value
raise ValidationError('批次号错误')
class MaterialBatchQuerySerializer(serializers.Serializer):
warehouse = serializers.IntegerField(label="仓库ID", required=False)
materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False)
class FIFOInOtherSerializer(serializers.ModelSerializer):
"""
其他入库序列化
"""
details = FIFODetailInPurSerializer(many=True, required=False)
vendor = serializers.PrimaryKeyRelatedField(label='供应商ID',
queryset=Vendor.objects.all())
class Meta:
model = FIFO
fields = ['details', 'vendor']
def create(self, validated_data):
details = validated_data.pop('details')
with transaction.atomic():
validated_data['type'] = FIFO.FIFO_TYPE_OTHER_IN
validated_data['number'] = 'RK' + ranstr(7)
obj = FIFO(**validated_data)
obj.save()
for i in details:
if 'details' in i:
p_details = i.pop('details')
if len(p_details) != i['count']:
raise serializers.ValidationError('数目对不上')
else:
i['fifo'] = obj
fifoitem = FIFOItem.objects.create(**i)
p_list0 = []
for x in p_details:
x['material'] = i['material']
x['fifoitem'] = fifoitem
p_list0.append(FIFOItemProduct(**x))
FIFOItemProduct.objects.bulk_create(p_list0)
else:
i['fifo'] = obj
FIFOItem.objects.create(**i)
return obj
class FIFOInPurSerializer(serializers.ModelSerializer):
"""
采购入库序列化
"""
pu_order = serializers.PrimaryKeyRelatedField(label='采购订单ID',
queryset = PuOrder.objects.filter(is_audited=True))
class Meta:
model = FIFO
fields = ['pu_order']
def create(self, validated_data):
pu_order = validated_data['pu_order']
if not pu_order.is_audited:
raise ValidationError('该采购订单未审核')
validated_data['vendor'] = pu_order.vendor
validated_data['number'] = 'RK' + ranstr(7)
validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN
obj = FIFO.objects.create(**validated_data)
return obj
class InmTestRecordItemCreateSerializer(serializers.ModelSerializer):
class Meta:
model = TestRecordItem
fields = ['form_field', 'field_value', 'is_testok']
class InmTestRecordCreateSerializer(serializers.ModelSerializer):
record_data = InmTestRecordItemCreateSerializer(many=True)
fifo_item = serializers.PrimaryKeyRelatedField(queryset=FIFOItem.objects.all(), required=True)
is_testok = serializers.BooleanField()
class Meta:
model = TestRecord
fields = ['form', 'record_data', 'is_testok', 'fifo_item']
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = FIFOItem
fields = ['need_test', 'files']
def validate(self, attrs):
ins = self.instance
fifo = ins.fifo
if fifo.is_audited:
raise exceptions.APIException('该记录已审核')
if ins.is_testok is not None:
attrs.pop('need_test')
return super().validate(attrs)