hberp/hb_server/apps/sam/serializers_sale.py

94 lines
3.8 KiB
Python

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 = ['packnum', 'detail']
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=PackItem.objects.all())
count = serializers.IntegerField()
class SaleProductPackSerializer(serializers.ModelSerializer):
detail = SPackItemCreateSerializer(many=True)
class Meta:
model = SaleProduct
fields = ['packnum', 'detail']