factory/apps/sam/views.py

139 lines
4.6 KiB
Python

from django.shortcuts import render
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.sam.models import Customer, Contract, Order, OrderItem, ContractRecord
from apps.sam.serializers import CustomerSerializer, ContractSerializer, OrderSerializer, OrderItemSerializer, ContractRecordSerializer
from rest_framework.exceptions import ParseError
from rest_framework.mixins import ListModelMixin, CreateModelMixin, DestroyModelMixin
from apps.utils.mixins import BulkCreateModelMixin
from rest_framework.decorators import action
from django.db import transaction
from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied
from django.utils import timezone
from rest_framework.response import Response
from .filters import OrderItemFilter
# Create your views here.
class CustomerViewSet(CustomModelViewSet):
"""
list: 客户信息
客户信息
"""
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
search_fields = ['name', 'contact']
def perform_destroy(self, instance):
if Contract.objects.filter(customer=instance).exists():
raise ParseError('该客户存在合同不可删除')
instance.delete()
class ContractViewSet(CustomModelViewSet):
"""
list: 合同信息
合同信息
"""
queryset = Contract.objects.all()
serializer_class = ContractSerializer
select_related_fields = ['customer', 'create_by']
search_fields = ['name', 'number']
filterset_fields = ['customer']
def perform_destroy(self, instance):
if Order.objects.filter(contract=instance).exists():
raise ParseError('该合同存在订单不可删除')
instance.delete()
class OrderViewSet(CustomModelViewSet):
"""
list: 订单信息
订单信息
"""
queryset = Order.objects.all()
serializer_class = OrderSerializer
select_related_fields = ['contract', 'customer']
search_fields = ['number', 'contract__name', 'contract__number', 'customer__name', 'item_order__material__name',
'item_order__material__specification', 'item_order__material__model']
filterset_fields = {
"contract": ["exact"],
"customer": ["exact"],
"state": ["exact", "in"],
}
def perform_destroy(self, instance):
if instance.state != Order.ORDER_CREATE:
raise ParseError('订单非创建中不可删除')
instance.delete()
@action(methods=['post'], detail=True, perms_map={'post': 'order.update'}, serializer_class=serializers.Serializer)
@transaction.atomic
def submit(self, request, *args, **kwargs):
"""提交订单
提交订单
"""
order = self.get_object()
user = request.user
if order.create_by != user:
raise PermissionDenied('非创建人不可提交')
if order.state != Order.ORDER_CREATE:
raise ParseError('订单非创建中')
order.submit_time = timezone.now()
order.state = Order.ORDER_SUBMITED
order.save()
return Response()
class OrderItemViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet):
"""
list: 订单明细
订单明细
"""
perms_map = {'get': '*', 'post': 'order.update', 'delete': 'order.update'}
queryset = OrderItem.objects.all()
serializer_class = OrderItemSerializer
select_related_fields = ['order', 'material']
filterset_class = OrderItemFilter
ordering = ['create_time']
def perform_destroy(self, instance):
if instance.order.state != Order.ORDER_CREATE:
raise ParseError('该订单状态下不可删除')
return super().perform_destroy(instance)
class ContractRecordViewSet(CustomModelViewSet):
"""
list: 销售合同到款流水
销售合同到款流水
"""
perms_map = {
'get': '*',
'post': 'contract.update',
'put': 'contract.update',
'patch': 'contract.update',
'delete': 'contract.update',
}
queryset = ContractRecord.objects.all()
serializer_class = ContractRecordSerializer
search_fields = ['contract__number', 'contract__name', 'voucher_no', 'remark']
select_related_fields = ['contract', 'contract__customer', 'create_by', 'update_by']
filterset_fields = {
'contract': ['exact'],
'stage_type': ['exact', 'in'],
'pay_method': ['exact', 'in'],
}
def perform_destroy(self, instance):
if instance.contract.status == Contract.STATUS_TERMINATED:
raise ParseError('合同已终止,不可删除到款流水')
instance.delete()