98 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.7 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
 | 
						|
from rest_framework.exceptions import ParseError
 | 
						|
 | 
						|
 | 
						|
class PumService:
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    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()
 | 
						|
    
 | 
						|
    @staticmethod
 | 
						|
    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()
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    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()
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def mio_pur(mio: MIO, is_reverse: bool = False, mioitem: MIOItem = None):
 | 
						|
        """
 | 
						|
        采购入库成功后的操作
 | 
						|
        """
 | 
						|
        pu_order = mio.pu_order
 | 
						|
        if pu_order is None:
 | 
						|
            return
 | 
						|
        if mioitem is None:
 | 
						|
            qs = MIOItem.objects.filter(mio=mio)
 | 
						|
        else:
 | 
						|
            qs = MIOItem.objects.filter(id=mioitem.id)
 | 
						|
        
 | 
						|
 | 
						|
        if mio.type == MIO.MIO_TYPE_PUR_IN:
 | 
						|
            if is_reverse:
 | 
						|
                xtype = "out"
 | 
						|
            else:
 | 
						|
                xtype = "in"
 | 
						|
        elif mio.type == MIO.MIO_TYPE_PUR_OUT:
 | 
						|
            if is_reverse:
 | 
						|
                xtype = "in"
 | 
						|
            else:
 | 
						|
                xtype = "out"
 | 
						|
 | 
						|
        for i in qs:
 | 
						|
            try:
 | 
						|
                pu_orderitem = PuOrderItem.objects.get(
 | 
						|
                    material=i.material, pu_order=pu_order)
 | 
						|
            except PuOrderItem.DoesNotExist:
 | 
						|
                raise ParseError(f'{str(i.material)}-采购订单中不存在该物料')
 | 
						|
            if xtype == "out":
 | 
						|
                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'{str(i.material)}-超出采购订单所需数量')
 | 
						|
            elif delivered_count < 0:
 | 
						|
                raise ValidationError(f'{str(i.material)}-数量小于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()
 | 
						|
 |