|
|
from django.db import transaction
|
|
|
from django.db.models import Sum
|
|
|
from rest_framework import serializers
|
|
|
from rest_framework.exceptions import ValidationError
|
|
|
|
|
|
from ERP_5.utils.get_inventory import get_inventory_by_goods
|
|
|
from purchase_info.models import PurchaseModel, PurchaseItemModel
|
|
|
from warehouse_info.models import PurchaseStorageItemModel
|
|
|
|
|
|
|
|
|
class PurchaseItemsSerializer(serializers.ModelSerializer):
|
|
|
"""
|
|
|
采购单中的项目 的序列化器
|
|
|
"""
|
|
|
|
|
|
model_number = serializers.CharField(source='goods.model_number', read_only=True)
|
|
|
color = serializers.CharField(source='goods.color', read_only=True)
|
|
|
nits_name = serializers.CharField(source='goods.units.basic_name', read_only=True)
|
|
|
cur_inventory = serializers.SerializerMethodField(read_only=True)
|
|
|
|
|
|
# 增加一个已经入库数量的序列化属性(未来在新增入库单的时候需要展示)
|
|
|
already_in_number = serializers.SerializerMethodField(read_only=True)
|
|
|
|
|
|
class Meta:
|
|
|
model = PurchaseItemModel
|
|
|
fields = '__all__'
|
|
|
|
|
|
def get_cur_inventory(self, obj):
|
|
|
return get_inventory_by_goods(obj.goods.id)
|
|
|
|
|
|
def get_already_in_number(self, obj):
|
|
|
# 先根据采购单ID作为一个过滤条件, 基于当前货品ID作为第二个过滤条件, 而且入库单的状态是已经审核
|
|
|
in_count = PurchaseStorageItemModel.objects.filter(
|
|
|
purchase_storage__purchase__id=obj.purchase.id,
|
|
|
goods_id=obj.goods.id).exclude(purchase_storage__status='0')\
|
|
|
.aggregate(sum=Sum('purchase_count'))
|
|
|
if in_count:
|
|
|
return in_count['sum']
|
|
|
return 0
|
|
|
|
|
|
class PurchaseSerializer(serializers.ModelSerializer):
|
|
|
"""
|
|
|
采购单的序列化器
|
|
|
"""
|
|
|
# 采购单列表中需要展示的商品信息:
|
|
|
goods_info = serializers.SerializerMethodField(read_only=True)
|
|
|
# item_list 用于新增,修改,查询
|
|
|
item_list = PurchaseItemsSerializer(many=True)
|
|
|
|
|
|
class Meta:
|
|
|
model = PurchaseModel
|
|
|
fields = '__all__'
|
|
|
|
|
|
def create(self, validated_data):
|
|
|
item_list = validated_data.pop('item_list')
|
|
|
with transaction.atomic():
|
|
|
purchase = PurchaseModel.objects.create(**validated_data)
|
|
|
for item in item_list:
|
|
|
PurchaseItemModel.objects.create(purchase=purchase, **item)
|
|
|
return purchase
|
|
|
|
|
|
# 同时插入采购单和采购单中货品项。必须重写update
|
|
|
def update(self, instance, validated_data):
|
|
|
if instance.status != '0':
|
|
|
raise ValidationError("采购单已经生效,不能修改!")
|
|
|
item_list = validated_data.pop('item_list')
|
|
|
old_list = instance.item_list.all()
|
|
|
with transaction.atomic():
|
|
|
if old_list.exists():
|
|
|
# 然后把旧数据删除,因为在validated_data拿不到货品库存数据的ID
|
|
|
instance.item_list.all().delete()
|
|
|
|
|
|
for item in item_list: # 重新插入采购项 数据
|
|
|
PurchaseItemModel.objects.create(purchase=instance, **item)
|
|
|
result = super(PurchaseSerializer, self).update(instance=instance, validated_data=validated_data)
|
|
|
return result
|
|
|
|
|
|
def get_goods_info(self, obj):
|
|
|
"""
|
|
|
商品信息是由: 商品1名称 商品1规格 , 商品2名称 商品2规格 ,....
|
|
|
"""
|
|
|
if obj.item_list.all():
|
|
|
result = []
|
|
|
for item in obj.item_list.all():
|
|
|
result.append(item.name + (item.specification if item.specification else ''))
|
|
|
return ', '.join(result)
|
|
|
return ""
|