123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- from django.conf import settings
- from django.db import transaction
- from django.db.models import Sum
- from django_logit import logit
- from django_models_ext.provincemodels import ProvinceShortModelMixin
- from django_query import get_query_value
- from django_response import response
- from TimeConvert import TimeConvert as tc
- from mch.models import BrandInfo, DistributorInfo, ModelInfo, SaleclerkInfo
- from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
- ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo,
- DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,
- RegisterStatisticInfo, SaleclerkSaleStatisticInfo, SaleStatisticInfo)
- from utils.rdm_utils import randnum
- @logit
- def tj_distributor(request):
- brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
- ymd = int(tc.local_string(format='%Y%m%d'))
-
- try:
- register_num = RegisterStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
- except RegisterStatisticInfo.DoesNotExist:
- register_num = 0
-
-
-
-
- try:
- sale_num = SaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
- except SaleStatisticInfo.DoesNotExist:
- sale_num = 0
-
-
-
-
- model_sales = ModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- model_sales = [m.data for m in model_sales]
-
- distributor_sales = DistributorSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- distributor_sales = [d.data for d in distributor_sales]
-
- province_sales = ProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('position')
- province_sales = [p.data for p in province_sales]
-
- rois = ModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True)
- rois = [m.roi for m in rois]
- return response(200, 'Get TJ Data Success', u'获取统计数据成功', {
- 'register_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else register_num,
-
- 'sale_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else sale_num,
-
- 'model_sales': model_sales,
- 'distributor_sales': distributor_sales,
- 'province_sales': province_sales,
- 'rois': rois,
- })
- @logit
- def tj_consumer(request):
- brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
- ymd = int(tc.local_string(format='%Y%m%d'))
-
- try:
- register_num = RegisterStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
- except RegisterStatisticInfo.DoesNotExist:
- register_num = 0
-
- register_trends = RegisterStatisticInfo.objects.filter(brand_id=brand_id, status=True).order_by('-ymd')[:30]
- register_trends = [r.data for r in register_trends][::-1]
-
- try:
- sale_num = ConsumeSaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
- except ConsumeSaleStatisticInfo.DoesNotExist:
- sale_num = 0
-
- sale_trends = ConsumeSaleStatisticInfo.objects.filter(brand_id=brand_id, status=True).order_by('-ymd')[:30]
- sale_trends = [s.data for s in sale_trends][::-1]
-
- model_sales = ConsumeModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- model_sales = [m.data for m in model_sales]
-
- distributor_sales = ConsumeDistributorSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- distributor_sales = [d.data for d in distributor_sales]
-
- province_sales = ConsumeProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('position')
- province_sales = [p.data for p in province_sales]
- return response(200, 'Get TJ Data Success', u'获取统计数据成功', {
- 'register_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else register_num,
- 'register_trends': register_trends,
- 'sale_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else sale_num,
- 'sale_trends': sale_trends,
- 'model_sales': model_sales,
- 'distributor_sales': distributor_sales,
- 'province_sales': province_sales,
- })
- @logit
- @transaction.atomic
- def tj_generate(request):
-
- __tj_generate(ymd=None)
- return response()
- @transaction.atomic
- def __tj_generate(ymd=None):
- ymd = ymd or int(tc.local_string(format='%Y%m%d'))
- brands = BrandInfo.objects.filter(status=True)
- for brand in brands:
- for pcode, pname in ProvinceShortModelMixin.PROVINCE_CODE_NAME_DICT.items():
- pssi, created = ProvinceSaleStatisticInfo.objects.get_or_create(
- brand_id=brand.brand_id,
- province_code=pcode,
- ymd=ymd,
- )
- pssi.province_name = pname
- pssi.save()
- cpssi, created = ConsumeProvinceSaleStatisticInfo.objects.get_or_create(
- brand_id=brand.brand_id,
- province_code=pcode,
- ymd=ymd,
- )
- cpssi.province_name = pname
- cpssi.save()
- models = ModelInfo.objects.filter(brand_id=brand.brand_id, status=True)
- for mdl in models:
- mssi, created = ModelSaleStatisticInfo.objects.get_or_create(
- brand_id=brand.brand_id,
- model_id=mdl.model_id,
- ymd=ymd,
- )
- mssi.model_name = mdl.model_name
- mssi.save()
- cmssi, created = ConsumeModelSaleStatisticInfo.objects.get_or_create(
- brand_id=brand.brand_id,
- model_name=mdl.model_uni_name,
- ymd=ymd,
- )
- cmssi.save()
- distributors = DistributorInfo.objects.filter(brand_id=brand.brand_id, status=True)
- for dtbt in distributors:
- dssi, created = DistributorSaleStatisticInfo.objects.get_or_create(
- brand_id=brand.brand_id,
- distributor_id=dtbt.distributor_id,
- ymd=ymd,
- )
- dssi.distributor_name = dtbt.distributor_name
- dssi.save()
- cdssi, created = ConsumeDistributorSaleStatisticInfo.objects.get_or_create(
- brand_id=brand.brand_id,
- distributor_id=dtbt.distributor_id,
- ymd=ymd,
- )
- cdssi.distributor_name = dtbt.distributor_name
- cdssi.save()
- RegisterStatisticInfo.objects.select_for_update().get_or_create(
- brand_id=brand.brand_id,
- ymd=ymd,
- )
- SaleStatisticInfo.objects.select_for_update().get_or_create(
- brand_id=brand.brand_id,
- ymd=ymd,
- )
- ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create(
- brand_id=brand.brand_id,
- ymd=ymd,
- )
- def ytj(brand_id):
-
- cusis = ConsumeUserStatisticInfo.objects.filter(brand_id=brand_id, ymd__lt=9999)
- users = []
- for cusi in cusis:
- users += cusi.users
- scan_user_count = len(set(users))
-
- sell_volume_count = ConsumeSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd__lt=9999).aggregate(Sum('num')).get('num__sum', 0) or 0
- startd = tc.local_string(months=-12, format='%Y%m%d')
- endd = tc.local_string(format='%Y%m%d')
-
- models = ConsumeModelSaleStatisticInfo.objects.filter(
- brand_id=brand_id,
- ymd__gt=startd,
- ymd__lte=endd,
- status=True
- ).order_by(
- 'model_name'
- ).values(
- 'model_id', 'model_name'
- ).annotate(
- num=Sum('num')
- ).order_by(
- '-num'
- )[:20]
-
- salesmen = SaleclerkSaleStatisticInfo.objects.filter(
- brand_id=brand_id,
- ymd__gt=startd,
- ymd__lte=endd,
- status=True
- ).order_by(
- 'clerk_id'
- ).values(
- 'clerk_id'
- ).annotate(
- num=Sum('num')
- ).order_by(
- '-num'
- )[:20]
- clerks = SaleclerkInfo.objects.filter(brand_id=brand_id, status=True)
- clerks = {clerk.clerk_id: {'distributor_id': clerk.distributor_id, 'distributor_name': clerk.distributor_name, 'clerk_name': clerk.clerk_name, 'salesman_id': clerk.clerk_id, 'salesman_name': clerk.clerk_name} for clerk in clerks}
- salesmen = [dict(sm, **clerks.get(sm.get('clerk_id', ''), {})) for sm in salesmen]
-
- provinces = ConsumeProvinceSaleStatisticInfo.objects.filter(
- brand_id=brand_id,
- ymd__gt=startd,
- ymd__lte=endd,
- status=True
- )
-
-
-
-
-
-
-
-
-
- provinces_users = {}
- for province in provinces:
- if provinces_users.get(province.province_code):
- provinces_users[province.province_code] += province.users
- else:
- provinces_users[province.province_code] = province.users
- provinces = [{'province_code': province_code, 'num': len(set(users))} for province_code, users in provinces_users.items()]
- provinces = sorted(provinces, key=lambda p: p['num'], reverse=True)
- return {
- 'scan_user_count': scan_user_count,
- 'sell_volume_count': sell_volume_count,
- 'user_count_increase_pct': -1,
- 'volume_count_increase_pct': -1,
- 'models': list(models),
- 'salesmen': salesmen,
- 'provinces': provinces,
- }
- def ymdtj(brand_id, ymd, lastymd):
-
- try:
- scan_user_count = ConsumeUserStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
- except ConsumeUserStatisticInfo.DoesNotExist:
- scan_user_count = 0
- try:
- last_scan_user_count = ConsumeUserStatisticInfo.objects.get(brand_id=brand_id, ymd=lastymd).num
- except ConsumeUserStatisticInfo.DoesNotExist:
- last_scan_user_count = 0
-
- try:
- sell_volume_count = ConsumeSaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
- except ConsumeSaleStatisticInfo.DoesNotExist:
- sell_volume_count = 0
- try:
- last_sell_volume_count = ConsumeSaleStatisticInfo.objects.get(brand_id=brand_id, ymd=lastymd).num
- except ConsumeSaleStatisticInfo.DoesNotExist:
- last_sell_volume_count = 0
-
- volume_count_increase_pct = '%.2f' % (sell_volume_count * 100.0 / last_sell_volume_count) if last_sell_volume_count != 0 else -1
-
- user_count_increase_pct = '%.2f' % (scan_user_count * 100.0 / last_scan_user_count) if last_scan_user_count != 0 else -1
-
- current_models = ConsumeModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- models = [m.data for m in current_models[:20]]
-
- salesmen = SaleclerkSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- salesmen = [s.data for s in salesmen[:20]]
-
- provinces = ConsumeProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num')
- provinces = [p.data for p in provinces]
- return {
- 'scan_user_count': scan_user_count,
- 'sell_volume_count': sell_volume_count,
- 'user_count_increase_pct': user_count_increase_pct,
- 'volume_count_increase_pct': volume_count_increase_pct,
- 'models': models,
- 'salesmen': salesmen,
- 'provinces': provinces,
- }
- @logit
- def v2_tj_distributor(request):
- brand_id = get_query_value(request, 'brand_id', settings.KODO_DEFAULT_BRAND_ID)
-
- month = tc.local_string(format='%Y%m')
- day = tc.local_string(format='%Y%m%d')
-
- lastmonth = tc.local_string(months=-1, format='%Y%m')
- lastday = tc.local_string(days=-1, format='%Y%m%d')
- year_data = ytj(brand_id)
- month_data = ymdtj(brand_id, month, lastmonth)
- day_data = ymdtj(brand_id, day, lastday)
- return response(200, 'Get TJ Data Success', u'获取统计数据成功', data={
- 'year_data': year_data,
- 'month_data': month_data,
- 'day_data': day_data,
- })
|