123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403 |
- from __future__ import division
- from django.conf import settings
- from django.db import transaction
- from django_logit import logit
- from django_response import response
- from paginator import pagination
- from TimeConvert import TimeConvert as tc
- from django.db.models import Sum
- from datetime import datetime
- from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo, SaleclerkInfo, ModelInfo
- from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo, ModelSaleStatisticInfo
- from integral.models import SaleclerkSubmitLogInfo
- from logs.models import MchInfoEncryptLogInfo
- from account.models import UserInfo
- from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode,
- ProductMachineStatusCode, UserStatusCode)
- from collections import defaultdict
- import json
- from itertools import groupby
- WECHAT = settings.WECHAT
- @logit
- def querysn(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- model_id = request.POST.get('model_id', '')
- sn = request.POST.get('sn', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():
- return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
- log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True).order_by('has_used', '-pk').first()
- if not log:
- log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, model_id=model_id, serialNo=sn).order_by('-submit_during_activity', 'dupload').first()
- if not log:
- return response(ProductMachineStatusCode.SN_NOT_FOUND)
- return response(200, 'Query SN Success', u'查询序列号成功', data=log.data)
- @logit
- def queryusedsn(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():
- return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
- logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, admin_id=admin_id, has_used=True).order_by('-used_at')
- logs = [log.data for log in logs]
- return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={
- 'logs': logs,
- })
- @logit
- @transaction.atomic
- def usecoupon(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- model_id = request.POST.get('model_id', '')
- sn = request.POST.get('sn', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- if not AdministratorInfo.objects.filter(
- admin_id=admin_id,
- admin_type=AdministratorInfo.MAINTENANCE,
- user_status=AdministratorInfo.ACTIVATED,
- status=True
- ).exists():
- return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
- log = ConsumeInfoSubmitLogInfo.objects.filter(
- brand_id=brand_id,
- model_id=model_id,
- serialNo=sn,
- submit_during_activity=True,
- has_used=False
- ).first()
- if not log:
- return response(ProductMachineStatusCode.SN_NOT_FOUND)
- logdata = log.data
- if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True):
- return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED)
- log.has_used = True
- log.used_at = tc.utc_datetime()
- log.save()
- return response(200, 'Use Coupon Success', u'核销优惠券成功')
- @logit
- def userinfo(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- page = request.POST.get('page', 1)
- num = request.POST.get('num', 20)
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- userinfos = UserInfo.objects.filter(status=True).order_by('-created_at')
- count = userinfos.count()
- userinfos, left = pagination(userinfos, page, num)
- userinfos = [userinfo.admindata for userinfo in userinfos]
- return response(200, 'Userinfo Success', u'用户列表获取成功', data={
- 'userinfos': userinfos,
- 'count': count,
- 'left': left,
- })
- @logit
- def query_usergoods(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- user_id = request.POST.get('user_id', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
-
- try:
- user = UserInfo.objects.get(user_id=user_id)
- except UserInfo.DoesNotExist:
- return response(UserStatusCode.USER_NOT_FOUND)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
- logs = [log.adminuserdata for log in logs]
- return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={
- 'logs': logs,
- })
- @logit
- def query_userinfo(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- phone = request.POST.get('phone', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- userinfos = UserInfo.objects.filter(status=True, phone=phone).order_by('-created_at')
- userinfos = [userinfo.admindata for userinfo in userinfos]
- return response(200, 'Userinfo Success', u'用户列表获取成功', data={
- 'userinfos': userinfos,
- })
- @logit
- def userinfo_update(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- user_id = request.POST.get('user_id', '')
- integral = int(request.POST.get('integral', 0))
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
-
- try:
- user = UserInfo.objects.get(user_id=user_id, status=True)
- except UserInfo.DoesNotExist:
- return response(UserStatusCode.USER_NOT_FOUND)
- user.integral = integral
- user.save()
- return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
- def statistic_userprofile(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- start_time = request.POST.get('start_time', '')
- end_time = request.POST.get('end_time', '')
- model_name = request.POST.get('model_name', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- if model_name:
- logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time)
- else:
- logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
- sexs = {0: 0, 1: 0, 2: 0}
- subscribes = {0: 0, 1: 0}
- has_membercards = {0: 0, 1: 0}
- provinces = defaultdict(int)
- for log in logs:
- for user in log.users:
- try:
- user = UserInfo.objects.get(user_id=user, status=True)
- except UserInfo.DoesNotExist:
- continue
- provinces[user.province_name] += 1
- sexs[user.sex] += 1
- subscribes[user.subscribe] += 1
- has_membercards[user.has_membercard] += 1
- return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
- 'provinces': provinces,
- 'sexs': sexs,
- 'subscribe': subscribes,
- 'has_membercards': has_membercards,
- })
- def statistic_daily(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- start_time = request.POST.get('start_time', '')
- end_time = request.POST.get('end_time', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
- user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
- sale_logs = [log.data for log in sale_logs]
- user_logs = [log.data for log in user_logs]
- return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={
- 'sale_logs': sale_logs,
- 'user_logs': user_logs,
- })
- def statistic_model(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- start_time = request.POST.get('start_time', '')
- end_time = request.POST.get('end_time', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num'))
- logs = [{'model_name': log[0], 'num': log[1]} for log in logs]
- return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={
- 'logs': logs
- })
- def statistic_distributor(request):
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
- admin_id = request.POST.get('admin_id', '')
- start_time = request.POST.get('start_time', '')
- end_time = request.POST.get('end_time', '')
- model_name = request.POST.get('model_name', '')
- distributor_name = request.POST.get('distributor_name', '')
- if brand_id != settings.KODO_DEFAULT_BRAND_ID:
- return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
- try:
- administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
- except AdministratorInfo.DoesNotExist:
- return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
- logs = ModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
- if model_name:
- logs = logs.filter(model_name=model_name)
- distributor_logs = []
- distributor_names = []
- logs = logs.values('model_name', 'ymd', 'num', 'saleclerks')
- for log in logs:
- for saleclerk in json.loads(log['saleclerks']):
- saleclerk_info = SaleclerkInfo.objects.get(clerk_id=saleclerk)
- if distributor_name and saleclerk_info.distributor_name != distributor_name:
- log['num'] -= 1
- else:
- if saleclerk_info.distributor_name not in distributor_names:
- distributor_logs.append({'distributor_name': saleclerk_info.distributor_name, 'num': 1})
- distributor_names.append(saleclerk_info.distributor_name)
- else:
- i = distributor_names.index(saleclerk_info.distributor_name)
- distributor_logs[i]['num'] += 1
- daily_logs = []
- for k, v in groupby(logs, lambda log: log['ymd']):
- daily_logs.append(reduce(lambda dict1, dict2: {'ymd': k, 'num': dict1['num'] + dict2['num']}, v))
- model_logs = []
- for k, v in groupby(sorted(logs, key=lambda log: log['model_name']), lambda log: log['model_name']):
- model_logs.append(reduce(lambda dict1, dict2: {'model_name': k, 'num': dict1['num'] + dict2['num']}, v))
- return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
- 'daily_logs': daily_logs,
- 'model_logs': model_logs,
- 'distributor_logs': distributor_logs
- })
- def statistic_deep_analyze(request):
- start_time = request.POST.get('start_time', '')
- end_time = request.POST.get('end_time', '')
- start_date = datetime.strptime(start_time + ' 00:00:00', '%Y-%m-%d %H:%M:%S')
- end_date = datetime.strptime(end_time + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
- logs = ConsumeInfoSubmitLogInfo.objects.filter(created_at__range=(start_date, end_date), dupload=False, test_user=False)
- res = []
- for log in logs:
- modelInfo = ModelInfo.objects.get(model_id=log.model_id)
- item = {'user_id': log.user_id, 'model_name': log.model_name, 'serialNo': log.serialNo}
- try:
- sale_log = SaleclerkSubmitLogInfo.objects.get(model_name=modelInfo.model_name, code=log.serialNo)
- item['distributor_name'] = sale_log.distributor_name
- item['outbound_time'] = sale_log.created_at
- except:
- item['distributor_name'] = ''
- item['outbound_time'] = ''
-
- date = datetime.strptime('2020-01-14 00:00:00', '%Y-%m-%d %H:%M:%S')
- encryptLog = MchInfoEncryptLogInfo.objects.filter(created_at__gte=date, sn=log.serialNo, model_pk=modelInfo.pk)
- if not encryptLog:
- item['is_new_code'] = False
- item['is_complement'] = False
- elif encryptLog.all()[0].operator_id == 'ZCQebtBiQHT8XRKpmbUotD':
- item['is_complement'] = True
- item['is_new_code'] = False
- elif encryptLog.all()[0].operator_id == '5qX3KWXZ8iKaip4AdxwtKF':
- item['is_new_code'] = True
- item['is_complement'] = False
- if encryptLog:
- item['outbound_time'] = encryptLog.all()[0].created_at
- else:
- item['outbound_time'] = ''
- res.append(item)
- return response(data=res)
|