views.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. # coding=utf-8
  2. import traceback
  3. from django.db.models import Sum, F
  4. from rest_framework.decorators import action
  5. from rest_framework.views import APIView
  6. from utils.file_operation import attachment_save
  7. from django.db import transaction
  8. from django.db.models import Q
  9. from utils.custom_modelviewset import CustomModelViewSet
  10. from .serializers import *
  11. from .filters import *
  12. from .resources import *
  13. from apps.log.models import BizLog
  14. from apps.base import Formater
  15. from utils import response_ok, response_error
  16. from utils.permission import isLogin
  17. from apps.order.models import Order
  18. from apps.WeChatResponse import WechatAppletPay, WeChatResponse
  19. from django.contrib.auth import get_user_model
  20. User = get_user_model()
  21. class OrderViewSet(CustomModelViewSet):
  22. permission_classes = [isLogin, ]
  23. queryset = Order.objects.filter()
  24. serializer_class = OrderSerializer
  25. def list(self, request, *args, **kwargs):
  26. # 底栏合计
  27. export = request.GET.get('export')
  28. queryset = self.filter_queryset(self.get_queryset())
  29. if export:
  30. queryset = queryset.filter(status=Order.FINISH).order_by('-student__classes_id',
  31. '-student__classes__grade_id')
  32. export_data = OrderResource().export(queryset)
  33. filename = attachment_save(export_data, '用户订单{}'.format(timezone.now().date()))
  34. return response_ok({'filename': filename})
  35. total = queryset.aggregate(total_amount=Sum('total_amount'), coupon_deduction=Sum('coupon_deduction'), actual_amount=Sum('actual_amount'))
  36. totalRow = {'totalRow':1,
  37. 'total_amount': Formater.formatPriceShow(total['total_amount']),
  38. 'coupon_deduction':Formater.formatPriceShow(total['coupon_deduction']),
  39. 'actual_amount':Formater.formatPriceShow(total['actual_amount'],)}
  40. page = self.paginate_queryset(queryset)
  41. if page is not None:
  42. serializer = self.get_serializer(page, many=True)
  43. data = serializer.data
  44. if len(data) > 0:
  45. data.append(totalRow)
  46. return self.get_paginated_response(data)
  47. serializer = self.get_serializer(queryset, many=True)
  48. return response_ok(serializer.data)
  49. def filter_queryset(self, queryset):
  50. queryset = queryset.filter()
  51. if self.request.user.type == User.CUSTOMER:
  52. queryset = queryset.filter(create_user=self.request.user)
  53. else:
  54. queryset = queryset.filter(student__school_id__in=self.request.user.get_manager_school())
  55. f = OrderFilter(self.request.GET, queryset=queryset)
  56. return f.qs
  57. def create(self, request, *args, **kwargs):
  58. commodity_id = request.POST.get('commodity')
  59. openid = request.POST.get('openid')
  60. appid = request.POST.get('appid')
  61. balance = request.POST.get('balance')
  62. try:
  63. # if request.user.id != 17 and request.user.id != 18:
  64. # raise CustomError(u'系统升级中,请稍后再试!')
  65. commodity = Commodity.objects.filter(id=commodity_id, status=settings.ONLINE).first()
  66. if not commodity:
  67. raise CustomError(u'当前商品信息有误,请退出重试!')
  68. with transaction.atomic():
  69. serializer = self.get_serializer(data=request.data)
  70. if serializer.is_valid(raise_exception=True):
  71. instance = serializer.save()
  72. instance.name = commodity.name
  73. instance.price = commodity.price
  74. instance.total_amount = commodity.amount
  75. actual_amount = commodity.amount
  76. data = ''
  77. if actual_amount:
  78. # 小程序在线支付
  79. pay = Pay.wechatAppPay(self.request.user, actual_amount, Pay.CUSTOMER)
  80. wechatpay = WechatAppletPay(appid)
  81. data = wechatpay.weChatUnifiedOrder(openid, pay.pay_no,
  82. Formater.formatPriceShow(actual_amount))
  83. instance.pay = pay
  84. instance.save()
  85. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  86. u'添加订单[%s],id=%d' % (instance.no, instance.id), request.data)
  87. return response_ok(data)
  88. except CustomError as e:
  89. return response_error(e.get_error_msg())
  90. except Exception as e:
  91. import traceback
  92. traceback.print_exc()
  93. return response_error(str(e))
  94. @action(methods=['post'], detail=True)
  95. def pay_order(self, request, pk):
  96. # 待付款订单付款
  97. openid = request.POST.get('openid')
  98. appid = request.POST.get('appid')
  99. data = {}
  100. try:
  101. instance = self.get_object()
  102. with transaction.atomic():
  103. total_amount = instance.total_amount
  104. if instance.status != Order.WAIT_PAY:
  105. raise CustomError('订单非待付款状态,禁止付款!')
  106. if instance.pay:
  107. pay_no = instance.pay.pay_no
  108. # 先查询订单状态
  109. checkRexponse = WeChatResponse(appid)
  110. total_fee = checkRexponse.orderquery(pay_no)
  111. if int(total_fee) == int(total_amount):
  112. wechatpay = WechatAppletPay(appid)
  113. data = wechatpay.weChatUnifiedOrder(openid, pay_no,
  114. Formater.formatPriceShow(total_amount))
  115. return response_ok(data)
  116. # 支付金额变动后,关闭原订单,重新发起支付
  117. instance.pay.payClosed()
  118. pay = Pay.wechatAppPay(self.request.user, total_amount)
  119. wechatpay = WechatAppletPay(appid)
  120. data = wechatpay.weChatUnifiedOrder(openid, pay.pay_no,
  121. Formater.formatPriceShow(total_amount))
  122. instance.pay = pay
  123. instance.save()
  124. return response_ok(data)
  125. except CustomError as e:
  126. return response_error(e.get_error_msg())
  127. except Exception as e:
  128. return response_error(str(e))
  129. class ExportOrderDictView(APIView):
  130. permission_classes = [isLogin]
  131. def get(self, request):
  132. queryset = Order.objects.filter(status=Order.FINISH).order_by('-student__classes_id','-student__classes__grade_id')
  133. export_data = OrderResource().export(queryset)
  134. filename = attachment_save(export_data,'用户订单{}'.format(timezone.now().date()))
  135. return response_ok({'filename': filename})
  136. class ShoppingCartViewSet(CustomModelViewSet):
  137. permission_classes = [isLogin]
  138. queryset = ShoppingCart.objects.filter()
  139. serializer_class = ShoppingCartSerializer
  140. def filter_queryset(self, queryset):
  141. queryset = queryset.filter(create_user=self.request.user)
  142. return queryset
  143. @action(methods=['post'], detail=True)
  144. def modify_quantity(self, request, pk):
  145. quantity = self.request.POST.get('quantity')
  146. try:
  147. with transaction.atomic():
  148. instance = ShoppingCart.objects.filter(id=pk, create_user=self.request.user).first()
  149. if instance:
  150. instance.quantity = quantity
  151. instance.save()
  152. return response_ok()
  153. except CustomError as e:
  154. return response_error(e.get_error_msg())
  155. except Exception as e:
  156. traceback.print_exc()
  157. return response_error(str(e))
  158. @action(methods=['post'], detail=False)
  159. def del_shopping_carts(self, request):
  160. item = request.POST.get('ids').split(',')
  161. try:
  162. with transaction.atomic():
  163. ShoppingCart.objects.filter(id__in=item, create_user=self.request.user).delete()
  164. return response_ok()
  165. except CustomError as e:
  166. return response_error(e.get_error_msg())
  167. except Exception as e:
  168. traceback.print_exc()
  169. return response_error(str(e))