No Description

admin_views.py 33KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. from collections import defaultdict
  4. from datetime import datetime
  5. from django.conf import settings
  6. from django.db import transaction
  7. from django.db.models import Count, Q, Sum
  8. from django_logit import logit
  9. from django_response import response
  10. from paginator import pagination
  11. from TimeConvert import TimeConvert as tc
  12. from account.models import UserInfo
  13. from coupon.models import UserCouponInfo
  14. from integral.models import SaleclerkSubmitLogInfo
  15. from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo, ModelInfo, DistributorInfo
  16. from member.models import GoodsOrderInfo
  17. from logs.models import MchInfoEncryptLogInfo
  18. from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
  19. from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode,
  20. ProductMachineStatusCode, UserStatusCode)
  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, status=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, status=True).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, status=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. status=True
  74. ).first()
  75. if not log:
  76. return response(ProductMachineStatusCode.SN_NOT_FOUND)
  77. logdata = log.data
  78. if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True):
  79. return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED)
  80. log.has_used = True
  81. log.used_at = tc.utc_datetime()
  82. log.save()
  83. return response(200, 'Use Coupon Success', u'核销优惠券成功')
  84. @logit
  85. def userinfo(request):
  86. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  87. admin_id = request.POST.get('admin_id', '')
  88. page = request.POST.get('page', 1)
  89. num = request.POST.get('num', 20)
  90. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  91. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  92. try:
  93. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  94. except AdministratorInfo.DoesNotExist:
  95. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  96. userinfos = UserInfo.objects.filter(status=True).order_by('-created_at')
  97. count = userinfos.count()
  98. userinfos, left = pagination(userinfos, page, num)
  99. userinfos = [userinfo.admindata for userinfo in userinfos]
  100. return response(200, 'Userinfo Success', u'用户列表获取成功', data={
  101. 'userinfos': userinfos,
  102. 'count': count,
  103. 'left': left,
  104. })
  105. @logit
  106. def query_usercoupons(request):
  107. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  108. admin_id = request.POST.get('admin_id', '')
  109. user_id = request.POST.get('user_id', '')
  110. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  111. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  112. # 校验用户是否存在
  113. try:
  114. user = UserInfo.objects.get(user_id=user_id)
  115. except UserInfo.DoesNotExist:
  116. return response(UserStatusCode.USER_NOT_FOUND)
  117. try:
  118. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  119. except AdministratorInfo.DoesNotExist:
  120. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  121. coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
  122. coupons = [coupon.admindata for coupon in coupons]
  123. return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
  124. 'coupons': coupons,
  125. })
  126. @logit
  127. def query_usergoods(request):
  128. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  129. admin_id = request.POST.get('admin_id', '')
  130. user_id = request.POST.get('user_id', '')
  131. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  132. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  133. # 校验用户是否存在
  134. try:
  135. user = UserInfo.objects.get(user_id=user_id)
  136. except UserInfo.DoesNotExist:
  137. return response(UserStatusCode.USER_NOT_FOUND)
  138. try:
  139. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  140. except AdministratorInfo.DoesNotExist:
  141. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  142. logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
  143. logs = [log.adminuserdata for log in logs]
  144. return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={
  145. 'logs': logs,
  146. })
  147. @logit
  148. def query_userinfo(request):
  149. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  150. admin_id = request.POST.get('admin_id', '')
  151. query = request.POST.get('query', '')
  152. level = request.POST.get('level', '')
  153. is_member = request.POST.get('is_member', '')
  154. code_version = request.POST.get('code_version', 0)
  155. sex = request.POST.get('sex', '')
  156. subscribe = request.POST.get('subscribe', '')
  157. has_membercard = request.POST.get('has_membercard', '')
  158. province = request.POST.get('province', '')
  159. start_time = request.POST.get('start_time', '')
  160. end_time = request.POST.get('end_time', '')
  161. page = request.POST.get('page', 1)
  162. num = request.POST.get('num', 20)
  163. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  164. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  165. try:
  166. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  167. except AdministratorInfo.DoesNotExist:
  168. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  169. userinfos = UserInfo.objects.filter(Q(status=True) & (Q(user_id__icontains=query) | Q(nickname__icontains=query) | Q(phone__icontains=query))).order_by('-created_at')
  170. if level:
  171. userinfos = userinfos.filter(level=level)
  172. if code_version:
  173. userinfos = userinfos.filter(code_version=code_version)
  174. if subscribe:
  175. userinfos = userinfos.filter(subscribe=subscribe)
  176. if has_membercard:
  177. userinfos = userinfos.filter(has_membercard=has_membercard)
  178. if is_member:
  179. userinfos = userinfos.filter(level__gte=1)
  180. if sex:
  181. userinfos = userinfos.filter(sex=sex)
  182. if province:
  183. userinfos = userinfos.filter(province_name=province)
  184. if start_time and end_time:
  185. ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S')
  186. ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  187. userinfos = userinfos.filter(created_at__range=[ftime, ttime])
  188. count = userinfos.count()
  189. userinfos, left = pagination(userinfos, page, num)
  190. userinfos = [userinfo.admindata for userinfo in userinfos]
  191. return response(200, 'Userinfo Success', u'用户列表获取成功', data={
  192. 'userinfos': userinfos,
  193. 'count': count,
  194. 'left': left
  195. })
  196. @logit
  197. @transaction.atomic
  198. def userinfo_update(request):
  199. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  200. admin_id = request.POST.get('admin_id', '')
  201. user_id = request.POST.get('user_id', '')
  202. integral = int(request.POST.get('integral', 0))
  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. # 校验用户是否存在
  210. try:
  211. user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
  212. except UserInfo.DoesNotExist:
  213. return response(UserStatusCode.USER_NOT_FOUND)
  214. user.integral = integral
  215. user.save()
  216. return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
  217. # 统计
  218. def statistic_userprofile(request):
  219. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  220. admin_id = request.POST.get('admin_id', '')
  221. start_time = request.POST.get('start_time', '')
  222. end_time = request.POST.get('end_time', '')
  223. model_name = request.POST.get('model_name', '')
  224. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  225. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  226. try:
  227. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  228. except AdministratorInfo.DoesNotExist:
  229. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  230. if model_name:
  231. logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time)
  232. else:
  233. logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  234. sexs = {0: 0, 1: 0, 2: 0}
  235. subscribes = {0: 0, 1: 0}
  236. has_membercards = {0: 0, 1: 0}
  237. provinces = defaultdict(int)
  238. for log in logs:
  239. for user in log.users:
  240. try:
  241. user = UserInfo.objects.get(user_id=user, status=True)
  242. except UserInfo.DoesNotExist:
  243. continue
  244. provinces[user.province_name] += 1
  245. sexs[user.sex] += 1
  246. subscribes[user.subscribe] += 1
  247. has_membercards[user.has_membercard] += 1
  248. return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
  249. 'provinces': provinces,
  250. 'sexs': sexs,
  251. 'subscribe': subscribes,
  252. 'has_membercards': has_membercards,
  253. })
  254. def statistic_daily(request):
  255. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  256. admin_id = request.POST.get('admin_id', '')
  257. start_time = request.POST.get('start_time', '')
  258. end_time = request.POST.get('end_time', '')
  259. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  260. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  261. try:
  262. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  263. except AdministratorInfo.DoesNotExist:
  264. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  265. sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  266. user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  267. sale_logs = [log.data for log in sale_logs]
  268. user_logs = [log.data for log in user_logs]
  269. return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={
  270. 'sale_logs': sale_logs,
  271. 'user_logs': user_logs,
  272. })
  273. def statistic_model(request):
  274. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  275. admin_id = request.POST.get('admin_id', '')
  276. start_time = request.POST.get('start_time', '')
  277. end_time = request.POST.get('end_time', '')
  278. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  279. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  280. try:
  281. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  282. except AdministratorInfo.DoesNotExist:
  283. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  284. logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num'))
  285. logs = [{'model_name': log[0], 'num': log[1]} for log in logs]
  286. return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={
  287. 'logs': logs
  288. })
  289. def statistic_distributor(request):
  290. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  291. admin_id = request.POST.get('admin_id', '')
  292. start_time = request.POST.get('start_time', '')
  293. end_time = request.POST.get('end_time', '')
  294. model_name = request.POST.get('model_name', '')
  295. distributor_name = request.POST.get('distributor_name', '')
  296. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  297. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  298. try:
  299. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  300. except AdministratorInfo.DoesNotExist:
  301. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  302. daily_sql = 'select id, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '', ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '')
  303. daily_logs = SaleclerkSubmitLogInfo.objects.raw(daily_sql)
  304. daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in daily_logs]
  305. model_logs = []
  306. if model_name == '':
  307. model_sql = 'select id, model_uni_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY model_uni_name;' % (start_time, end_time, ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '')
  308. model_logs = SaleclerkSubmitLogInfo.objects.raw(model_sql)
  309. model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in model_logs]
  310. distributor_logs = []
  311. if distributor_name == '':
  312. distributor_sql = 'select id, distributor_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY distributor_name;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')
  313. distributor_logs = SaleclerkSubmitLogInfo.objects.raw(distributor_sql)
  314. distributor_logs = [{'distributor_name': log.distributor_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in distributor_logs]
  315. return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
  316. 'daily_logs': daily_logs,
  317. 'model_logs': model_logs,
  318. 'distributor_logs': distributor_logs
  319. })
  320. def dashboard(request):
  321. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  322. admin_id = request.POST.get('admin_id', '')
  323. start_time = request.POST.get('start_time', '')
  324. end_time = request.POST.get('end_time', '')
  325. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  326. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  327. try:
  328. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  329. except AdministratorInfo.DoesNotExist:
  330. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  331. # 销售员统计
  332. sale_logs = SaleclerkSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, test_sn=False, status=True)
  333. sale_count = sale_logs.count()
  334. sale_daily_logs = list(sale_logs.values('ymd').annotate(num=Count('pk')))
  335. sale_model_logs = list(sale_logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]
  336. sale_distributor_logs = list(sale_logs.values('distributor_name').annotate(num=Count('pk')).order_by('-num'))[:10]
  337. # 消费者统计
  338. logs = ConsumeInfoSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, status=True)
  339. consumer_count = logs.count()
  340. consumer_daily_logs = list(logs.values('ymd').annotate(num=Count('pk')).order_by('ymd'))
  341. consumer_model_logs = list(logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]
  342. consumer_province_logs = list(logs.values('province').annotate(num=Count('pk')).order_by('-num'))[:10]
  343. return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
  344. 'sale_daily_logs': sale_daily_logs,
  345. 'sale_model_logs': sale_model_logs,
  346. 'sale_distributor_logs': sale_distributor_logs,
  347. 'consumer_daily_logs': consumer_daily_logs,
  348. 'consumer_model_logs': consumer_model_logs,
  349. 'consumer_province_logs': consumer_province_logs,
  350. 'sale_count': sale_count,
  351. 'consumer_count': consumer_count,
  352. })
  353. def statistic_consumer(request):
  354. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  355. admin_id = request.POST.get('admin_id', '')
  356. start_time = request.POST.get('start_time', '')
  357. end_time = request.POST.get('end_time', '')
  358. model_name = request.POST.get('model_name', '')
  359. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  360. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  361. try:
  362. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  363. except AdministratorInfo.DoesNotExist:
  364. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  365. # 消费者统计
  366. daily_sql = 'select id, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')
  367. daily_logs = ConsumeInfoSubmitLogInfo.objects.raw(daily_sql)
  368. daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in daily_logs]
  369. model_logs = []
  370. if model_name == '':
  371. model_sql = 'select id, model_uni_name, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True GROUP BY model_uni_name ORDER BY num desc;' % (start_time, end_time)
  372. model_logs = ConsumeInfoSubmitLogInfo.objects.raw(model_sql)
  373. model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in model_logs]
  374. province_sql = 'select id, province, Count(id) AS num, Count(code_version=1 or NULL) AS code1, Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY province ORDER BY num desc;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')
  375. province_logs = ConsumeInfoSubmitLogInfo.objects.raw(province_sql)
  376. province_logs = [{'province': log.province, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in province_logs]
  377. return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
  378. 'daily_logs': daily_logs,
  379. 'model_logs': model_logs,
  380. 'province_logs': province_logs,
  381. })
  382. def statistic_member(request):
  383. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  384. admin_id = request.POST.get('admin_id', '')
  385. start_time = request.POST.get('start_time', '')
  386. end_time = request.POST.get('end_time', '')
  387. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  388. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  389. try:
  390. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  391. except AdministratorInfo.DoesNotExist:
  392. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  393. # 消费者统计
  394. users = ConsumeInfoSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, status=True).values_list('user_id', flat=True).distinct()
  395. userinfos = UserInfo.objects.filter(user_id__in=users)
  396. # 会员级别
  397. level_logs = list(userinfos.values('level').annotate(num=Count('user_id')))
  398. # 会员积分
  399. integral_logs = list(userinfos.values('integral').annotate(num=Count('user_id')))
  400. # 镜头数
  401. shot_logs = list(userinfos.values('shots_num').annotate(num=Count('user_id')))
  402. # 性别
  403. sex_logs = list(userinfos.values('sex').annotate(num=Count('user_id')))
  404. # 省份
  405. province_logs = list(userinfos.values('province_name').annotate(num=Count('user_id')).order_by('-num'))
  406. return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
  407. 'level_logs': level_logs,
  408. 'integral_logs': integral_logs,
  409. 'shot_logs': shot_logs,
  410. 'sex_logs': sex_logs,
  411. 'province_logs': province_logs,
  412. })
  413. def record_consumer(request):
  414. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  415. page = request.POST.get('page', 1)
  416. num = request.POST.get('num', 20)
  417. admin_id = request.POST.get('admin_id', '')
  418. start_time = request.POST.get('start_time', '')
  419. end_time = request.POST.get('end_time', '')
  420. query = request.POST.get('query', '')
  421. dupload = request.POST.get('dupload', '')
  422. code_version = request.POST.get('code_version', 0)
  423. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  424. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  425. try:
  426. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  427. except AdministratorInfo.DoesNotExist:
  428. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  429. logs = ConsumeInfoSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & (Q(model_name__icontains=query) | Q(phone__icontains=query) | Q(serialNo__icontains=query))).order_by('-created_at')
  430. if dupload:
  431. logs = logs.filter(dupload=dupload)
  432. if code_version:
  433. logs = logs.filter(code_version=code_version)
  434. if start_time and end_time:
  435. logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)
  436. count = logs.count()
  437. logs, left = pagination(logs, page, num)
  438. logs = [log.admindata for log in logs]
  439. return response(200, 'Get Consumer Record Success', u'获取消费者销售记录成功', data={
  440. 'logs': logs,
  441. 'count': count,
  442. 'left': left
  443. })
  444. def record_sale(request):
  445. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  446. admin_id = request.POST.get('admin_id', '')
  447. page = request.POST.get('page', 1)
  448. num = request.POST.get('num', 20)
  449. start_time = request.POST.get('start_time', '')
  450. end_time = request.POST.get('end_time', '')
  451. query = request.POST.get('query', '')
  452. dupload = request.POST.get('dupload', '')
  453. has_scan = request.POST.get('has_scan', '')
  454. code_version = request.POST.get('code_version', 0)
  455. is_online_sale = request.POST.get('is_online_sale', '')
  456. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  457. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  458. try:
  459. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  460. except AdministratorInfo.DoesNotExist:
  461. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  462. logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query) | Q(code__icontains=query))).order_by('-created_at')
  463. if dupload:
  464. logs = logs.filter(dupload=dupload)
  465. if code_version:
  466. logs = logs.filter(code_version=code_version)
  467. if has_scan:
  468. logs = logs.filter(has_scan=has_scan)
  469. if start_time and end_time:
  470. logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)
  471. if is_online_sale:
  472. logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else ''))
  473. count = logs.count()
  474. logs, left = pagination(logs, page, num)
  475. logs = [log.admindata for log in logs]
  476. return response(200, 'Get Sale Record Success', u'获取销售员销售记录成功', data={
  477. 'logs': logs,
  478. 'count': count,
  479. 'left': left
  480. })
  481. def model_list(request):
  482. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  483. admin_id = request.POST.get('admin_id', '')
  484. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  485. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  486. try:
  487. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  488. except AdministratorInfo.DoesNotExist:
  489. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  490. infos = list(ModelInfo.objects.filter(status=True).values_list('model_uni_name', flat=True).distinct().order_by('model_uni_name'))
  491. return response(200, 'Get Model List Success', u'获取型号列表成功', data={
  492. 'models': infos
  493. })
  494. def distributor_list(request):
  495. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  496. admin_id = request.POST.get('admin_id', '')
  497. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  498. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  499. try:
  500. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  501. except AdministratorInfo.DoesNotExist:
  502. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  503. infos = list(DistributorInfo.objects.filter(status=True).values_list('distributor_name', flat=True).distinct().order_by('distributor_name'))
  504. return response(200, 'Get Model List Success', u'获取经销商列表成功', data={
  505. 'distributors': infos
  506. })
  507. def member_goods_order(request):
  508. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  509. admin_id = request.POST.get('admin_id', '')
  510. phone = request.POST.get('phone', '')
  511. good_type = request.POST.get('good_type', '')
  512. page = request.POST.get('page', 1)
  513. num = request.POST.get('num', 20)
  514. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  515. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  516. try:
  517. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  518. except AdministratorInfo.DoesNotExist:
  519. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  520. orders = GoodsOrderInfo.objects.filter(phone__icontains=phone, status=True).order_by('-created_at')
  521. if good_type:
  522. orders = orders.filter(good_type=good_type)
  523. count = orders.count()
  524. orders, left = pagination(orders, page, num)
  525. orders = [order.admindata for order in orders]
  526. return response(200, 'Get Member Goods Order List Success', u'获取会员商品订单列表成功', data={
  527. 'orders': orders,
  528. 'left': left,
  529. 'count': count
  530. })
  531. def member_goods_order_update(request):
  532. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  533. admin_id = request.POST.get('admin_id', '')
  534. order_id = request.POST.get('order_id', '')
  535. tracking_number = request.POST.get('tracking_number', '')
  536. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  537. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  538. try:
  539. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  540. except AdministratorInfo.DoesNotExist:
  541. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  542. GoodsOrderInfo.objects.filter(pk=order_id, status=True).update(tracking_number=tracking_number)
  543. return response(200, 'Get Member Goods Order Update Success', u'获取会员商品订单修改成功')
  544. def record_warehouse(request):
  545. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  546. admin_id = request.POST.get('admin_id', '')
  547. model_name = request.POST.get('model_name', '')
  548. sn = request.POST.get('sn', '')
  549. start_time = request.POST.get('start_time', '')
  550. end_time = request.POST.get('end_time', '')
  551. page = request.POST.get('page', 1)
  552. num = request.POST.get('num', 20)
  553. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  554. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  555. try:
  556. administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
  557. except AdministratorInfo.DoesNotExist:
  558. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  559. models = ModelInfo.objects.filter(model_name__icontains=model_name, status=True).values_list('pk', flat=True)
  560. logs = MchInfoEncryptLogInfo.objects.filter(model_pk__in=models, sn__icontains=sn, status=True)
  561. if start_time and end_time:
  562. start_time = datetime.strptime(start_time, '%Y%m%d')
  563. end_time = datetime.strptime(end_time+' 23:59:59', '%Y%m%d %H:%M:%S')
  564. logs = logs.filter(created_at__range=(start_time, end_time))
  565. logs = logs.order_by('-created_at')
  566. count = logs.count()
  567. logs, left = pagination(logs, page, num)
  568. logs = [log.admindata for log in logs]
  569. return response(200, 'Get Warehouse Record Success', u'获取入库记录成功', data={
  570. 'logs': logs,
  571. 'left': left,
  572. 'count': count
  573. })