|
# -*- coding: utf-8 -*-
from django.conf import settings
from django.db import transaction
from django.db.models import Count, F, Sum
from django_logit import logit
from django_models_ext.provincemodels import ProvinceShortModelMixin
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', 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(status=True).order_by('-ymd')
# register_trends = [r.data for r in register_trends]
# 销量统计 & 今日销量
try:
sale_num = SaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num
except SaleStatisticInfo.DoesNotExist:
sale_num = 0
# # 商品销量趋势
# sale_trends = SaleStatisticInfo.objects.filter(status=True).order_by('-ymd')
# sale_trends = [s.data for s in sale_trends]
# 型号销量统计 & 热销商品榜
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]
# TOADD: ROI
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, # 注册用户统计 & 今日注册用户
# '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, # 各地区实时销量
'rois': rois, # ROI
})
@logit
def tj_consumer(request):
brand_id = request.POST.get('brand_id', 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):
# 1 0 * * * curl http://kodo.xfoto.com.cn/api/tj/generate
__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} 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
)
# ).order_by(
# 'province_code'
# ).values(
# 'province_code'
# ).annotate(
# num=Sum('num')
# ).order_by(
# '-num'
# )
provinces_users = {}
for province in provinces:
if provinces_users['province']:
provinces_users['province'] += province.users
else:
provinces_users['province'] = province.users
provinces = [{'province_code': province_code, 'num': len(users)} for province_code, users in provinces_users.iteritems()]
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 = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
# year = tc.local_string(format='%Y')
month = tc.local_string(format='%Y%m')
day = tc.local_string(format='%Y%m%d')
# lastyear = tc.local_string(tc.several_time_ago(years=1), format='%Y')
lastmonth = tc.local_string(tc.several_time_ago(months=1), format='%Y%m')
lastday = tc.local_string(tc.several_time_ago(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,
})
|