123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- # coding=utf-8
- from django.db import transaction
- from django.utils import timezone
- from django.db.models import Q
- from rest_framework.decorators import action
- from rest_framework.views import APIView
- from rest_framework import generics
- from utils import response_ok
- from utils.permission import IsEmployee
- from utils.exceptions import CustomError
- from utils.custom_modelviewset import CustomModelViewSet
- from apps.log.models import BizLog
- from apps.order.models import Order
- from apps.order.filters import OrderFilter
- from apps.rebate.models import PointRebate, CashRebate, TransferCashRebate, TransferCashRebateDetail
- from apps.rebate.filters import TransferCashRebateFilter, TransferCashRebateDetailFilter
- from apps.rebate.serializers import OrderRebateSerializer, CashRebateSerializer, PointRebateSerializer, TransferCashRebateSerializer, TransferCashRebateDetailSerializer
- from apps.rebate.bussiness import CustomerRebateTransfer, transfer_detail_refresh, transfer_refresh
- class OrderRebateViewSet(CustomModelViewSet):
- permission_classes = [IsEmployee, ]
- queryset = Order.objects.filter(status__in=[Order.WAIT_DISPATCH, Order.CONFIRM_DISPATCH])
- serializer_class = OrderRebateSerializer
- def filter_queryset(self, queryset):
- order_list = []
- p_order = PointRebate.objects.filter().values_list('order_id', flat=True)
- for item in p_order:
- order_list.append(item)
- c_order = CashRebate.objects.filter().values_list('order_id', flat=True)
- for item in c_order:
- order_list.append(item)
- order_list = list(set(order_list))
- queryset = queryset.filter(id__in=order_list)
- f = OrderFilter(self.request.GET, queryset=queryset)
- return f.qs
- @action(methods=['get'], detail=True)
- def cash_rebate(self, request, pk):
- '''
- 现金返利明细
- :return:
- '''
- instance = self.get_object()
- rows = CashRebate.objects.filter(order=instance)
- serializer = CashRebateSerializer(rows, many=True)
- return response_ok(serializer.data)
- @action(methods=['get'], detail=True)
- def point_rebate(self, request, pk):
- '''积分返利明细'''
- instance = self.get_object()
- rows = PointRebate.objects.filter(order=instance)
- serializer = PointRebateSerializer(rows, many=True)
- return response_ok(serializer.data)
- @action(methods=['post'], detail=True)
- def transfer_rebate(self, request, pk):
- '''现金返利转账申请'''
- instance = self.get_object()
- crt = CustomerRebateTransfer(instance)
- with transaction.atomic():
- crt.transfer_rebate()
- BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'申请订单[{}]现金返利转账'.format(instance.no), )
- return response_ok()
- class TransferCashRebateViewSet(CustomModelViewSet):
- permission_classes = [IsEmployee, ]
- queryset = TransferCashRebate.objects.filter()
- serializer_class = TransferCashRebateSerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter()
- f = TransferCashRebateFilter(self.request.GET, queryset=queryset)
- return f.qs
- def list(self, request, *args, **kwargs):
- '''查看订单转账记录 同时刷新该转账的状态 刷新这个订单的批次单在处理中的记录 刷新他们的状态 一般一个订单只有一个批次单在处理中'''
- queryset = self.filter_queryset(self.get_queryset())
- refresh = queryset.filter(~Q(transfer_status__in=[TransferCashRebate.DEFAULT, TransferCashRebate.FINISHED, TransferCashRebate.CLOSED]))
- for item in refresh:
- with transaction.atomic():
- transfer_refresh(item)
- page = self.paginate_queryset(queryset)
- if page is not None:
- serializer = self.get_serializer(page, many=True)
- return self.get_paginated_response(serializer.data)
- serializer = self.get_serializer(queryset, many=True)
- return response_ok(serializer.data)
- @action(methods=['post'], detail=True)
- def apply_again(self, request, pk):
- instance = self.get_object()
- if instance.transfer_status != TransferCashRebate.DEFAULT:
- return
- # 再次申请转账 但是不需要创建转账表
- return response_ok()
- class TransferCashRebateDetailViewSet(CustomModelViewSet):
- permission_classes = [IsEmployee, ]
- queryset = TransferCashRebateDetail.objects.filter()
- serializer_class = TransferCashRebateDetailSerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter()
- f = TransferCashRebateDetailFilter(self.request.GET, queryset=queryset)
- return f.qs
- def list(self, request, *args, **kwargs):
- queryset = self.filter_queryset(self.get_queryset())
- refresh = queryset.filter(status=TransferCashRebateDetail.PENDING)
- for item in refresh:
- # 微信支付明细单号查询明细单
- with transaction.atomic():
- transfer_detail_refresh(item)
- page = self.paginate_queryset(queryset)
- if page is not None:
- serializer = self.get_serializer(page, many=True)
- return self.get_paginated_response(serializer.data)
- serializer = self.get_serializer(queryset, many=True)
- return response_ok(serializer.data)
- @action(methods=['post'], detail=True)
- def apply_again(self, request, pk):
- instance = self.get_object()
- if instance.status != TransferCashRebateDetail.FAIL:
- raise CustomError(u'该转账明细未失败,禁止再次申请转账!')
- # 失败的明细重新申请转账 创建新的转账批次和转账批次明细
- order = instance.main.order
- crt = CustomerRebateTransfer(order)
- with transaction.atomic():
- crt.transfer_rebate(detail=instance)
- BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'转账明细[{}]转账失败,重新申请转账!'.format(instance.no), )
- return response_ok()
|