es-code">
+    is_clerk_send_redpack = models.BooleanField(_(u'is_clerk_send_redpack'), default=False, help_text=u'销售员是否发放红包', db_index=True)
30
+    clerk_redpack_amount = models.IntegerField(_(u'clerk_redpack_amount'), default=0, help_text=u'销售员红包固定金额,单位:分')
31
+    clerk_redpack_max_amount = models.IntegerField(_(u'clerk_redpack_max_amount'), default=0, help_text=u'销售员红包金额范围,单位:分)')
32
+    has_clerk_send_redpack = models.BooleanField(_(u'has_clerk_send_redpack'), default=False, help_text=u'销售员是否已发放红包', db_index=True)
33
+    clerk_redpack_send_amount = models.IntegerField(_(u'clerk_redpack_send_amount'), default=0, help_text=u'销售员红包发放金额,单位:分)')
34
+
28 35
     user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识(红包)', db_index=True)
29 36
     nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户昵称')
30 37
 
@@ -99,6 +106,8 @@ class RedpackSendLogInfo(BaseModelMixin):
99 106
     redpack_type = models.IntegerField(_(u'redpack_type'), default=WX_REDPACK, choices=REDPACK_TYPE_TUPLE, help_text=u'红包发放方式', db_index=True)
100 107
     redpack_amount = models.IntegerField(_(u'redpack_amount'), default=0, help_text=u'红包发放金额')
101 108
 
109
+    is_clerk_redpack = models.BooleanField(_(u'is_clerk_redpack'), default=False, help_text=u'是否为销售员红包', db_index=True)
110
+
102 111
     class Meta:
103 112
         verbose_name = _(u'红包发放记录')
104 113
         verbose_name_plural = _(u'红包发放记录')

+ 2 - 1
mch/admin.py

@@ -65,7 +65,7 @@ class BrandInfoAdmin(admin.ModelAdmin):
65 65
 
66 66
 
67 67
 class ModelInfoAdmin(admin.ModelAdmin):
68
-    list_display = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_name', 'model_uni_name', 'model_full_name', 'model_descr', 'category', 'warehouse', 'image', 'url', 'image2', 'factory_yuan', 'integral', 'is_send_redpack', 'redpack_amount', 'redpack_max_amount', 'position', 'display', 'status', 'created_at', 'updated_at')
68
+    list_display = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_name', 'model_uni_name', 'model_full_name', 'model_descr', 'category', 'warehouse', 'image', 'url', 'image2', 'factory_yuan', 'integral', 'is_send_redpack', 'redpack_amount', 'redpack_max_amount', 'is_clerk_send_redpack', 'clerk_redpack_amount', 'clerk_redpack_max_amount', 'position', 'display', 'status', 'created_at', 'updated_at')
69 69
     list_filter = ('brand_name', 'category', 'warehouse', 'display', 'status')
70 70
     readonly_fields = ('brand_name', 'factory_fee')
71 71
     search_fields = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_name', 'model_uni_name', 'model_full_name', 'model_descr', 'category', 'warehouse')
@@ -83,6 +83,7 @@ class ModelInfoAdmin(admin.ModelAdmin):
83 83
         obj.save()
84 84
 
85 85
         MchInfoEncryptLogInfo.objects.filter(has_send_redpack=False).update(is_send_redpack=obj.is_send_redpack, redpack_amount=obj.redpack_amount, redpack_max_amount=obj.redpack_max_amount)
86
+        MchInfoEncryptLogInfo.objects.filter(has_clerk_send_redpack=False).update(is_clerk_send_redpack=obj.is_clerk_send_redpack, clerk_redpack_amount=obj.clerk_redpack_amount, clerk_redpack_max_amount=obj.clerk_redpack_max_amount)
86 87
 
87 88
 
88 89
 class ModelImageInfoAdmin(admin.ModelAdmin):

+ 30 - 0
mch/migrations/0045_auto_20190816_1815.py

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.22 on 2019-08-16 10:15
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
+        ('mch', '0044_auto_20190816_1459'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='modelinfo',
17
+            name='clerk_redpack_amount',
18
+            field=models.IntegerField(default=0, help_text='\u9500\u552e\u5458\u7ea2\u5305\u56fa\u5b9a\u91d1\u989d\uff0c\u5355\u4f4d\uff1a\u5206', verbose_name='clerk_redpack_amount'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='modelinfo',
22
+            name='clerk_redpack_max_amount',
23
+            field=models.IntegerField(default=0, help_text='\u9500\u552e\u5458\u7ea2\u5305\u91d1\u989d\u8303\u56f4\uff0c\u5355\u4f4d\uff1a\u5206\uff09', verbose_name='clerk_redpack_max_amount'),
24
+        ),
25
+        migrations.AddField(
26
+            model_name='modelinfo',
27
+            name='is_clerk_send_redpack',
28
+            field=models.BooleanField(db_index=True, default=False, help_text='\u9500\u552e\u5458\u662f\u5426\u53d1\u653e\u7ea2\u5305', verbose_name='is_clerk_send_redpack'),
29
+        ),
30
+    ]

+ 4 - 0
mch/models.py

@@ -165,6 +165,10 @@ class ModelInfo(BaseModelMixin):
165 165
     redpack_amount = models.IntegerField(_(u'redpack_amount'), default=0, help_text=u'红包固定金额,单位:分')
166 166
     redpack_max_amount = models.IntegerField(_(u'redpack_max_amount'), default=0, help_text=u'红包金额范围,单位:分)')
167 167
 
168
+    is_clerk_send_redpack = models.BooleanField(_(u'is_clerk_send_redpack'), default=False, help_text=u'销售员是否发放红包', db_index=True)
169
+    clerk_redpack_amount = models.IntegerField(_(u'clerk_redpack_amount'), default=0, help_text=u'销售员红包固定金额,单位:分')
170
+    clerk_redpack_max_amount = models.IntegerField(_(u'clerk_redpack_max_amount'), default=0, help_text=u'销售员红包金额范围,单位:分)')
171
+
168 172
     position = models.IntegerField(_(u'position'), default=1, help_text=u'排序')
169 173
 
170 174
     display = models.BooleanField(_(u'display'), default=True, help_text=_(u'Display'), db_index=True)

+ 29 - 0
page/sale_views.py

@@ -2,6 +2,8 @@
2 2
 
3 3
 from __future__ import division
4 4
 
5
+import random
6
+
5 7
 from django.conf import settings
6 8
 from django.db import transaction
7 9
 from django_logit import logit
@@ -10,6 +12,7 @@ from paginator import pagination
10 12
 from TimeConvert import TimeConvert as tc
11 13
 
12 14
 from api.encrypt_views import decrypt
15
+from api.hb_views import exec_clerk_send_jsapi_hb
13 16
 from account.models import UserInfo
14 17
 from logs.models import MchInfoDecryptLogInfo, MchInfoEncryptLogInfo
15 18
 from integral.models import SaleclerkIntegralIncomeExpensesInfo, SaleclerkSubmitLogInfo
@@ -21,6 +24,8 @@ from utils.algorithm.caesar import caesar_decrypt
21 24
 from utils.algorithm.rsalg import rsa_decrypt
22 25
 from utils.error.errno_utils import (ProductBrandStatusCode, ProductDistributorStatusCode, ProductModelStatusCode,
23 26
                                      SaleclerkStatusCode)
27
+from utils.redis.connect import r
28
+from utils.redis.rkeys import REDPACK_WAITING_SEND_LIST
24 29
 
25 30
 
26 31
 # CIPHER_ALGORITHM = ('CAESAR', 'B64', 'RSA')
@@ -681,6 +686,30 @@ def clerk_sale_submit_api(request):
681 686
         sssi.num += 1
682 687
         sssi.save()
683 688
 
689
+    # 重复上传执行不到此处,为了下面的统一,这里直接赋值
690
+    dupload = False
691
+
692
+    try:
693
+        elog = MchInfoEncryptLogInfo.objects.select_for_update().get(sn=serialNo)
694
+    except MchInfoEncryptLogInfo.DoesNotExist:
695
+        elog = None
696
+    except MchInfoEncryptLogInfo.MultipleObjectsReturned:
697
+        elog = None
698
+
699
+    if elog and (not dupload) and elog.is_clerk_send_redpack and (not elog.has_clerk_send_redpack) and (elog.clerk_redpack_amount or elog.clerk_redpack_max_amount):
700
+        amount = elog.clerk_redpack_amount
701
+        if elog.clerk_redpack_max_amount:
702
+            amount = random.randint(100, elog.clerk_redpack_max_amount)
703
+        if user.openid:
704
+            exec_clerk_send_jsapi_hb(user, elog, amount)
705
+        else:
706
+            r.rpushjson(REDPACK_WAITING_SEND_LIST, {
707
+                'sn': serialNo,
708
+                'user_id': user.user_id,
709
+                'amount': amount,
710
+                'is_clerk': 1,
711
+            })
712
+
684 713
     return response(200, data={
685 714
         'integral': integral,
686 715
         'total_integral': clerk.integral,

adminSystem - Gogs: Go Git Service

暫無描述

borderTopLeftRadius.js 274B

    'use strict'; module.exports.definition = { set: function (v) { this._setProperty('border-top-left-radius', v); }, get: function () { return this.getPropertyValue('border-top-left-radius'); }, enumerable: true, configurable: true };