103 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			4.1 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)
 | |
|     packnum = serializers.CharField(min_length=6)
 | |
|     class Meta:
 | |
|         model = SaleProduct
 | |
|         fields = ['packnum', 'detail', 'remark']
 | |
| 
 | |
| 
 | |
| class SRemarkItemCreateSerializer(serializers.Serializer):
 | |
|     remark = serializers.CharField(min_length=6)
 | |
| 
 | |
| class SaleUpShipPicSerializer(serializers.Serializer):
 | |
|     path = serializers.CharField(min_length=4, max_length=200)
 |