factory/apps/sam/services.py

42 lines
1.8 KiB
Python

from apps.sam.models import Order, OrderItem
from rest_framework.exceptions import ValidationError
from django.db.models import F
from apps.inm.models import MIO, MIOItem
class SamService:
def mio_saleout(mio: MIO, is_reverse: bool = False):
"""
销售出库成功后的操作
"""
order = mio.order
if order is None:
return
orderitem_qs = OrderItem.objects.filter(order=order)
matIds = list(MIOItem.objects.filter(mio=mio).values_list('material__id', flat=True).distinct())
matIds2 = list(orderitem_qs.values_list('material__id', flat=True).distinct())
if set(matIds) != set(matIds2):
raise ValidationError('订单与发货单物料不一致')
for orderitem in orderitem_qs:
material = orderitem.material
delivered_count = MIOItem.objects.filter(
mio__order=order, material=material, mio__type='sale_out', mio__submit_time__isnull=False).values('count').aggregate(Sum('count'))['count__sum']
delivered_count = delivered_count if delivered_count else 0
if delivered_count > orderitem.count:
raise ValidationError((f'{str(material)}-超出订单所需数量'))
elif delivered_count < 0:
raise ValidationError((f'{str(material)}-数量小于0'))
orderitem.delivered_count = delivered_count
orderitem.save(update_fields=['delivered_count'])
# 更新order的状态
qs = OrderItem.objects.filter(
order=order, count__gt=F('delivered_count'))
order_state = Order.ORDER_DOING
if qs.exists():
pass
else:
order_state = Order.ORDER_DELIVERED
order.state = order_state
order.save()