72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
from rest_framework.exceptions import ValidationError
|
|
from apps.pum.models import PuOrderItem, PuPlan, PuPlanItem, PuOrder
|
|
from django.db.models import F, Sum
|
|
from apps.inm.models import MIO, MIOItem
|
|
|
|
|
|
class PumService:
|
|
|
|
def cal_pu_order_total_price(puorder: PuOrder):
|
|
total_price = PuOrderItem.objects.filter(pu_order=puorder).aggregate(total=Sum("total_price"))["total"] or 0
|
|
puorder.total_price = total_price
|
|
puorder.save()
|
|
|
|
def cal_pu_plan_total_price(puplan: PuPlan):
|
|
total_price = PuPlanItem.objects.filter(pu_plan=puplan).aggregate(total=Sum("total_price"))["total"] or 0
|
|
puplan.total_price = total_price
|
|
puplan.save()
|
|
|
|
def change_puplan_state_when_puorder_sumbit(puorder: PuOrder):
|
|
puplanIds = PuPlanItem.objects.filter(
|
|
pu_order=puorder).values_list('pu_plan', flat=True)
|
|
for id in puplanIds:
|
|
puplan = PuPlan.objects.get(id=id)
|
|
state = puplan.state
|
|
if PuPlanItem.objects.filter(pu_plan=puplan).count() == PuPlanItem.objects.filter(pu_plan=puplan, pu_order__state__gte=PuOrder.PUORDER_SUBMITED).count():
|
|
state = PuPlan.PUPLAN_ORDERED
|
|
else:
|
|
state = PuPlan.PUPLAN_ORDERING
|
|
puplan.state = state
|
|
puplan.save()
|
|
|
|
def mio_purin(mio: MIO, is_reverse: bool = False):
|
|
"""
|
|
采购入库成功后的操作
|
|
"""
|
|
pu_order = mio.pu_order
|
|
if pu_order is None:
|
|
return
|
|
for i in MIOItem.objects.filter(mio=mio):
|
|
pu_orderitem = PuOrderItem.objects.get(
|
|
material=i.material, pu_order=pu_order)
|
|
if is_reverse:
|
|
delivered_count = pu_orderitem.delivered_count - i.count
|
|
else:
|
|
delivered_count = pu_orderitem.delivered_count + i.count
|
|
if delivered_count > pu_orderitem.count:
|
|
raise ValidationError(f'{i.material.name}-超出采购订单所需数量')
|
|
elif delivered_count < 0:
|
|
raise ValidationError(f'{i.material.name}-数量小于0')
|
|
pu_orderitem.delivered_count = delivered_count
|
|
pu_orderitem.save()
|
|
pu_order_state = PuOrder.PUORDER_SHIP
|
|
qs = PuOrderItem.objects.filter(
|
|
pu_order=pu_order, count__gt=F('delivered_count')) # 查询未完全到货的
|
|
if qs.exists():
|
|
pass
|
|
else:
|
|
pu_order_state = PuOrder.PUORDER_DONE
|
|
pu_order.state = pu_order_state
|
|
pu_order.save()
|
|
|
|
# 更新采购计划进度
|
|
qs2 = PuPlanItem.objects.filter(pu_order=pu_order).values_list(
|
|
'pu_plan').distinct()
|
|
for puplan in qs2:
|
|
qs3 = PuPlanItem.objects.filter(pu_plan=puplan).values_list(
|
|
'pu_order__state', flat=True)
|
|
states = set(list(qs3))
|
|
if len(states) == 1 and list(states)[0] == PuOrder.PUORDER_DONE:
|
|
puplan.state = PuPlan.PUPLAN_DONE
|
|
puplan.save()
|