jiaweiqi 3 年之前
父节点
当前提交
0da8a92d2a

+ 10 - 17
apps/activity/filters.py

@@ -38,29 +38,22 @@ class MemberCouponFilter(django_filters.FilterSet):
     coupon_name = django_filters.CharFilter(field_name='coupon__name', lookup_expr='icontains')
     activity_name = django_filters.CharFilter(field_name='activity__title', lookup_expr='icontains')
 
-    not_used = django_filters.CharFilter(method='find_not_used')
-    used = django_filters.CharFilter(method='find_used')
-    overdue = django_filters.CharFilter(method='find_overdue')
+    status = django_filters.CharFilter(method='find_coupon_by_status')
 
     class Meta:
         model = MemberCoupon
         fields = '__all__'
 
-    def find_not_used(self, queryset, *args):
+    def find_coupon_by_status(self, queryset, *args):
         if args[1]:
-            now = datetime.datetime.date(timezone.now())
-            queryset = queryset.filter(write_off=False, end_date__gt=now)
-        return queryset
-
-    def find_used(self, queryset, *args):
-        if args[1]:
-            queryset = queryset.filter(write_off=True)
-        return queryset
-
-    def find_overdue(self, queryset, *args):
-        if args[1]:
-            now = datetime.datetime.date(timezone.now())
-            queryset = queryset.filter(write_off=False, end_date__lt=now)
+            if args[1] == '1':#待使用
+                now = datetime.datetime.date(timezone.now())
+                queryset = queryset.filter(write_off=False, end_date__gt=now)
+            elif args[1] == '2':#已使用
+                queryset = queryset.filter(write_off=True)
+            elif args[1] == '3':#已过期
+                now = datetime.datetime.date(timezone.now())
+                queryset = queryset.filter(write_off=False, end_date__lt=now)
         return queryset
 
 

+ 22 - 5
apps/activity/models.py

@@ -29,11 +29,11 @@ class Activity(models.Model):
     delete = models.BooleanField(verbose_name=u"删除", default=False)
 
     @staticmethod
-    def getById1(id):
+    def getById(id):
         try:
             id = int(id)
         except:
-            raise CustomError(u'无效的活动')
+            raise CustomError(u'无效的活动Id')
         instance = Activity.objects.filter(pk=id).first()
         if not instance:
             raise CustomError(u'未找到相应的活动')
@@ -114,9 +114,7 @@ class Pay(models.Model):
         self.save()
         order = Order.objects.filter(pay=self).first()
         if order:
-            order.status = Order.FINISH
-            order.amount = self.amount
-            order.save()
+            order.orderPayConfirm(self.amount)
 
     @staticmethod
     def getByNo(no):
@@ -202,6 +200,25 @@ class Order(models.Model):
         self.save()
         return data
 
+    def orderPayConfirm(self, amount):
+        self.status = Order.FINISH
+        self.amount = amount
+        self.save()
+        coupons = ActivityCoupon.objects.filter(activity=self.activity, coupon__enabled=True)
+        now = datetime.datetime.date(timezone.now())
+        for item in coupons:
+            if item.off_type == Coupon.FIXED_DATE:
+                end_date = item.end_date
+            else:
+                end_date = now + datetime.timedelta(days=item.end_days)
+            MemberCoupon.objects.create(
+                activity=self.activity,
+                member=self.member,
+                coupon=item,
+                receive_date=now,
+                end_date=end_date
+            )
+
 
 class Coupon(models.Model):
     FIXED_DATE = 0

+ 1 - 0
apps/customer/activity/urls.py

@@ -6,5 +6,6 @@ from .views import *
 
 urlpatterns = [
     url(r'^detail/$', ActivityDetailView.as_view()),
+    url(r'^poster/$', ActivityPosterView.as_view()),
 ]
 

+ 29 - 0
apps/customer/activity/views.py

@@ -1,15 +1,20 @@
 # coding=utf-8
 
+import traceback
+
 from rest_framework import generics
+from rest_framework.views import APIView
 
 from django.conf import settings
 
 from util import response_ok, response_error
 from util.wx.wechat import WeChat
+from util.permission import IsCustomerUser
 from util.exceptions import CustomError
 
 from apps.customer.activity.serializers import ActivitySerializer
 from apps.activity.models import Activity
+from apps.WechatApplet.models import WechatApplet
 
 
 class ActivityDetailView(generics.RetrieveAPIView):
@@ -25,3 +30,27 @@ class ActivityDetailView(generics.RetrieveAPIView):
             raise CustomError(u'未找到相应活动信息!')
         serializer = self.get_serializer(instance)
         return response_ok(serializer.data)
+
+
+
+class ActivityPosterView(APIView):
+    '''必须登录才能生成海报'''
+    permission_classes = [IsCustomerUser, ]
+
+    def get(self, request):
+        appid = request.GET.get('appid', None)
+        activity_id = request.GET.get('activity_id', None)
+
+        try:
+            app = WechatApplet.getByAppid(appid)
+            activity = Activity.getById(activity_id)
+            wxCode = app.generateActivityCode(request.customer.id, activity.id)
+            serializer = ActivitySerializer(activity)
+            data = serializer.data
+            data['wxCode'] = settings.MEDIA_URL + wxCode
+            return response_ok(data)
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            traceback.print_exc()
+            return response_error(str(e))

+ 3 - 1
apps/customer/coupon/serializers.py

@@ -5,7 +5,9 @@ from apps.activity.models import MemberCoupon
 
 
 class MemberCouponSerializer(serializers.ModelSerializer):
+    activity_name = serializers.CharField(source='activity.title', read_only=True)
+    coupon_name = serializers.CharField(source='coupon.name', read_only=True)
 
     class Meta:
         model = MemberCoupon
-        fields = '__all__'
+        fields = ('activity_name', 'coupon_name', 'receive_date', 'end_date', )

+ 1 - 1
apps/customer/coupon/urls.py

@@ -5,6 +5,6 @@ from django.conf.urls import url
 from .views import *
 
 urlpatterns = [
-    url(r'^coupon/$', CouponListView.as_view()),
+    url(r'', CouponListView.as_view()),
 ]
 

+ 0 - 2
apps/customer/coupon/views.py

@@ -8,8 +8,6 @@ from apps.activity.models import MemberCoupon
 from apps.activity.filters import MemberCouponFilter
 
 
-
-
 class CouponListView(generics.ListAPIView):
     '''
     小程序显示我的卡券--显示用户所有优惠券信息

+ 3 - 4
apps/customer/tool.py

@@ -18,9 +18,8 @@ class WechatHandel(object):
     @staticmethod
     def login(code, appid, activity_id):
         app = WechatApplet.getByAppid(appid)
-        # 还有过期的活动还显示不?
         if activity_id:
-            activity = Activity.objects.filter(id=activity_id, enabled=True, delete=False).first()
+            activity = Activity.objects.filter(id=activity_id).first()
             if not activity:
                 activity = Activity.objects.filter().order_by('-create_time').first()
         else:
@@ -41,8 +40,8 @@ class WechatHandel(object):
 
     @staticmethod
     def bindWechat(appid, openid, phoneEncryptedData, phoneIv, activity_id):
-        app = WechatApplet.getByAppid(appid)
-        activity = Activity.objects.filter(id=activity_id, enabled=True, delete=False).first()
+        WechatApplet.getByAppid(appid)
+        activity = Activity.objects.filter(id=activity_id).first()
         if not activity:
             raise CustomError(u'未找到相应的活动')
 

+ 1 - 0
apps/customer/urls.py

@@ -4,6 +4,7 @@ from apps.customer.views import *
 urlpatterns = [
     url(r'^code2Session/$', WxLoginView.as_view()),  # 自动登录
     url(r'^wxbind/$', WxBindView.as_view()),         # 微信快捷登录
+    url(r'^setUserInfo/$', SetUserInfoView.as_view()),         # 微信快捷登录
     url(r'^token/refresh/', CustomerRefreshTokenView),
     url(r'^token/verify/', CustomerVerifyTokenView),
 

+ 43 - 0
apps/customer/views.py

@@ -1,14 +1,22 @@
 # coding=utf-8
 
+import traceback
+
 from rest_framework.views import APIView
 from rest_framework_jwt.views import VerifyJSONWebToken,RefreshJSONWebToken
 from rest_framework.serializers import ValidationError
 
 from util import response_error, response_ok
+from util.exceptions import CustomError
+from util.permission import IsCustomerUser
+from util.wx.WXBizDataCrypt import WXBizDataCrypt
 
 from django.contrib.auth import get_user_model
+from django.db import transaction
 
 from apps.customer.serializers import WechatLoginSerializer, WechatBindSerializer
+from apps.activity.models import Activity
+from apps.customer.models import Customer, CustomerWechat
 
 User = get_user_model()
 
@@ -35,6 +43,41 @@ class WxBindView(APIView):
             return response_error('参数错误')
 
 
+class SetUserInfoView(APIView):
+    permission_classes = [IsCustomerUser, ]
+
+    def post(self, request, *args, **kwargs):
+        appid = request.POST.get('appid')
+        openid = request.POST.get('openid')
+        encryptedData = request.POST.get('encryptedData')
+        iv = request.POST.get('iv')
+        try:
+            customer = request.customer
+            customer_wechat = CustomerWechat.objects.filter(openid=openid, customer=customer).first()
+            if not customer_wechat:
+                raise CustomError(u'未找到相应的微信客户!')
+
+            if customer_wechat.customer and customer_wechat.customer.id != customer.id:
+                raise CustomError(u'该微信已同步其他客户!')
+            if not customer_wechat.customer:
+                customer_wechat.customer = customer
+                customer_wechat.save()
+            pc = WXBizDataCrypt(appid, customer_wechat.session_key)
+            result = pc.decrypt(encryptedData, iv)
+            with transaction.atomic():
+                if customer.name == customer.tel:
+                    customer.name = result['nickName']
+                customer.gender = result['gender']
+                customer.face = result['avatarUrl']
+                customer.save()
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            traceback.print_exc()
+            return response_error(u'保存失败!')
+        return response_ok({'face':customer.face,'name':customer.name})
+
+
 class CustomerRefreshTokenView(RefreshJSONWebToken):
     def post(self, request, *args, **kwargs):
         try:

+ 6 - 3
util/wx/wechat.py

@@ -274,9 +274,12 @@ class WeChat(object):
     def getActivityCode(access_token, page, customer_id, activity_id):
         '''获取活动二维码'''
         url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={}'.format(access_token)
-        data = {"scene": "customer_id={}&activity_id={}".format(customer_id, activity_id),
-                "line_color": {"r": 43, "g": 162, "b": 69},  # 自定义颜色
-                "is_hyaline": True,}
+        data = {
+            "scene": "customer_id={}&activity_id={}".format(customer_id, activity_id),
+            "page": page,
+            "line_color": {"r": 43, "g": 162, "b": 69},  # 自定义颜色
+            "is_hyaline": True,
+        }
         result = requests.post(url, json=data)
         upload_path = PathAndRename("activiytCode/")
         filename = "{}{}_{}.png".format(upload_path.path, activity_id, customer_id)