views.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.utils import timezone
  4. from django.db.models import Q
  5. from rest_framework.decorators import action
  6. from rest_framework.views import APIView
  7. from rest_framework import generics
  8. from utils import response_ok
  9. from utils.permission import IsEmployee
  10. from utils.exceptions import CustomError
  11. from utils.custom_modelviewset import CustomModelViewSet
  12. from apps.log.models import BizLog
  13. from apps.order.models import Order
  14. from apps.order.filters import OrderFilter
  15. from apps.rebate.models import PointRebate, CashRebate, TransferCashRebate, TransferCashRebateDetail, CashRebateLog
  16. from apps.rebate.filters import TransferCashRebateFilter, TransferCashRebateDetailFilter
  17. from apps.rebate.serializers import OrderRebateSerializer, CashRebateSerializer, PointRebateSerializer, TransferCashRebateSerializer, TransferCashRebateDetailSerializer
  18. from apps.rebate.bussiness import CustomerRebateTransfer, transfer_detail_refresh, transfer_refresh
  19. class OrderRebateViewSet(CustomModelViewSet):
  20. permission_classes = [IsEmployee, ]
  21. queryset = Order.objects.filter(status__in=[Order.WAIT_DISPATCH, Order.CONFIRM_DISPATCH])
  22. serializer_class = OrderRebateSerializer
  23. def filter_queryset(self, queryset):
  24. order_list = []
  25. p_order = PointRebate.objects.filter().values_list('order_id', flat=True)
  26. for item in p_order:
  27. order_list.append(item)
  28. c_order = CashRebate.objects.filter().values_list('order_id', flat=True)
  29. for item in c_order:
  30. order_list.append(item)
  31. order_list = list(set(order_list))
  32. queryset = queryset.filter(id__in=order_list)
  33. f = OrderFilter(self.request.GET, queryset=queryset)
  34. return f.qs
  35. @action(methods=['get'], detail=True)
  36. def cash_rebate(self, request, pk):
  37. '''
  38. 现金返利明细
  39. :return:
  40. '''
  41. instance = self.get_object()
  42. rows = CashRebate.objects.filter(order=instance)
  43. serializer = CashRebateSerializer(rows, many=True)
  44. return response_ok(serializer.data)
  45. @action(methods=['get'], detail=False)
  46. def cash_rebae_off(self, request):
  47. id = request.GET.get('id')
  48. try:
  49. id = int(id)
  50. except:
  51. raise CustomError(u'参数异常!')
  52. rebate = CashRebate.objects.filter(id=id).first()
  53. if not rebate:
  54. raise CustomError(u'未找到相应的返利')
  55. if rebate.status != CashRebate.DEFAULT:
  56. raise CustomError(u'该返利已申请转账,禁止手动核销!')
  57. with transaction.atomic():
  58. rebate.status = CashRebate.TRANSFERED
  59. rebate.save()
  60. CashRebateLog.addnew(rebate, off=True)
  61. BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'手动核销返利,id=%d' % rebate.id, )
  62. return response_ok()
  63. @action(methods=['get'], detail=True)
  64. def point_rebate(self, request, pk):
  65. '''积分返利明细'''
  66. instance = self.get_object()
  67. rows = PointRebate.objects.filter(order=instance)
  68. serializer = PointRebateSerializer(rows, many=True)
  69. return response_ok(serializer.data)
  70. @action(methods=['post'], detail=True)
  71. def transfer_rebate(self, request, pk):
  72. '''现金返利转账申请'''
  73. instance = self.get_object()
  74. crt = CustomerRebateTransfer(instance)
  75. with transaction.atomic():
  76. crt.transfer_rebate()
  77. BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'申请订单[{}]现金返利转账'.format(instance.no), )
  78. return response_ok()
  79. class TransferCashRebateViewSet(CustomModelViewSet):
  80. permission_classes = [IsEmployee, ]
  81. queryset = TransferCashRebate.objects.filter()
  82. serializer_class = TransferCashRebateSerializer
  83. def filter_queryset(self, queryset):
  84. queryset = queryset.filter()
  85. f = TransferCashRebateFilter(self.request.GET, queryset=queryset)
  86. return f.qs
  87. def list(self, request, *args, **kwargs):
  88. '''查看订单转账记录 同时刷新该转账的状态 刷新这个订单的批次单在处理中的记录 刷新他们的状态 一般一个订单只有一个批次单在处理中'''
  89. queryset = self.filter_queryset(self.get_queryset())
  90. refresh = queryset.filter(~Q(transfer_status__in=[TransferCashRebate.DEFAULT, TransferCashRebate.FINISHED, TransferCashRebate.CLOSED]))
  91. for item in refresh:
  92. with transaction.atomic():
  93. transfer_refresh(item)
  94. page = self.paginate_queryset(queryset)
  95. if page is not None:
  96. serializer = self.get_serializer(page, many=True)
  97. return self.get_paginated_response(serializer.data)
  98. serializer = self.get_serializer(queryset, many=True)
  99. return response_ok(serializer.data)
  100. class TransferCashRebateDetailViewSet(CustomModelViewSet):
  101. permission_classes = [IsEmployee, ]
  102. queryset = TransferCashRebateDetail.objects.filter()
  103. serializer_class = TransferCashRebateDetailSerializer
  104. def filter_queryset(self, queryset):
  105. queryset = queryset.filter()
  106. f = TransferCashRebateDetailFilter(self.request.GET, queryset=queryset)
  107. return f.qs
  108. def list(self, request, *args, **kwargs):
  109. queryset = self.filter_queryset(self.get_queryset())
  110. refresh = queryset.filter(status=TransferCashRebateDetail.PENDING)
  111. for item in refresh:
  112. # 微信支付明细单号查询明细单
  113. with transaction.atomic():
  114. transfer_detail_refresh(item)
  115. page = self.paginate_queryset(queryset)
  116. if page is not None:
  117. serializer = self.get_serializer(page, many=True)
  118. return self.get_paginated_response(serializer.data)
  119. serializer = self.get_serializer(queryset, many=True)
  120. return response_ok(serializer.data)
  121. @action(methods=['post'], detail=True)
  122. def apply_again(self, request, pk):
  123. instance = self.get_object()
  124. if instance.status != TransferCashRebateDetail.FAIL:
  125. raise CustomError(u'该转账明细未失败,禁止再次申请转账!')
  126. # 失败的明细重新申请转账 创建新的转账批次和转账批次明细
  127. order = instance.main.order
  128. crt = CustomerRebateTransfer(order)
  129. with transaction.atomic():
  130. crt.transfer_rebate(detail=instance)
  131. BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'转账明细[{}]转账失败,重新申请转账!'.format(instance.no), )
  132. return response_ok()