fix: 采购入库创建与提交
This commit is contained in:
parent
4a1996c4e9
commit
21f53dd3ef
|
@ -1,6 +1,6 @@
|
|||
from rest_framework import serializers
|
||||
from apps.utils.serializers import CustomModelSerializer
|
||||
from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS_BASE
|
||||
from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
from apps.pum.models import Supplier, PuPlan, PuPlanItem, PuOrder, PuOrderItem
|
||||
|
@ -28,24 +28,38 @@ class PuPlanSerializer(CustomModelSerializer):
|
|||
|
||||
class PuPlanItemSerializer(CustomModelSerializer):
|
||||
material_ = MaterialSerializer(source='material', read_only=True)
|
||||
pu_plan_number = serializers.CharField(
|
||||
source='pu_plan.number', read_only=True)
|
||||
create_by_name = serializers.CharField(
|
||||
source='create_by.name', read_only=True)
|
||||
belong_dept_name = serializers.CharField(
|
||||
source='belong_dept.name', read_only=True)
|
||||
note = serializers.CharField(required=False, allow_blank=True)
|
||||
|
||||
class Meta:
|
||||
model = PuPlanItem
|
||||
fields = '__all__'
|
||||
read_only_fields = EXCLUDE_FIELDS_DEPT + ['pu_order']
|
||||
read_only_fields = EXCLUDE_FIELDS + ['pu_order']
|
||||
|
||||
def create(self, validated_data):
|
||||
pu_plan = validated_data['pu_plan']
|
||||
if pu_plan.state != PuPlan.PUPLAN_CREATE:
|
||||
raise ValidationError('该状态下不可添加需求')
|
||||
material = validated_data['material']
|
||||
user = self.context['request'].user
|
||||
if PuPlanItem.objects.filter(material=material, belong_dept=user.belong_dept).exists():
|
||||
self.complete_belong_dept(validated_data)
|
||||
if PuPlanItem.objects.filter(material=material, belong_dept=validated_data['belong_dept']).exists():
|
||||
raise ValidationError('同部门已提交该物料需求,请确认!')
|
||||
return super().create(validated_data)
|
||||
|
||||
def complete_belong_dept(self, validated_data):
|
||||
belong_dept = validated_data.get('belong_dept', None)
|
||||
if belong_dept is None:
|
||||
belong_dept = self.context['request'].user.belong_dept
|
||||
if belong_dept is None:
|
||||
raise ValidationError('所属部门不可为空')
|
||||
else:
|
||||
validated_data['belong_dept'] = belong_dept
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
validated_data.pop('pu_plan')
|
||||
pu_plan = instance.pu_plan
|
||||
|
@ -53,9 +67,11 @@ class PuPlanItemSerializer(CustomModelSerializer):
|
|||
raise ValidationError('该状态下不可编辑需求')
|
||||
material = validated_data['material']
|
||||
user = self.context['request'].user
|
||||
|
||||
if instance.create_by != user:
|
||||
raise ValidationError('非创建人不可编辑')
|
||||
if PuPlanItem.objects.exclude(id=instance.id).filter(material=material, belong_dept=user.belong_dept).exists():
|
||||
self.complete_belong_dept(validated_data)
|
||||
if PuPlanItem.objects.exclude(id=instance.id).filter(material=material, belong_dept=validated_data['belong_dept']).exists():
|
||||
raise ValidationError('同部门已提交该物料需求,请确认!')
|
||||
return super().update(instance, validated_data)
|
||||
|
||||
|
|
|
@ -3,14 +3,16 @@ from apps.pum.models import PuOrderItem, PuPlan, PuPlanItem, PuOrder
|
|||
from django.db.models import F
|
||||
from apps.inm.models import MIO, MIOItem
|
||||
|
||||
|
||||
class PumService:
|
||||
|
||||
def change_puplan_state_when_puorder_sumbit(puorder: PuOrder):
|
||||
puplanIds = PuPlanItem.objects.filter(pu_order=puorder).values_list('pu_plan', flat=True)
|
||||
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() == PuPlan.objects.filter(pu_plan=puplan, pu_order__state__gte=PuOrder.PUORDER_SUBMITED).count():
|
||||
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
|
||||
|
@ -23,27 +25,30 @@ class PumService:
|
|||
"""
|
||||
pu_order = mio.pu_order
|
||||
for i in MIOItem.objects.filter(mio=mio):
|
||||
pu_orderitem = PuOrderItem.objects.get(material=i.material, pu_order=pu_order)
|
||||
pu_orderitem = PuOrderItem.objects.get(
|
||||
material=i.material, pu_order=pu_order)
|
||||
delivered_count = pu_orderitem.delivered_count + i.count
|
||||
if delivered_count > pu_orderitem.count:
|
||||
raise ValidationError(f'{i.material.name}-超出采购订单所需数量')
|
||||
pu_orderitem.delivered_count = delivered_count
|
||||
pu_orderitem.save()
|
||||
pu_order_state = PuOrder.PUORDER_SHIP
|
||||
qs = PuOrderItem.objects.filter(pu_order=pu_order, count__lte=F('delivered_count'))
|
||||
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', flat=True).distinct()
|
||||
|
||||
# 更新采购计划进度
|
||||
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)
|
||||
qs3 = PuPlanItem.objects.filter(pu_plan=puplan).values_list(
|
||||
'pu_order__state', flat=True)
|
||||
states = set(list(qs3))
|
||||
if len(states) == 1 and states[0] == PuOrder.PUORDER_DONE:
|
||||
if len(states) == 1 and list(states)[0] == PuOrder.PUORDER_DONE:
|
||||
puplan.state = PuPlan.PUPLAN_DONE
|
||||
puplan.save()
|
||||
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ class PuPlanViewSet(CustomModelViewSet):
|
|||
filterset_fields = ['state']
|
||||
|
||||
def perform_destroy(self, instance):
|
||||
if PuPlan.objects.filter(pu_plan=instance).exists():
|
||||
if PuPlanItem.objects.filter(pu_plan=instance).exists():
|
||||
raise ParseError('该计划存在明细不可删除')
|
||||
return super().perform_destroy(instance)
|
||||
|
||||
|
@ -73,6 +73,8 @@ class PuPlanItemViewSet(CustomModelViewSet):
|
|||
queryset = PuPlanItem.objects.all()
|
||||
serializer_class = PuPlanItemSerializer
|
||||
filterset_class = PuPlanItemFilter
|
||||
select_related_fields = ['material', 'pu_plan',
|
||||
'pu_order', 'create_by', 'belong_dept']
|
||||
ordering_fields = ['create_time', 'material', 'need_date', 'need_count']
|
||||
ordering = ['create_time']
|
||||
|
||||
|
@ -117,10 +119,10 @@ class PuOrderViewSet(CustomModelViewSet):
|
|||
raise ParseError('订单信息不全')
|
||||
if puorder.create_by != user:
|
||||
raise PermissionDenied('非创建人不可提交')
|
||||
if puorder.state != PuOrder.PUPLAN_CREATE:
|
||||
if puorder.state != PuOrder.PUORDER_CREATE:
|
||||
raise ParseError('采购计划状态异常')
|
||||
puorder.submit_time = timezone.now()
|
||||
puorder.state = PuPlan.PUPLAN_SUBMITED
|
||||
puorder.state = PuOrder.PUORDER_SUBMITED
|
||||
puorder.save()
|
||||
PumService.change_puplan_state_when_puorder_sumbit(puorder)
|
||||
return Response()
|
||||
|
|
Loading…
Reference in New Issue