Statistic

Brightcells 7 years ago
parent
commit
537c495621

+ 1 - 0
api/encrypt_views.py

@@ -83,6 +83,7 @@ def decrypt(request):
83 83
         'logo_url': brand.brand_logo_url if brand else '',
84 84
         'model_imgs': model.images if model else [],
85 85
         'goodsInfo': {
86
+            'BrandID': brand_pk,
86 87
             'Brand': brand.brand_name if brand else '',
87 88
             'ModelID': model_pk,
88 89
             'Model': (model.model_full_name or model.model_name) if model else '',

+ 112 - 1
api/mch_views.py

@@ -8,10 +8,14 @@ from django_logit import logit
8 8
 from django_response import response
9 9
 from pywe_miniapp import get_phone_number
10 10
 from pywe_storage import RedisStorage
11
+from TimeConvert import TimeConvert as tc
11 12
 
12 13
 from account.models import UserInfo
13 14
 from mch.models import BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, ModelInfo, OperatorInfo
14
-from utils.error.errno_utils import OperatorStatusCode, UserStatusCode
15
+from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
16
+                              ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo)
17
+from utils.error.errno_utils import (OperatorStatusCode, ProductBrandStatusCode, ProductDistributorStatusCode,
18
+                                     ProductModelStatusCode, SaleclerkStatusCode, UserStatusCode)
15 19
 from utils.redis.connect import r
16 20
 
17 21
 
@@ -153,6 +157,9 @@ def consumer_info_api(request):
153 157
     encryptedData = request.POST.get('encryptedData', '')
154 158
     lat = request.POST.get('lat', '')
155 159
     lon = request.POST.get('lon', '')
160
+    brandID = request.POST.get('BrandID', '')
161
+    modelID = request.POST.get('ModelID', '')
162
+    distributorID = request.POST.get('DistributorID', '')
156 163
     serialNo = request.POST.get('SerialNo', '')
157 164
     verifyResult = request.POST.get('verifyResult', '')
158 165
     purePhoneNumber = request.POST.get('purePhoneNumber', '')
@@ -169,6 +176,27 @@ def consumer_info_api(request):
169 176
     user.phone = purePhoneNumber
170 177
     user.save()
171 178
 
179
+    try:
180
+        brand = BrandInfo.objects.get(pk=brandID)
181
+    except BrandInfo.DoesNotExist:
182
+        return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
183
+    except ValueError:
184
+        return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
185
+
186
+    try:
187
+        model = ModelInfo.objects.get(pk=modelID)
188
+    except ModelInfo.DoesNotExist:
189
+        return response(ProductModelStatusCode.MODEL_NOT_FOUND)
190
+    except ValueError:
191
+        return response(ProductModelStatusCode.MODEL_NOT_FOUND)
192
+
193
+    try:
194
+        distributor = DistributorInfo.objects.get(pk=distributorID)
195
+    except DistributorInfo.DoesNotExist:
196
+        return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)
197
+    except ValueError:
198
+        return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)
199
+
172 200
     # 记录用户信息提交记录
173 201
     ConsumeInfoSubmitLogInfo.objects.create(
174 202
         user_id=user_id,
@@ -177,9 +205,92 @@ def consumer_info_api(request):
177 205
         encryptedData=encryptedData,
178 206
         lat=lat,
179 207
         lon=lon,
208
+        brand_id=brand.brand_id,
209
+        brand_name=brand.brand_name,
210
+        model_id=model.model_id,
211
+        model_name=model.model_name,
212
+        distributor_id=distributor.distributor_id,
213
+        distributor_name=distributor.distributor_name,
180 214
         serialNo=serialNo,
181 215
         verifyResult=verifyResult,
182 216
         test_user=user.test_user,
183 217
     )
184 218
 
219
+    if not user.test_user:
220
+        # TODO: Make statistic async
221
+        if ConsumeInfoSubmitLogInfo.objects.filter(
222
+            brand_id=brand.brand_id,
223
+            model_id=model.model_id,
224
+            distributor_id=distributor.distributor_id,
225
+            serialNo=serialNo,
226
+            verifyResult=1,
227
+            test_user=False,
228
+        ).count() == 1:
229
+            ymd = int(tc.local_string(format='%Y%m%d'))
230
+
231
+            # 销量统计
232
+            ssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create(
233
+                brand_id=brand.brand_id,
234
+                ymd=ymd,
235
+            )
236
+            ssi.num += 1
237
+            ssi.save()
238
+
239
+            # 型号销量统计
240
+            mssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
241
+                brand_id=brand.brand_id,
242
+                model_id=model.model_id,
243
+                ymd=ymd,
244
+            )
245
+            mssi.model_name = model.model_name
246
+            mssi.num += 1
247
+            mssi.save()
248
+
249
+            mssi2, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
250
+                brand_id=brand.brand_id,
251
+                model_id=model.model_id,
252
+                ymd=0,
253
+            )
254
+            mssi2.model_name = model.model_name
255
+            mssi2.num += 1
256
+            mssi2.save()
257
+
258
+            # 经销商销量统计
259
+            dssi, _ = ConsumeDistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
260
+                brand_id=brand.brand_id,
261
+                distributor_id=distributor.distributor_id,
262
+                ymd=ymd,
263
+            )
264
+            dssi.distributor_name = distributor.distributor_name
265
+            dssi.num += 1
266
+            dssi.save()
267
+
268
+            dssi2, _ = ConsumeDistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
269
+                brand_id=brand.brand_id,
270
+                distributor_id=distributor.distributor_id,
271
+                ymd=0,
272
+            )
273
+            dssi2.distributor_name = distributor.distributor_name
274
+            dssi2.num += 1
275
+            dssi2.save()
276
+
277
+            # 省份销量统计
278
+            pssi, _ = ConsumeProvinceSaleStatisticInfo.objects.select_for_update().get_or_create(
279
+                brand_id=brand.brand_id,
280
+                province_code=distributor.distributor_province_code,
281
+                ymd=ymd,
282
+            )
283
+            pssi.province_name = distributor.distributor_province_name
284
+            pssi.num += 1
285
+            pssi.save()
286
+
287
+            pssi2, _ = ConsumeProvinceSaleStatisticInfo.objects.select_for_update().get_or_create(
288
+                brand_id=brand.brand_id,
289
+                province_code=distributor.distributor_province_code,
290
+                ymd=0,
291
+            )
292
+            pssi2.province_name = distributor.distributor_province_name
293
+            pssi2.num += 1
294
+            pssi2.save()
295
+
185 296
     return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功')

+ 3 - 1
api/urls.py

@@ -227,6 +227,8 @@ urlpatterns += [
227 227
 ]
228 228
 
229 229
 urlpatterns += [
230
-    url(r'^tj$', tj_views.tj_data, name='tj_data'),  # 统计数据
230
+    url(r'^tj$', tj_views.tj_distributor, name='tj_distributor_old'),  # 统计数据(经销商维度)
231
+    url(r'^tj/distributor$', tj_views.tj_distributor, name='tj_distributor'),  # 统计数据(经销商维度)
232
+    url(r'^tj/consumer$', tj_views.tj_consumer, name='tj_consumer'),  # 统计数据(消费者维度)
231 233
     url(r'^tj/generate$', tj_views.tj_generate, name='tj_generate'),  # 统计数据生成
232 234
 ]

+ 50 - 0
integral/migrations/0006_auto_20180508_1830.py

@@ -0,0 +1,50 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-05-08 10:30
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
+        ('integral', '0005_saleclerksubmitloginfo_dupload'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='saleclerkintegralincomeexpensesinfo',
17
+            name='brand_id',
18
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='saleclerkintegralincomeexpensesinfo',
22
+            name='brand_name',
23
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
24
+        ),
25
+        migrations.AddField(
26
+            model_name='saleclerkintegralincomeexpensesinfo',
27
+            name='distributor_id',
28
+            field=models.CharField(blank=True, db_index=True, help_text='\u7ecf\u9500\u5546\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='distributor_id'),
29
+        ),
30
+        migrations.AddField(
31
+            model_name='saleclerkintegralincomeexpensesinfo',
32
+            name='distributor_name',
33
+            field=models.CharField(blank=True, help_text='\u7ecf\u9500\u5546\u540d\u79f0', max_length=255, null=True, verbose_name='distributor_name'),
34
+        ),
35
+        migrations.AddField(
36
+            model_name='saleclerksubmitloginfo',
37
+            name='brand_pk',
38
+            field=models.IntegerField(db_index=True, default=0, help_text='\u54c1\u724cPK', verbose_name='brand_pk'),
39
+        ),
40
+        migrations.AddField(
41
+            model_name='saleclerksubmitloginfo',
42
+            name='distributor_pk',
43
+            field=models.IntegerField(db_index=True, default=0, help_text='\u7ecf\u9500\u5546PK', verbose_name='distributor_pk'),
44
+        ),
45
+        migrations.AddField(
46
+            model_name='saleclerksubmitloginfo',
47
+            name='model_pk',
48
+            field=models.IntegerField(db_index=True, default=0, help_text='\u578b\u53f7PK', verbose_name='model_pk'),
49
+        ),
50
+    ]

+ 10 - 0
integral/models.py

@@ -21,9 +21,15 @@ class SaleclerkIntegralIncomeExpensesInfo(BaseModelMixin):
21 21
 
22 22
     type = models.IntegerField(_(u'type'), choices=TYPE, default=INCOME, help_text=u'收支类别', db_index=True)
23 23
 
24
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
25
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
26
+
24 27
     model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True)
25 28
     model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
26 29
 
30
+    distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True)
31
+    distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称')
32
+
27 33
     code = models.CharField(_(u'code'), max_length=32, blank=True, null=True, help_text=u'机身码', db_index=True)
28 34
 
29 35
     consumer_name = models.CharField(_(u'consumer_name'), max_length=32, blank=True, null=True, help_text=u'消费者姓名')
@@ -63,6 +69,10 @@ class SaleclerkSubmitLogInfo(BaseModelMixin):
63 69
     franchiser_id = models.CharField(_(u'franchiser_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True)
64 70
     clerk_id = models.CharField(_(u'clerk_id'), max_length=32, blank=True, null=True, help_text=u'店员唯一标识', db_index=True)
65 71
 
72
+    brand_pk = models.IntegerField(_(u'brand_pk'), default=0, help_text=u'品牌PK', db_index=True)
73
+    model_pk = models.IntegerField(_(u'model_pk'), default=0, help_text=u'型号PK', db_index=True)
74
+    distributor_pk = models.IntegerField(_(u'distributor_pk'), default=0, help_text=u'经销商PK', db_index=True)
75
+
66 76
     code = models.CharField(_(u'code'), max_length=32, blank=True, null=True, help_text=u'机身码', db_index=True)
67 77
 
68 78
     consumer_name = models.CharField(_(u'consumer_name'), max_length=32, blank=True, null=True, help_text=u'消费者姓名')

+ 1 - 1
mch/admin.py

@@ -165,6 +165,6 @@ admin.site.register(BrandInfo, BrandInfoAdmin)
165 165
 admin.site.register(ModelInfo, ModelInfoAdmin)
166 166
 # admin.site.register(ModelImageInfo, ModelImageInfoAdmin)
167 167
 admin.site.register(DistributorInfo, DistributorInfoAdmin)
168
-admin.site.register(BrandModelDistributorPriceInfo, BrandModelDistributorPriceInfoAdmin)
168
+# admin.site.register(BrandModelDistributorPriceInfo, BrandModelDistributorPriceInfoAdmin)
169 169
 admin.site.register(LatestAppInfo, LatestAppInfoAdmin)
170 170
 admin.site.register(ConsumeInfoSubmitLogInfo, ConsumeInfoSubmitLogInfoAdmin)

+ 49 - 0
mch/migrations/0017_auto_20180508_1830.py

@@ -0,0 +1,49 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-05-08 10:30
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', '0016_auto_20180508_1507'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AlterModelOptions(
16
+            name='brandmodeldistributorpriceinfo',
17
+            options={'verbose_name': '\u54c1\u724c/\u578b\u53f7/\u4ee3\u7406\u5546\u4ef7\u683c\u4fe1\u606f', 'verbose_name_plural': '\u54c1\u724c/\u578b\u53f7/\u4ee3\u7406\u5546\u4ef7\u683c\u4fe1\u606f'},
18
+        ),
19
+        migrations.AddField(
20
+            model_name='consumeinfosubmitloginfo',
21
+            name='brand_id',
22
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
23
+        ),
24
+        migrations.AddField(
25
+            model_name='consumeinfosubmitloginfo',
26
+            name='brand_name',
27
+            field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'),
28
+        ),
29
+        migrations.AddField(
30
+            model_name='consumeinfosubmitloginfo',
31
+            name='distributor_id',
32
+            field=models.CharField(blank=True, db_index=True, help_text='\u7ecf\u9500\u5546\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='distributor_id'),
33
+        ),
34
+        migrations.AddField(
35
+            model_name='consumeinfosubmitloginfo',
36
+            name='distributor_name',
37
+            field=models.CharField(blank=True, help_text='\u7ecf\u9500\u5546\u540d\u79f0', max_length=255, null=True, verbose_name='distributor_name'),
38
+        ),
39
+        migrations.AddField(
40
+            model_name='consumeinfosubmitloginfo',
41
+            name='model_id',
42
+            field=models.CharField(blank=True, db_index=True, help_text='\u578b\u53f7\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='model_id'),
43
+        ),
44
+        migrations.AddField(
45
+            model_name='consumeinfosubmitloginfo',
46
+            name='model_name',
47
+            field=models.CharField(blank=True, help_text='\u578b\u53f7\u540d\u79f0', max_length=255, null=True, verbose_name='model_name'),
48
+        ),
49
+    ]

+ 9 - 0
mch/models.py

@@ -281,6 +281,15 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):
281 281
     lat = models.FloatField(_(u'lat'), default=1.0, help_text=u'纬度')
282 282
     lon = models.FloatField(_(u'lon'), default=1.0, help_text=u'经度')
283 283
 
284
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
285
+    brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
286
+
287
+    model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True)
288
+    model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
289
+
290
+    distributor_id = models.CharField(_(u'distributor_id'), max_length=32, blank=True, null=True, help_text=u'经销商唯一标识', db_index=True)
291
+    distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称')
292
+
284 293
     serialNo = models.CharField(_(u'serialNo'), max_length=16, blank=True, null=True, help_text=u'序列号', db_index=True)
285 294
 
286 295
     verifyResult = models.IntegerField(_(u'verifyResult'), default=0, help_text=u'验证结果')

+ 25 - 2
page/sale_views.py

@@ -12,11 +12,12 @@ from TimeConvert import TimeConvert as tc
12 12
 
13 13
 from account.models import SaleclerkInfo, UserInfo
14 14
 from integral.models import SaleclerkIntegralIncomeExpensesInfo, SaleclerkSubmitLogInfo
15
-from mch.models import DistributorInfo, ModelInfo
15
+from mch.models import BrandInfo, DistributorInfo, ModelInfo
16 16
 from product.models import ProductModelInfo
17 17
 from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,
18 18
                               SaleStatisticInfo)
19
-from utils.error.errno_utils import ProductDistributorStatusCode, ProductModelStatusCode, SaleclerkStatusCode
19
+from utils.error.errno_utils import (ProductBrandStatusCode, ProductDistributorStatusCode, ProductModelStatusCode,
20
+                                     SaleclerkStatusCode)
20 21
 
21 22
 
22 23
 def clerk_sale_oauth(request):
@@ -45,6 +46,7 @@ def clerk_sale_submit_api(request):
45 46
     encryptedData = request.POST.get('encryptedData', '')
46 47
     lat = float(request.POST.get('lat', 0))
47 48
     lon = float(request.POST.get('lon', 0))
49
+    brandID = request.POST.get('BrandID', '')
48 50
     modelID = request.POST.get('ModelID', '')
49 51
     distributorID = request.POST.get('DistributorID', '')
50 52
     serialNo = request.POST.get('SerialNo', '')
@@ -69,6 +71,9 @@ def clerk_sale_submit_api(request):
69 71
     ssli = SaleclerkSubmitLogInfo.objects.create(
70 72
         franchiser_id=clerk.franchiser_id,
71 73
         clerk_id=clerk.clerk_id,
74
+        brand_pk=brandID,
75
+        model_pk=modelID,
76
+        distributor_pk=distributorID,
72 77
         code=serialNo,
73 78
         consumer_name=consumer_name,
74 79
         consumer_phone=consumer_phone,
@@ -99,6 +104,13 @@ def clerk_sale_submit_api(request):
99 104
 
100 105
     # 店员积分
101 106
     try:
107
+        brand = BrandInfo.objects.get(pk=brandID)
108
+    except BrandInfo.DoesNotExist:
109
+        return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
110
+    except ValueError:
111
+        return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
112
+
113
+    try:
102 114
         model = ModelInfo.objects.get(pk=modelID)
103 115
     except ModelInfo.DoesNotExist:
104 116
         return response(ProductModelStatusCode.MODEL_NOT_FOUND)
@@ -123,8 +135,12 @@ def clerk_sale_submit_api(request):
123 135
         franchiser_id=clerk.franchiser_id,
124 136
         clerk_id=clerk.clerk_id,
125 137
         type=SaleclerkIntegralIncomeExpensesInfo.INCOME,
138
+        brand_id=brand.brand_id,
139
+        brand_name=brand.brand_name,
126 140
         model_id=model.model_id,
127 141
         model_name=model.model_name,
142
+        distributor_id=distributor.distributor_id,
143
+        distributor_name=distributor.distributor_name,
128 144
         code=serialNo,
129 145
         consumer_name=consumer_name,
130 146
         consumer_phone=consumer_phone,
@@ -142,6 +158,7 @@ def clerk_sale_submit_api(request):
142 158
 
143 159
         # 销量统计
144 160
         ssi, _ = SaleStatisticInfo.objects.select_for_update().get_or_create(
161
+            brand_id=brand.brand_id,
145 162
             ymd=ymd,
146 163
         )
147 164
         ssi.num += 1
@@ -149,6 +166,7 @@ def clerk_sale_submit_api(request):
149 166
 
150 167
         # 型号销量统计
151 168
         mssi, _ = ModelSaleStatisticInfo.objects.select_for_update().get_or_create(
169
+            brand_id=brand.brand_id,
152 170
             model_id=model.model_id,
153 171
             ymd=ymd,
154 172
         )
@@ -157,6 +175,7 @@ def clerk_sale_submit_api(request):
157 175
         mssi.save()
158 176
 
159 177
         mssi2, _ = ModelSaleStatisticInfo.objects.select_for_update().get_or_create(
178
+            brand_id=brand.brand_id,
160 179
             model_id=model.model_id,
161 180
             ymd=0,
162 181
         )
@@ -166,6 +185,7 @@ def clerk_sale_submit_api(request):
166 185
 
167 186
         # 经销商销量统计
168 187
         dssi, _ = DistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
188
+            brand_id=brand.brand_id,
169 189
             distributor_id=distributor.distributor_id,
170 190
             ymd=ymd,
171 191
         )
@@ -174,6 +194,7 @@ def clerk_sale_submit_api(request):
174 194
         dssi.save()
175 195
 
176 196
         dssi2, _ = DistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
197
+            brand_id=brand.brand_id,
177 198
             distributor_id=distributor.distributor_id,
178 199
             ymd=0,
179 200
         )
@@ -183,6 +204,7 @@ def clerk_sale_submit_api(request):
183 204
 
184 205
         # 省份销量统计
185 206
         pssi, _ = ProvinceSaleStatisticInfo.objects.select_for_update().get_or_create(
207
+            brand_id=brand.brand_id,
186 208
             province_code=distributor.distributor_province_code,
187 209
             ymd=ymd,
188 210
         )
@@ -191,6 +213,7 @@ def clerk_sale_submit_api(request):
191 213
         pssi.save()
192 214
 
193 215
         pssi2, _ = ProvinceSaleStatisticInfo.objects.select_for_update().get_or_create(
216
+            brand_id=brand.brand_id,
194 217
             province_code=distributor.distributor_province_code,
195 218
             ymd=0,
196 219
         )

+ 49 - 15
statistic/admin.py

@@ -3,40 +3,74 @@
3 3
 from django.contrib import admin
4 4
 from django_admin import ReadOnlyModelAdmin
5 5
 
6
-from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,
7
-                              RegisterStatisticInfo, SaleStatisticInfo)
6
+from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
7
+                              ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo, DistributorSaleStatisticInfo,
8
+                              ModelSaleStatisticInfo, ProvinceSaleStatisticInfo, RegisterStatisticInfo,
9
+                              SaleStatisticInfo)
8 10
 
9 11
 
10 12
 class RegisterStatisticInfoAdmin(admin.ModelAdmin):
11
-    list_display = ('ymd', 'num', 'status', 'created_at', 'updated_at')
12
-    search_fields = ('ymd', )
13
+    list_display = ('brand_id', 'ymd', 'num', 'status', 'created_at', 'updated_at')
14
+    list_filter = ('brand_id', 'status')
15
+    search_fields = ('brand_id', 'ymd')
13 16
 
14 17
 
15 18
 class SaleStatisticInfoAdmin(admin.ModelAdmin):
16
-    list_display = ('ymd', 'num', 'status', 'created_at', 'updated_at')
17
-    search_fields = ('ymd', )
19
+    list_display = ('brand_id', 'ymd', 'num', 'status', 'created_at', 'updated_at')
20
+    list_filter = ('brand_id', 'status')
21
+    search_fields = ('brand_id', 'ymd')
18 22
 
19 23
 
20 24
 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')
25
+    list_display = ('brand_id', 'model_id', 'model_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
26
+    list_filter = ('brand_id', 'model_name', 'status')
27
+    search_fields = ('brand_id', 'model_id', 'model_name', 'ymd')
24 28
 
25 29
 
26 30
 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')
31
+    list_display = ('brand_id', 'distributor_id', 'distributor_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
32
+    list_filter = ('brand_id', 'distributor_name', 'status')
33
+    search_fields = ('brand_id', 'distributor_id', 'distributor_name', 'ymd')
30 34
 
31 35
 
32 36
 class ProvinceSaleStatisticInfoAdmin(admin.ModelAdmin):
33
-    list_display = ('province_code', 'province_name', 'ymd', 'num', 'position', 'status', 'created_at', 'updated_at')
34
-    list_filter = ('province_code', 'province_name', 'status')
35
-    search_fields = ('province_code', 'province_name', 'ymd')
37
+    list_display = ('brand_id', 'province_code', 'province_name', 'ymd', 'num', 'position', 'status', 'created_at', 'updated_at')
38
+    list_filter = ('brand_id', 'province_code', 'province_name', 'status')
39
+    search_fields = ('brand_id', 'province_code', 'province_name', 'ymd')
40
+
41
+
42
+class ConsumeSaleStatisticInfoAdmin(admin.ModelAdmin):
43
+    list_display = ('brand_id', 'ymd', 'num', 'status', 'created_at', 'updated_at')
44
+    list_filter = ('brand_id', 'status')
45
+    search_fields = ('brand_id', 'ymd')
46
+
47
+
48
+class ConsumeModelSaleStatisticInfoAdmin(admin.ModelAdmin):
49
+    list_display = ('brand_id', 'model_id', 'model_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
50
+    list_filter = ('brand_id', 'model_name', 'status')
51
+    search_fields = ('brand_id', 'model_id', 'model_name', 'ymd')
52
+
53
+
54
+class ConsumeDistributorSaleStatisticInfoAdmin(admin.ModelAdmin):
55
+    list_display = ('brand_id', 'distributor_id', 'distributor_name', 'ymd', 'num', 'status', 'created_at', 'updated_at')
56
+    list_filter = ('brand_id', 'distributor_name', 'status')
57
+    search_fields = ('brand_id', 'distributor_id', 'distributor_name', 'ymd')
58
+
59
+
60
+class ConsumeProvinceSaleStatisticInfoAdmin(admin.ModelAdmin):
61
+    list_display = ('brand_id', 'province_code', 'province_name', 'ymd', 'num', 'position', 'status', 'created_at', 'updated_at')
62
+    list_filter = ('brand_id', 'province_code', 'province_name', 'status')
63
+    search_fields = ('brand_id', 'province_code', 'province_name', 'ymd')
36 64
 
37 65
 
38 66
 admin.site.register(RegisterStatisticInfo, RegisterStatisticInfoAdmin)
67
+
39 68
 admin.site.register(SaleStatisticInfo, SaleStatisticInfoAdmin)
40 69
 admin.site.register(ModelSaleStatisticInfo, ModelSaleStatisticInfoAdmin)
41 70
 admin.site.register(DistributorSaleStatisticInfo, DistributorSaleStatisticInfoAdmin)
42 71
 admin.site.register(ProvinceSaleStatisticInfo, ProvinceSaleStatisticInfoAdmin)
72
+
73
+admin.site.register(ConsumeSaleStatisticInfo, ConsumeSaleStatisticInfoAdmin)
74
+admin.site.register(ConsumeModelSaleStatisticInfo, ConsumeModelSaleStatisticInfoAdmin)
75
+admin.site.register(ConsumeDistributorSaleStatisticInfo, ConsumeDistributorSaleStatisticInfoAdmin)
76
+admin.site.register(ConsumeProvinceSaleStatisticInfo, ConsumeProvinceSaleStatisticInfoAdmin)

+ 111 - 0
statistic/migrations/0006_auto_20180508_1830.py

@@ -0,0 +1,111 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.11 on 2018-05-08 10:30
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', '0005_auto_20180508_1057'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.CreateModel(
16
+            name='ConsumeDistributorSaleStatisticInfo',
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
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')),
23
+                ('distributor_id', models.CharField(db_index=True, help_text='\u7ecf\u9500\u5546\u552f\u4e00\u6807\u8bc6', max_length=32, verbose_name='distributor_id')),
24
+                ('distributor_name', models.CharField(blank=True, help_text='\u7ecf\u9500\u5546\u540d\u79f0', max_length=255, null=True, verbose_name='distributor_name')),
25
+                ('ymd', models.IntegerField(db_index=True, default=0, help_text='\u5e74\u6708\u65e5', verbose_name='ymd')),
26
+                ('num', models.IntegerField(default=0, help_text='\u6570\u91cf', verbose_name='num')),
27
+            ],
28
+            options={
29
+                'verbose_name': '\u7ecf\u9500\u5546\u9500\u91cf\u7edf\u8ba1',
30
+                'verbose_name_plural': '\u7ecf\u9500\u5546\u9500\u91cf\u7edf\u8ba1',
31
+            },
32
+        ),
33
+        migrations.CreateModel(
34
+            name='ConsumeModelSaleStatisticInfo',
35
+            fields=[
36
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
37
+                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
38
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
39
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
40
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')),
41
+                ('model_id', models.CharField(db_index=True, help_text='\u578b\u53f7\u552f\u4e00\u6807\u8bc6', max_length=32, verbose_name='model_id')),
42
+                ('model_name', models.CharField(blank=True, help_text='\u578b\u53f7\u540d\u79f0', max_length=255, null=True, verbose_name='model_name')),
43
+                ('ymd', models.IntegerField(db_index=True, default=0, help_text='\u5e74\u6708\u65e5', verbose_name='ymd')),
44
+                ('num', models.IntegerField(default=0, help_text='\u6570\u91cf', verbose_name='num')),
45
+            ],
46
+            options={
47
+                'verbose_name': '\u578b\u53f7\u9500\u91cf\u7edf\u8ba1',
48
+                'verbose_name_plural': '\u578b\u53f7\u9500\u91cf\u7edf\u8ba1',
49
+            },
50
+        ),
51
+        migrations.CreateModel(
52
+            name='ConsumeProvinceSaleStatisticInfo',
53
+            fields=[
54
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
55
+                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
56
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
57
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
58
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')),
59
+                ('province_code', models.CharField(db_index=True, help_text='\u7701\u4efd\u7f16\u7801', max_length=6, verbose_name='province_code')),
60
+                ('province_name', models.CharField(blank=True, help_text='\u7701\u4efd\u540d\u79f0', max_length=3, null=True, verbose_name='province_name')),
61
+                ('ymd', models.IntegerField(db_index=True, default=0, help_text='\u5e74\u6708\u65e5', verbose_name='ymd')),
62
+                ('num', models.IntegerField(default=0, help_text='\u6570\u91cf', verbose_name='num')),
63
+                ('position', models.IntegerField(default=1, help_text='\u6392\u5e8f', verbose_name='position')),
64
+            ],
65
+            options={
66
+                'verbose_name': '\u7701\u4efd\u9500\u91cf\u7edf\u8ba1',
67
+                'verbose_name_plural': '\u7701\u4efd\u9500\u91cf\u7edf\u8ba1',
68
+            },
69
+        ),
70
+        migrations.CreateModel(
71
+            name='ConsumeSaleStatisticInfo',
72
+            fields=[
73
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
74
+                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
75
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
76
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
77
+                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')),
78
+                ('ymd', models.IntegerField(db_index=True, default=0, help_text='\u5e74\u6708\u65e5', verbose_name='ymd')),
79
+                ('num', models.IntegerField(default=0, help_text='\u6570\u91cf', verbose_name='num')),
80
+            ],
81
+            options={
82
+                'verbose_name': '\u9500\u91cf\u7edf\u8ba1',
83
+                'verbose_name_plural': '\u9500\u91cf\u7edf\u8ba1',
84
+            },
85
+        ),
86
+        migrations.AddField(
87
+            model_name='distributorsalestatisticinfo',
88
+            name='brand_id',
89
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
90
+        ),
91
+        migrations.AddField(
92
+            model_name='modelsalestatisticinfo',
93
+            name='brand_id',
94
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
95
+        ),
96
+        migrations.AddField(
97
+            model_name='provincesalestatisticinfo',
98
+            name='brand_id',
99
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
100
+        ),
101
+        migrations.AddField(
102
+            model_name='registerstatisticinfo',
103
+            name='brand_id',
104
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
105
+        ),
106
+        migrations.AddField(
107
+            model_name='salestatisticinfo',
108
+            name='brand_id',
109
+            field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'),
110
+        ),
111
+    ]

+ 105 - 0
statistic/models.py

@@ -9,6 +9,7 @@ from utils.rdm_utils import randnum
9 9
 
10 10
 
11 11
 class RegisterStatisticInfo(BaseModelMixin):
12
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
12 13
     ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d')
13 14
     num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
14 15
 
@@ -27,7 +28,11 @@ class RegisterStatisticInfo(BaseModelMixin):
27 28
         }
28 29
 
29 30
 
31
+# 经销商维度
32
+
33
+
30 34
 class SaleStatisticInfo(BaseModelMixin):
35
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
31 36
     ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d')
32 37
     num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
33 38
 
@@ -47,6 +52,7 @@ class SaleStatisticInfo(BaseModelMixin):
47 52
 
48 53
 
49 54
 class ModelSaleStatisticInfo(BaseModelMixin):
55
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
50 56
     model_id = models.CharField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True)
51 57
     model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
52 58
     ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
@@ -70,6 +76,7 @@ class ModelSaleStatisticInfo(BaseModelMixin):
70 76
 
71 77
 
72 78
 class DistributorSaleStatisticInfo(BaseModelMixin):
79
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
73 80
     distributor_id = models.CharField(_(u'distributor_id'), max_length=32, help_text=u'经销商唯一标识', db_index=True)
74 81
     distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称')
75 82
     ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
@@ -93,6 +100,104 @@ class DistributorSaleStatisticInfo(BaseModelMixin):
93 100
 
94 101
 
95 102
 class ProvinceSaleStatisticInfo(BaseModelMixin):
103
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
104
+    province_code = models.CharField(_(u'province_code'), max_length=6, help_text=u'省份编码', db_index=True)
105
+    province_name = models.CharField(_(u'province_name'), max_length=3, blank=True, null=True, help_text=u'省份名称')
106
+    ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
107
+    num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
108
+
109
+    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序')
110
+
111
+    class Meta:
112
+        verbose_name = _(u'省份销量统计')
113
+        verbose_name_plural = _(u'省份销量统计')
114
+
115
+    def __unicode__(self):
116
+        return unicode(self.pk)
117
+
118
+    @property
119
+    def data(self):
120
+        return {
121
+            'province_code': self.province_code,
122
+            'province_name': self.province_name,
123
+            'ymd': self.ymd,
124
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
125
+        }
126
+
127
+
128
+# 消费者维度
129
+
130
+
131
+class ConsumeSaleStatisticInfo(BaseModelMixin):
132
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
133
+    ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d')
134
+    num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
135
+
136
+    class Meta:
137
+        verbose_name = _(u'销量统计')
138
+        verbose_name_plural = _(u'销量统计')
139
+
140
+    def __unicode__(self):
141
+        return unicode(self.pk)
142
+
143
+    @property
144
+    def data(self):
145
+        return {
146
+            'ymd': self.ymd,
147
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
148
+        }
149
+
150
+
151
+class ConsumeModelSaleStatisticInfo(BaseModelMixin):
152
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
153
+    model_id = models.CharField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True)
154
+    model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
155
+    ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
156
+    num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
157
+
158
+    class Meta:
159
+        verbose_name = _(u'型号销量统计')
160
+        verbose_name_plural = _(u'型号销量统计')
161
+
162
+    def __unicode__(self):
163
+        return unicode(self.pk)
164
+
165
+    @property
166
+    def data(self):
167
+        return {
168
+            'model_id': self.model_id,
169
+            'model_name': self.model_name,
170
+            'ymd': self.ymd,
171
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
172
+        }
173
+
174
+
175
+class ConsumeDistributorSaleStatisticInfo(BaseModelMixin):
176
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
177
+    distributor_id = models.CharField(_(u'distributor_id'), max_length=32, help_text=u'经销商唯一标识', db_index=True)
178
+    distributor_name = models.CharField(_(u'distributor_name'), max_length=255, blank=True, null=True, help_text=u'经销商名称')
179
+    ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部
180
+    num = models.IntegerField(_(u'num'), default=0, help_text=u'数量')
181
+
182
+    class Meta:
183
+        verbose_name = _(u'经销商销量统计')
184
+        verbose_name_plural = _(u'经销商销量统计')
185
+
186
+    def __unicode__(self):
187
+        return unicode(self.pk)
188
+
189
+    @property
190
+    def data(self):
191
+        return {
192
+            'distributor_id': self.distributor_id,
193
+            'distributor_name': self.distributor_name,
194
+            'ymd': self.ymd,
195
+            'num': randnum() if settings.DEBUG_DATA_FLAG else self.num,
196
+        }
197
+
198
+
199
+class ConsumeProvinceSaleStatisticInfo(BaseModelMixin):
200
+    brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
96 201
     province_code = models.CharField(_(u'province_code'), max_length=6, help_text=u'省份编码', db_index=True)
97 202
     province_name = models.CharField(_(u'province_name'), max_length=3, blank=True, null=True, help_text=u'省份名称')
98 203
     ymd = models.IntegerField(_(u'ymd'), default=0, help_text=u'年月日', db_index=True)  # 例:20171208, tc.local_string(format='%Y%m%d'), 0 为全部

+ 50 - 1
statistic/views.py

@@ -12,7 +12,56 @@ from utils.rdm_utils import randnum
12 12
 
13 13
 
14 14
 @logit
15
-def tj_data(request):
15
+def tj_distributor(request):
16
+    ymd = int(tc.local_string(format='%Y%m%d'))
17
+
18
+    # 注册用户统计 & 今日注册用户
19
+    try:
20
+        register_num = RegisterStatisticInfo.objects.get(ymd=ymd).num
21
+    except RegisterStatisticInfo.DoesNotExist:
22
+        register_num = 0
23
+
24
+    # # 注册用户数趋势
25
+    # register_trends = RegisterStatisticInfo.objects.filter(status=True).order_by('-ymd')
26
+    # register_trends = [r.data for r in register_trends]
27
+
28
+    # 销量统计 & 今日销量
29
+    try:
30
+        sale_num = SaleStatisticInfo.objects.get(ymd=ymd).num
31
+    except SaleStatisticInfo.DoesNotExist:
32
+        sale_num = 0
33
+
34
+    # # 商品销量趋势
35
+    # sale_trends = SaleStatisticInfo.objects.filter(status=True).order_by('-ymd')
36
+    # sale_trends = [s.data for s in sale_trends]
37
+
38
+    # 型号销量统计 & 热销商品榜
39
+    model_sales = ModelSaleStatisticInfo.objects.filter(ymd=0, status=True).order_by('-num')
40
+    model_sales = [m.data for m in model_sales]
41
+
42
+    # 经销商销量统计 & 经销商榜
43
+    distributor_sales = DistributorSaleStatisticInfo.objects.filter(ymd=0, status=True).order_by('-num')
44
+    distributor_sales = [d.data for d in distributor_sales]
45
+
46
+    # 各地区实时销量
47
+    province_sales = ProvinceSaleStatisticInfo.objects.filter(ymd=0, status=True).order_by('position')
48
+    province_sales = [p.data for p in province_sales]
49
+
50
+    # TOADD: ROI
51
+
52
+    return response(200, 'Get TJ Data Success', u'获取统计数据成功', {
53
+        'register_num': randnum() if settings.DEBUG_DATA_FLAG else register_num,  # 注册用户统计 & 今日注册用户
54
+        # 'register_trends': register_trends,  # 注册用户数趋势
55
+        'sale_num': randnum() if settings.DEBUG_DATA_FLAG else sale_num,  # 销量统计 & 今日销量
56
+        # 'sale_trends': sale_trends,  # 商品销量趋势
57
+        'model_sales': model_sales,  # 型号销量统计 & 热销商品榜
58
+        'distributor_sales': distributor_sales,  # 经销商销量统计 & 经销商榜
59
+        'province_sales': province_sales,  # 各地区实时销量
60
+    })
61
+
62
+
63
+@logit
64
+def tj_consumer(request):
16 65
     ymd = int(tc.local_string(format='%Y%m%d'))
17 66
 
18 67
     # 注册用户统计 & 今日注册用户

+ 8 - 3
utils/error/errno_utils.py

@@ -20,14 +20,19 @@ class SaleclerkStatusCode(BaseStatusCode):
20 20
     DUPLICATE_SUBMIT = StatusCodeField(500199, 'Duplicate Submit', description=u'重复提交')
21 21
 
22 22
 
23
+class ProductBrandStatusCode(BaseStatusCode):
24
+    """ 品牌相关错误码 5010xx """
25
+    BRAND_NOT_FOUND = StatusCodeField(501001, 'Brand Not Found', description=u'品牌不存在')
26
+
27
+
23 28
 class ProductModelStatusCode(BaseStatusCode):
24
-    """ 型号相关错误码 5010xx """
25
-    MODEL_NOT_FOUND = StatusCodeField(501001, 'Model Not Found', description=u'型号不存在')
29
+    """ 型号相关错误码 5011xx """
30
+    MODEL_NOT_FOUND = StatusCodeField(501101, 'Model Not Found', description=u'型号不存在')
26 31
 
27 32
 
28 33
 class ProductDistributorStatusCode(BaseStatusCode):
29 34
     """ 经销商相关错误码 5011xx """
30
-    DISTRIBUTOR_NOT_FOUND = StatusCodeField(501101, 'Distributor Not Found', description=u'经销商不存在')
35
+    DISTRIBUTOR_NOT_FOUND = StatusCodeField(501201, 'Distributor Not Found', description=u'经销商不存在')
31 36
 
32 37
 
33 38
 class ProductStatusCode(BaseStatusCode):