增加摄影师活动积分

FFIB 1 an auparavant
Parent
Commettre
0c91ed9208

+ 29 - 0
account/migrations/0060_auto_20240312_1350.py

@@ -0,0 +1,29 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2024-03-12 05:50
3
+
4
+from django.db import migrations, models
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('account', '0059_lensmaninfo'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='userintegralincomeexpensesinfo',
16
+            name='activity_id',
17
+            field=models.CharField(blank=True, db_index=True, help_text='活动唯一标识', max_length=32, null=True, verbose_name='activity_id'),
18
+        ),
19
+        migrations.AddField(
20
+            model_name='userintegralincomeexpensesinfo',
21
+            name='expired_at',
22
+            field=models.DateField(blank=True, help_text='积分过期日期', null=True, verbose_name='expired_at'),
23
+        ),
24
+        migrations.AlterField(
25
+            model_name='userintegralincomeexpensesinfo',
26
+            name='integral_from',
27
+            field=models.IntegerField(choices=[(0, '产品'), (1, '分享'), (2, '投稿'), (99, '会员活动投稿福利'), (3, '摄影师活动')], default=0, help_text='积分来源', verbose_name='integral_from'),
28
+        ),
29
+    ]

+ 42 - 0
account/models.py

@@ -6,9 +6,11 @@ from django.utils.translation import ugettext_lazy as _
6 6
 from django_models_ext import BaseModelMixin, SexModelMixin
7 7
 from shortuuidfield import ShortUUIDField
8 8
 from TimeConvert import TimeConvert as tc
9
+import datetime
9 10
 
10 11
 from kodo.basemodels import LensmanTypeBoolMixin
11 12
 from mch.models import ConsumeInfoSubmitLogInfo, MaintenancemanInfo, SaleclerkInfo
13
+from member.models import MemberActivityInfo
12 14
 from sales.models import SalesResponsibilityInfo
13 15
 
14 16
 
@@ -397,6 +399,12 @@ class LensmanInfo(BaseModelMixin):
397 399
 
398 400
     def __unicode__(self):
399 401
         return '%d' % self.pk
402
+    
403
+    @property
404
+    def is_expired(self):
405
+        now_time = datetime.datetime.now()
406
+        now_date = datetime.date(now_time.year, now_time.month, now_time.day)
407
+        return self.start_date <= now_date <= self.end_date
400 408
 
401 409
     @property
402 410
     def data(self):
@@ -404,6 +412,7 @@ class LensmanInfo(BaseModelMixin):
404 412
             'lensman_id': self.lensman_id,
405 413
             'name': self.name,
406 414
             'phone': self.phone,
415
+            'is_expired': self.is_expired,
407 416
             'lensman_status': self.lensman_status,
408 417
         }
409 418
 
@@ -411,11 +420,13 @@ class LensmanInfo(BaseModelMixin):
411 420
     def admindata(self):
412 421
         return {
413 422
             'lensman_id': self.lensman_id,
423
+            'user_id': self.user_id,
414 424
             'name': self.name,
415 425
             'phone': self.phone,
416 426
             'lensman_status': self.lensman_status,
417 427
             'start_date': self.start_date,
418 428
             'end_date': self.end_date,
429
+            'is_expired': self.is_expired,
419 430
             'created_at': tc.local_string(utc_dt=self.created_at),
420 431
         }
421 432
 
@@ -423,6 +434,7 @@ class UserIntegralIncomeExpensesInfo(BaseModelMixin):
423 434
     PRODUCT = 0
424 435
     SHARE = 1
425 436
     CONTRIBUTE = 2
437
+    LENSMAN_ACTIVITY = 3
426 438
     MEMBER_ACTIVITY_CONTRIBUTION_WELFARE = 99
427 439
 
428 440
     INTEGRAL_FROM = (
@@ -430,6 +442,7 @@ class UserIntegralIncomeExpensesInfo(BaseModelMixin):
430 442
         (SHARE, u'分享'),
431 443
         (CONTRIBUTE, u'投稿'),
432 444
         (MEMBER_ACTIVITY_CONTRIBUTION_WELFARE, u'会员活动投稿福利'),
445
+        (LENSMAN_ACTIVITY, u'摄影师活动')
433 446
     )
434 447
 
435 448
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
@@ -447,6 +460,8 @@ class UserIntegralIncomeExpensesInfo(BaseModelMixin):
447 460
     final_integral = models.IntegerField(_(u'final_integral'), default=0, help_text=u'最终积分')
448 461
 
449 462
     remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注')
463
+    activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
464
+    expired_at = models.DateField(_(u'expired_at'), blank=True, null=True, help_text=u'积分过期日期')
450 465
 
451 466
     class Meta:
452 467
         verbose_name = _(u'userinfointegralincomeexpensesinfo')
@@ -454,3 +469,30 @@ class UserIntegralIncomeExpensesInfo(BaseModelMixin):
454 469
 
455 470
     def __unicode__(self):
456 471
         return '%d' % self.pk
472
+
473
+    @property
474
+    def lensman_admindata(self):
475
+        act = MemberActivityInfo.objects.get(activity_id=self.activity_id)
476
+        return {
477
+            'integral_from': self.integral_from,
478
+            'integral': self.integral,
479
+            'remark': self.remark,
480
+            'act_info': act.admindata,
481
+            'activity_id': self.activity_id,
482
+            'expired_at': self.expired_at if self.expired_at else '',
483
+            'created_at': tc.local_string(utc_dt=self.created_at),
484
+        }
485
+    
486
+    @property
487
+    def lensman_userdata(self):
488
+        act = MemberActivityInfo.objects.get(activity_id=self.activity_id)
489
+        return {
490
+            'integral_from': self.integral_from,
491
+            'integral': self.integral,
492
+            'remark': self.remark,
493
+            'act_info': act.admindata,
494
+            'activity_id': self.activity_id,
495
+            'expired_at': self.expired_at if self.expired_at else '',
496
+            'created_at': tc.local_string(utc_dt=self.created_at),
497
+        }
498
+    

+ 18 - 1
api/lensman_admin_views.py

@@ -8,7 +8,7 @@ from django.db.models import Q
8 8
 from paginator import pagination
9 9
 from TimeConvert import TimeConvert as tc
10 10
 
11
-from account.models import LensmanInfo
11
+from account.models import LensmanInfo, UserIntegralIncomeExpensesInfo
12 12
 from kodo.decorators import check_admin
13 13
 
14 14
 
@@ -79,3 +79,20 @@ def lensman_update(request, administrator):
79 79
 
80 80
     return response(200, 'Lensman Info Update Suceess', u'摄影师信息更新成功')
81 81
 
82
+
83
+@logit
84
+@check_admin
85
+def lensman_integral_list(request, administrator):
86
+  user_id = request.POST.get('user_id', '')
87
+
88
+  try:
89
+    lensman = LensmanInfo.objects.get(user_id=user_id, status=True)
90
+  except LensmanInfo.DoesNotExist:
91
+    return response(200, 'Lensman Not Found', u'摄影师不存在')
92
+  
93
+  integrals = UserIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY, status=True)
94
+
95
+  integrals = [integral.lensman_admindata for integral in integrals]
96
+  
97
+
98
+  return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals)

+ 19 - 2
api/lensman_mp_views.py

@@ -5,7 +5,7 @@ from __future__ import division
5 5
 from django_logit import logit
6 6
 from django_response import response
7 7
 
8
-from account.models import LensmanInfo
8
+from account.models import LensmanInfo, UserIntegralIncomeExpensesInfo
9 9
 
10 10
 @logit
11 11
 def lensman_register(request):
@@ -33,4 +33,21 @@ def lensman_detail(request):
33 33
   except LensmanInfo.DoesNotExist:
34 34
     return response(200, 'Lensman Not Found', u'摄影师不存在')
35 35
 
36
-  return response(200, 'Get Lensman Detail Success', u'获取摄影师信息成功', data=lensman.data)
36
+  return response(200, 'Get Lensman Detail Success', u'获取摄影师信息成功', data=lensman.data)
37
+
38
+
39
+@logit
40
+def lensman_integral_list(request):
41
+  user_id = request.POST.get('user_id', '')
42
+
43
+  try:
44
+    lensman = LensmanInfo.objects.get(user_id=user_id, status=True)
45
+  except LensmanInfo.DoesNotExist:
46
+    return response(200, 'Lensman Not Found', u'摄影师不存在')
47
+  
48
+  integrals = UserIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY, status=True)
49
+
50
+  integrals = [integral.lensman_userdata for integral in integrals]
51
+  
52
+
53
+  return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals)

+ 2 - 0
api/urls.py

@@ -375,9 +375,11 @@ urlpatterns += [
375 375
     #小程序
376 376
     url(r'^mp/lensman/detail$', lensman_mp_views.lensman_detail, name='mp_lensman_detail'),
377 377
     url(r'^mp/lensman/register$', lensman_mp_views.lensman_register, name='mp_lensman_register'),
378
+    url(r'^mp/lensman/integral/list$', lensman_mp_views.lensman_integral_list, name='mp_lensman_integral_list'),
378 379
 
379 380
     #管理后台
380 381
     url(r'^admin/lensman/list$', lensman_admin_views.lensman_list, name='admin_lensman_list'),
381 382
     url(r'^admin/lensman/audit$', lensman_admin_views.lensman_audit, name='admin_lensman_audit'),
382 383
     url(r'^admin/lensman/update$', lensman_admin_views.lensman_update, name='admin_lensman_update'),
384
+    url(r'^admin/lensman/integral/list$', lensman_admin_views.lensman_integral_list, name='admin_lensman_integral_list'),
383 385
 ]

+ 61 - 3
member/activity_admin_views.py

@@ -9,9 +9,10 @@ from django_response import response
9 9
 from paginator import pagination
10 10
 from TimeConvert import TimeConvert as tc
11 11
 
12
-from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo
12
+from account.models import UserIntegralIncomeExpensesInfo, UserInfo, LensmanInfo
13
+from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo, MemberActivityDataInfo
13 14
 from kodo.decorators import check_admin
14
-from utils.error.errno_utils import MemberActivityStatusCode
15
+from utils.error.errno_utils import MemberActivityStatusCode, UserStatusCode
15 16
 
16 17
 
17 18
 @check_admin
@@ -266,4 +267,61 @@ def activity_signup_pass(request, administrator):
266 267
 
267 268
     MemberActivitySignupInfo.objects.filter(activity_id=activity_id, signup_id=signup_id, status=True).update(passed=True)
268 269
 
269
-    return response(200, 'Member Activity Signup Passed Success', u'活动报名通过成功')
270
+    return response(200, 'Member Activity Signup Passed Success', u'活动报名通过成功')
271
+
272
+
273
+@check_admin
274
+def activity_data_list(request, administrator):
275
+    activity_id = request.POST.get('activity_id', '')
276
+    page = int(request.POST.get('page', 1))
277
+    num = int(request.POST.get('num', 20))
278
+    query = request.POST.get('query', '')
279
+
280
+    logs = MemberActivityDataInfo.objects.filter(activity_id=activity_id, status=True)
281
+    if query:
282
+        logs = logs.filter(Q(lensman_name__icontains=query) | Q(lensman_phone__icontains=query))
283
+
284
+    count = logs.count()
285
+    logs, left = pagination(logs, page, num)
286
+    logs = [log.admindata for log in logs]
287
+    
288
+    return response(200, 'Get Member Activity Data List Success', u'获取会员活动数据列表成功', data={
289
+        'logs': logs,
290
+        'count': count,
291
+        'left': left,
292
+    })
293
+
294
+@check_admin
295
+def activity_integral_add(request, administrator):
296
+    activity_id = request.POST.get('activity_id', '')
297
+    user_id = request.POST.get('user_id', '')
298
+    lensman_id = request.POST.get('lensman_id', '')
299
+    integral = int(request.POST.get('integral', 0))
300
+    remark = request.POST.get('remark', '')
301
+    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
302
+
303
+    try:
304
+        user = UserInfo.objects.get(user_id=user_id, status=True)
305
+    except UserInfo.DoesNotExist:
306
+        return response(UserStatusCode.USER_NOT_FOUND)
307
+
308
+    try:
309
+        lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
310
+    except LensmanInfo.DoesNotExist:
311
+        return response('400001', 'LensmanInfo Not Found', '摄影师不存在')
312
+
313
+    user.integral += integral
314
+    user.save()
315
+
316
+    UserIntegralIncomeExpensesInfo.objects.create(
317
+        brand_id=brand_id,
318
+        user_id=user_id,
319
+        integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY,
320
+        integral=integral,
321
+        final_integral=user.integral,
322
+        activity_id=activity_id,
323
+        remark=remark,
324
+        expired_at=lensman.end_date,
325
+    )
326
+
327
+    return response(200, 'Add Member Activity Integral Success', u'添加积分成功')

+ 12 - 2
member/activity_mp_views.py

@@ -7,7 +7,7 @@ from django_query import get_query_value
7 7
 from django_response import response
8 8
 from paginator import pagination
9 9
 
10
-from account.models import UserInfo
10
+from account.models import UserInfo, LensmanInfo
11 11
 from member.models import MemberActivityContributionInfo, MemberActivityInfo, MemberActivitySignupInfo, MemberActivityDataInfo
12 12
 from utils.error.errno_utils import MemberActivityContributionStatusCode, MemberActivityStatusCode, UserStatusCode
13 13
 
@@ -95,7 +95,7 @@ def activity_signup(request):
95 95
         act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
96 96
     except MemberActivityInfo.DoesNotExist:
97 97
         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
98
-
98
+    
99 99
     MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
100 100
         'title': act.title,
101 101
         'lensman_id': lensman_id,
@@ -139,10 +139,20 @@ def activity_data_submit(request):
139 139
         act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
140 140
     except MemberActivityInfo.DoesNotExist:
141 141
         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
142
+    
143
+    try:
144
+        lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
145
+    except LensmanInfo.DoesNotExist:
146
+        return response('400001', 'LensmanInfo Not Found', '摄影师不存在')
147
+
148
+    if act.is_expired:
149
+        return response(40001, 'Lensman Has Expired', '摄影师合作已到期')
142 150
 
143 151
     MemberActivityDataInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
144 152
         'title': act.title,
145 153
         'lensman_id': lensman_id,
154
+        'lensman_name': lensman.name,
155
+        'lensman_phone': lensman.phone,
146 156
         'data_fields': data_fields,
147 157
     })
148 158
 

+ 6 - 0
member/admin_urls.py

@@ -17,3 +17,9 @@ urlpatterns += [
17 17
     url(r'^member/activity/signup/list$', activity_admin_views.activity_signup_list, name='admin_member_activity_signup_list'),
18 18
     url(r'^member/activity/signup/pass$', activity_admin_views.activity_signup_pass, name='admin_member_activity_signup_pass'),
19 19
 ]
20
+
21
+#activity data
22
+urlpatterns += [
23
+    url(r'^member/activity/data/list$', activity_admin_views.activity_data_list, name='admin_member_activity_data_list'),
24
+    url(r'^member/activity/integral/add$', activity_admin_views.activity_integral_add, name='admin_member_activity_integral_add'),
25
+]

+ 30 - 0
member/migrations/0069_auto_20240312_1350.py

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# Generated by Django 3.2.16 on 2024-03-12 05:50
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('member', '0068_auto_20240306_1410'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='memberactivitydatainfo',
17
+            name='lensman_name',
18
+            field=models.CharField(blank=True, help_text='摄影师姓名', max_length=255, null=True, verbose_name='lensman_name'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='memberactivitydatainfo',
22
+            name='lensman_phone',
23
+            field=models.CharField(blank=True, help_text='摄影师手机号', max_length=255, null=True, verbose_name='lensman_phone'),
24
+        ),
25
+        migrations.AlterField(
26
+            model_name='memberactivitydatainfo',
27
+            name='lensman_id',
28
+            field=models.CharField(blank=True, db_index=True, help_text='摄影师唯一标识', max_length=32, null=True, verbose_name='lensman_id'),
29
+        ),
30
+    ]

+ 6 - 1
member/models.py

@@ -794,7 +794,9 @@ class MemberActivityDataInfo(BaseModelMixin, BrandInfoMixin):
794 794
     activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
795 795
 
796 796
     title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
797
-    lensman_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)
797
+    lensman_id = models.CharField(_(u'lensman_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)
798
+    lensman_name = models.CharField(_(u'lensman_name'), max_length=255, blank=True, null=True, help_text=u'摄影师姓名')
799
+    lensman_phone = models.CharField(_(u'lensman_phone'), max_length=255, blank=True, null=True, help_text=u'摄影师手机号')
798 800
 
799 801
     data_fields = JSONField(_(u'data_fields'), blank=True, null=True, default='[]', help_text=u'自定义数据表单字段')
800 802
 
@@ -826,7 +828,10 @@ class MemberActivityDataInfo(BaseModelMixin, BrandInfoMixin):
826 828
             'lensman_id': self.lensman_id,
827 829
             'activity_id': self.activity_id,
828 830
             'title': self.title,
831
+            'lensman_name': self.lensman_name,
832
+            'lensman_phone': self.lensman_phone,
829 833
             'data_fields': json.loads(self.data_fields) if self.data_fields else [],
834
+            'created_at': tc.local_string(utc_dt=self.created_at),
830 835
         }
831 836
 
832 837