增加抽奖活动

FFIB 11 小時之前
父節點
當前提交
2dc5bda8b4
共有 7 個文件被更改,包括 155 次插入 和 1 次删除
  1. 9 0
      api/encrypt_views.py
  2. 0 0
      api/sale/__init__.py
  3. 1 0
      api/sale/lottery_views.py
  4. 8 0
      api/sale/urls.py
  5. 9 1
      sales/admin.py
  6. 58 0
      sales/migrations/0010_lotterycampaigninfo_lotteryentryinfo.py
  7. 70 0
      sales/models.py

+ 9 - 0
api/encrypt_views.py

@@ -16,6 +16,7 @@ from account.models import UserInfo
16 16
 from logs.models import MchInfoDecryptLogInfo, MchInfoEncryptLogInfo
17 17
 from marketcode.models import MarketCodeInfo
18 18
 from mch.models import ActivityInfo, BrandInfo, ConsumeShotUnbindingInfo, ModelInfo
19
+from sales.models import LotteryCampaignInfo
19 20
 from utils.algorithm.b64 import b64_decrypt, b64_encrypt
20 21
 from utils.algorithm.caesar import caesar_decrypt, caesar_encrypt
21 22
 from utils.algorithm.rsalg import rsa_decrypt, rsa_encrypt
@@ -161,8 +162,16 @@ def decrypt(request, v='v2'):
161 162
         activities = ActivityInfo.objects.filter(status=True).order_by('-pk')
162 163
         coupon_infos = [act.coupon_info3 for act in activities if act and act.has_unexpired_activity(model.model_name)]
163 164
 
165
+    lotterys = LotteryCampaignInfo.objects.filter(status=True)
166
+   
167
+    if lotterys.exists():
168
+        active_lotterys = [lottery.data for lottery in lotterys if lottery.is_active()]
169
+    else:
170
+        active_lotterys = None
171
+
164 172
     return response(200, data={
165 173
         'plaintext': plaintext,
174
+        'lotterys': active_lotterys,
166 175
         'logo_url': brand.brand_logo_url if brand else '',
167 176
         'model_imgs': model.images if model else [],
168 177
         'code_version': 1,

+ 0 - 0
api/sale/__init__.py


+ 1 - 0
api/sale/lottery_views.py

@@ -0,0 +1 @@
1
+

+ 8 - 0
api/sale/urls.py

@@ -0,0 +1,8 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf.urls import include, url
4
+
5
+from api.sale import lottery_views
6
+
7
+urlpatterns = [
8
+]

+ 9 - 1
sales/admin.py

@@ -3,7 +3,7 @@
3 3
 from django.contrib import admin
4 4
 
5 5
 from sales.models import (SalesResponsibilityInfo, SalesResponsibilityInfoModelsSaleStatisticInfo,
6
-                          SuperSalesResponsibilityInfoModelsSaleStatisticInfo)
6
+                          SuperSalesResponsibilityInfoModelsSaleStatisticInfo, LotteryEntryInfo, LotteryCampaignInfo)
7 7
 
8 8
 
9 9
 class SalesResponsibilityInfoAdmin(admin.ModelAdmin):
@@ -18,7 +18,15 @@ class SalesResponsibilityInfoModelsSaleStatisticInfoAdmin(admin.ModelAdmin):
18 18
 class SuperSalesResponsibilityInfoModelsSaleStatisticInfoAdmin(admin.ModelAdmin):
19 19
     list_display = ('brand_id', 'sr_id', 'sr_name', 'ymd', 'today_num', 'yesterday_num', 'current_month', 'last_month', 'position', 'status', 'created_at', 'updated_at')
20 20
 
21
+class LotteryEntryInfoAdmin(admin.ModelAdmin):
22
+    list_display = ('entry_id', 'campaign_id', 'user_id', 'title', 'phone', 'created_at', 'updated_at')
23
+
24
+class LotteryCampaignInfoAdmin(admin.ModelAdmin):
25
+    list_display = ('campaign_id', 'title', 'start_at', 'end_at', 'draw_at', 'created_at', 'updated_at')
26
+
21 27
 
22 28
 admin.site.register(SalesResponsibilityInfo, SalesResponsibilityInfoAdmin)
23 29
 admin.site.register(SalesResponsibilityInfoModelsSaleStatisticInfo, SalesResponsibilityInfoModelsSaleStatisticInfoAdmin)
24 30
 admin.site.register(SuperSalesResponsibilityInfoModelsSaleStatisticInfo, SuperSalesResponsibilityInfoModelsSaleStatisticInfoAdmin)
31
+admin.site.register(LotteryEntryInfo, LotteryEntryInfoAdmin)
32
+admin.site.register(LotteryCampaignInfo, LotteryCampaignInfoAdmin)

+ 58 - 0
sales/migrations/0010_lotterycampaigninfo_lotteryentryinfo.py

@@ -0,0 +1,58 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2026-10-23 09:34
3
+
4
+from django.db import migrations, models
5
+import shortuuidfield.fields
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('sales', '0009_auto_20201202_1203'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.CreateModel(
16
+            name='LotteryCampaignInfo',
17
+            fields=[
18
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')),
20
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
21
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
22
+                ('campaign_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='活动唯一标识', max_length=22, null=True, unique=True)),
23
+                ('title', models.CharField(help_text='活动标题', max_length=255, verbose_name='title')),
24
+                ('start_at', models.DateTimeField(blank=True, help_text='参与开始时间', null=True, verbose_name='start_at')),
25
+                ('end_at', models.DateTimeField(blank=True, help_text='参与结束时间', null=True, verbose_name='end_at')),
26
+                ('draw_at', models.DateTimeField(blank=True, db_index=True, help_text='开奖时间', null=True, verbose_name='draw_at')),
27
+            ],
28
+            options={
29
+                'verbose_name': '抽奖活动',
30
+                'verbose_name_plural': '抽奖活动',
31
+                'ordering': ('-created_at',),
32
+            },
33
+        ),
34
+        migrations.CreateModel(
35
+            name='LotteryEntryInfo',
36
+            fields=[
37
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
38
+                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')),
39
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
40
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
41
+                ('entry_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='名额唯一标识', max_length=22, null=True, unique=True)),
42
+                ('campaign_id', models.CharField(db_index=True, help_text='所属活动唯一标识', max_length=32, verbose_name='campaign_id')),
43
+                ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')),
44
+                ('title', models.CharField(blank=True, db_index=True, help_text='用户姓名', max_length=255, null=True, verbose_name='title')),
45
+                ('phone', models.CharField(blank=True, db_index=True, help_text='用户手机', max_length=11, null=True, verbose_name='phone')),
46
+                ('serial_no', models.CharField(db_index=True, help_text='镜头序列号', max_length=64, verbose_name='serial_no')),
47
+                ('model_id', models.CharField(blank=True, db_index=True, help_text='型号唯一标识', max_length=64, null=True, verbose_name='model_id')),
48
+                ('model_name', models.CharField(blank=True, db_index=True, help_text='型号名称', max_length=64, null=True, verbose_name='model_id')),
49
+                ('submit_pk', models.CharField(blank=True, db_index=True, help_text='提交记录唯一标识', max_length=32, null=True, verbose_name='submit_pk')),
50
+            ],
51
+            options={
52
+                'verbose_name': '抽奖名单',
53
+                'verbose_name_plural': '抽奖名单',
54
+                'ordering': ('-created_at',),
55
+                'unique_together': {('campaign_id', 'serial_no', 'model_id')},
56
+            },
57
+        ),
58
+    ]

+ 70 - 0
sales/models.py

@@ -6,6 +6,8 @@ from django.utils.translation import ugettext_lazy as _
6 6
 from django_models_ext import BaseModelMixin, upload_file_url, upload_path
7 7
 from shortuuidfield import ShortUUIDField
8 8
 
9
+from datetime import datetime
10
+
9 11
 
10 12
 class SalesResponsibilityInfo(BaseModelMixin):
11 13
     REFUSED = -1
@@ -162,3 +164,71 @@ class SuperSalesResponsibilityInfoModelsSaleStatisticInfo(BaseModelMixin):
162 164
             'current_month': self.current_month,
163 165
             'last_month': self.last_month,
164 166
         }
167
+
168
+
169
+class LotteryCampaignInfo(BaseModelMixin):
170
+    """抽奖活动"""
171
+
172
+    campaign_id = ShortUUIDField(_(u'campaign_id'), max_length=32, blank=True, null=True,
173
+                                 help_text=u'活动唯一标识', db_index=True, unique=True)
174
+    title = models.CharField(_(u'title'), max_length=255, help_text=u'活动标题')
175
+
176
+    start_at = models.DateTimeField(_(u'start_at'), blank=True, null=True, help_text=u'参与开始时间')
177
+    end_at = models.DateTimeField(_(u'end_at'), blank=True, null=True, help_text=u'参与结束时间')
178
+    draw_at = models.DateTimeField(_(u'draw_at'), blank=True, null=True, help_text=u'开奖时间', db_index=True)
179
+
180
+    class Meta:
181
+        verbose_name = _(u'抽奖活动')
182
+        verbose_name_plural = _(u'抽奖活动')
183
+        ordering = ('-created_at',)
184
+
185
+    def __unicode__(self):
186
+        return u'{}'.format(self.title or self.campaign_id or '')
187
+
188
+    def is_active(self):
189
+        return self.start_at and self.end_at and self.start_at <= datetime.now() <= self.end_at
190
+
191
+    @property
192
+    def data(self):
193
+        return {
194
+            'campaign_id': self.campaign_id,
195
+            'title': self.title,
196
+            'start_at': self.start_at and self.start_at.isoformat(),
197
+            'end_at': self.end_at and self.end_at.isoformat(),
198
+            'draw_at': self.draw_at and self.draw_at.isoformat(),
199
+        }
200
+
201
+
202
+class LotteryEntryInfo(BaseModelMixin):
203
+    """抽奖名单"""
204
+
205
+    entry_id = ShortUUIDField(_(u'entry_id'), max_length=32, blank=True, null=True,
206
+                              help_text=u'名额唯一标识', db_index=True, unique=True)
207
+    campaign_id = models.CharField(_(u'campaign_id'), max_length=32,
208
+                                   help_text=u'所属活动唯一标识', db_index=True)
209
+    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True,
210
+                               help_text=u'用户唯一标识', db_index=True)
211
+    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True,
212
+                               help_text=u'用户姓名', db_index=True)
213
+    
214
+    phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'用户手机', db_index=True)
215
+
216
+
217
+    serial_no = models.CharField(_(u'serial_no'), max_length=64, help_text=u'镜头序列号', db_index=True)
218
+    model_id = models.CharField(_(u'model_id'), max_length=64, blank=True, null=True,
219
+                                help_text=u'型号唯一标识', db_index=True)
220
+    model_name = models.CharField(_(u'model_id'), max_length=64, blank=True, null=True,
221
+                                help_text=u'型号名称', db_index=True)
222
+    submit_pk = models.CharField(_(u'submit_pk'), max_length=32, blank=True, null=True,
223
+                               help_text=u'提交记录唯一标识', db_index=True)
224
+
225
+    class Meta:
226
+        verbose_name = _(u'抽奖名单')
227
+        verbose_name_plural = _(u'抽奖名单')
228
+        ordering = ('-created_at',)
229
+        unique_together = (
230
+            ('campaign_id', 'serial_no', 'model_id'),
231
+        )
232
+
233
+    def __unicode__(self):
234
+        return u'{}-{}'.format(self.campaign_id, self.serial_no)