from rest_framework import serializers from rest_framework.exceptions import ValidationError from apps.mtm.serializers import MaterialSerializer from apps.pum.models import PuOrder from apps.system.models import Dept, User from apps.utils.constants import EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT from apps.utils.serializers import CustomModelSerializer from .models import MIO, MaterialBatch, MIOItem, WareHouse class WareHourseSerializer(CustomModelSerializer): class Meta: model = WareHouse fields = '__all__' read_only_fields = EXCLUDE_FIELDS_DEPT class MaterialBatchSerializer(CustomModelSerializer): warehouse_name = serializers.CharField( source='warehouse.name', read_only=True) material_name = serializers.CharField( source='material.name', read_only=True) class Meta: model = MaterialBatch fields = '__all__' read_only_fields = EXCLUDE_FIELDS_BASE class MIOSerializer(CustomModelSerializer): create_by_name = serializers.CharField( source='create_by.name', read_only=True) class Meta: model = MIO fields = '__all__' read_only_fields = EXCLUDE_FIELDS_DEPT + ['state', 'submit_time'] def validate(self, attrs): if 'pu_order' in attrs and attrs['pu_order']: attrs['supplier'] = attrs['pu_order'].supplier elif 'order' in attrs and attrs['order']: attrs['customer'] = attrs['order'].customer return super().validate(attrs) def create(self, validated_data): type = validated_data['type'] if type == MIO.MIO_TYPE_PUR_IN: pu_order = validated_data.get('pu_order', None) if pu_order and pu_order.state in [PuOrder.PUORDER_SUBMITED, PuOrder.PUORDER_SHIP]: pass else: raise ValidationError('该采购订单不可选') return super().create(validated_data) def update(self, instance, validated_data): validated_data.pop('type') return super().update(instance, validated_data) class MIOItemSerializer(CustomModelSerializer): warehouse_name = serializers.CharField(source='warehouse', read_only=True) material_ = MaterialSerializer(source='material', read_only=True) class Meta: model = MIOItem fields = '__all__' def create(self, validated_data): mio = validated_data['mio'] if mio.state != MIO.MIO_CREATE: raise ValidationError('出入库记录非创建中不可新增') return super().create(validated_data) class PickSerializer(CustomModelSerializer): belong_dept = serializers.PrimaryKeyRelatedField( label="领料车间", queryset=Dept.objects.all(), required=True) pick_user = serializers.PrimaryKeyRelatedField( label="领料人", queryset=User.objects.all(), required=True) class Meta: model = MIO fields = ['number', 'note', 'pick_user', 'belong_dept'] def create(self, validated_data): validated_data['type'] = MIO.MIO_TYPE_DO_OUT return super().create(validated_data) def update(self, instance, validated_data): if instance.state != MIO.MIO_CREATE: raise ValidationError('记录非创建中') return super().update(instance, validated_data)