1
0
forked from erp-dev/erp

fix: rebuild stock change record

This commit is contained in:
2025-11-05 16:57:54 +08:00
parent d88bf367f8
commit a759030cdc
16 changed files with 1116 additions and 66 deletions

86
api_v1/serializers.py Normal file
View File

@@ -0,0 +1,86 @@
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()