99 lines
4.0 KiB
Python
99 lines
4.0 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 = 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)
|
|
class Meta:
|
|
model = SaleProduct
|
|
fields = ['packnum', 'detail', 'remark']
|
|
|
|
|
|
class SRemarkItemCreateSerializer(serializers.Serializer):
|
|
remark = serializers.CharField()
|