Statistic

Brightcells 7 年 前
コミット
4efb7f6f87
共有15 個のファイルを変更した245 個の追加22 個の削除を含む
  1. 4 0
      kodo/settings.py
  2. 16 0
      page/sale_views.py
  3. 0 0
      pre/__init__.py
  4. 7 0
      pre/admin.py
  5. 8 0
      pre/apps.py
  6. 0 0
      pre/migrations/__init__.py
  7. 7 0
      pre/models.py
  8. 7 0
      pre/tests.py
  9. 67 0
      pre/views.py
  10. 3 3
      requirements.txt
  11. 37 2
      statistic/admin.py
  12. 32 0
      statistic/migrations/0002_provincesalestatisticinfo.py
  13. 32 6
      statistic/models.py
  14. 18 11
      statistic/views.py
  15. 7 0
      utils/rdm_utils.py

+ 4 - 0
kodo/settings.py

@@ -60,6 +60,7 @@ INSTALLED_APPS = (
60 60
     'page',
61 61
     'pay',
62 62
     'photo',
63
+    'pre',
63 64
     'product',
64 65
     'server',
65 66
     'statistic',
@@ -363,6 +364,9 @@ DISABLE_ACTION = False
363 364
 # Django-Logit Settings
364 365
 DJANGO_LOGIT_ENABLED = True
365 366
 
367
+# Test Settings
368
+DEBUG_DATA_FLAG = False
369
+
366 370
 try:
367 371
     from local_settings import *
368 372
 except ImportError:

+ 16 - 0
page/sale_views.py

@@ -150,6 +150,14 @@ def clerk_sale_submit_api(request):
150 150
         mssi.num += 1
151 151
         mssi.save()
152 152
 
153
+        mssi2, _ = ModelSaleStatisticInfo.objects.select_for_update().get_or_create(
154
+            model_id=modelID,
155
+            ymd='0',
156
+        )
157
+        mssi2.model_name = model.model_name
158
+        mssi2.num += 1
159
+        mssi2.save()
160
+
153 161
         # 经销商销量统计
154 162
         dssi, _ = DistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
155 163
             distributor_id=distributorID,
@@ -159,6 +167,14 @@ def clerk_sale_submit_api(request):
159 167
         dssi.num += 1
160 168
         dssi.save()
161 169
 
170
+        dssi2, _ = DistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
171
+            distributor_id=distributorID,
172
+            ymd='0',
173
+        )
174
+        dssi2.distributor_name = distributor.distributor_name
175
+        dssi2.num += 1
176
+        dssi2.save()
177
+
162 178
     return response(200, data={
163 179
         'integral': integral,
164 180
         'total_integral': clerk.integral,

+ 0 - 0
pre/__init__.py


+ 7 - 0
pre/admin.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.contrib import admin
5
+
6
+
7
+# Register your models here.

+ 8 - 0
pre/apps.py

@@ -0,0 +1,8 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.apps import AppConfig
5
+
6
+
7
+class PreConfig(AppConfig):
8
+    name = 'pre'

+ 0 - 0
pre/migrations/__init__.py


+ 7 - 0
pre/models.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models
5
+
6
+
7
+# Create your models here.

+ 7 - 0
pre/tests.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.test import TestCase
5
+
6
+
7
+# Create your tests here.

+ 67 - 0
pre/views.py

@@ -0,0 +1,67 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+from mch.models import DistributorInfo, ModelInfo
6
+from statistic.models import DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo
7
+
8
+
9
+PROVINCE_LIST = {
10
+    "110000": "北京市",
11
+    "120000": "天津市",
12
+    "130000": "河北省",
13
+    "140000": "山西省",
14
+    "150000": "内蒙古自治区",
15
+    "210000": "辽宁省",
16
+    "220000": "吉林省",
17
+    "230000": "黑龙江省",
18
+    "310000": "上海市",
19
+    "320000": "江苏省",
20
+    "330000": "浙江省",
21
+    "340000": "安徽省",
22
+    "350000": "福建省",
23
+    "360000": "江西省",
24
+    "370000": "山东省",
25
+    "410000": "河南省",
26
+    "420000": "湖北省",
27
+    "430000": "湖南省",
28
+    "440000": "广东省",
29
+    "450000": "广西壮族自治区",
30
+    "460000": "海南省",
31
+    "500000": "重庆市",
32
+    "510000": "四川省",
33
+    "520000": "贵州省",
34
+    "530000": "云南省",
35
+    "540000": "西藏自治区",
36
+    "610000": "陕西省",
37
+    "620000": "甘肃省",
38
+    "630000": "青海省",
39
+    "640000": "宁夏回族自治区",
40
+    "650000": "新疆维吾尔自治区",
41
+    "710000": "台湾省",
42
+    "810000": "香港特别行政区",
43
+    "820000": "澳门特别行政区"
44
+}
45
+
46
+
47
+def pre_provinces():
48
+    for pcode, pname in PROVINCE_LIST.items():
49
+        pssi, created = ProvinceSaleStatisticInfo.objects.get_or_create(province_code=pcode, ymd='0')
50
+        pssi.province_name = pname
51
+        pssi.save()
52
+
53
+
54
+def pre_models():
55
+    models = ModelInfo.objects.filter(status=True)
56
+    for mdl in models:
57
+        mssi, created = ModelSaleStatisticInfo.objects.get_or_create(model_id=mdl.model_id, ymd='0')
58
+        mssi.model_name = mdl.model_name
59
+        mssi.save()
60
+
61
+
62
+def pre_distributors():
63
+    distributors = DistributorInfo.objects.filter(status=True)
64
+    for dtbt in distributors:
65
+        dssi, created = DistributorSaleStatisticInfo.objects.get_or_create(distributor_id=dtbt.distributor_id, ymd='0')
66
+        dssi.distributor_name = dtbt.distributor_name
67
+        dssi.save()

+ 3 - 3
requirements.txt

@@ -9,7 +9,7 @@ django-admin==1.2.4
9 9
 django-curtail-uuid==1.0.4
10 10
 django-detect==1.0.5
11 11
 django-file-md5==1.0.2
12
-django-file-upload==1.0.2
12
+django-file-upload==1.0.5
13 13
 django-ip==1.0.2
14 14
 django-json-render==1.0.0
15 15
 django-json-response==1.1.5
@@ -24,7 +24,7 @@ django-rlog==1.0.7
24 24
 django-shortuuidfield==0.1.3
25 25
 django-six==1.0.4
26 26
 django-uniapi==1.0.1
27
-django-we==1.2.9
27
+django-we==1.3.0
28 28
 djangorestframework==3.7.7
29 29
 furl==1.0.1
30 30
 hiredis==0.2.0
@@ -40,7 +40,7 @@ pywe-pay==1.0.11
40 40
 pywe-pay-notify==1.0.4
41 41
 pywe-response==1.0.1
42 42
 pywe-sign==1.0.8
43
-pywe-xml==1.0.3
43
+pywe-xml==1.0.6
44 44
 qiniu==7.2.0
45 45
 redis==2.10.6
46 46
 redis-extensions==1.2.1

+ 37 - 2
statistic/admin.py

@@ -1,7 +1,42 @@
1 1
 # -*- coding: utf-8 -*-
2
-from __future__ import unicode_literals
3 2
 
4 3
 from django.contrib import admin
4
+from django_admin import ReadOnlyModelAdmin
5 5
 
6
+from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,
7
+                              RegisterStatisticInfo, SaleStatisticInfo)
6 8
 
7
-# Register your models here.
9
+
10
+class RegisterStatisticInfoAdmin(admin.ModelAdmin):
11
+    list_display = ('ymd', 'num', 'status', 'created_at', 'updated_at')
12
+    search_fields = ('ymd', )
13
+
14
+
15
+class SaleStatisticInfoAdmin(admin.ModelAdmin):
16
+    list_display = ('ymd', 'num', 'status', 'created_at', 'updated_at')
17
+    search_fields = ('ymd', )
18
+
19
+
20
+class ModelSaleStatisticInfoAdmin(admin.ModelAdmin):
21
+    list_display = ('model_id', 'model_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
22
+    list_filter = ('model_name', 'status')
23
+    search_fields = ('model_id', 'model_name', 'ymd')
24
+
25
+
26
+class DistributorSaleStatisticInfoAdmin(admin.ModelAdmin):
27
+    list_display = ('distributor_id', 'distributor_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
28
+    list_filter = ('distributor_name', 'status')
29
+    search_fields = ('distributor_id', 'distributor_name', 'ymd')
30
+
31
+
32
+class ProvinceSaleStatisticInfoAdmin(admin.ModelAdmin):
33
+    list_display = ('province_code', 'province_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
34
+    list_filter = ('province_code', 'province_name', 'status')
35
+    search_fields = ('province_code', 'province_name', 'ymd')
36
+
37
+
38
+admin.site.register(RegisterStatisticInfo, RegisterStatisticInfoAdmin)
39
+admin.site.register(SaleStatisticInfo, SaleStatisticInfoAdmin)
40
+admin.site.register(ModelSaleStatisticInfo, ModelSaleStatisticInfoAdmin)
41
+admin.site.register(DistributorSaleStatisticInfo, DistributorSaleStatisticInfoAdmin)
42
+admin.site.register(ProvinceSaleStatisticInfo, ProvinceSaleStatisticInfoAdmin)

+ 32 - 0
statistic/migrations/0002_provincesalestatisticinfo.py

@@ -0,0 +1,32 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-04-25 04:59
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
+        ('statistic', '0001_initial'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.CreateModel(
16
+            name='ProvinceSaleStatisticInfo',
17
+            fields=[
18
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+                ('status', models.BooleanField(db_index=True, 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
+                ('province_code', models.CharField(db_index=True, help_text='\u7701\u4efd\u7f16\u7801', max_length=32, verbose_name='province_code')),
23
+                ('province_name', models.CharField(blank=True, help_text='\u7701\u4efd\u540d\u79f0', max_length=32, null=True, verbose_name='province_name')),
24
+                ('ymd', models.CharField(blank=True, db_index=True, help_text='\u5e74\u6708\u65e5', max_length=8, null=True, verbose_name='ymd')),
25
+                ('num', models.IntegerField(default=0, help_text='\u6570\u91cf', verbose_name='num')),
26
+            ],
27
+            options={
28
+                'verbose_name': '\u7701\u4efd\u9500\u91cf\u7edf\u8ba1',
29
+                'verbose_name_plural': '\u7701\u4efd\u9500\u91cf\u7edf\u8ba1',
30
+            },
31
+        ),
32
+    ]

+ 32 - 6
statistic/models.py

@@ -1,9 +1,12 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+from django.conf import settings
3 4
 from django.db import models
4 5
 from django.utils.translation import ugettext_lazy as _
5 6
 from django_models_ext import BaseModelMixin
6 7
 
8
+from utils.rdm_utils import randnum
9
+
7 10
 
8 11
 class RegisterStatisticInfo(BaseModelMixin):
9 12
     ymd = models.CharField(_(u'ymd'), max_length=8, blank=True, null=True, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d')
@@ -20,7 +23,7 @@ class RegisterStatisticInfo(BaseModelMixin):
20 23
     def data(self):
21 24
         return {
22 25
             'ymd': self.ymd,
23
-            'num': self.num,
26
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
24 27
         }
25 28
 
26 29
 
@@ -39,14 +42,14 @@ class SaleStatisticInfo(BaseModelMixin):
39 42
     def data(self):
40 43
         return {
41 44
             'ymd': self.ymd,
42
-            'num': self.num,
45
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
43 46
         }
44 47
 
45 48
 
46 49
 class ModelSaleStatisticInfo(BaseModelMixin):
47 50
     model_id = models.CharField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True)
48 51
     model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
49
-    ymd = models.CharField(_(u'ymd'), max_length=8, blank=True, null=True, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d')
52
+    ymd = models.CharField(_(u'ymd'), max_length=8, blank=True, null=True, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
50 53
     num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
51 54
 
52 55
     class Meta:
@@ -62,14 +65,14 @@ class ModelSaleStatisticInfo(BaseModelMixin):
62 65
             'model_id': self.model_id,
63 66
             'model_name': self.model_name,
64 67
             'ymd': self.ymd,
65
-            'num': self.num,
68
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
66 69
         }
67 70
 
68 71
 
69 72
 class DistributorSaleStatisticInfo(BaseModelMixin):
70 73
     distributor_id = models.CharField(_(u'distributor_id'), max_length=32, help_text=u'经销商唯一标识', db_index=True)
71 74
     distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称')
72
-    ymd = models.CharField(_(u'ymd'), max_length=8, blank=True, null=True, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d')
75
+    ymd = models.CharField(_(u'ymd'), max_length=8, blank=True, null=True, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
73 76
     num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
74 77
 
75 78
     class Meta:
@@ -85,5 +88,28 @@ class DistributorSaleStatisticInfo(BaseModelMixin):
85 88
             'distributor_id': self.distributor_id,
86 89
             'distributor_name': self.distributor_name,
87 90
             'ymd': self.ymd,
88
-            'num': self.num,
91
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
92
+        }
93
+
94
+
95
+class ProvinceSaleStatisticInfo(BaseModelMixin):
96
+    province_code = models.CharField(_(u'province_code'), max_length=32, help_text=u'省份编码', db_index=True)
97
+    province_name = models.CharField(_(u'province_name'), max_length=32, blank=True, null=True, help_text=u'省份名称')
98
+    ymd = models.CharField(_(u'ymd'), max_length=8, blank=True, null=True, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
99
+    num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
100
+
101
+    class Meta:
102
+        verbose_name = _(u'省份销量统计')
103
+        verbose_name_plural = _(u'省份销量统计')
104
+
105
+    def __unicode__(self):
106
+        return unicode(self.pk)
107
+
108
+    @property
109
+    def data(self):
110
+        return {
111
+            'province_code': self.province_code,
112
+            'province_name': self.province_name,
113
+            'ymd': self.ymd,
114
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
89 115
         }

+ 18 - 11
statistic/views.py

@@ -1,11 +1,13 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+from django.conf import settings
3 4
 from django_logit import logit
4 5
 from django_response import response
5 6
 from TimeConvert import TimeConvert as tc
6 7
 
7
-from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, RegisterStatisticInfo,
8
-                              SaleStatisticInfo)
8
+from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,
9
+                              RegisterStatisticInfo, SaleStatisticInfo)
10
+from utils.rdm_utils import randnum
9 11
 
10 12
 
11 13
 @logit
@@ -25,7 +27,7 @@ def tj_data(request):
25 27
     # 销量统计 & 今日销量
26 28
     try:
27 29
         sale_num = SaleStatisticInfo.objects.get(ymd=ymd).num
28
-    except RegisterStatisticInfo.DoesNotExist:
30
+    except SaleStatisticInfo.DoesNotExist:
29 31
         sale_num = 0
30 32
 
31 33
     # 商品销量趋势
@@ -33,18 +35,23 @@ def tj_data(request):
33 35
     sale_trends = [s.data for s in sale_trends]
34 36
 
35 37
     # 型号销量统计 & 热销商品榜
36
-    model_sales = ModelSaleStatisticInfo.objects.filter(status=True).order_by('-num')[:3]
38
+    model_sales = ModelSaleStatisticInfo.objects.filter(ymd='0', status=True).order_by('-num')[:3]
37 39
     model_sales = [m.data for m in model_sales]
38 40
 
39 41
     # 经销商销量统计 & 经销商榜
40
-    distributor_sales = DistributorSaleStatisticInfo.objects.filter(status=True).order_by('-num')[:3]
42
+    distributor_sales = DistributorSaleStatisticInfo.objects.filter(ymd='0', status=True).order_by('-num')[:3]
41 43
     distributor_sales = [d.data for d in distributor_sales]
42 44
 
45
+    # 各地区实时销量
46
+    province_sales = ProvinceSaleStatisticInfo.objects.filter(ymd='0', status=True).order_by('-num')[:3]
47
+    province_sales = [p.data for p in province_sales]
48
+
43 49
     return response(200, 'Get TJ Data Success', u'获取统计数据成功', {
44
-        'register_num': register_num,
45
-        'register_trends': register_trends,
46
-        'sale_num': sale_num,
47
-        'sale_trends': sale_trends,
48
-        'model_sales': model_sales,
49
-        'distributor_sales': distributor_sales,
50
+        'register_num': randnum() if settings.DEBUG_DATA_FLAG else register_num,  # 注册用户统计 & 今日注册用户
51
+        'register_trends': register_trends,  # 注册用户数趋势
52
+        'sale_num': randnum() if settings.DEBUG_DATA_FLAG else sale_num,  # 销量统计 & 今日销量
53
+        'sale_trends': sale_trends,  # 商品销量趋势
54
+        'model_sales': model_sales,  # 型号销量统计 & 热销商品榜
55
+        'distributor_sales': distributor_sales,  # 经销商销量统计 & 经销商榜
56
+        'province_sales': province_sales,  # 各地区实时销量
50 57
     })

+ 7 - 0
utils/rdm_utils.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import random
4
+
5
+
6
+def randnum(sflag=100, eflag=1000):
7
+    return random.randint(sflag, eflag)