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)