You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from django.db import transaction
from django.db.models import Sum
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from financial_info.models import ReceiptModel, ReceiptItemModel
class ReceiptItemSerializer(serializers.ModelSerializer):
"""
收款单中 收款项目 的序列化器
"""
# 查询当前销售 出库单中已经 收金额
already_receipt = serializers.SerializerMethodField(read_only=True, help_text='已经收款的金额')
class Meta:
model = ReceiptItemModel
fields = '__all__'
def get_already_receipt(self, obj: ReceiptItemModel):
"""
查询当前 销售出库单中已经 收的货款金额
:param obj: ReceiptItemModel
:return: 0获取其他的数值
"""
if obj.deliver_storage:
sum_dict = ReceiptItemModel.objects.filter(deliver_storage_id=obj.deliver_storage.id)\
.exclude(receipt__status='0')\
.aggregate(sum=Sum('this_money'))
if sum_dict:
return sum_dict['sum'] if sum_dict['sum'] else 0
return 0
return 0
class ReceiptSerializer(serializers.ModelSerializer):
"""
收款单——序列化器
"""
item_list = ReceiptItemSerializer(many=True, required=False)
class Meta:
model = ReceiptModel
fields = '__all__'
def create(self, validated_data):
if 'item_list' not in validated_data:
return super(ReceiptSerializer, self).create(validated_data)
item_list = validated_data.pop('item_list')
with transaction.atomic():
receipt = ReceiptModel.objects.create(**validated_data)
for item in item_list:
# 插入收款项目
ReceiptItemModel.objects.create(receipt=receipt, **item)
return receipt
# 必须重写update
def update(self, instance, validated_data):
if instance.status != '0':
raise ValidationError("收款单已经生效,不能修改!")
with transaction.atomic():
if 'item_list' in validated_data:
item_list = validated_data.pop('item_list')
old_list = instance.item_list.all()
if old_list.exists():
# 然后把旧数据删除因为在validated_data拿不到货品库存数据的ID
instance.item_list.all().delete()
for item in item_list: # 重新插入采购项 数据
ReceiptItemModel.objects.create(receipt=instance, **item)
result = super(ReceiptSerializer, self).update(instance=instance, validated_data=validated_data)
return result