factory/apps/pum/views.py

156 lines
6.2 KiB
Python

from django.shortcuts import render
from apps.pum.models import Supplier, PuPlan, PuPlanItem, PuOrder, PuOrderItem
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.pum.serializers import (SupplierSerializer, PuPlanSerializer, PuPlanItemSerializer,
PuOrderSerializer, PuOrderItemSerializer, AddSerializer)
from rest_framework.exceptions import ParseError, PermissionDenied
from rest_framework.decorators import action
from rest_framework import serializers
from apps.pum.filters import PuPlanItemFilter
from django.db import transaction
from rest_framework.response import Response
from django.utils import timezone
from apps.pum.services import PumService
# Create your views here.
class SupplierViewSet(CustomModelViewSet):
queryset = Supplier.objects.all()
serializer_class = SupplierSerializer
search_fields = ['name', 'contact']
def perform_destroy(self, instance):
if PuOrder.objects.filter(supplier=instance).exists():
raise ParseError('该供应商存在采购订单不可删除')
instance.delete()
class PuPlanViewSet(CustomModelViewSet):
queryset = PuPlan.objects.all()
serializer_class = PuPlanSerializer
search_fields = ['name', 'number']
filterset_fields = ['state']
def perform_destroy(self, instance):
if PuPlan.objects.filter(pu_plan=instance).exists():
raise ParseError('该计划存在明细不可删除')
return super().perform_destroy(instance)
@action(methods=['post'], detail=True, perms_map={'post': 'pu_plan.update'}, serializer_class=serializers.Serializer)
def submit(self, request, *args, **kwargs):
"""提交采购计划
提交采购计划
"""
puplan = self.get_object()
user = request.user
if puplan.create_by != user:
raise PermissionDenied('非创建人不可提交')
if puplan.state != PuPlan.PUPLAN_CREATE:
raise ParseError('采购计划状态异常')
puplan.submit_time = timezone.now()
puplan.state = PuPlan.PUPLAN_SUBMITED
puplan.save()
return Response()
class PuPlanItemViewSet(CustomModelViewSet):
queryset = PuPlanItem.objects.all()
serializer_class = PuPlanItemSerializer
filterset_class = PuPlanItemFilter
ordering_fields = ['create_time', 'material', 'need_date', 'need_count']
ordering = ['create_time']
def perform_destroy(self, instance):
user = self.request.user
pu_plan = instance.pu_plan
if pu_plan.state == PuPlan.PUPLAN_CREATE and user != instance.create_by:
raise ParseError('非创建人不可删除')
elif instance.pu_order is not None:
raise ParseError('存在采购订单不可删除')
return super().perform_destroy(instance)
class PuOrderViewSet(CustomModelViewSet):
queryset = PuOrder.objects.all()
serializer_class = PuOrderSerializer
filterset_fields = ['state', 'supplier']
search_fields = ['number', 'supplier__name']
@transaction.atomic
def perform_destroy(self, instance):
if instance.state != PuOrder.PUORDER_CREATE:
raise ParseError('采购订单非创建中不可删除')
instance.delete(soft=False)
@action(methods=['post'], detail=True, perms_map={'post': 'pu_order.update'}, serializer_class=serializers.Serializer)
@transaction.atomic
def submit(self, request, *args, **kwargs):
"""提交采购订单
提交采购订单
"""
puorder = self.get_object()
user = request.user
if puorder.delivery_date is None or puorder.number is None:
raise ParseError('订单信息不全')
if puorder.create_by != user:
raise PermissionDenied('非创建人不可提交')
if puorder.state != PuOrder.PUPLAN_CREATE:
raise ParseError('采购计划状态异常')
puorder.submit_time = timezone.now()
puorder.state = PuPlan.PUPLAN_SUBMITED
puorder.save()
PumService.change_puplan_state_when_puorder_sumbit(puorder)
return Response()
class PuOrderItemViewSet(CustomModelViewSet):
queryset = PuOrderItem.objects.all()
serializer_class = PuOrderItemSerializer
filterset_fields = ['material', 'pu_order']
ordering = ['create_time']
@transaction.atomic
def perform_destroy(self, instance):
pu_order = instance.pu_order
if pu_order.state != PuOrder.PUORDER_CREATE:
raise ParseError('采购订单非创建中不可删除')
instance.delete()
@action(methods=['post'], detail=False, perms_map={'post': 'pu_orderitem.create'}, serializer_class=AddSerializer)
@transaction.atomic
def add_from_planitems(self, request, *args, **kwargs):
"""从计划明细创建/变更采购订单明细
从计划明细创建/变更采购订单明细
"""
data = request.data
sr = AddSerializer(data=data)
sr.is_valid(raise_exception=True)
vdata = sr.validated_data
puorder = vdata['pu_order']
if puorder.state != PuOrder.PUORDER_CREATE:
raise ParseError('该采购订单不可用')
puplanitems = PuPlanItem.objects.filter(id__in=vdata['pu_planitems'])
for item in puplanitems:
if item.pu_plan.state == PuPlan.PUPLAN_CREATE:
raise ParseError('存在不可选择的计划明细')
if item.pu_order and item.pu_order.state != PuOrder.PUORDER_CREATE:
raise ParseError('存在计划明细已指定进行中的采购订单')
puorderitem, is_created = PuOrderItem.objects.get_or_create(
pu_order = puorder, material=item.material,
defaults={'pu_order': puorder, 'material': item.material, 'count': item.need_count}
)
if not is_created:
puorderitem.count = puorderitem.count + item.need_count
puorderitem.save()
if puorder.delivery_date is None:
puorder.delivery_date = item.need_date
elif item.need_date < puorder.delivery_data:
puorder.delivery_date = item.need_date
puorder.save()
item.pu_order = puorder
item.save()
return Response()