from rest_framework import serializers from decimal import Decimal from typing import List, Dict, Any from stock import models as stock_models from basic_info import models as basic_info_models class ProductStockChangeSerializer(serializers.Serializer): """产品库存变动序列化器""" product = serializers.IntegerField(help_text="产品ID") quantity = serializers.ListField( child=serializers.DecimalField(max_digits=10, decimal_places=2, min_value=Decimal('0.01')), min_length=1, help_text="数量列表,每个数量对应一条明细记录" ) def validate_product(self, value: int) -> int: """验证产品是否存在""" try: basic_info_models.Product.objects.get(id=value) except basic_info_models.Product.DoesNotExist: raise serializers.ValidationError(f"产品ID {value} 不存在") return value class CreateStockChangeSerializer(serializers.Serializer): """创建库存变动记录序列化器""" stock_change_record_id = serializers.IntegerField( required=False, allow_null=True, help_text="库存变动记录ID,如果不提供则创建新记录" ) products = ProductStockChangeSerializer(many=True, help_text="产品列表") def validate_stock_change_record_id(self, value: int) -> int: """验证库存变动记录是否存在""" if value is not None: try: stock_models.StockChangeRecord.objects.get(id=value) except stock_models.StockChangeRecord.DoesNotExist: raise serializers.ValidationError(f"库存变动记录ID {value} 不存在") return value def validate_products(self, value: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """验证产品列表""" if not value: raise serializers.ValidationError("产品列表不能为空") # 检查是否有重复的产品ID product_ids = [item['product'] for item in value] if len(product_ids) != len(set(product_ids)): raise serializers.ValidationError("产品列表中存在重复的产品ID") return value class StockChangeRecordResponseSerializer(serializers.ModelSerializer): """库存变动记录响应序列化器""" class Meta: model = stock_models.StockChangeRecord fields = [ 'id', 'type', 'warehouse', 'source_type', 'source_id', 'is_finished', 'finished_at', 'created_at', 'updated_at' ] class StockChangeDetailResponseSerializer(serializers.ModelSerializer): """库存变动明细响应序列化器""" product_name = serializers.CharField(source='product.name', read_only=True) unit_display = serializers.CharField(source='get_unit_display', read_only=True) class Meta: model = stock_models.StockChangeDetail fields = [ 'id', 'product', 'product_name', 'quantity', 'unit', 'unit_display', 'stock_change_record' ] class CreateStockChangeResponseSerializer(serializers.Serializer): """创建库存变动记录响应序列化器""" stock_change_record = StockChangeRecordResponseSerializer() details = StockChangeDetailResponseSerializer(many=True) message = serializers.CharField() created_details_count = serializers.IntegerField() class SetMerchantAutoCompleteStockChangeSerializer(serializers.Serializer): """设置商户自动确认库存变动序列化器""" auto_complete = serializers.BooleanField( help_text="是否自动确认库存变动" )