@@ -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 | 
                + ]  | 
            
                @@ -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)  | 
            
                @@ -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'处理会员活动投稿福利解锁成功')  | 
            
                @@ -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()  | 
            
                @@ -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()  | 
            
                @@ -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 | 
                 | 
            
                @@ -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 | 
                + ]  | 
            
                @@ -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'电话')  | 
            
                @@ -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'添加用户投稿积分成功')  |