views.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # coding=utf-8
  2. import json
  3. from django.db.models import Sum, F
  4. from django.db import transaction
  5. from django.db.models import Q
  6. from rest_framework.views import APIView
  7. from utils.custom_modelviewset import CustomModelViewSet
  8. from .serializers import *
  9. from .filters import *
  10. from apps.log.models import BizLog
  11. from apps.base import Formater
  12. from utils import response_ok, response_error
  13. from utils.permission import isLogin
  14. from apps.order.models import Order
  15. from apps.WeChatResponse import WechatAppletPay
  16. from apps.option.models import Balance
  17. from django.contrib.auth import get_user_model
  18. User = get_user_model()
  19. class PackageView(APIView):
  20. def get(self, request):
  21. data = []
  22. queryset = Package.objects.filter()
  23. for row in queryset:
  24. item = {
  25. 'id':row.id,
  26. 'amount':Formater.formatPriceShow(row.amount),
  27. 'give_amount':Formater.formatPriceShow(row.give_amount),
  28. }
  29. data.append(item)
  30. return response_ok(data)
  31. class PackageViewSet(CustomModelViewSet):
  32. permission_classes = [isLogin, ]
  33. queryset = Package.objects.filter()
  34. serializer_class = PackageSerializer
  35. def filter_queryset(self, queryset):
  36. f = PackageFilter(self.request.GET, queryset=queryset)
  37. return f.qs
  38. class OrderViewSet(CustomModelViewSet):
  39. permission_classes = [isLogin, ]
  40. queryset = Order.objects.filter()
  41. serializer_class = OrderSerializer
  42. def list(self, request, *args, **kwargs):
  43. # 底栏合计
  44. queryset = self.filter_queryset(self.get_queryset())
  45. total = queryset.aggregate(total_amount=Sum('total_amount'), balance_deduction=Sum('balance_deduction'),
  46. actual_amount=Sum('actual_amount'))
  47. totalRow = {'totalRow': 1,
  48. 'total_amount': Formater.formatPriceShow(total['total_amount']),
  49. 'balance_deduction': Formater.formatPriceShow(total['balance_deduction']),
  50. 'actual_amount': Formater.formatPriceShow(total['actual_amount'], )}
  51. page = self.paginate_queryset(queryset)
  52. if page is not None:
  53. serializer = self.get_serializer(page, many=True)
  54. data = serializer.data
  55. if len(data) > 0:
  56. data.append(totalRow)
  57. return self.get_paginated_response(data)
  58. serializer = self.get_serializer(queryset, many=True)
  59. return response_ok(serializer.data)
  60. def filter_queryset(self, queryset):
  61. queryset = queryset.filter()
  62. f = OrderFilter(self.request.GET, queryset=queryset)
  63. return f.qs
  64. def create(self, request, *args, **kwargs):
  65. openid = request.POST.get('openid')
  66. appid = request.POST.get('appid')
  67. package = request.POST.get('package') or ''
  68. try:
  69. with transaction.atomic():
  70. serializer = self.get_serializer(data=request.data)
  71. if serializer.is_valid(raise_exception=True):
  72. instance = serializer.save()
  73. total_amount = instance.total_amount
  74. # 充值套餐
  75. if package:
  76. package = Package.objects.filter(id=package).first()
  77. if package:
  78. instance.package = package
  79. actual_amount = package.amount
  80. else:
  81. raise CustomError('套餐错误,请刷新重试!')
  82. else:
  83. # 余额抵扣
  84. balance = Balance.objects.filter(create_user=request.user).first()
  85. if balance and balance.balance > 0:
  86. if balance.balance >= total_amount:
  87. instance.balance_deduction = total_amount
  88. actual_amount = 0
  89. instance.status = Order.FINISH
  90. desc = '支付抵扣{}元'.format(Formater.formatPriceShow(total_amount))
  91. Balance.update_balance(instance.create_user, -instance.balance_deduction, desc)
  92. else:
  93. raise CustomError('余额不足,请充值!')
  94. else:
  95. raise CustomError('余额不足,请充值!')
  96. data = ''
  97. if actual_amount:
  98. # 小程序在线支付
  99. pay = Pay.wechatAppPay(self.request.user, actual_amount, Pay.CUSTOMER)
  100. wechatpay = WechatAppletPay(appid)
  101. data = wechatpay.weChatUnifiedOrder(openid, pay.pay_no,
  102. Formater.formatPriceShow(actual_amount))
  103. instance.pay = pay
  104. instance.save()
  105. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  106. u'添加订单[%s],id=%d' % (instance.no, instance.id), request.data)
  107. return response_ok(data)
  108. except CustomError as e:
  109. return response_error(e.get_error_msg())
  110. except Exception as e:
  111. import traceback
  112. traceback.print_exc()
  113. return response_error(str(e))