194 lines
7.3 KiB
Python
194 lines
7.3 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, PuOrderFilter
|
|
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):
|
|
"""
|
|
list: 供应商
|
|
|
|
供应商
|
|
"""
|
|
queryset = Supplier.objects.all()
|
|
serializer_class = SupplierSerializer
|
|
search_fields = ['name', 'contact']
|
|
filterset_fields = ['can_outsource']
|
|
|
|
def perform_destroy(self, instance):
|
|
if PuOrder.objects.filter(supplier=instance).exists():
|
|
raise ParseError('该供应商存在采购订单不可删除')
|
|
instance.delete()
|
|
|
|
|
|
class PuPlanViewSet(CustomModelViewSet):
|
|
"""
|
|
list: 采购计划
|
|
|
|
采购计划
|
|
"""
|
|
queryset = PuPlan.objects.all()
|
|
serializer_class = PuPlanSerializer
|
|
search_fields = ['name', 'number']
|
|
filterset_fields = ['state']
|
|
|
|
def perform_destroy(self, instance):
|
|
if PuPlanItem.objects.filter(pu_plan=instance).exists():
|
|
raise ParseError('该计划存在明细不可删除')
|
|
instance.delete(soft=False)
|
|
|
|
@action(methods=['post'], detail=True, perms_map={'post': 'pu_plan.submit'}, 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.submit_user = user
|
|
puplan.state = PuPlan.PUPLAN_SUBMITED
|
|
puplan.save()
|
|
return Response()
|
|
|
|
|
|
class PuPlanItemViewSet(CustomModelViewSet):
|
|
"""
|
|
list: 采购计划明细
|
|
|
|
采购计划明细
|
|
"""
|
|
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']
|
|
|
|
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('存在采购订单不可删除')
|
|
instance.delete()
|
|
PumService.cal_pu_plan_total_price(pu_plan)
|
|
|
|
|
|
class PuOrderViewSet(CustomModelViewSet):
|
|
"""
|
|
list: 采购订单
|
|
|
|
采购订单
|
|
"""
|
|
queryset = PuOrder.objects.all()
|
|
serializer_class = PuOrderSerializer
|
|
filterset_class = PuOrderFilter
|
|
search_fields = ['number', 'supplier__name', 'item_puorder__material__name', 'item_puorder__material__specification', 'item_puorder__material__model']
|
|
select_related_fields = ['create_by', 'update_by', 'supplier']
|
|
|
|
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.submit'}, 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.PUORDER_CREATE:
|
|
raise ParseError('采购计划状态异常')
|
|
puorder.submit_time = timezone.now()
|
|
puorder.submit_user = user
|
|
puorder.state = PuOrder.PUORDER_SUBMITED
|
|
puorder.save()
|
|
PumService.change_puplan_state_when_puorder_sumbit(puorder)
|
|
return Response()
|
|
|
|
|
|
class PuOrderItemViewSet(CustomModelViewSet):
|
|
"""
|
|
list: 采购订单明细
|
|
|
|
采购订单明细
|
|
"""
|
|
perms_map = {'get': '*', 'post': 'pu_order.update', 'put': 'pu_order.update', 'delete': 'pu_order.update'}
|
|
queryset = PuOrderItem.objects.all()
|
|
serializer_class = PuOrderItemSerializer
|
|
filterset_fields = ['material', 'pu_order']
|
|
ordering = ['create_time']
|
|
|
|
def perform_destroy(self, instance):
|
|
pu_order = instance.pu_order
|
|
if pu_order.state != PuOrder.PUORDER_CREATE:
|
|
raise ParseError('采购订单非创建中不可删除')
|
|
instance.delete()
|
|
PumService.cal_pu_order_total_price(pu_order)
|
|
|
|
@action(methods=['post'], detail=False, perms_map={'post': 'pu_order.update'}, 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('该采购订单不可用')
|
|
for item in vdata['pu_planitems']:
|
|
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,
|
|
'unit_price': item.unit_price,
|
|
'total_price': item.total_price
|
|
}
|
|
)
|
|
if not is_created:
|
|
puorderitem.count = puorderitem.count + item.need_count
|
|
if item.total_price:
|
|
puorderitem.total_price = puorderitem.total_price if puorderitem.total_price else 0 + item.total_price
|
|
puorderitem.save()
|
|
if puorder.delivery_date is None:
|
|
puorder.delivery_date = item.need_date
|
|
elif item.need_date < puorder.delivery_date:
|
|
puorder.delivery_date = item.need_date
|
|
puorder.save()
|
|
item.pu_order = puorder
|
|
item.save()
|
|
return Response()
|