from rest_framework import serializers from rest_framework import exceptions from apps.inm.models import IProduct from apps.inm.serializers import IProductListSerializer from apps.mtm.models import Material, PackItem from apps.mtm.serializers import MaterialSimpleSerializer, PackItemDetailSerializer from apps.sam.models import Sale, SalePack, SaleProduct from apps.sam.serializers import CustomerSimpleSerializer, OrderSimpleSerializer from django.db import transaction from rest_framework.exceptions import ValidationError class SaleCreateSerializer(serializers.ModelSerializer): iproducts = serializers.PrimaryKeyRelatedField(queryset= IProduct.objects.all(), many=True) class Meta: model = Sale fields = ['customer', 'order', 'product', 'iproducts', 'edelivery_date', 'trans_mode', 'receiver', 'receiver_phone' , 'receiver_address', 'remark'] def validate(self, attrs): order = attrs.get('order', None) if order: if order.customer: attrs['customer'] = order.customer attrs['product'] = order.product ips = IProduct.objects.filter(id__in=[i.id for i in attrs['iproducts']]) if ips.exclude(state=IProduct.SALE_OK).exists(): raise exceptions.APIException('选取了非可用的产品') if ips.count() != ips.filter(material=attrs['product']).count(): raise exceptions.APIException('产品选取错误') return super().validate(attrs) class SaleListSerializer(serializers.ModelSerializer): customer_ = CustomerSimpleSerializer(source='customer', read_only=True) order_ = OrderSimpleSerializer(source='order', read_only=True) product_ = MaterialSimpleSerializer(source='product', read_only=True) class Meta: model = Sale fields = '__all__' class SaleProductListSerializer(serializers.ModelSerializer): iproduct_ = IProductListSerializer(source='iproduct', read_only=True) class Meta: model = SaleProduct fields = '__all__' class SaleProductCreateSerializer(serializers.ModelSerializer): class Meta: model = SaleProduct fields = ['sale', 'iproduct'] def create(self, validated_data): with transaction.atomic(): validated_data['number'] = validated_data['iproduct'].number instance = SaleProduct.objects.create(**validated_data) sale = instance.sale sale.count = SaleProduct.objects.filter(sale=instance.sale).count() sale.save() order = sale.order if order: if sale.count+order.delivered_count>order.count: raise exceptions.APIException('超过订单所需数量') return instance class SPackItemSerializer(serializers.ModelSerializer): name = serializers.CharField(source='packitem.name', read_only=True) specification = serializers.CharField(source='packitem.specification', read_only=True) unit = serializers.CharField(source='packitem.unit', read_only=True) material_ = MaterialSimpleSerializer(source='packitem.material', read_only=True) class Meta: model = SalePack fields = '__all__' class SaleProductPackDetailSerializer(serializers.ModelSerializer): detail = serializers.SerializerMethodField() class Meta: model = SaleProduct fields = ['packnum', 'detail', 'remark'] def get_detail(self, obj): return SPackItemSerializer(instance=SalePack.objects.filter(sale_product=obj) , many=True).data class SPackItemCreateSerializer(serializers.Serializer): id = serializers.PrimaryKeyRelatedField(queryset=SalePack.objects.all()) count = serializers.IntegerField() class SaleProductPackSerializer(serializers.ModelSerializer): detail = SPackItemCreateSerializer(many=True) packnum = serializers.CharField(min_length=6) class Meta: model = SaleProduct fields = ['packnum', 'detail', 'remark'] class SRemarkItemCreateSerializer(serializers.Serializer): remark = serializers.CharField(min_length=6)