No Description

admin_views.py 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. from django.conf import settings
  4. from django.db import transaction
  5. from django_logit import logit
  6. from django_response import response
  7. from paginator import pagination
  8. from TimeConvert import TimeConvert as tc
  9. from django.db.models import Sum
  10. from datetime import datetime
  11. from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo, SaleclerkInfo, ModelInfo
  12. from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo, ModelSaleStatisticInfo
  13. from integral.models import SaleclerkSubmitLogInfo
  14. from logs.models import MchInfoEncryptLogInfo
  15. from account.models import UserInfo
  16. from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode,
  17. ProductMachineStatusCode, UserStatusCode)
  18. from collections import defaultdict
  19. import json
  20. from itertools import groupby
  21. WECHAT = settings.WECHAT
  22. @logit
  23. def querysn(request):
  24. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  25. admin_id = request.POST.get('admin_id', '')
  26. model_id = request.POST.get('model_id', '')
  27. sn = request.POST.get('sn', '')
  28. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  29. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  30. if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():
  31. return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
  32. log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True).order_by('has_used', '-pk').first()
  33. if not log:
  34. log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, model_id=model_id, serialNo=sn).order_by('-submit_during_activity', 'dupload').first()
  35. if not log:
  36. return response(ProductMachineStatusCode.SN_NOT_FOUND)
  37. return response(200, 'Query SN Success', u'查询序列号成功', data=log.data)
  38. @logit
  39. def queryusedsn(request):
  40. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  41. admin_id = request.POST.get('admin_id', '')
  42. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  43. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  44. if not AdministratorInfo.objects.filter(admin_id=admin_id, admin_type=AdministratorInfo.MAINTENANCE, user_status=AdministratorInfo.ACTIVATED, status=True).exists():
  45. return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
  46. logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=brand_id, admin_id=admin_id, has_used=True).order_by('-used_at')
  47. logs = [log.data for log in logs]
  48. return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={
  49. 'logs': logs,
  50. })
  51. @logit
  52. @transaction.atomic
  53. def usecoupon(request):
  54. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  55. admin_id = request.POST.get('admin_id', '')
  56. model_id = request.POST.get('model_id', '')
  57. sn = request.POST.get('sn', '')
  58. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  59. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  60. if not AdministratorInfo.objects.filter(
  61. admin_id=admin_id,
  62. admin_type=AdministratorInfo.MAINTENANCE,
  63. user_status=AdministratorInfo.ACTIVATED,
  64. status=True
  65. ).exists():
  66. return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
  67. log = ConsumeInfoSubmitLogInfo.objects.filter(
  68. brand_id=brand_id,
  69. model_id=model_id,
  70. serialNo=sn,
  71. submit_during_activity=True,
  72. has_used=False
  73. ).first()
  74. if not log:
  75. return response(ProductMachineStatusCode.SN_NOT_FOUND)
  76. logdata = log.data
  77. if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True):
  78. return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED)
  79. log.has_used = True
  80. log.used_at = tc.utc_datetime()
  81. log.save()
  82. return response(200, 'Use Coupon Success', u'核销优惠券成功')
  83. @logit
  84. def userinfo(request):
  85. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  86. admin_id = request.POST.get('admin_id', '')
  87. page = request.POST.get('page', 1)
  88. num = request.POST.get('num', 20)
  89. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  90. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  91. try:
  92. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  93. except AdministratorInfo.DoesNotExist:
  94. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  95. userinfos = UserInfo.objects.filter(status=True).order_by('-created_at')
  96. count = userinfos.count()
  97. userinfos, left = pagination(userinfos, page, num)
  98. userinfos = [userinfo.admindata for userinfo in userinfos]
  99. return response(200, 'Userinfo Success', u'用户列表获取成功', data={
  100. 'userinfos': userinfos,
  101. 'count': count,
  102. 'left': left,
  103. })
  104. @logit
  105. def query_usergoods(request):
  106. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  107. admin_id = request.POST.get('admin_id', '')
  108. user_id = request.POST.get('user_id', '')
  109. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  110. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  111. # 校验用户是否存在
  112. try:
  113. user = UserInfo.objects.get(user_id=user_id)
  114. except UserInfo.DoesNotExist:
  115. return response(UserStatusCode.USER_NOT_FOUND)
  116. try:
  117. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  118. except AdministratorInfo.DoesNotExist:
  119. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  120. logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
  121. logs = [log.adminuserdata for log in logs]
  122. return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={
  123. 'logs': logs,
  124. })
  125. @logit
  126. def query_userinfo(request):
  127. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  128. admin_id = request.POST.get('admin_id', '')
  129. phone = request.POST.get('phone', '')
  130. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  131. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  132. try:
  133. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  134. except AdministratorInfo.DoesNotExist:
  135. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  136. userinfos = UserInfo.objects.filter(status=True, phone=phone).order_by('-created_at')
  137. userinfos = [userinfo.admindata for userinfo in userinfos]
  138. return response(200, 'Userinfo Success', u'用户列表获取成功', data={
  139. 'userinfos': userinfos,
  140. })
  141. @logit
  142. def userinfo_update(request):
  143. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  144. admin_id = request.POST.get('admin_id', '')
  145. user_id = request.POST.get('user_id', '')
  146. integral = int(request.POST.get('integral', 0))
  147. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  148. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  149. try:
  150. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  151. except AdministratorInfo.DoesNotExist:
  152. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  153. # 校验用户是否存在
  154. try:
  155. user = UserInfo.objects.get(user_id=user_id, status=True)
  156. except UserInfo.DoesNotExist:
  157. return response(UserStatusCode.USER_NOT_FOUND)
  158. user.integral = integral
  159. user.save()
  160. return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
  161. # 统计
  162. def statistic_userprofile(request):
  163. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  164. admin_id = request.POST.get('admin_id', '')
  165. start_time = request.POST.get('start_time', '')
  166. end_time = request.POST.get('end_time', '')
  167. model_name = request.POST.get('model_name', '')
  168. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  169. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  170. try:
  171. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  172. except AdministratorInfo.DoesNotExist:
  173. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  174. if model_name:
  175. logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time)
  176. else:
  177. logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  178. sexs = {0: 0, 1: 0, 2: 0}
  179. subscribes = {0: 0, 1: 0}
  180. has_membercards = {0: 0, 1: 0}
  181. provinces = defaultdict(int)
  182. for log in logs:
  183. for user in log.users:
  184. try:
  185. user = UserInfo.objects.get(user_id=user, status=True)
  186. except UserInfo.DoesNotExist:
  187. continue
  188. provinces[user.province_name] += 1
  189. sexs[user.sex] += 1
  190. subscribes[user.subscribe] += 1
  191. has_membercards[user.has_membercard] += 1
  192. return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
  193. 'provinces': provinces,
  194. 'sexs': sexs,
  195. 'subscribe': subscribes,
  196. 'has_membercards': has_membercards,
  197. })
  198. def statistic_daily(request):
  199. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  200. admin_id = request.POST.get('admin_id', '')
  201. start_time = request.POST.get('start_time', '')
  202. end_time = request.POST.get('end_time', '')
  203. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  204. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  205. try:
  206. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  207. except AdministratorInfo.DoesNotExist:
  208. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  209. sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  210. user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  211. sale_logs = [log.data for log in sale_logs]
  212. user_logs = [log.data for log in user_logs]
  213. return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={
  214. 'sale_logs': sale_logs,
  215. 'user_logs': user_logs,
  216. })
  217. def statistic_model(request):
  218. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  219. admin_id = request.POST.get('admin_id', '')
  220. start_time = request.POST.get('start_time', '')
  221. end_time = request.POST.get('end_time', '')
  222. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  223. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  224. try:
  225. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  226. except AdministratorInfo.DoesNotExist:
  227. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  228. logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num'))
  229. logs = [{'model_name': log[0], 'num': log[1]} for log in logs]
  230. return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={
  231. 'logs': logs
  232. })
  233. def statistic_distributor(request):
  234. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  235. admin_id = request.POST.get('admin_id', '')
  236. start_time = request.POST.get('start_time', '')
  237. end_time = request.POST.get('end_time', '')
  238. model_name = request.POST.get('model_name', '')
  239. distributor_name = request.POST.get('distributor_name', '')
  240. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  241. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  242. try:
  243. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  244. except AdministratorInfo.DoesNotExist:
  245. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  246. logs = ModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  247. if model_name:
  248. logs = logs.filter(model_name=model_name)
  249. distributor_logs = []
  250. distributor_names = []
  251. logs = logs.values('model_name', 'ymd', 'num', 'saleclerks')
  252. for log in logs:
  253. for saleclerk in json.loads(log['saleclerks']):
  254. saleclerk_info = SaleclerkInfo.objects.get(clerk_id=saleclerk)
  255. if distributor_name and saleclerk_info.distributor_name != distributor_name:
  256. log['num'] -= 1
  257. else:
  258. if saleclerk_info.distributor_name not in distributor_names:
  259. distributor_logs.append({'distributor_name': saleclerk_info.distributor_name, 'num': 1})
  260. distributor_names.append(saleclerk_info.distributor_name)
  261. else:
  262. i = distributor_names.index(saleclerk_info.distributor_name)
  263. distributor_logs[i]['num'] += 1
  264. daily_logs = []
  265. for k, v in groupby(logs, lambda log: log['ymd']):
  266. daily_logs.append(reduce(lambda dict1, dict2: {'ymd': k, 'num': dict1['num'] + dict2['num']}, v))
  267. model_logs = []
  268. for k, v in groupby(sorted(logs, key=lambda log: log['model_name']), lambda log: log['model_name']):
  269. model_logs.append(reduce(lambda dict1, dict2: {'model_name': k, 'num': dict1['num'] + dict2['num']}, v))
  270. return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
  271. 'daily_logs': daily_logs,
  272. 'model_logs': model_logs,
  273. 'distributor_logs': distributor_logs
  274. })
  275. def statistic_deep_analyze(request):
  276. start_time = request.POST.get('start_time', '')
  277. end_time = request.POST.get('end_time', '')
  278. start_date = datetime.strptime(start_time + ' 00:00:00', '%Y-%m-%d %H:%M:%S')
  279. end_date = datetime.strptime(end_time + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
  280. logs = ConsumeInfoSubmitLogInfo.objects.filter(created_at__range=(start_date, end_date), dupload=False, test_user=False)
  281. res = []
  282. for log in logs:
  283. modelInfo = ModelInfo.objects.get(model_id=log.model_id)
  284. item = {'user_id': log.user_id, 'model_name': log.model_name, 'serialNo': log.serialNo}
  285. try:
  286. sale_log = SaleclerkSubmitLogInfo.objects.get(model_name=modelInfo.model_name, code=log.serialNo)
  287. item['distributor_name'] = sale_log.distributor_name
  288. item['outbound_time'] = sale_log.created_at
  289. except:
  290. item['distributor_name'] = ''
  291. item['outbound_time'] = ''
  292. date = datetime.strptime('2020-01-14 00:00:00', '%Y-%m-%d %H:%M:%S')
  293. encryptLog = MchInfoEncryptLogInfo.objects.filter(created_at__gte=date, sn=log.serialNo, model_pk=modelInfo.pk)
  294. if not encryptLog:
  295. item['is_new_code'] = False
  296. item['is_complement'] = False
  297. elif encryptLog.all()[0].operator_id == 'ZCQebtBiQHT8XRKpmbUotD':
  298. item['is_complement'] = True
  299. item['is_new_code'] = False
  300. elif encryptLog.all()[0].operator_id == '5qX3KWXZ8iKaip4AdxwtKF':
  301. item['is_new_code'] = True
  302. item['is_complement'] = False
  303. if encryptLog:
  304. item['outbound_time'] = encryptLog.all()[0].created_at
  305. else:
  306. item['outbound_time'] = ''
  307. res.append(item)
  308. return response(data=res)