fix: 采购入库创建与提交

This commit is contained in:
caoqianming 2023-10-19 14:06:27 +08:00
parent 4a1996c4e9
commit 21f53dd3ef
3 changed files with 41 additions and 18 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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()