|
|
@@ -2,12 +2,13 @@
|
2
|
2
|
|
3
|
3
|
from django.conf import settings
|
4
|
4
|
from django.db import transaction
|
|
5
|
+from django.db.models import Count, F, Sum
|
5
|
6
|
from django_logit import logit
|
6
|
7
|
from django_models_ext.provincemodels import ProvinceShortModelMixin
|
7
|
8
|
from django_response import response
|
8
|
9
|
from TimeConvert import TimeConvert as tc
|
9
|
10
|
|
10
|
|
-from mch.models import BrandInfo, DistributorInfo, ModelInfo
|
|
11
|
+from mch.models import BrandInfo, DistributorInfo, ModelInfo, SaleclerkInfo
|
11
|
12
|
from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
|
12
|
13
|
ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo,
|
13
|
14
|
DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,
|
|
|
@@ -203,6 +204,83 @@ def __tj_generate(ymd=None):
|
203
|
204
|
)
|
204
|
205
|
|
205
|
206
|
|
|
207
|
+def ytj(brand_id):
|
|
208
|
+ # [消费者维度] 周期内扫描用户人数
|
|
209
|
+ cusis = ConsumeUserStatisticInfo.objects.filter(brand_id=brand_id, ymd__lt=9999)
|
|
210
|
+ users = []
|
|
211
|
+ for cusi in cusis:
|
|
212
|
+ users += cusi.users
|
|
213
|
+ scan_user_count = sum(users)
|
|
214
|
+
|
|
215
|
+ # [消费者维度] 周期内镜头销售支数
|
|
216
|
+ sell_volume_count = ConsumeSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd__lt=9999).aggregate(Sum('num')).get('num__sum', 0) or 0
|
|
217
|
+
|
|
218
|
+ startd = tc.local_string(months=-12, format='%Y%m%d')
|
|
219
|
+ endd = tc.local_string(format='%Y%m%d')
|
|
220
|
+
|
|
221
|
+ # [消费者维度] 统计周期内型号扫描排行数据,请按顺序返回
|
|
222
|
+ models = ConsumeModelSaleStatisticInfo.objects.filter(
|
|
223
|
+ brand_id=brand_id,
|
|
224
|
+ ymd__gt=startd,
|
|
225
|
+ ymd__lte=endd,
|
|
226
|
+ status=True
|
|
227
|
+ ).order_by(
|
|
228
|
+ 'model_name'
|
|
229
|
+ ).values(
|
|
230
|
+ 'model_id', 'model_name'
|
|
231
|
+ ).annotate(
|
|
232
|
+ num=Sum('num')
|
|
233
|
+ ).order_by(
|
|
234
|
+ '-num'
|
|
235
|
+ )[:20]
|
|
236
|
+
|
|
237
|
+ # [经销商维度] 统计周期内销售员排行数据,请按顺序返回
|
|
238
|
+ salesmen = SaleclerkSaleStatisticInfo.objects.filter(
|
|
239
|
+ brand_id=brand_id,
|
|
240
|
+ ymd__gt=startd,
|
|
241
|
+ ymd__lte=endd,
|
|
242
|
+ status=True
|
|
243
|
+ ).order_by(
|
|
244
|
+ 'clerk_id'
|
|
245
|
+ ).values(
|
|
246
|
+ 'clerk_id'
|
|
247
|
+ ).annotate(
|
|
248
|
+ num=Sum('num')
|
|
249
|
+ ).order_by(
|
|
250
|
+ '-num'
|
|
251
|
+ )[:20]
|
|
252
|
+ clerks = SaleclerkInfo.objects.filter(brand_id=brand_id, status=True)
|
|
253
|
+ clerks = {clerk.clerk_id: {'distributor_id': clerk.distributor_id, 'distributor_name': clerk.distributor_name, 'clerk_name': clerk.clerk_name} for clerk in clerks}
|
|
254
|
+ salesmen = [dict(sm, **clerks.get(sm.get('clerk_id', ''), {})) for sm in salesmen]
|
|
255
|
+
|
|
256
|
+ # [收费者维度] 统计周期内省份销量排行数据,请按顺序返回
|
|
257
|
+ provinces = ConsumeProvinceSaleStatisticInfo.objects.filter(
|
|
258
|
+ brand_id=brand_id,
|
|
259
|
+ ymd__gt=startd,
|
|
260
|
+ ymd__lte=endd,
|
|
261
|
+ status=True
|
|
262
|
+ ).order_by(
|
|
263
|
+ 'province_code'
|
|
264
|
+ ).values(
|
|
265
|
+ 'province_code'
|
|
266
|
+ ).annotate(
|
|
267
|
+ num=Sum('num')
|
|
268
|
+ ).order_by(
|
|
269
|
+ '-num'
|
|
270
|
+ )
|
|
271
|
+ provinces = [dict(p, **{'province_name': ''}) for p in provinces]
|
|
272
|
+
|
|
273
|
+ return {
|
|
274
|
+ 'scan_user_count': scan_user_count,
|
|
275
|
+ 'sell_volume_count': sell_volume_count,
|
|
276
|
+ 'user_count_increase_pct': -1, # 与上个统计周期数据的用户人数比例
|
|
277
|
+ 'volume_count_increase_pct': -1, # 与上个统计周期数据的销售支数比例
|
|
278
|
+ 'models': list(models),
|
|
279
|
+ 'salesmen': salesmen,
|
|
280
|
+ 'provinces': provinces,
|
|
281
|
+ }
|
|
282
|
+
|
|
283
|
+
|
206
|
284
|
def ymdtj(brand_id, ymd, lastymd):
|
207
|
285
|
# [消费者维度] 周期内扫描用户人数
|
208
|
286
|
try:
|
|
|
@@ -237,8 +315,8 @@ def ymdtj(brand_id, ymd, lastymd):
|
237
|
315
|
models = [m.data for m in current_models[:20]]
|
238
|
316
|
|
239
|
317
|
# [经销商维度] 统计周期内销售员排行数据,请按顺序返回
|
240
|
|
- salesmen = SaleclerkSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')[:20]
|
241
|
|
- salesmen = [s.data for s in salesmen]
|
|
318
|
+ salesmen = SaleclerkSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
|
|
319
|
+ salesmen = [s.data for s in salesmen[:20]]
|
242
|
320
|
|
243
|
321
|
# [收费者维度] 统计周期内省份销量排行数据,请按顺序返回
|
244
|
322
|
provinces = ConsumeProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
|
|
|
@@ -259,15 +337,15 @@ def ymdtj(brand_id, ymd, lastymd):
|
259
|
337
|
def v2_tj_distributor(request):
|
260
|
338
|
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
|
261
|
339
|
|
262
|
|
- year = tc.local_string(format='%Y')
|
|
340
|
+ # year = tc.local_string(format='%Y')
|
263
|
341
|
month = tc.local_string(format='%Y%m')
|
264
|
342
|
day = tc.local_string(format='%Y%m%d')
|
265
|
343
|
|
266
|
|
- lastyear = tc.local_string(tc.several_time_ago(years=1), format='%Y')
|
|
344
|
+ # lastyear = tc.local_string(tc.several_time_ago(years=1), format='%Y')
|
267
|
345
|
lastmonth = tc.local_string(tc.several_time_ago(months=1), format='%Y%m')
|
268
|
346
|
lastday = tc.local_string(tc.several_time_ago(days=1), format='%Y%m%d')
|
269
|
347
|
|
270
|
|
- year_data = ymdtj(brand_id, year, lastyear)
|
|
348
|
+ year_data = ytj(brand_id)
|
271
|
349
|
month_data = ymdtj(brand_id, month, lastmonth)
|
272
|
350
|
day_data = ymdtj(brand_id, day, lastday)
|
273
|
351
|
|