1
0
forked from erp-dev/erp

feat: transfer api for stock module

This commit is contained in:
2025-12-02 14:14:17 +08:00
parent 9dbb2f9c9b
commit 0b8146d972
9 changed files with 616 additions and 0 deletions

View File

@@ -154,6 +154,86 @@ class SetMerchantAutoCompleteStockChangeSerializer(serializers.Serializer):
)
class StockTransferProductSerializer(serializers.Serializer):
product_id = serializers.IntegerField()
quantities = serializers.ListField(
child=serializers.DecimalField(max_digits=10, decimal_places=2),
required=False,
allow_empty=False,
)
value = serializers.DecimalField(max_digits=10, decimal_places=2, required=False)
num_of_rolls = serializers.IntegerField(required=False)
unit_count = serializers.DecimalField(max_digits=10, decimal_places=2, required=False)
consume_detail_ids = serializers.ListField(
child=serializers.IntegerField(min_value=1),
required=False,
allow_empty=False,
)
def validate(self, attrs):
has_quantities = bool(attrs.get('quantities'))
has_value = attrs.get('value') is not None
has_consumes = bool(attrs.get('consume_detail_ids'))
if not (has_quantities or has_value or has_consumes):
raise serializers.ValidationError('必须提供 quantities、value 或 consume_detail_ids 之一')
return attrs
class StockTransferSerializer(serializers.Serializer):
from_warehouse = serializers.IntegerField()
to_warehouse = serializers.IntegerField()
transfer_date = serializers.DateField(required=False)
remarks = serializers.CharField(required=False, allow_blank=True, allow_null=True, max_length=500)
request_id = serializers.CharField(required=False, allow_blank=True, allow_null=True, max_length=64)
products = StockTransferProductSerializer(many=True)
def validate_products(self, value):
if not value:
raise serializers.ValidationError('产品列表不能为空')
return value
class TransferOrderItemSerializer(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.TransferOrderItem
fields = ['id', 'product', 'product_name', 'total_quantity', 'unit', 'unit_display', 'num_of_rolls']
class StockTransferResponseSerializer(serializers.ModelSerializer):
items = TransferOrderItemSerializer(many=True, read_only=True)
from_warehouse_name = serializers.CharField(source='from_warehouse.name', read_only=True)
to_warehouse_name = serializers.CharField(source='to_warehouse.name', read_only=True)
mode_display = serializers.CharField(source='get_mode_display', read_only=True)
status_display = serializers.CharField(source='get_status_display', read_only=True)
outgoing_record_id = serializers.IntegerField(source='outgoing_record.id', read_only=True)
incoming_record_id = serializers.IntegerField(source='incoming_record.id', read_only=True)
class Meta:
model = stock_models.TransferOrder
fields = [
'id',
'merchant',
'from_warehouse',
'from_warehouse_name',
'to_warehouse',
'to_warehouse_name',
'mode',
'mode_display',
'operator',
'transfer_date',
'status',
'status_display',
'remarks',
'request_id',
'outgoing_record_id',
'incoming_record_id',
'items',
]
# ==================== 通用文件上传序列化器 ====================
class UploadedFileSerializer(serializers.ModelSerializer):