:art: MEMBER_ACTIVITY_CONTRIBUTION_WELFARE

huangqimin001 %!s(int64=2) %!d(string=hace) años
padre
commit
2bf8b860dd

+ 19 - 0
account/migrations/0056_alter_userintegralincomeexpensesinfo_integral_from.py

@@ -0,0 +1,19 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2022-10-27 10:38
3
+
4
+from django.db import migrations, models
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('account', '0055_userintegralincomeexpensesinfo_final_integral'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AlterField(
15
+            model_name='userintegralincomeexpensesinfo',
16
+            name='integral_from',
17
+            field=models.IntegerField(choices=[(0, '产品'), (1, '分享'), (2, '投稿'), (99, '会员活动投稿福利')], default=0, help_text='积分来源', verbose_name='integral_from'),
18
+        ),
19
+    ]

+ 2 - 0
account/models.py

@@ -331,11 +331,13 @@ class UserIntegralIncomeExpensesInfo(BaseModelMixin):
331 331
     PRODUCT = 0
332 332
     SHARE = 1
333 333
     CONTRIBUTE = 2
334
+    MEMBER_ACTIVITY_CONTRIBUTION_WELFARE = 99
334 335
 
335 336
     INTEGRAL_FROM = (
336 337
         (PRODUCT, u'产品'),
337 338
         (SHARE, u'分享'),
338 339
         (CONTRIBUTE, u'投稿'),
340
+        (MEMBER_ACTIVITY_CONTRIBUTION_WELFARE, u'会员活动投稿福利'),
339 341
     )
340 342
 
341 343
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)

+ 18 - 2
api/member_views.py

@@ -13,7 +13,7 @@ from pywe_miniapp import get_shareinfo
13 13
 from pywe_storage import RedisStorage
14 14
 from TimeConvert import TimeConvert as tc
15 15
 
16
-from account.models import UserInfo
16
+from account.models import UserInfo, UserIntegralIncomeExpensesInfo
17 17
 from coupon.models import UserCouponInfo
18 18
 from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo,
19 19
                            MemberActivityContributionWelfareUnlockingInfo, MemberActivityGroupShareInfo,
@@ -501,7 +501,7 @@ def activity_group_share(request):
501 501
         return response()
502 502
 
503 503
     try:
504
-        user = UserInfo.objects.get(user_id=share_user_id, status=True)
504
+        user = UserInfo.objects.select_for_update().get(user_id=share_user_id, status=True)
505 505
     except UserInfo.DoesNotExist:
506 506
         return response(UserStatusCode.USER_NOT_FOUND)
507 507
 
@@ -753,5 +753,21 @@ def activity_contribute_welfare_unlocking_handled(request):
753 753
     unlocking.save()
754 754
 
755 755
     # TODO: 积分相关逻辑在这里处理?
756
+    try:
757
+        user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
758
+    except UserInfo.DoesNotExist:
759
+        return response(UserStatusCode.USER_NOT_FOUND)
760
+
761
+    user.integral += unlocking.welfare_value
762
+    user.save()
763
+
764
+    UserIntegralIncomeExpensesInfo.objects.create(
765
+        brand_id=brand_id,
766
+        user_id=user_id,
767
+        integral_from=UserIntegralIncomeExpensesInfo.MEMBER_ACTIVITY_CONTRIBUTION_WELFARE,
768
+        integral=unlocking.welfare_value,
769
+        final_integral=user.integral,
770
+        remark=unlocking.id,
771
+    )
756 772
 
757 773
     return response(200, 'Update Member Activity Contribute Welfare Unblocking Success', u'处理会员活动投稿福利解锁成功')

+ 72 - 70
commands/management/commands/cpon.py

@@ -3,6 +3,7 @@
3 3
 import logging
4 4
 import time
5 5
 
6
+from django.db import transaction
6 7
 from django_six import CompatibilityBaseCommand, close_old_connections
7 8
 from TimeConvert import TimeConvert as tc
8 9
 
@@ -42,83 +43,84 @@ class Command(CompatibilityBaseCommand):
42 43
             # TODO: Opt by delay execute
43 44
             time.sleep(5)
44 45
 
45
-            try:
46
-                user = UserInfo.objects.get(user_id=user_id)
47
-            except UserInfo.DoesNotExist:
48
-                continue
49
-
50
-            if coupon_id:
51
-                # 发放商城兑换券
46
+            with transaction.atomic():
52 47
                 try:
53
-                    coupon = CouponInfo.objects.get(coupon_id=coupon_id)
54
-                except CouponInfo.DoesNotExist:
48
+                    user = UserInfo.objects.get(user_id=user_id)
49
+                except UserInfo.DoesNotExist:
55 50
                     continue
56 51
 
57
-                UserCouponInfo.objects.create(
58
-                    brand_id=coupon.brand_id,
59
-                    brand_name=coupon.brand_name,
60
-                    coupon_id=coupon_id,
61
-                    user_id=user_id,
62
-                    coupon_title=coupon.coupon_title,
63
-                    coupon_detail=coupon.coupon_detail,
64
-                    coupon_value=coupon.coupon_value,
65
-                    coupon_image=coupon.coupon_image,
66
-                    coupon_from='INTEGRAL_MALL',
67
-                    active_at=tc.utc_datetime(),
68
-                    expire_at=tc.utc_datetime(days=coupon.coupon_valid_period) if coupon.coupon_expire_type == CouponInfo.CHANGED_EXPIRED_TIME else coupon.coupon_expire_at,
69
-                    coupon_valid_period=coupon.coupon_valid_period,
70
-                    coupon_limit_model_ids=coupon.coupon_limit_model_ids,
71
-                    is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff,
72
-                )
73
-
74
-            else:
75
-                # 发放会员权益
76
-                active_at = tc.utc_datetime()
77
-                expire_at = tc.utc_datetime(days=365)
78
-
79
-                rights = RightInfo.objects.filter(is_send_coupon=True, status=True)
80
-                for right in rights:
81
-                    if user.level == UserInfo.MEMBER_LRC:
82
-                        coupon_id = right.coupon_level1_id
83
-                        coupon_num = right.coupon_level1_num
84
-                    elif user.level == UserInfo.MEMBER_SILVER:
85
-                        coupon_id = right.coupon_level2_id
86
-                        coupon_num = right.coupon_level2_num
87
-                    elif user.level == UserInfo.MEMBER_GOLD:
88
-                        coupon_id = right.coupon_level3_id
89
-                        coupon_num = right.coupon_level3_num
90
-                    elif user.level == UserInfo.MEMBER_WHITE_GOLD:
91
-                        coupon_id = right.coupon_level4_id
92
-                        coupon_num = right.coupon_level4_num
93
-                    elif user.level == UserInfo.MEMBER_BLACK_GOLD:
94
-                        coupon_id = right.coupon_level5_id
95
-                        coupon_num = right.coupon_level5_num
96
-
97
-                    if not coupon_id:
98
-                        continue
99
-
52
+                if coupon_id:
53
+                    # 发放商城兑换券
100 54
                     try:
101 55
                         coupon = CouponInfo.objects.get(coupon_id=coupon_id)
102 56
                     except CouponInfo.DoesNotExist:
103 57
                         continue
104 58
 
105
-                    for _ in range(right.coupon_num or coupon_num):
106
-                        UserCouponInfo.objects.create(
107
-                            brand_id=coupon.brand_id,
108
-                            brand_name=coupon.brand_name,
109
-                            coupon_id=coupon_id,
110
-                            user_id=user_id,
111
-                            coupon_title=coupon.coupon_title,
112
-                            coupon_detail=coupon.coupon_detail,
113
-                            coupon_value=coupon.coupon_value,
114
-                            coupon_image=coupon.coupon_image,
115
-                            active_at=active_at,
116
-                            expire_at=expire_at,
117
-                            coupon_valid_period=coupon.coupon_valid_period,
118
-                            coupon_limit_model_ids=coupon.coupon_limit_model_ids,
119
-                        )
120
-
121
-                user.coupon_expire_at = expire_at
122
-                user.save()
59
+                    UserCouponInfo.objects.create(
60
+                        brand_id=coupon.brand_id,
61
+                        brand_name=coupon.brand_name,
62
+                        coupon_id=coupon_id,
63
+                        user_id=user_id,
64
+                        coupon_title=coupon.coupon_title,
65
+                        coupon_detail=coupon.coupon_detail,
66
+                        coupon_value=coupon.coupon_value,
67
+                        coupon_image=coupon.coupon_image,
68
+                        coupon_from='INTEGRAL_MALL',
69
+                        active_at=tc.utc_datetime(),
70
+                        expire_at=tc.utc_datetime(days=coupon.coupon_valid_period) if coupon.coupon_expire_type == CouponInfo.CHANGED_EXPIRED_TIME else coupon.coupon_expire_at,
71
+                        coupon_valid_period=coupon.coupon_valid_period,
72
+                        coupon_limit_model_ids=coupon.coupon_limit_model_ids,
73
+                        is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff,
74
+                    )
75
+
76
+                else:
77
+                    # 发放会员权益
78
+                    active_at = tc.utc_datetime()
79
+                    expire_at = tc.utc_datetime(days=365)
80
+
81
+                    rights = RightInfo.objects.filter(is_send_coupon=True, status=True)
82
+                    for right in rights:
83
+                        if user.level == UserInfo.MEMBER_LRC:
84
+                            coupon_id = right.coupon_level1_id
85
+                            coupon_num = right.coupon_level1_num
86
+                        elif user.level == UserInfo.MEMBER_SILVER:
87
+                            coupon_id = right.coupon_level2_id
88
+                            coupon_num = right.coupon_level2_num
89
+                        elif user.level == UserInfo.MEMBER_GOLD:
90
+                            coupon_id = right.coupon_level3_id
91
+                            coupon_num = right.coupon_level3_num
92
+                        elif user.level == UserInfo.MEMBER_WHITE_GOLD:
93
+                            coupon_id = right.coupon_level4_id
94
+                            coupon_num = right.coupon_level4_num
95
+                        elif user.level == UserInfo.MEMBER_BLACK_GOLD:
96
+                            coupon_id = right.coupon_level5_id
97
+                            coupon_num = right.coupon_level5_num
98
+
99
+                        if not coupon_id:
100
+                            continue
101
+
102
+                        try:
103
+                            coupon = CouponInfo.objects.get(coupon_id=coupon_id)
104
+                        except CouponInfo.DoesNotExist:
105
+                            continue
106
+
107
+                        for _ in range(right.coupon_num or coupon_num):
108
+                            UserCouponInfo.objects.create(
109
+                                brand_id=coupon.brand_id,
110
+                                brand_name=coupon.brand_name,
111
+                                coupon_id=coupon_id,
112
+                                user_id=user_id,
113
+                                coupon_title=coupon.coupon_title,
114
+                                coupon_detail=coupon.coupon_detail,
115
+                                coupon_value=coupon.coupon_value,
116
+                                coupon_image=coupon.coupon_image,
117
+                                active_at=active_at,
118
+                                expire_at=expire_at,
119
+                                coupon_valid_period=coupon.coupon_valid_period,
120
+                                coupon_limit_model_ids=coupon.coupon_limit_model_ids,
121
+                            )
122
+
123
+                    user.coupon_expire_at = expire_at
124
+                    user.save()
123 125
 
124 126
             close_old_connections()

+ 52 - 50
commands/management/commands/cpon2.py

@@ -2,6 +2,7 @@
2 2
 
3 3
 import logging
4 4
 
5
+from django.db import transaction
5 6
 from django_six import CompatibilityBaseCommand, close_old_connections
6 7
 from TimeConvert import TimeConvert as tc
7 8
 
@@ -37,58 +38,59 @@ class Command(CompatibilityBaseCommand):
37 38
             brand_id = v.get('brand_id', '')
38 39
             user_id = v.get('user_id', '')
39 40
 
40
-            try:
41
-                user = UserInfo.objects.get(user_id=user_id)
42
-            except UserInfo.DoesNotExist:
43
-                continue
44
-
45
-            active_at = user.coupon_expire_at
46
-            expire_at = tc.utc_datetime(user.coupon_expire_at, days=365)
47
-
48
-            # 发放会员权益
49
-            rights = RightInfo.objects.filter(is_send_coupon=True, is_continue_send_coupon=True, status=True)
50
-            for right in rights:
51
-                if user.level == UserInfo.MEMBER_LRC:
52
-                    coupon_id = right.coupon_level1_id
53
-                    coupon_num = right.coupon_level1_num
54
-                elif user.level == UserInfo.MEMBER_SILVER:
55
-                    coupon_id = right.coupon_level2_id
56
-                    coupon_num = right.coupon_level2_num
57
-                elif user.level == UserInfo.MEMBER_GOLD:
58
-                    coupon_id = right.coupon_level3_id
59
-                    coupon_num = right.coupon_level3_num
60
-                elif user.level == UserInfo.MEMBER_WHITE_GOLD:
61
-                    coupon_id = right.coupon_level4_id
62
-                    coupon_num = right.coupon_level4_num
63
-                elif user.level == UserInfo.MEMBER_BLACK_GOLD:
64
-                    coupon_id = right.coupon_level5_id
65
-                    coupon_num = right.coupon_level5_num
66
-
67
-                if not coupon_id:
68
-                    continue
69
-
41
+            with transaction.atomic():
70 42
                 try:
71
-                    coupon = CouponInfo.objects.get(coupon_id=coupon_id)
72
-                except CouponInfo.DoesNotExist:
43
+                    user = UserInfo.objects.get(user_id=user_id)
44
+                except UserInfo.DoesNotExist:
73 45
                     continue
74 46
 
75
-                for _ in range(right.coupon_num or coupon_num):
76
-                    UserCouponInfo.objects.create(
77
-                        brand_id=coupon.brand_id,
78
-                        brand_name=coupon.brand_name,
79
-                        coupon_id=coupon_id,
80
-                        user_id=user_id,
81
-                        coupon_title=coupon.coupon_title,
82
-                        coupon_detail=coupon.coupon_detail,
83
-                        coupon_value=coupon.coupon_value,
84
-                        coupon_image=coupon.coupon_image,
85
-                        active_at=active_at,
86
-                        expire_at=expire_at,
87
-                        coupon_valid_period=coupon.coupon_valid_period,
88
-                        coupon_limit_model_ids=coupon.coupon_limit_model_ids,
89
-                    )
90
-
91
-            user.coupon_expire_at = expire_at
92
-            user.save()
47
+                active_at = user.coupon_expire_at
48
+                expire_at = tc.utc_datetime(user.coupon_expire_at, days=365)
49
+
50
+                # 发放会员权益
51
+                rights = RightInfo.objects.filter(is_send_coupon=True, is_continue_send_coupon=True, status=True)
52
+                for right in rights:
53
+                    if user.level == UserInfo.MEMBER_LRC:
54
+                        coupon_id = right.coupon_level1_id
55
+                        coupon_num = right.coupon_level1_num
56
+                    elif user.level == UserInfo.MEMBER_SILVER:
57
+                        coupon_id = right.coupon_level2_id
58
+                        coupon_num = right.coupon_level2_num
59
+                    elif user.level == UserInfo.MEMBER_GOLD:
60
+                        coupon_id = right.coupon_level3_id
61
+                        coupon_num = right.coupon_level3_num
62
+                    elif user.level == UserInfo.MEMBER_WHITE_GOLD:
63
+                        coupon_id = right.coupon_level4_id
64
+                        coupon_num = right.coupon_level4_num
65
+                    elif user.level == UserInfo.MEMBER_BLACK_GOLD:
66
+                        coupon_id = right.coupon_level5_id
67
+                        coupon_num = right.coupon_level5_num
68
+
69
+                    if not coupon_id:
70
+                        continue
71
+
72
+                    try:
73
+                        coupon = CouponInfo.objects.get(coupon_id=coupon_id)
74
+                    except CouponInfo.DoesNotExist:
75
+                        continue
76
+
77
+                    for _ in range(right.coupon_num or coupon_num):
78
+                        UserCouponInfo.objects.create(
79
+                            brand_id=coupon.brand_id,
80
+                            brand_name=coupon.brand_name,
81
+                            coupon_id=coupon_id,
82
+                            user_id=user_id,
83
+                            coupon_title=coupon.coupon_title,
84
+                            coupon_detail=coupon.coupon_detail,
85
+                            coupon_value=coupon.coupon_value,
86
+                            coupon_image=coupon.coupon_image,
87
+                            active_at=active_at,
88
+                            expire_at=expire_at,
89
+                            coupon_valid_period=coupon.coupon_valid_period,
90
+                            coupon_limit_model_ids=coupon.coupon_limit_model_ids,
91
+                        )
92
+
93
+                user.coupon_expire_at = expire_at
94
+                user.save()
93 95
 
94 96
             close_old_connections()

+ 1 - 1
member/admin.py

@@ -110,7 +110,7 @@ class MemberActivityContributionWelfareInfoAdmin(admin.ModelAdmin):
110 110
 
111 111
 
112 112
 class MemberActivityContributionWelfareUnlockingInfoAdmin(admin.ModelAdmin):
113
-    list_display = ('unlocking_id', 'admin_id', 'user_id', 'activity_id', 'contribution_id', 'welfare_id', 'name', 'phone', 'address', 'tracking_number', 'is_handled', 'status', 'created_at', 'updated_at')
113
+    list_display = ('unlocking_id', 'admin_id', 'user_id', 'activity_id', 'contribution_id', 'welfare_id', 'welfare_value', 'name', 'phone', 'address', 'tracking_number', 'is_handled', 'status', 'created_at', 'updated_at')
114 114
     list_filter = ('admin_id', 'activity_id', 'welfare_id', 'is_handled', 'status')
115 115
 
116 116
 

+ 19 - 0
member/migrations/0046_memberactivitycontributionwelfareunlockinginfo_welfare_value.py

@@ -0,0 +1,19 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2022-10-27 10:38
3
+
4
+from django.db import migrations, models
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('member', '0045_auto_20221026_2102'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='memberactivitycontributionwelfareunlockinginfo',
16
+            name='welfare_value',
17
+            field=models.IntegerField(default=0, help_text='福利数量', verbose_name='welfare_value'),
18
+        ),
19
+    ]

+ 1 - 0
member/models.py

@@ -811,6 +811,7 @@ class MemberActivityContributionWelfareUnlockingInfo(BaseModelMixin, BrandInfoMi
811 811
     contribution_id = models.CharField(_(u'contribution_id'), max_length=32, blank=True, null=True, help_text=u'投稿唯一标识', db_index=True)
812 812
 
813 813
     welfare_id = models.CharField(_(u'welfare_id'), max_length=32, blank=True, null=True, help_text=u'福利唯一标识', db_index=True)
814
+    welfare_value = models.IntegerField(_(u'welfare_value'), default=0, help_text=_(u'福利数量'))
814 815
 
815 816
     name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名')
816 817
     phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话')

+ 6 - 5
miniapp/views.py

@@ -318,19 +318,20 @@ def user_integral_add(request):
318 318
         return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
319 319
 
320 320
     try:
321
-        user = UserInfo.objects.get(user_id=user_id, status=True)
321
+        user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
322 322
     except UserInfo.DoesNotExist:
323 323
         return response(UserStatusCode.USER_NOT_FOUND)
324 324
 
325
+    user.integral += integral
326
+    user.save()
327
+
325 328
     UserIntegralIncomeExpensesInfo.objects.create(
326 329
         brand_id=brand_id,
327 330
         user_id=user_id,
328 331
         integral_from=UserIntegralIncomeExpensesInfo.CONTRIBUTE,
329 332
         integral=integral,
330
-        remark=remark
333
+        final_integral=user.integral,
334
+        remark=remark,
331 335
     )
332 336
 
333
-    user.integral += integral
334
-    user.save()
335
-
336 337
     return response(200, 'Add User Integral Success', u'添加用户投稿积分成功')