:art: Coupons

huangqimin 5 lat temu
rodzic
commit
75ab3f5097

+ 5 - 1
api/mch_views.py

@@ -402,8 +402,12 @@ def consumer_info_api(request):
402 402
         user.shots_num += 1
403 403
         if user.level < UserInfo.MEMBER_BLACK_GOLD:
404 404
             user.level += 1
405
+            # 发放会员权益
406
+            r.rpushjson({
407
+                'brand_id': brand.brand_id,
408
+                'user_id': user_id,
409
+            })
405 410
         user.save()
406
-        # TODO: 发放会员权益
407 411
 
408 412
     return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功')
409 413
 

+ 2 - 2
api/member_views.py

@@ -13,7 +13,7 @@ from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivity
13 13
                            MemberActivitySignupInfo, RightInfo)
14 14
 from utils.error.errno_utils import (MemberActivityStatusCode, MemberGoodStatusCode, MemberRightStatusCode,
15 15
                                      UserStatusCode)
16
-from utils.redis.rshot import get_shot_member_data
16
+from utils.redis.rshot import get_member_shot_data
17 17
 
18 18
 
19 19
 @logit
@@ -230,7 +230,7 @@ def integrals(request):
230 230
     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
231 231
 
232 232
     return response(200, data={
233
-        'shots_types': get_shot_member_data(),
233
+        'shots_types': get_member_shot_data(),
234 234
         'enable_photo_upvote_integral': True,
235 235
         'photo_upvote_integrals': {
236 236
             'headers': [u'排名', u'日', u'周', u'月'],

+ 74 - 0
commands/management/commands/membercoupon.py

@@ -0,0 +1,74 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import logging
4
+import time
5
+
6
+from django.db import transaction
7
+from django_six import CompatibilityBaseCommand, close_old_connections
8
+from TimeConvert import TimeConvert as tc
9
+
10
+from account.models import UserInfo
11
+from member.models import CouponInfo, RightInfo
12
+from utils.redis.connect import r
13
+from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST
14
+
15
+
16
+logger = logging.getLogger('console')
17
+
18
+
19
+class Command(CompatibilityBaseCommand):
20
+    def handle(self, *args, **options):
21
+
22
+        logger.info('Gis is dealing')
23
+
24
+        while True:
25
+            # r.rpushjson('TEMPLET_CMD_KEY', {
26
+            #     'brand_id': 'brand_id',
27
+            #     'user_id': 'user_id',
28
+            # })
29
+            k, v = r.blpopjson(MEMBER_SEND_COUPON_LIST, 60)
30
+            if v:
31
+
32
+                time.sleep(10)
33
+
34
+                close_old_connections()
35
+
36
+                logger.info(v)
37
+
38
+                brand_id = v.get('brand_id', 0)
39
+                user_id = v.get('user_id', 0)
40
+
41
+                with transaction.atomic():
42
+                    try:
43
+                        user = UserInfo.objects.get(user_id=user_id)
44
+                    except UserInfo.DoesNotExist:
45
+                        continue
46
+                    rights = RightInfo.objects.filter(is_send_coupon=True, status=True)
47
+                    for right in rights:
48
+                        if user.level == UserInfo.MEMBER_LRC:
49
+                            coupon_amount = right.coupon_level1_amount
50
+                        elif user.level == UserInfo.MEMBER_SILVER:
51
+                            coupon_amount = right.coupon_level2_amount
52
+                        elif user.level == UserInfo.MEMBER_SILVER:
53
+                            coupon_amount = right.coupon_level3_amount
54
+                        elif user.level == UserInfo.MEMBER_SILVER:
55
+                            coupon_amount = right.coupon_level4_amount
56
+                        else:
57
+                            coupon_amount = right.coupon_level5_amount
58
+                        for _ in xrange(right.coupon_num):
59
+                            CouponInfo.objects.create(
60
+                                user_id=user_id,
61
+                                coupon_valid_period=right.coupon_valid_period,
62
+                                coupon_amount=coupon_amount,
63
+                                coupon_detail=right.coupon_detail,
64
+                                active_at=tc.utc_datetime(),
65
+                                expire_at=tc.utc_datetime(days=365),
66
+                                right_id=right.right_id,
67
+                                right_type=right.right_type,
68
+                                icon=right.icon,
69
+                                title=right.title,
70
+                                subtitle=right.subtitle,
71
+                                detail=right.detail,
72
+                            )
73
+
74
+                close_old_connections()

+ 3 - 3
mch/admin.py

@@ -10,7 +10,7 @@ from pysnippets.strsnippets import strip
10 10
 
11 11
 from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo,
12 12
                         LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo, SaleclerkInfo)
13
-from utils.redis.rshot import update_shot_member_data
13
+from utils.redis.rshot import update_member_shot_data
14 14
 
15 15
 
16 16
 class AdministratorInfoAdmin(admin.ModelAdmin):
@@ -81,11 +81,11 @@ class ModelInfoAdmin(admin.ModelAdmin):
81 81
 
82 82
         obj.save()
83 83
 
84
-        update_shot_member_data()
84
+        update_member_shot_data()
85 85
 
86 86
     def delete_model(self, request, obj):
87 87
         obj.delete()
88
-        update_shot_member_data()
88
+        update_member_shot_data()
89 89
 
90 90
 
91 91
 class ModelImageInfoAdmin(admin.ModelAdmin):

+ 1 - 1
mch/models.py

@@ -242,7 +242,7 @@ class ModelInfo(BaseModelMixin):
242 242
     fulldata = admindata
243 243
 
244 244
     @property
245
-    def shot_member_data(self):
245
+    def member_shot_data(self):
246 246
         return {
247 247
             'shot_id': self.model_id,
248 248
             'shot_name': self.shot_member_name,

+ 12 - 11
member/admin.py

@@ -2,9 +2,9 @@
2 2
 
3 3
 from django.contrib import admin
4 4
 
5
-from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo,
6
-                           MemberActivitySignupInfo, MemberCouponInfo, RightInfo, ShotTypeInfo)
7
-from utils.redis.rshot import update_shot_member_data
5
+from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo,
6
+                           MemberActivitySignupInfo, RightInfo, ShotTypeInfo)
7
+from utils.redis.rshot import update_member_shot_data
8 8
 
9 9
 
10 10
 class GoodsInfoAdmin(admin.ModelAdmin):
@@ -27,7 +27,12 @@ class GoodsOrderInfoAdmin(admin.ModelAdmin):
27 27
 
28 28
 
29 29
 class RightInfoAdmin(admin.ModelAdmin):
30
-    list_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'status', 'created_at', 'updated_at')
30
+    list_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'is_send_coupon', 'coupon_valid_period', 'coupon_num', 'status', 'created_at', 'updated_at')
31
+    list_filter = ('right_type', 'is_send_coupon', 'status')
32
+
33
+
34
+class CouponInfoAdmin(admin.ModelAdmin):
35
+    list_display = ('coupon_id', 'user_id', 'coupon_valid_period', 'coupon_amount', 'coupon_detail', 'active_at', 'expire_at', 'right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'status', 'created_at', 'updated_at')
31 36
     list_filter = ('right_type', 'status')
32 37
 
33 38
 
@@ -36,11 +41,11 @@ class ShotTypeInfoAdmin(admin.ModelAdmin):
36 41
 
37 42
     def save_model(self, request, obj, form, change):
38 43
         obj.save()
39
-        update_shot_member_data()
44
+        update_member_shot_data()
40 45
 
41 46
     def delete_model(self, request, obj):
42 47
         obj.delete()
43
-        update_shot_member_data()
48
+        update_member_shot_data()
44 49
 
45 50
 
46 51
 class MemberActivityInfoAdmin(admin.ModelAdmin):
@@ -60,15 +65,11 @@ class MemberActivitySigninInfoAdmin(admin.ModelAdmin):
60 65
     list_display = ('signin_id', 'user_id', 'activity_id', 'title', 'status', 'created_at', 'updated_at')
61 66
 
62 67
 
63
-class MemberCouponInfoAdmin(admin.ModelAdmin):
64
-    list_display = ('coupon_id', 'user_id', 'coupon_type', 'coupon_start_at', 'coupon_expire_at', 'coupon_value', 'has_used', 'admin_id', 'used_at', 'status', 'created_at', 'updated_at')
65
-
66
-
67 68
 admin.site.register(GoodsInfo, GoodsInfoAdmin)
68 69
 admin.site.register(GoodsOrderInfo, GoodsOrderInfoAdmin)
69 70
 admin.site.register(RightInfo, RightInfoAdmin)
71
+admin.site.register(CouponInfo, CouponInfoAdmin)
70 72
 admin.site.register(ShotTypeInfo, ShotTypeInfoAdmin)
71 73
 admin.site.register(MemberActivityInfo, MemberActivityInfoAdmin)
72 74
 admin.site.register(MemberActivitySignupInfo, MemberActivitySignupInfoAdmin)
73 75
 admin.site.register(MemberActivitySigninInfo, MemberActivitySigninInfoAdmin)
74
-admin.site.register(MemberCouponInfo, MemberCouponInfoAdmin)

+ 76 - 0
member/migrations/0008_auto_20191212_1742.py

@@ -0,0 +1,76 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.26 on 2019-12-12 09:42
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+import simditor.fields
7
+
8
+
9
+class Migration(migrations.Migration):
10
+
11
+    dependencies = [
12
+        ('member', '0007_auto_20191212_0952'),
13
+    ]
14
+
15
+    operations = [
16
+        migrations.AddField(
17
+            model_name='couponinfo',
18
+            name='coupon_amount',
19
+            field=models.IntegerField(blank=True, default=0, help_text='\u5238\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_amount'),
20
+        ),
21
+        migrations.AddField(
22
+            model_name='couponinfo',
23
+            name='coupon_detail',
24
+            field=simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail'),
25
+        ),
26
+        migrations.AddField(
27
+            model_name='couponinfo',
28
+            name='coupon_valid_period',
29
+            field=models.IntegerField(default=0, help_text='\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period'),
30
+        ),
31
+        migrations.AddField(
32
+            model_name='rightinfo',
33
+            name='coupon_detail',
34
+            field=simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail'),
35
+        ),
36
+        migrations.AddField(
37
+            model_name='rightinfo',
38
+            name='coupon_level1_amount',
39
+            field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level1_amount'),
40
+        ),
41
+        migrations.AddField(
42
+            model_name='rightinfo',
43
+            name='coupon_level2_amount',
44
+            field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level2_amount'),
45
+        ),
46
+        migrations.AddField(
47
+            model_name='rightinfo',
48
+            name='coupon_level3_amount',
49
+            field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level3_amount'),
50
+        ),
51
+        migrations.AddField(
52
+            model_name='rightinfo',
53
+            name='coupon_level4_amount',
54
+            field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level4_amount'),
55
+        ),
56
+        migrations.AddField(
57
+            model_name='rightinfo',
58
+            name='coupon_level5_amount',
59
+            field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level5_amount'),
60
+        ),
61
+        migrations.AddField(
62
+            model_name='rightinfo',
63
+            name='coupon_num',
64
+            field=models.IntegerField(default=0, help_text='\u5238\u6bcf\u4f1a\u5458\u7ea7\u522b\u53d1\u653e\u5f20\u6570', verbose_name='coupon_num'),
65
+        ),
66
+        migrations.AddField(
67
+            model_name='rightinfo',
68
+            name='coupon_valid_period',
69
+            field=models.IntegerField(default=0, help_text='\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period'),
70
+        ),
71
+        migrations.AddField(
72
+            model_name='rightinfo',
73
+            name='is_send_coupon',
74
+            field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u53d1\u5238', verbose_name='is_send_coupon'),
75
+        ),
76
+    ]

+ 43 - 0
member/migrations/0009_auto_20191212_1749.py

@@ -0,0 +1,43 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.26 on 2019-12-12 09:49
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('member', '0008_auto_20191212_1742'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.RemoveField(
16
+            model_name='couponinfo',
17
+            name='level1',
18
+        ),
19
+        migrations.RemoveField(
20
+            model_name='couponinfo',
21
+            name='level2',
22
+        ),
23
+        migrations.RemoveField(
24
+            model_name='couponinfo',
25
+            name='level3',
26
+        ),
27
+        migrations.RemoveField(
28
+            model_name='couponinfo',
29
+            name='level4',
30
+        ),
31
+        migrations.RemoveField(
32
+            model_name='couponinfo',
33
+            name='level5',
34
+        ),
35
+        migrations.RemoveField(
36
+            model_name='couponinfo',
37
+            name='minlevel',
38
+        ),
39
+        migrations.RemoveField(
40
+            model_name='couponinfo',
41
+            name='position',
42
+        ),
43
+    ]

+ 105 - 0
member/migrations/0010_auto_20191212_1821.py

@@ -0,0 +1,105 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.26 on 2019-12-12 10:21
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('member', '0009_auto_20191212_1749'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='couponinfo',
17
+            name='brand_id',
18
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='couponinfo',
22
+            name='brand_name',
23
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
24
+        ),
25
+        migrations.AddField(
26
+            model_name='goodsinfo',
27
+            name='brand_id',
28
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
29
+        ),
30
+        migrations.AddField(
31
+            model_name='goodsinfo',
32
+            name='brand_name',
33
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
34
+        ),
35
+        migrations.AddField(
36
+            model_name='goodsorderinfo',
37
+            name='brand_id',
38
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
39
+        ),
40
+        migrations.AddField(
41
+            model_name='goodsorderinfo',
42
+            name='brand_name',
43
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
44
+        ),
45
+        migrations.AddField(
46
+            model_name='memberactivityinfo',
47
+            name='brand_id',
48
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
49
+        ),
50
+        migrations.AddField(
51
+            model_name='memberactivityinfo',
52
+            name='brand_name',
53
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
54
+        ),
55
+        migrations.AddField(
56
+            model_name='memberactivitysignininfo',
57
+            name='brand_id',
58
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
59
+        ),
60
+        migrations.AddField(
61
+            model_name='memberactivitysignininfo',
62
+            name='brand_name',
63
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
64
+        ),
65
+        migrations.AddField(
66
+            model_name='memberactivitysignupinfo',
67
+            name='brand_id',
68
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
69
+        ),
70
+        migrations.AddField(
71
+            model_name='memberactivitysignupinfo',
72
+            name='brand_name',
73
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
74
+        ),
75
+        migrations.AddField(
76
+            model_name='membercouponinfo',
77
+            name='brand_id',
78
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
79
+        ),
80
+        migrations.AddField(
81
+            model_name='membercouponinfo',
82
+            name='brand_name',
83
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
84
+        ),
85
+        migrations.AddField(
86
+            model_name='rightinfo',
87
+            name='brand_id',
88
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
89
+        ),
90
+        migrations.AddField(
91
+            model_name='rightinfo',
92
+            name='brand_name',
93
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
94
+        ),
95
+        migrations.AddField(
96
+            model_name='shottypeinfo',
97
+            name='brand_id',
98
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
99
+        ),
100
+        migrations.AddField(
101
+            model_name='shottypeinfo',
102
+            name='brand_name',
103
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
104
+        ),
105
+    ]

+ 30 - 0
member/migrations/0011_auto_20191212_1827.py

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.26 on 2019-12-12 10:27
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('member', '0010_auto_20191212_1821'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='couponinfo',
17
+            name='admin_id',
18
+            field=models.CharField(blank=True, db_index=True, help_text='\u6838\u9500\u5458\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='admin_id'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='couponinfo',
22
+            name='has_used',
23
+            field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u5df2\u6838\u9500', verbose_name='has_used'),
24
+        ),
25
+        migrations.AddField(
26
+            model_name='couponinfo',
27
+            name='used_at',
28
+            field=models.DateTimeField(blank=True, help_text='\u7ef4\u4fee\u5238\u6838\u9500\u65f6\u95f4', null=True, verbose_name='used_at'),
29
+        ),
30
+    ]

+ 52 - 19
member/models.py

@@ -19,6 +19,9 @@ class GoodsInfo(BaseModelMixin):
19 19
         (VIRTUAL, u'虚拟'),
20 20
     )
21 21
 
22
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
23
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
24
+
22 25
     good_id = ShortUUIDField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True, unique=True)
23 26
     good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True)
24 27
 
@@ -85,6 +88,9 @@ class GoodsOrderInfo(BaseModelMixin):
85 88
         (VIRTUAL, u'虚拟'),
86 89
     )
87 90
 
91
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
92
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
93
+
88 94
     order_id = ShortUUIDField(_(u'order_id'), max_length=32, blank=True, null=True, help_text=u'订单唯一标识', db_index=True, unique=True)
89 95
 
90 96
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
@@ -121,6 +127,9 @@ class RightInfo(BaseModelMixin):
121 127
         (COUPON, u'优惠券'),
122 128
     )
123 129
 
130
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
131
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
132
+
124 133
     right_id = ShortUUIDField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True, unique=True)
125 134
     right_type = models.IntegerField(_(u'right_type'), choices=RIGHT_TYPE_TUPLE, default=VIRTUAL, help_text=u'权益类型', db_index=True)
126 135
 
@@ -139,6 +148,17 @@ class RightInfo(BaseModelMixin):
139 148
 
140 149
     position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
141 150
 
151
+    # 券相关
152
+    is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券'), db_index=True)
153
+    coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)'))
154
+    coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数'))
155
+    coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)')
156
+    coupon_level2_amount = models.IntegerField(_(u'coupon_level2_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)')
157
+    coupon_level3_amount = models.IntegerField(_(u'coupon_level3_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)')
158
+    coupon_level4_amount = models.IntegerField(_(u'coupon_level4_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)')
159
+    coupon_level5_amount = models.IntegerField(_(u'coupon_level5_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)')
160
+    coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情')
161
+
142 162
     class Meta:
143 163
         verbose_name = _(u'会员权益信息')
144 164
         verbose_name_plural = _(u'会员权益信息')
@@ -186,9 +206,16 @@ class CouponInfo(BaseModelMixin):
186 206
         (COUPON, u'优惠券'),
187 207
     )
188 208
 
209
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
210
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
211
+
189 212
     coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True)
190 213
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
191 214
 
215
+    coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)'))
216
+    coupon_amount = models.IntegerField(_(u'coupon_amount'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)')
217
+    coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情')
218
+
192 219
     active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间'))
193 220
     expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间'))
194 221
 
@@ -200,15 +227,9 @@ class CouponInfo(BaseModelMixin):
200 227
     subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称')
201 228
     detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情')
202 229
 
203
-    level1 = models.CharField(_(u'level1'), max_length=255, blank=True, null=True, help_text=u'level1')
204
-    level2 = models.CharField(_(u'level2'), max_length=255, blank=True, null=True, help_text=u'level2')
205
-    level3 = models.CharField(_(u'level3'), max_length=255, blank=True, null=True, help_text=u'level3')
206
-    level4 = models.CharField(_(u'level4'), max_length=255, blank=True, null=True, help_text=u'level4')
207
-    level5 = models.CharField(_(u'level5'), max_length=255, blank=True, null=True, help_text=u'level5')
208
-
209
-    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'权益最低会员级别')
210
-
211
-    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
230
+    has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True)
231
+    admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True)
232
+    used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间')
212 233
 
213 234
     class Meta:
214 235
         verbose_name = _(u'会员券信息')
@@ -229,6 +250,9 @@ class CouponInfo(BaseModelMixin):
229 250
     def data(self):
230 251
         return {
231 252
             'coupon_id': self.coupon_id,
253
+            'coupon_valid_period': self.coupon_valid_period,
254
+            'coupon_amount': self.coupon_amount,
255
+            'coupon_detail': self.coupon_detail,
232 256
             'active_at': tc.local_string(self.active_at, format='%Y%m%d'),
233 257
             'expire_at': tc.local_string(self.expire_at, format='%Y%m%d'),
234 258
             'right_id': self.right_id,
@@ -237,19 +261,16 @@ class CouponInfo(BaseModelMixin):
237 261
             'title': self.title,
238 262
             'subtitle': self.subtitle,
239 263
             'detail': self.detail,
240
-            'level1': self.level1,
241
-            'level2': self.level2,
242
-            'level3': self.level3,
243
-            'level4': self.level4,
244
-            'level5': self.level5,
245
-            'minlevel': self.minlevel,
246
-            'able': True,
247
-            'left_num': 3,
248
-            'left_tip': 3,
264
+            'has_used': self.has_used,
265
+            'admin_id': self.admin_id,
266
+            'used_at': self.used_at,
249 267
         }
250 268
 
251 269
 
252 270
 class ShotTypeInfo(BaseModelMixin):
271
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
272
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
273
+
253 274
     shot_type_id = ShortUUIDField(_(u'shot_type_id'), max_length=32, blank=True, null=True, help_text=u'镜头类型唯一标识', db_index=True, unique=True)
254 275
     shot_type_name = models.CharField(_(u'shot_type_name'), max_length=255, blank=True, null=True, help_text=u'镜头类型名称')
255 276
 
@@ -265,7 +286,7 @@ class ShotTypeInfo(BaseModelMixin):
265 286
     @property
266 287
     def shots(self):
267 288
         models = ModelInfo.objects.filter(shot_type_id=self.shot_type_id, status=True)
268
-        return [model.shot_member_data for model in models]
289
+        return [model.member_shot_data for model in models]
269 290
 
270 291
     @property
271 292
     def data(self):
@@ -277,6 +298,9 @@ class ShotTypeInfo(BaseModelMixin):
277 298
 
278 299
 
279 300
 class MemberActivityInfo(BaseModelMixin):
301
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
302
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
303
+
280 304
     activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True, unique=True)
281 305
 
282 306
     title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
@@ -371,6 +395,9 @@ class MemberActivityInfo(BaseModelMixin):
371 395
 
372 396
 
373 397
 class MemberActivitySignupInfo(BaseModelMixin):
398
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
399
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
400
+
374 401
     signup_id = ShortUUIDField(_(u'signup_id'), max_length=32, blank=True, null=True, help_text=u'活动报名唯一标识', db_index=True, unique=True)
375 402
 
376 403
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
@@ -395,6 +422,9 @@ class MemberActivitySignupInfo(BaseModelMixin):
395 422
 
396 423
 
397 424
 class MemberActivitySigninInfo(BaseModelMixin):
425
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
426
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
427
+
398 428
     signin_id = ShortUUIDField(_(u'signin_id'), max_length=32, blank=True, null=True, help_text=u'活动签到唯一标识', db_index=True, unique=True)
399 429
 
400 430
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
@@ -430,6 +460,9 @@ class MemberCouponInfo(BaseModelMixin):
430 460
         (MAINTENANCE_MANPOWER, u'维修人工')
431 461
     )
432 462
 
463
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
464
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
465
+
433 466
     coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True)
434 467
 
435 468
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)

+ 2 - 1
utils/redis/rkeys.py

@@ -74,4 +74,5 @@ SCREEN_ADMIN_LOGIN = 'tamron:screen:admin:login:%s:%s'  # brand_id, token
74 74
 
75 75
 SUBSCRIBE_USERINFO_LIST = 'subscribe:userinfo:%s'
76 76
 
77
-SHOT_MEMBER_DATA = 'shot:member:data'
77
+MEMBER_SHOT_DATA = 'kodo:member:shot:data'
78
+MEMBER_SEND_COUPON_LIST = 'kodo:member:send:coupon:list'

+ 5 - 5
utils/redis/rshot.py

@@ -1,16 +1,16 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 from utils.redis.connect import r
4
-from utils.redis.rkeys import SHOT_MEMBER_DATA
4
+from utils.redis.rkeys import MEMBER_SHOT_DATA
5 5
 
6 6
 
7
-def update_shot_member_data():
7
+def update_member_shot_data():
8 8
     from member.models import ShotTypeInfo
9 9
     shots_types = ShotTypeInfo.objects.filter(status=True).order_by('position')
10 10
     shots_types = [st.data for st in shots_types]
11
-    r.setjson(SHOT_MEMBER_DATA, shots_types)
11
+    r.setjson(MEMBER_SHOT_DATA, shots_types)
12 12
     return shots_types
13 13
 
14 14
 
15
-def get_shot_member_data():
16
-    return r.getjson(SHOT_MEMBER_DATA) or update_shot_member_data()
15
+def get_member_shot_data():
16
+    return r.getjson(MEMBER_SHOT_DATA) or update_member_shot_data()