views.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # coding=utf-8
  2. import traceback
  3. from django.db import transaction
  4. from rest_framework import generics
  5. from rest_framework.exceptions import NotFound
  6. from rest_framework.views import APIView
  7. from rest_framework.viewsets import ModelViewSet
  8. from rest_framework.decorators import action
  9. from util import response_ok, response_error
  10. from util.wx.wechat import WeChat
  11. from util.permission import IsCustomerUser
  12. from util.exceptions import CustomError
  13. from apps.foundation.models import BizLog
  14. from apps.customer.order.serializers import OrderSerializer, ActivityOrderSerializer
  15. from apps.activity.models import Activity, Order, Pay
  16. from apps.activity.base import OrderUpdate
  17. from apps.WechatApplet.models import WechatApplet
  18. from apps.activity.filters import OrderFilter
  19. class OrderViewSet(ModelViewSet):
  20. permission_classes = [IsCustomerUser, ]
  21. queryset = Order.objects.filter(delete=False)
  22. serializer_class = OrderSerializer
  23. def filter_queryset(self, queryset):
  24. queryset = queryset.filter(member=self.request.customer)
  25. f = OrderFilter(self.request.GET, queryset=queryset)
  26. return f.qs
  27. def list(self, request, *args, **kwargs):
  28. try:
  29. # 获取订单前更新订单状态
  30. OrderUpdate.update_status()
  31. data = super(OrderViewSet, self).list(request)
  32. except NotFound:
  33. return response_ok([])
  34. return data
  35. def create(self, request, *args, **kwargs):
  36. try:
  37. with transaction.atomic():
  38. serializer = self.get_serializer(data=request.data)
  39. serializer.is_valid(raise_exception=True)
  40. serializer.save()
  41. instance = serializer.instance
  42. validated_data = serializer.validated_data
  43. if instance.amount == 0:
  44. instance.status = Order.FINISH
  45. instance.save()
  46. BizLog.objects.addnew(request.customer.user, BizLog.INSERT, u"添加商品订单,id=%d" % instance.id, validated_data)
  47. else:
  48. openid = request.POST.get('openid', None)
  49. if not openid:
  50. raise CustomError(u'未获取openid!')
  51. appid = request.POST.get('appid', None)
  52. app = WechatApplet.getByAppid(appid)
  53. profit_sharing = "N"
  54. if instance.rebate > 0 and instance.recommend_member:
  55. profit_sharing = "Y"
  56. pay, query_string = Pay.wechatPay(app, instance.branch, instance.member, instance.amount, openid, profit_sharing)
  57. instance.pay = pay
  58. instance.save()
  59. BizLog.objects.addnew(request.customer.user, BizLog.INSERT, u'添加商品订单,id=%d' % instance.id, validated_data)
  60. if query_string:
  61. return response_ok(query_string)
  62. except CustomError as e:
  63. return response_error(e.get_error_msg())
  64. except Exception as e:
  65. traceback.print_exc()
  66. return response_error(str(e))
  67. return response_ok()
  68. @action(methods=['post'], detail=True)
  69. def pay_order(self, request, pk):
  70. openid = request.POST.get('openid')
  71. appid = request.POST.get('appid')
  72. try:
  73. if not openid:
  74. raise CustomError(u'未获取openid!')
  75. app = WechatApplet.getByAppid(appid)
  76. order = Order.objects.filter(id=pk).first()
  77. if not order:
  78. raise CustomError(u'未找到相应的订单')
  79. order.activity.checkStatus()
  80. # 要不要设置一个时间 时间过了订单不能再支付 提示订单已过期 请重新下单 然后把订单状态改成失败
  81. with transaction.atomic():
  82. data = order.payOrder(openid, app)
  83. BizLog.objects.addnew(request.customer.user, BizLog.INSERT, u'支付订单,id=%d' % order.id, request.data)
  84. return response_ok(data)
  85. except CustomError as e:
  86. return response_error(e.get_error_msg())
  87. except Exception as e:
  88. traceback.print_exc()
  89. return response_error(str(e))
  90. @action(methods=['post'], detail=True)
  91. def del_order(self, request, pk):
  92. try:
  93. order = Order.objects.filter(id=pk).first()
  94. if not order:
  95. raise CustomError(u'未找到相应的订单!')
  96. if order.delete:
  97. raise CustomError(u'该订单已删除!')
  98. with transaction.atomic():
  99. order.delete = True
  100. order.save()
  101. BizLog.objects.addnew(request.customer.user, BizLog.DELETE, u'删除订单,id=%d' % order.id, request.data)
  102. return response_ok()
  103. except CustomError as e:
  104. return response_error(e.get_error_msg())
  105. except Exception as e:
  106. traceback.print_exc()
  107. return response_error(str(e))
  108. class ActivityOrderListView(generics.ListAPIView):
  109. '''
  110. 小程序显示已有人购买订单列表-- 查询这个活动的订单记录(删除的也显示)
  111. '''
  112. queryset = Order.objects.filter(status=Order.FINISH)
  113. serializer_class = ActivityOrderSerializer
  114. def filter_queryset(self, queryset):
  115. activity_id = self.request.GET.get('activity_id')
  116. activity = Activity.getById(activity_id)
  117. queryset = queryset.filter(activity=activity)
  118. f = OrderFilter(self.request.GET, queryset=queryset)
  119. return f.qs
  120. def list(self, request, *args, **kwargs):
  121. try:
  122. data = super(ActivityOrderListView, self).list(request)
  123. except NotFound:
  124. return response_ok([])
  125. return data