暂无描述

admin_views.py 69KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. from collections import defaultdict
  5. from datetime import datetime
  6. from django.conf import settings
  7. from django.contrib.auth.hashers import make_password
  8. from django.db import transaction
  9. from django.db.models import Count, Q, Sum
  10. from django_logit import logit
  11. from django_query import get_query_value
  12. from django_response import response
  13. from paginator import pagination
  14. from pysnippets.strsnippets import strip
  15. from TimeConvert import TimeConvert as tc
  16. from account.models import UserInfo
  17. from api.encrypt_views import get_ciphertext
  18. from coupon.models import CouponInfo, UserCouponInfo
  19. from integral.models import SaleclerkSubmitLogInfo
  20. from kodo.decorators import check_admin
  21. from logs.models import AdministratorLoginLogInfo, ComplementCodeLogInfo, MchInfoEncryptLogInfo
  22. from mch.models import AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo
  23. from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo,
  24. MemberActivityContributionWelfareInfo, MemberActivityContributionWelfareUnlockingInfo,
  25. MemberActivityGroupShareInfo, MemberActivityInfo, MemberActivitySignupInfo)
  26. from pre.custom_message import sendtemplatemessage, sendwxasubscribemessage
  27. from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
  28. from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, CouponStatusCode,
  29. MemberActivityContributionStatusCode, MemberActivityContributionWelfareStatusCode,
  30. MemberActivityContributionWelfareUnblockingStatusCode, MemberActivityStatusCode,
  31. MemberGoodStatusCode, ProductCouponStatusCode, ProductMachineStatusCode,
  32. UserStatusCode)
  33. WECHAT = settings.WECHAT
  34. @logit
  35. @check_admin
  36. def change_password(request, administrator):
  37. password = request.POST.get('password', '')
  38. encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
  39. administrator.encryption = encryption
  40. administrator.save()
  41. return response(200, 'Change Password Success', u'修改密码成功')
  42. @logit
  43. @check_admin
  44. def querysn(request, administrator):
  45. model_id = request.POST.get('model_id', '')
  46. sn = request.POST.get('sn', '')
  47. if administrator.admin_type != AdministratorInfo.MAINTENANCE:
  48. return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
  49. log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, status=True).order_by('has_used', '-pk').first()
  50. if not log:
  51. log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, status=True).order_by('-submit_during_activity', 'dupload').first()
  52. if not log:
  53. return response(ProductMachineStatusCode.SN_NOT_FOUND)
  54. return response(200, 'Query SN Success', u'查询序列号成功', data=log.data)
  55. @logit
  56. @check_admin
  57. def queryusedsn(request, administrator):
  58. if administrator.admin_type != AdministratorInfo.MAINTENANCE:
  59. return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
  60. logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, admin_id=administrator.admin_id, has_used=True, status=True).order_by('-used_at')
  61. logs = [log.data for log in logs]
  62. return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={
  63. 'logs': logs,
  64. })
  65. @logit
  66. @check_admin
  67. @transaction.atomic
  68. def usecoupon(request, administrator):
  69. model_id = request.POST.get('model_id', '')
  70. sn = request.POST.get('sn', '')
  71. if administrator.admin_type != AdministratorInfo.MAINTENANCE:
  72. return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
  73. log = ConsumeInfoSubmitLogInfo.objects.filter(
  74. brand_id=administrator.brand_id,
  75. model_id=model_id,
  76. serialNo=sn,
  77. submit_during_activity=True,
  78. has_used=False,
  79. status=True
  80. ).first()
  81. if not log:
  82. return response(ProductMachineStatusCode.SN_NOT_FOUND)
  83. logdata = log.data
  84. if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True):
  85. return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED)
  86. log.has_used = True
  87. log.used_at = tc.utc_datetime()
  88. log.save()
  89. return response(200, 'Use Coupon Success', u'核销优惠券成功')
  90. @logit
  91. @check_admin
  92. def userinfo(request, administrator):
  93. page = request.POST.get('page', 1)
  94. num = request.POST.get('num', 20)
  95. userinfos = UserInfo.objects.filter(status=True).order_by('-pk')
  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. @check_admin
  106. def query_usercoupons(request, administrator):
  107. user_id = request.POST.get('user_id', '')
  108. # 校验用户是否存在
  109. try:
  110. user = UserInfo.objects.get(user_id=user_id)
  111. except UserInfo.DoesNotExist:
  112. return response(UserStatusCode.USER_NOT_FOUND)
  113. coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk')
  114. coupons = [coupon.admindata for coupon in coupons]
  115. return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
  116. 'coupons': coupons,
  117. })
  118. @logit
  119. @check_admin
  120. def query_usergoods(request, administrator):
  121. user_id = request.POST.get('user_id', '')
  122. dupload = request.POST.get('dupload', '')
  123. # 校验用户是否存在
  124. try:
  125. user = UserInfo.objects.get(user_id=user_id)
  126. except UserInfo.DoesNotExist:
  127. return response(UserStatusCode.USER_NOT_FOUND)
  128. logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk')
  129. if dupload:
  130. logs = logs.filter(dupload=dupload)
  131. logs = [log.adminuserdata for log in logs]
  132. return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={
  133. 'logs': logs,
  134. })
  135. @logit
  136. @check_admin
  137. def query_userinfo(request, administrator):
  138. query = request.POST.get('query', '')
  139. level = request.POST.get('level', '')
  140. is_member = request.POST.get('is_member', '')
  141. code_version = request.POST.get('code_version', 0)
  142. sex = request.POST.get('sex', '')
  143. subscribe = request.POST.get('subscribe', '')
  144. has_membercard = request.POST.get('has_membercard', '')
  145. tenancy_shot_permission = request.POST.get('tenancy_shot_permission', '')
  146. province = request.POST.get('province', '')
  147. start_time = request.POST.get('start_time', '')
  148. end_time = request.POST.get('end_time', '')
  149. page = request.POST.get('page', 1)
  150. num = request.POST.get('num', 20)
  151. userinfos = UserInfo.objects.filter(Q(status=True) & (Q(user_id__icontains=query) | Q(nickname__icontains=query) | Q(phone__icontains=query) | Q(memberusercardcode__icontains=query))).order_by('-pk')
  152. if level:
  153. userinfos = userinfos.filter(level=level)
  154. if code_version:
  155. userinfos = userinfos.filter(code_version=code_version)
  156. if subscribe:
  157. userinfos = userinfos.filter(subscribe=subscribe)
  158. if has_membercard:
  159. userinfos = userinfos.filter(has_membercard=has_membercard)
  160. if is_member:
  161. userinfos = userinfos.filter(level__gte=1)
  162. if sex:
  163. userinfos = userinfos.filter(sex=sex)
  164. if province:
  165. userinfos = userinfos.filter(province_name=province)
  166. if tenancy_shot_permission != '':
  167. userinfos = userinfos.filter(tenancy_shot_permission=tenancy_shot_permission)
  168. if start_time and end_time:
  169. ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S')
  170. ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  171. userinfos = userinfos.filter(created_at__range=[ftime, ttime])
  172. count = userinfos.count()
  173. userinfos, left = pagination(userinfos, page, num)
  174. userinfos = [userinfo.admindata for userinfo in userinfos]
  175. return response(200, 'Userinfo Success', u'用户列表获取成功', data={
  176. 'userinfos': userinfos,
  177. 'count': count,
  178. 'left': left
  179. })
  180. @logit
  181. @check_admin
  182. @transaction.atomic
  183. def userinfo_update(request, administrator):
  184. user_id = request.POST.get('user_id', '')
  185. integral = int(request.POST.get('integral', 0))
  186. # 校验用户是否存在
  187. try:
  188. user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
  189. except UserInfo.DoesNotExist:
  190. return response(UserStatusCode.USER_NOT_FOUND)
  191. user.integral = integral
  192. user.save()
  193. return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
  194. # 统计
  195. @check_admin
  196. def statistic_userprofile(request, administrator):
  197. start_time = request.POST.get('start_time', '')
  198. end_time = request.POST.get('end_time', '')
  199. model_name = request.POST.get('model_name', '')
  200. if model_name:
  201. logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time)
  202. else:
  203. logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  204. sexs = {0: 0, 1: 0, 2: 0}
  205. subscribes = {0: 0, 1: 0}
  206. has_membercards = {0: 0, 1: 0}
  207. provinces = defaultdict(int)
  208. for log in logs:
  209. for user in log.users:
  210. try:
  211. user = UserInfo.objects.get(user_id=user, status=True)
  212. except UserInfo.DoesNotExist:
  213. continue
  214. provinces[user.province_name] += 1
  215. sexs[user.sex] += 1
  216. subscribes[user.subscribe] += 1
  217. has_membercards[user.has_membercard] += 1
  218. return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
  219. 'provinces': provinces,
  220. 'sexs': sexs,
  221. 'subscribe': subscribes,
  222. 'has_membercards': has_membercards,
  223. })
  224. @check_admin
  225. def statistic_daily(request, administrator):
  226. start_time = request.POST.get('start_time', '')
  227. end_time = request.POST.get('end_time', '')
  228. sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  229. user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
  230. sale_logs = [log.data for log in sale_logs]
  231. user_logs = [log.data for log in user_logs]
  232. return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={
  233. 'sale_logs': sale_logs,
  234. 'user_logs': user_logs,
  235. })
  236. @check_admin
  237. def statistic_model(request, administrator):
  238. brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
  239. admin_id = request.POST.get('admin_id', '')
  240. start_time = request.POST.get('start_time', '')
  241. end_time = request.POST.get('end_time', '')
  242. logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num'))
  243. logs = [{'model_name': log[0], 'num': log[1]} for log in logs]
  244. return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={
  245. 'logs': logs
  246. })
  247. @check_admin
  248. def statistic_distributor(request, administrator):
  249. start_time = request.POST.get('start_time', '')
  250. end_time = request.POST.get('end_time', '')
  251. model_name = request.POST.get('model_name', '')
  252. distributor_name = request.POST.get('distributor_name', '')
  253. 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 '')
  254. daily_logs = SaleclerkSubmitLogInfo.objects.raw(daily_sql)
  255. 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]
  256. model_logs = []
  257. if model_name == '':
  258. 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 '')
  259. model_logs = SaleclerkSubmitLogInfo.objects.raw(model_sql)
  260. 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]
  261. distributor_logs = []
  262. if distributor_name == '':
  263. 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 '')
  264. distributor_logs = SaleclerkSubmitLogInfo.objects.raw(distributor_sql)
  265. 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]
  266. return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
  267. 'daily_logs': daily_logs,
  268. 'model_logs': model_logs,
  269. 'distributor_logs': distributor_logs
  270. })
  271. @check_admin
  272. def dashboard(request, administrator):
  273. start_time = request.POST.get('start_time', '')
  274. end_time = request.POST.get('end_time', '')
  275. # 销售员统计
  276. sale_logs = SaleclerkSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, test_sn=False, status=True)
  277. sale_count = sale_logs.count()
  278. sale_daily_logs = list(sale_logs.values('ymd').annotate(num=Count('pk')))
  279. sale_model_logs = list(sale_logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]
  280. sale_distributor_logs = list(sale_logs.values('distributor_name').annotate(num=Count('pk')).order_by('-num'))[:10]
  281. # 消费者统计
  282. logs = ConsumeInfoSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, status=True)
  283. consumer_count = logs.count()
  284. consumer_daily_logs = list(logs.values('ymd').annotate(num=Count('pk')).order_by('ymd'))
  285. consumer_model_logs = list(logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]
  286. consumer_province_logs = list(logs.values('province').annotate(num=Count('pk')).order_by('-num'))[:10]
  287. return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
  288. 'sale_daily_logs': sale_daily_logs,
  289. 'sale_model_logs': sale_model_logs,
  290. 'sale_distributor_logs': sale_distributor_logs,
  291. 'consumer_daily_logs': consumer_daily_logs,
  292. 'consumer_model_logs': consumer_model_logs,
  293. 'consumer_province_logs': consumer_province_logs,
  294. 'sale_count': sale_count,
  295. 'consumer_count': consumer_count,
  296. })
  297. @check_admin
  298. def statistic_consumer(request, administrator):
  299. start_time = request.POST.get('start_time', '')
  300. end_time = request.POST.get('end_time', '')
  301. model_name = request.POST.get('model_name', '')
  302. # 消费者统计
  303. 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 '')
  304. daily_logs = ConsumeInfoSubmitLogInfo.objects.raw(daily_sql)
  305. daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in daily_logs]
  306. model_logs = []
  307. if model_name == '':
  308. 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)
  309. model_logs = ConsumeInfoSubmitLogInfo.objects.raw(model_sql)
  310. model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in model_logs]
  311. 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 '')
  312. province_logs = ConsumeInfoSubmitLogInfo.objects.raw(province_sql)
  313. province_logs = [{'province': log.province, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in province_logs]
  314. return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
  315. 'daily_logs': daily_logs,
  316. 'model_logs': model_logs,
  317. 'province_logs': province_logs,
  318. })
  319. @check_admin
  320. def statistic_member(request, administrator):
  321. start_time = request.POST.get('start_time', '')
  322. end_time = request.POST.get('end_time', '')
  323. # 消费者统计
  324. if start_time and end_time:
  325. start_time = datetime.strptime(start_time, '%Y%m%d')
  326. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  327. userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, resgister_at__range=(start_time, end_time))
  328. else:
  329. userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, status=True)
  330. # 关注公众号数
  331. mp_num = userinfos.filter(subscribe=True).count()
  332. # 领取保卡数
  333. membercard_num = userinfos.filter(has_membercard=True).count()
  334. # 会员级别
  335. level_logs = list(userinfos.values('level').annotate(num=Count('user_id')))
  336. # 会员积分
  337. integral_logs = list(userinfos.values('integral').annotate(num=Count('user_id')))
  338. # 镜头数
  339. shot_logs = list(userinfos.values('shots_num').annotate(num=Count('user_id')))
  340. # 性别
  341. sex_logs = list(userinfos.values('sex').annotate(num=Count('user_id')))
  342. # 省份
  343. province_logs = list(userinfos.values('province_name').annotate(num=Count('user_id')).order_by('-num'))
  344. return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
  345. 'mp_num': mp_num,
  346. 'membercard_num': membercard_num,
  347. 'level_logs': level_logs,
  348. 'integral_logs': integral_logs,
  349. 'shot_logs': shot_logs,
  350. 'sex_logs': sex_logs,
  351. 'province_logs': province_logs,
  352. })
  353. @check_admin
  354. def statistic_coupon(request, administrator):
  355. start_time = request.POST.get('start_time', '')
  356. end_time = request.POST.get('end_time', '')
  357. if start_time and end_time:
  358. start_time = datetime.strptime(start_time, '%Y%m%d')
  359. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  360. coupons = UserCouponInfo.objects.filter(active_at__range=(start_time, end_time), status=True)
  361. else:
  362. coupons = UserCouponInfo.objects.filter(status=True)
  363. froms_logs = list(coupons.values('coupon_from').annotate(num=Count('user_coupon_id')))
  364. type_logs = list(coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id')))
  365. if start_time and end_time:
  366. used_coupons = UserCouponInfo.objects.filter(used_at__range=(start_time, end_time), status=True)
  367. else:
  368. used_coupons = UserCouponInfo.objects.filter(has_used=True, status=True)
  369. type_has_used_logs = list(used_coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id')))
  370. return response(200, 'Get Consumer Statistic Success', u'获取用户劵统计成功', data={
  371. 'froms_logs': froms_logs,
  372. 'type_logs': type_logs,
  373. 'type_has_used_logs': type_has_used_logs,
  374. })
  375. @check_admin
  376. def record_consumer(request, administrator):
  377. start_time = request.POST.get('start_time', '')
  378. end_time = request.POST.get('end_time', '')
  379. query = request.POST.get('query', '')
  380. dupload = request.POST.get('dupload', '')
  381. code_version = request.POST.get('code_version', 0)
  382. page = request.POST.get('page', 1)
  383. num = request.POST.get('num', 20)
  384. 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('-pk')
  385. if dupload:
  386. logs = logs.filter(dupload=dupload)
  387. if code_version:
  388. logs = logs.filter(code_version=code_version)
  389. if start_time and end_time:
  390. logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)
  391. count = logs.count()
  392. logs, left = pagination(logs, page, num)
  393. logs = [log.admindata for log in logs]
  394. return response(200, 'Get Consumer Record Success', u'获取消费者销售记录成功', data={
  395. 'logs': logs,
  396. 'count': count,
  397. 'left': left
  398. })
  399. @check_admin
  400. def record_consumer_batch(request, administrator):
  401. logs = json.loads(request.POST.get('logs', '[]'))
  402. infos = []
  403. unknows = []
  404. for log in logs:
  405. try:
  406. infos.append(ConsumeInfoSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], serialNo=log['code'], status=True, dupload=False).admindata)
  407. except ConsumeInfoSubmitLogInfo.DoesNotExist:
  408. unknows.append(log)
  409. return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={
  410. 'logs': infos,
  411. 'unknows': unknows
  412. })
  413. @check_admin
  414. def record_sale(request, administrator):
  415. page = request.POST.get('page', 1)
  416. num = request.POST.get('num', 20)
  417. start_time = request.POST.get('start_time', '')
  418. end_time = request.POST.get('end_time', '')
  419. query = request.POST.get('query', '')
  420. dupload = request.POST.get('dupload', '')
  421. has_scan = request.POST.get('has_scan', '')
  422. code_version = request.POST.get('code_version', 0)
  423. is_online_sale = request.POST.get('is_online_sale', '')
  424. 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')
  425. if dupload:
  426. logs = logs.filter(dupload=dupload)
  427. if code_version:
  428. logs = logs.filter(code_version=code_version)
  429. if has_scan:
  430. logs = logs.filter(has_scan=has_scan)
  431. if start_time and end_time:
  432. logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)
  433. if is_online_sale:
  434. logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else ''))
  435. count = logs.count()
  436. logs, left = pagination(logs, page, num)
  437. logs = [log.admindata for log in logs]
  438. return response(200, 'Get Sale Record Success', u'获取销售员销售记录成功', data={
  439. 'logs': logs,
  440. 'count': count,
  441. 'left': left
  442. })
  443. @check_admin
  444. def record_sale_batch(request, administrator):
  445. logs = json.loads(request.POST.get('logs', '[]'))
  446. infos = []
  447. unknows = []
  448. for log in logs:
  449. try:
  450. infos.append(SaleclerkSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], code=log['code'], status=True, dupload=False).admindata)
  451. except SaleclerkSubmitLogInfo.DoesNotExist:
  452. unknows.append(log)
  453. return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={
  454. 'logs': infos,
  455. 'unknows': unknows
  456. })
  457. @check_admin
  458. def model_list(request, administrator):
  459. infos = ModelInfo.objects.filter(status=True)
  460. infos = [info.admindata for info in infos]
  461. return response(200, 'Get Model List Success', u'获取型号列表成功', data={
  462. 'models': infos
  463. })
  464. @check_admin
  465. def distributor_list(request, administrator):
  466. infos = list(DistributorInfo.objects.filter(status=True).values_list('distributor_name', flat=True).distinct().order_by('distributor_name'))
  467. return response(200, 'Get Model List Success', u'获取经销商列表成功', data={
  468. 'distributors': infos
  469. })
  470. @check_admin
  471. def member_goods_order(request, administrator):
  472. query = request.POST.get('query', '')
  473. good_type = request.POST.get('good_type', '')
  474. page = request.POST.get('page', 1)
  475. num = request.POST.get('num', 20)
  476. order_status = int(request.POST.get('order_status', 0))
  477. start_time = request.POST.get('start_time', '')
  478. end_time = request.POST.get('end_time', '')
  479. orders = GoodsOrderInfo.objects.filter(Q(phone__icontains=query) | Q(user_id=query) | Q(title__icontains=query) & Q(status=True)).order_by('-pk')
  480. if good_type:
  481. orders = orders.filter(good_type=good_type)
  482. if start_time and end_time:
  483. start_time = datetime.strptime(start_time, '%Y%m%d')
  484. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  485. orders = orders.filter(created_at__range=(start_time, end_time))
  486. # 未发货,即快递单号为空
  487. if order_status == 1:
  488. orders = orders.filter(Q(tracking_number__isnull=True) | Q(tracking_number=''))
  489. elif order_status == 2:
  490. orders = orders.filter(tracking_number__isnull=False).exclude(tracking_number='')
  491. count = orders.count()
  492. orders, left = pagination(orders, page, num)
  493. orders = [order.admindata for order in orders]
  494. return response(200, 'Get Member Goods Order List Success', u'获取会员商品订单列表成功', data={
  495. 'orders': orders,
  496. 'left': left,
  497. 'count': count
  498. })
  499. @check_admin
  500. def member_goods_order_update(request, administrator):
  501. order_id = request.POST.get('order_id', '')
  502. tracking_number = request.POST.get('tracking_number', '')
  503. remark = request.POST.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')
  504. if not send_trackingNumber_message(order_id, tracking_number, remark):
  505. return response(400001, 'Member Goods Order Update Failure', u'会员商品订单修改失败')
  506. return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功')
  507. @check_admin
  508. def member_goods_order_batch_update(request, administrator):
  509. orders = json.loads(request.POST.get('orders', '[]'))
  510. err_orders = []
  511. for order in orders:
  512. if not send_trackingNumber_message(order.get('order_id', ''), order.get('tracking_number', ''), order.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')):
  513. err_orders.append(order.get('order_id', ''))
  514. if err_orders:
  515. return response(40001, 'Member Goods Order Update Error', u'部分会员商品订单修改失败', data={
  516. 'orders': err_orders
  517. })
  518. return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功')
  519. def send_trackingNumber_message(order_id, tracking_number, remark):
  520. try:
  521. order = GoodsOrderInfo.objects.get(order_id=order_id, status=True)
  522. order.remark = remark
  523. order.tracking_number = tracking_number
  524. if tracking_number and order.good_type == GoodsInfo.PHYSICAL and not order.has_send_template_message:
  525. order.has_send_template_message = True
  526. # 校验用户是否存在
  527. user = UserInfo.objects.get(user_id=order.user_id)
  528. data = {
  529. "thing6": {
  530. "value": order.title,
  531. "color": "#173177"
  532. },
  533. "character_string7": {
  534. "value": tracking_number,
  535. "color": "#173177"
  536. },
  537. "number2": {
  538. "value": order.integral,
  539. "color": "#173177"
  540. },
  541. "thing5": {
  542. "value": order.remark,
  543. "color": "#173177"
  544. },
  545. }
  546. res = sendwxasubscribemessage(openid=user.openid_miniapp, template_id=settings.TEMPLATE_ID_TRACKING, data=data, miniprogram_state=None, lang=None, page=None)
  547. order.send_template_message_res = json.dumps(res)
  548. order.save()
  549. return True
  550. except Exception:
  551. return False
  552. @check_admin
  553. def record_warehouse(request, administrator):
  554. model_name = request.POST.get('model_name', '')
  555. sn = request.POST.get('sn', '')
  556. start_time = request.POST.get('start_time', '')
  557. end_time = request.POST.get('end_time', '')
  558. page = request.POST.get('page', 1)
  559. num = request.POST.get('num', 20)
  560. models = ModelInfo.objects.filter(model_name__icontains=model_name, status=True).values_list('pk', flat=True)
  561. logs = MchInfoEncryptLogInfo.objects.filter(model_pk__in=models, sn__icontains=sn, status=True)
  562. if start_time and end_time:
  563. start_time = datetime.strptime(start_time, '%Y%m%d')
  564. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  565. logs = logs.filter(created_at__range=(start_time, end_time))
  566. logs = logs.order_by('-pk')
  567. count = logs.count()
  568. logs, left = pagination(logs, page, num)
  569. logs = [log.admindata for log in logs]
  570. return response(200, 'Get Warehouse Record Success', u'获取入库记录成功', data={
  571. 'logs': logs,
  572. 'left': left,
  573. 'count': count
  574. })
  575. @check_admin
  576. def member_activity_list(request, administrator):
  577. activity_type = request.POST.get('activity_type', '')
  578. title = request.POST.get('title', '')
  579. start_time = request.POST.get('start_time', '')
  580. end_time = request.POST.get('end_time', '')
  581. page = request.POST.get('page', 1)
  582. num = request.POST.get('num', 20)
  583. activity_state = request.POST.get('activity_state', '')
  584. logs = MemberActivityInfo.objects.filter(status=True)
  585. if activity_type:
  586. logs = logs.filter(activity_type=activity_type)
  587. if activity_state:
  588. logs = logs.filter(activity_state=activity_state)
  589. if title:
  590. logs = logs.filter(title__icontains=title)
  591. if start_time and end_time:
  592. start_time = datetime.strptime(start_time, '%Y%m%d')
  593. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  594. logs = logs.filter(created_at__range=(start_time, end_time))
  595. logs = logs.order_by('-pk')
  596. count = logs.count()
  597. logs, left = pagination(logs, page, num)
  598. logs = [log.admindata for log in logs]
  599. return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
  600. 'logs': logs,
  601. 'left': left,
  602. 'count': count
  603. })
  604. @check_admin
  605. def member_activity_detail(request, administrator):
  606. activity_id = request.POST.get('activity_id', '')
  607. try:
  608. log = MemberActivityInfo.objects.get(activity_id=activity_id)
  609. except MemberActivityInfo.DoesNotExist:
  610. return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
  611. return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
  612. 'log': log.admindetails,
  613. })
  614. @check_admin
  615. def member_activity_update(request, administrator):
  616. activity_id = request.POST.get('activity_id', '')
  617. activity_type = int(request.POST.get('activity_type', 0))
  618. title = request.POST.get('title', '')
  619. subtitle = request.POST.get('subtitle', '')
  620. start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
  621. end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
  622. start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
  623. end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
  624. city = request.POST.get('city', '')
  625. location = request.POST.get('location', '')
  626. integral = int(request.POST.get('integral', 0))
  627. is_slider = request.POST.get('is_slider', 0)
  628. slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '')
  629. cover_path = request.POST.get('cover_path', '')
  630. detail_image_path = request.POST.get('detail_image_path', '')
  631. limit_image_num = int(request.POST.get('limit_image_num', 3))
  632. is_signup = request.POST.get('is_signup', 0)
  633. group_share_max_integral = int(request.POST.get('share_max_integral', 0))
  634. group_share_integral = int(request.POST.get('share_integral', 0))
  635. content_rich_text = request.POST.get('content_rich_text', '')
  636. share_h5_link = request.POST.get('share_h5_link', '')
  637. activity_state = int(request.POST.get('activity_state', 0))
  638. poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
  639. poster_content = request.POST.get('poster_content', '')
  640. contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
  641. try:
  642. log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
  643. except MemberActivityInfo.DoesNotExist:
  644. return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
  645. log.activity_type = activity_type
  646. log.title = title
  647. log.subtitle = subtitle
  648. log.date = date
  649. log.start_date = start_date
  650. log.end_date = end_date
  651. log.start_display_date = start_display_date
  652. log.end_display_date = end_display_date
  653. log.city = city
  654. log.location = location
  655. log.integral = integral
  656. log.is_slider = is_slider
  657. log.slider_image = slider_image_path
  658. log.cover = cover_path
  659. log.image = detail_image_path
  660. log.limit_image_num = limit_image_num
  661. log.is_signup = is_signup
  662. log.group_share_integral = group_share_integral
  663. log.group_share_max_integral = group_share_max_integral
  664. log.content_rich_text = content_rich_text
  665. log.share_h5_link = share_h5_link
  666. log.activity_state = activity_state
  667. log.poster_kv_img_url = poster_kv_img_url
  668. log.poster_content = poster_content
  669. log.contribution_content_placeholder = contribution_content_placeholder
  670. log.save()
  671. return response(200, 'MemberActivityInfo Update Success', u'会员活动更新成功')
  672. @check_admin
  673. def member_activity_create(request, administrator):
  674. activity_type = int(request.POST.get('activity_type', 0))
  675. title = request.POST.get('title', '')
  676. subtitle = request.POST.get('subtitle', '')
  677. start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
  678. end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
  679. start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
  680. end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
  681. city = request.POST.get('city', '')
  682. location = request.POST.get('location', '')
  683. integral = int(request.POST.get('integral', 0))
  684. is_slider = request.POST.get('is_slider', 0)
  685. slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '')
  686. cover_path = request.POST.get('cover_path', '')
  687. detail_image_path = request.POST.get('detail_image_path', '')
  688. limit_image_num = int(request.POST.get('limit_image_num', 3))
  689. is_signup = request.POST.get('is_signup', 0)
  690. group_share_max_integral = int(request.POST.get('share_max_integral', 0))
  691. group_share_integral = int(request.POST.get('share_integral', 0))
  692. content_rich_text = request.POST.get('content_rich_text', '')
  693. share_h5_link = request.POST.get('share_h5_link', '')
  694. activity_state = int(request.POST.get('activity_state', 0))
  695. poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
  696. poster_content = request.POST.get('poster_content', '')
  697. contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
  698. act = MemberActivityInfo.objects.create(
  699. brand_id=administrator.brand_id,
  700. activity_type=activity_type,
  701. title=title,
  702. subtitle=subtitle,
  703. date=date,
  704. start_date=start_date,
  705. end_date=end_date,
  706. start_display_date=start_display_date,
  707. end_display_date=end_display_date,
  708. city=city,
  709. location=location,
  710. integral=integral,
  711. is_slider=is_slider,
  712. slider_image=slider_image_path,
  713. cover=cover_path,
  714. image=detail_image_path,
  715. limit_image_num=limit_image_num,
  716. is_signup=is_signup,
  717. group_share_max_integral=group_share_max_integral,
  718. group_share_integral=group_share_integral,
  719. content_rich_text=content_rich_text,
  720. share_h5_link=share_h5_link,
  721. activity_state=activity_state,
  722. poster_kv_img_url=poster_kv_img_url,
  723. poster_content=poster_content,
  724. contribution_content_placeholder=contribution_content_placeholder,
  725. is_upload_qiniu=True,
  726. )
  727. return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={
  728. 'activity': act.admindetails
  729. })
  730. @check_admin
  731. def member_activity_share_list(request, administrator):
  732. activity_id = request.POST.get('activity_id', '')
  733. page = int(request.POST.get('page', 1))
  734. num = int(request.POST.get('num', 20))
  735. logs = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, status=True)
  736. total_integral = logs.aggregate(Sum('integral'))['integral__sum']
  737. logs = logs.values('share_user_id').annotate(integral_sum=Sum('integral'), group_count=Count('open_gid'), user_count=Count('click_user_id')).order_by('-user_count')
  738. count = logs.count()
  739. logs, left = pagination(logs, page, num)
  740. return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
  741. 'logs': list(logs),
  742. 'count': count,
  743. 'left': left,
  744. 'total_integral': total_integral
  745. })
  746. @check_admin
  747. def member_activity_register_list(request, administrator):
  748. activity_id = request.POST.get('activity_id', '')
  749. page = int(request.POST.get('page', 1))
  750. num = int(request.POST.get('num', 20))
  751. logs = MemberActivitySignupInfo.objects.filter(activity_id=activity_id, status=True)
  752. count = logs.count()
  753. logs, left = pagination(logs, page, num)
  754. logs = [log.admindata for log in logs]
  755. return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
  756. 'logs': list(logs),
  757. 'count': count,
  758. 'left': left,
  759. })
  760. @logit
  761. @check_admin
  762. def member_activity_contribute_list(request, administrator):
  763. brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
  764. activity_id = request.POST.get('activity_id', '')
  765. content_type = get_query_value(request, 'content_type', val_cast_type='int')
  766. audit_status = request.POST.get('audit_status', '')
  767. is_selected = request.POST.get('is_selected', '')
  768. query = request.POST.get('query', '')
  769. page = request.POST.get('page', 1)
  770. num = request.POST.get('num', 20)
  771. contributions = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, status=True)
  772. if 'content_type' in request.POST:
  773. contributions = contributions.filter(content_type=content_type)
  774. if audit_status != '':
  775. contributions = contributions.filter(audit_status=audit_status)
  776. if is_selected != '':
  777. contributions = contributions.filter(is_selected=is_selected)
  778. if query:
  779. contributions = contributions.filter(Q(title__icontains=query) | Q(user_name__icontains=query))
  780. contributions = contributions.order_by('-pk')
  781. count = contributions.count()
  782. contributions, left = pagination(contributions, page, num)
  783. contributions = [contribution.admindata for contribution in contributions]
  784. return response(data={
  785. 'contributions': contributions,
  786. 'left': left,
  787. 'count': count
  788. })
  789. @check_admin
  790. @transaction.atomic
  791. def member_activity_contribute_audit(request, administrator):
  792. contribution_id = request.POST.get('contribution_id', '')
  793. audit_status = get_query_value(request, 'audit_status', val_cast_type='int')
  794. try:
  795. contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True)
  796. except MemberActivityContributionInfo.DoesNotExist:
  797. return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
  798. contribution.audit_status = audit_status
  799. contribution.save()
  800. return response(200, 'Member Activity Contribution Audit Success', u'会员活动投稿审批成功')
  801. @check_admin
  802. @transaction.atomic
  803. def member_activity_contribute_selected(request, administrator):
  804. contribution_id = request.POST.get('contribution_id', '')
  805. selected = get_query_value(request, 'selected', val_cast_type='int')
  806. try:
  807. contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True)
  808. except MemberActivityContributionInfo.DoesNotExist:
  809. return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
  810. contribution.is_selected = selected
  811. contribution.save()
  812. return response(200, 'Member Activity Contribution Selected Success', u'会员活动投稿入围成功')
  813. @check_admin
  814. def member_activity_contribute_welfare_list(request, administrator):
  815. welfare_type = request.POST.get('welfare_type', '')
  816. welfare_title = request.POST.get('welfare_title', '')
  817. page = request.POST.get('page', 1)
  818. num = request.POST.get('num', 20)
  819. welfares = MemberActivityContributionWelfareInfo.objects.filter(status=True)
  820. if welfare_type:
  821. welfares = welfares.filter(welfare_type=welfare_type)
  822. if welfare_title:
  823. welfares = welfares.filter(welfare_title__icontains=welfare_title)
  824. welfares = welfares.order_by('-pk')
  825. count = welfares.count()
  826. welfares, left = pagination(welfares, page, num)
  827. welfares = [welfare.data for welfare in welfares]
  828. return response(200, 'Get Member Activity Contribute Welfare List Success', u'获取会员活动投稿福利列表成功', data={
  829. 'welfares': welfares,
  830. 'left': left,
  831. 'count': count
  832. })
  833. @check_admin
  834. def member_activity_contribute_welfare_detail(request, administrator):
  835. welfare_id = request.POST.get('welfare_id', '')
  836. try:
  837. welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id)
  838. except MemberActivityContributionWelfareInfo.DoesNotExist:
  839. return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
  840. return response(200, 'Get Member Activity Contribute Welfare Detail Success', u'获取会员活动投稿福利详情成功', data={
  841. 'welfare': welfare.data,
  842. })
  843. @check_admin
  844. def member_activity_contribute_welfare_update(request, administrator):
  845. activity_id = request.POST.get('activity_id', '')
  846. welfare_id = request.POST.get('welfare_id', '')
  847. welfare_type = int(request.POST.get('welfare_type', 0))
  848. welfare_title = request.POST.get('welfare_title', '')
  849. welfare_detail = request.POST.get('welfare_detail', '')
  850. welfare_value = request.POST.get('welfare_value', 0)
  851. welfare_image_path = request.POST.get('welfare_image_path', '')
  852. try:
  853. welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
  854. except MemberActivityContributionWelfareInfo.DoesNotExist:
  855. return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
  856. welfare.activity_id = activity_id
  857. welfare.welfare_type = welfare_type
  858. welfare.welfare_title = welfare_title
  859. welfare.welfare_detail = welfare_detail
  860. welfare.welfare_value = welfare_value if welfare_value else 0
  861. welfare.welfare_image = welfare_image_path
  862. welfare.save()
  863. return response(200, 'Update Member Activity Contribute Welfare Success', u'更新会员活动投稿福利成功')
  864. @check_admin
  865. def member_activity_contribute_welfare_create(request, administrator):
  866. activity_id = request.POST.get('activity_id', '')
  867. welfare_type = int(request.POST.get('welfare_type', 0))
  868. welfare_title = request.POST.get('welfare_title', '')
  869. welfare_detail = request.POST.get('welfare_detail', '')
  870. welfare_value = request.POST.get('welfare_value', 0)
  871. welfare_image_path = request.POST.get('welfare_image_path', None)
  872. MemberActivityContributionWelfareInfo.objects.create(
  873. brand_id=administrator.brand_id,
  874. activity_id=activity_id,
  875. welfare_type=welfare_type,
  876. welfare_title=welfare_title,
  877. welfare_detail=welfare_detail,
  878. welfare_value=welfare_value if welfare_value else 0,
  879. welfare_image=welfare_image_path,
  880. )
  881. return response(200, 'Create Member Activity Contribute Welfare Success', u'创建会员活动投稿福利成功')
  882. @check_admin
  883. def member_activity_contribute_welfare_delete(request, administrator):
  884. welfare_id = request.POST.get('welfare_id', '')
  885. try:
  886. welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
  887. except MemberActivityContributionWelfareInfo.DoesNotExist:
  888. return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
  889. welfare.status = False
  890. welfare.save()
  891. return response(200, 'Delete Member Activity Contribute Welfare Success', u'删除会员活动投稿福利成功')
  892. @check_admin
  893. def member_activity_contribute_welfare_unlock(request, administrator):
  894. admin_id = request.POST.get('admin_id', '')
  895. contribution_id = request.POST.get('contribution_id', '')
  896. welfare_id = request.POST.get('welfare_id', '')
  897. try:
  898. contribution = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id, status=True)
  899. except MemberActivityContributionInfo.DoesNotExist:
  900. return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
  901. try:
  902. welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
  903. except MemberActivityContributionWelfareInfo.DoesNotExist:
  904. return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
  905. unlocking_info, _ = MemberActivityContributionWelfareUnlockingInfo.objects.get_or_create(
  906. brand_id=administrator.brand_id,
  907. user_id=contribution.user_id,
  908. activity_id=contribution.activity_id,
  909. welfare_id=welfare_id,
  910. defaults={
  911. 'admin_id': admin_id,
  912. 'contribution_id': contribution_id,
  913. 'welfare_type': welfare.welfare_type,
  914. 'welfare_value': welfare.welfare_value,
  915. }
  916. )
  917. # Send template_message
  918. try:
  919. user = UserInfo.objects.get(user_id=contribution.user_id, status=True)
  920. except UserInfo.DoesNotExist:
  921. return response(UserStatusCode.USER_NOT_FOUND)
  922. try:
  923. act = MemberActivityInfo.objects.get(activity_id=contribution.activity_id, status=True)
  924. except MemberActivityInfo.DoesNotExist:
  925. return (MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
  926. data = {
  927. "first": {
  928. "value": u'你的活动福利已解锁。',
  929. "color": "#173177"
  930. },
  931. "keyword1": {
  932. "value": act.title,
  933. "color": "#173177"
  934. },
  935. "keyword2": {
  936. "value": welfare.welfare_title,
  937. "color": "#173177"
  938. },
  939. "remark": {
  940. "value": u'请点击详情填写收货地址。' if welfare.welfare_type == 0 else u'请点击详情进入小程序,收取福利。',
  941. "color": "#173177"
  942. }
  943. }
  944. wxcfg = WECHAT.get('MINIAPP', {})
  945. appid = wxcfg.get('appID')
  946. sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_UNLOCKING_WELFARE, data=data, miniappid=appid, minipagepath='/pages/member/activity/activity?unlocking_id={}'.format(unlocking_info.unlocking_id))
  947. return response(200, 'Unlock Member Activity Contribute Welfare Success', u'解锁会员活动投稿福利成功')
  948. @logit
  949. @check_admin
  950. def member_activity_contribute_welfare_unlocking_list(request, administrator):
  951. user_id = request.POST.get('user_id', '')
  952. activity_id = request.POST.get('activity_id', '')
  953. contribution_id = request.POST.get('contribution_id', '')
  954. welfare_id = request.POST.get('welfare_id', '')
  955. query = request.POST.get('query', '')
  956. is_handled = request.POST.get('is_handled', '')
  957. page = request.POST.get('page', 1)
  958. num = request.POST.get('num', 20)
  959. unlockings = MemberActivityContributionWelfareUnlockingInfo.objects.filter(status=True)
  960. if user_id:
  961. unlockings = unlockings.filter(user_id=user_id)
  962. if activity_id:
  963. unlockings = unlockings.filter(activity_id=activity_id)
  964. if contribution_id:
  965. unlockings = unlockings.filter(contribution_id=contribution_id)
  966. if welfare_id:
  967. unlockings = unlockings.filter(welfare_id=welfare_id)
  968. if query:
  969. users = MemberActivitySignupInfo.objects.values_list('user_id', flat=True).filter(name__icontains=query)
  970. unlockings = unlockings.filter(Q(name__icontains=query) | Q(phone__icontains=query) | Q(user_id__in=users))
  971. if is_handled != '':
  972. unlockings = unlockings.filter(is_handled=is_handled)
  973. unlockings = unlockings.order_by('-pk')
  974. count = unlockings.count()
  975. unlockings, left = pagination(unlockings, page, num)
  976. unlockings = [unlocking.data for unlocking in unlockings]
  977. return response(data={
  978. 'unlockings': unlockings,
  979. 'left': left,
  980. 'count': count,
  981. })
  982. @logit
  983. @check_admin
  984. def member_activity_contribute_welfare_unlocking_detail(request, administrator):
  985. unlocking_id = request.POST.get('unlocking_id', '')
  986. try:
  987. unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.get(unlocking_id=unlocking_id, status=True)
  988. except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
  989. return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)
  990. return response(data=unlocking.data)
  991. @logit
  992. @check_admin
  993. @transaction.atomic
  994. def member_activity_contribute_welfare_unlocking_update(request, administrator):
  995. unlocking_id = request.POST.get('unlocking_id', '')
  996. name = request.POST.get('name', '')
  997. phone = request.POST.get('phone', '')
  998. address = request.POST.get('address', '')
  999. tracking_number = request.POST.get('tracking_number', '')
  1000. try:
  1001. unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True)
  1002. except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
  1003. return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)
  1004. if name:
  1005. unlocking.name = name
  1006. if phone:
  1007. unlocking.phone = phone
  1008. if address:
  1009. unlocking.address = address
  1010. if tracking_number:
  1011. unlocking.tracking_number = tracking_number
  1012. unlocking.save()
  1013. return response(200, 'Update Member Activity Contribute Welfare Unblocking Success', u'更新会员活动投稿福利解锁成功')
  1014. @logit
  1015. @check_admin
  1016. @transaction.atomic
  1017. def member_activity_contribute_welfare_unlocking_delete(request, administrator):
  1018. unlocking_id = request.POST.get('unlocking_id', '')
  1019. try:
  1020. unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True)
  1021. except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
  1022. return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)
  1023. unlocking.status = False
  1024. unlocking.save()
  1025. return response(200, 'Delete Member Activity Contribute Welfare Unblocking Success', u'删除会员活动投稿福利解锁成功')
  1026. @check_admin
  1027. def coupon_list(request, administrator):
  1028. title = request.POST.get('title', '')
  1029. start_time = request.POST.get('start_time', '')
  1030. end_time = request.POST.get('end_time', '')
  1031. page = request.POST.get('page', 1)
  1032. num = request.POST.get('num', 20)
  1033. logs = CouponInfo.objects.filter(coupon_title__icontains=title, status=True)
  1034. if start_time and end_time:
  1035. start_time = datetime.strptime(start_time, '%Y%m%d')
  1036. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  1037. logs = logs.filter(created_at__range=(start_time, end_time))
  1038. logs = logs.order_by('-pk')
  1039. count = logs.count()
  1040. logs, left = pagination(logs, page, num)
  1041. logs = [log.admindata for log in logs]
  1042. return response(200, 'Get CouponInfo List Success', u'获取劵列表成功', data={
  1043. 'logs': logs,
  1044. 'left': left,
  1045. 'count': count
  1046. })
  1047. @check_admin
  1048. def coupon_detail(request, administrator):
  1049. coupon_id = request.POST.get('coupon_id', '')
  1050. try:
  1051. log = CouponInfo.objects.get(coupon_id=coupon_id)
  1052. except CouponInfo.DoesNotExist:
  1053. return response(CouponStatusCode.COUPON_NOT_FOUND)
  1054. log = log.admindetails
  1055. return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
  1056. 'log': log,
  1057. })
  1058. @check_admin
  1059. def coupon_create(request, administrator):
  1060. coupon_title = request.POST.get('coupon_title', '')
  1061. coupon_detail = request.POST.get('coupon_detail', '')
  1062. coupon_value = int(request.POST.get('coupon_value', 0))
  1063. coupon_image = request.POST.get('coupon_image', '')
  1064. coupon_expire_type = int(request.POST.get('coupon_expire_type', 0))
  1065. coupon_valid_period = int(request.POST.get('coupon_valid_period', 0))
  1066. coupon_expire_at = request.POST.get('coupon_expire_at', '')
  1067. is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1))
  1068. info = CouponInfo.objects.create(
  1069. brand_id=administrator.brand_id,
  1070. coupon_title=coupon_title,
  1071. coupon_detail=coupon_detail,
  1072. coupon_value=coupon_value,
  1073. coupon_image=coupon_image,
  1074. coupon_expire_type=coupon_expire_type,
  1075. coupon_valid_period=coupon_valid_period,
  1076. is_coupon_admin_writeoff=is_coupon_admin_writeoff,
  1077. )
  1078. if coupon_expire_at:
  1079. info.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
  1080. info.save()
  1081. return response(200, 'CouponInfo Create Success', u'劵创建成功')
  1082. @check_admin
  1083. def coupon_update(request, administrator):
  1084. coupon_id = request.POST.get('coupon_id', '')
  1085. coupon_title = request.POST.get('coupon_title', '')
  1086. coupon_detail = request.POST.get('coupon_detail', '')
  1087. coupon_value = int(request.POST.get('coupon_value', 0))
  1088. coupon_image = request.POST.get('coupon_image', '')
  1089. coupon_expire_type = int(request.POST.get('coupon_expire_type', 0))
  1090. coupon_valid_period = int(request.POST.get('coupon_valid_period', 0))
  1091. coupon_expire_at = request.POST.get('coupon_expire_at', '')
  1092. is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1))
  1093. try:
  1094. log = CouponInfo.objects.get(coupon_id=coupon_id, status=True)
  1095. except CouponInfo.DoesNotExist:
  1096. return response(CouponStatusCode.COUPON_NOT_FOUND)
  1097. log.brand_id = administrator.brand_id
  1098. log.coupon_title = coupon_title
  1099. log.coupon_detail = coupon_detail
  1100. log.coupon_value = coupon_value
  1101. log.coupon_image = coupon_image
  1102. log.coupon_expire_type = coupon_expire_type
  1103. log.coupon_valid_period = coupon_valid_period
  1104. if coupon_expire_at:
  1105. log.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
  1106. log.is_coupon_admin_writeoff = is_coupon_admin_writeoff
  1107. log.save()
  1108. return response(200, 'CouponInfo Update Success', u'劵更新成功')
  1109. @check_admin
  1110. def coupon_delete(request, administrator):
  1111. coupon_id = request.POST.get('activity_id', '')
  1112. try:
  1113. log = CouponInfo.objects.get(coupon_id=coupon_id, status=True)
  1114. except CouponInfo.DoesNotExist:
  1115. return response(CouponStatusCode.COUPON_NOT_FOUND)
  1116. log.status = False
  1117. log.save()
  1118. return response(200, 'CouponInfo Delete Success', u'劵删除成功')
  1119. @check_admin
  1120. def member_goods_list(request, administrator):
  1121. title = request.POST.get('title', '')
  1122. page = request.POST.get('page', 1)
  1123. num = request.POST.get('num', 20)
  1124. understock = request.POST.get('understock', '')
  1125. good_state = request.POST.get('good_state', '')
  1126. logs = GoodsInfo.objects.filter(title__icontains=title).order_by('-pk')
  1127. if understock:
  1128. logs = logs.filter(left_num=0)
  1129. if good_state:
  1130. logs = logs.filter(good_state=good_state)
  1131. count = logs.count()
  1132. logs, left = pagination(logs, page, num)
  1133. logs = [log.admindata for log in logs]
  1134. return response(200, 'Get Member Goods Success', u'获取会员商品成功', data={
  1135. 'logs': logs,
  1136. 'left': left,
  1137. 'count': count
  1138. })
  1139. @check_admin
  1140. def member_goods_detail(request, administrator):
  1141. good_id = request.POST.get('good_id', '')
  1142. try:
  1143. log = GoodsInfo.objects.get(good_id=good_id)
  1144. except GoodsInfo.DoesNotExist:
  1145. return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
  1146. log = log.admindetails
  1147. return response(200, 'Get Member Goods Details Success', u'获取积分商品详情成功', data={
  1148. 'log': log,
  1149. })
  1150. @check_admin
  1151. def member_goods_update(request, administrator):
  1152. good_id = request.POST.get('good_id', '')
  1153. title = request.POST.get('title', '')
  1154. desc = request.POST.get('desc', '')
  1155. value = int(request.POST.get('value', 0))
  1156. left_num = int(request.POST.get('left_num', 0))
  1157. image = request.POST.get('image_path', '')
  1158. coupon_id = request.POST.get('coupon_id', '')
  1159. slider_image = request.POST.get('slider_path', '')
  1160. integral = int(request.POST.get('integral', 0))
  1161. fee = int(request.POST.get('fee', 0))
  1162. try:
  1163. log = GoodsInfo.objects.get(good_id=good_id, status=True)
  1164. except GoodsInfo.DoesNotExist:
  1165. return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
  1166. log.title = title
  1167. log.desc = desc
  1168. log.value = value
  1169. log.left_num = left_num
  1170. log.image = image
  1171. log.coupon_id = coupon_id
  1172. log.slider_image = slider_image
  1173. log.integral = integral
  1174. log.fee = fee
  1175. log.save()
  1176. return response(200, 'GoodsInfo Update Success', u'积分商品更新成功')
  1177. @check_admin
  1178. def member_goods_create(request, administrator):
  1179. good_type = int(request.POST.get('good_type', 0))
  1180. title = request.POST.get('title', '')
  1181. desc = request.POST.get('desc', '')
  1182. value = int(request.POST.get('value', 0))
  1183. left_num = int(request.POST.get('left_num', 0))
  1184. image = request.POST.get('image_path', '')
  1185. coupon_id = request.POST.get('coupon_id', '')
  1186. slider_image = request.POST.get('slider_path', '')
  1187. integral = int(request.POST.get('integral', 0))
  1188. fee = int(request.POST.get('fee', 0))
  1189. GoodsInfo.objects.create(
  1190. brand_id=administrator.brand_id,
  1191. good_type=good_type,
  1192. title=title,
  1193. desc=desc,
  1194. value=value,
  1195. left_num=left_num,
  1196. image=image,
  1197. coupon_id=coupon_id,
  1198. slider_image=slider_image,
  1199. integral=integral,
  1200. fee=fee,
  1201. )
  1202. return response(200, 'GoodsInfo Create Success', u'积分商品创建成功')
  1203. @check_admin
  1204. def complement_code_list(request, administrator):
  1205. start_time = request.POST.get('start_time', '')
  1206. end_time = request.POST.get('end_time', '')
  1207. type_ = request.POST.get('type', '')
  1208. query = request.POST.get('query', '')
  1209. page = request.POST.get('page', 1)
  1210. num = request.POST.get('num', 20)
  1211. logs = ComplementCodeLogInfo.objects.filter(status=True)
  1212. if start_time and end_time:
  1213. start_time = datetime.strptime(start_time, '%Y%m%d')
  1214. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  1215. logs = logs.filter(created_at__range=(start_time, end_time))
  1216. if type_ == 'todo':
  1217. logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_TODO)
  1218. elif type_ == 'pass':
  1219. logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_PASS)
  1220. elif type_ == 'refused':
  1221. logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_REFUSED)
  1222. logs = logs.order_by('audit_status', '-pk')
  1223. if query:
  1224. logs = logs.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query))
  1225. count = logs.count()
  1226. logs, left = pagination(logs, page, num)
  1227. logs = [log.data for log in logs]
  1228. return response(200, 'Get Complement Code List Success', u'获取补码列表成功', data={
  1229. 'logs': logs,
  1230. 'left': left,
  1231. 'count': count
  1232. })
  1233. @check_admin
  1234. @transaction.atomic
  1235. def complement_code_audit(request, administrator):
  1236. brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
  1237. admin_id = request.POST.get('admin_id', '')
  1238. log_id = request.POST.get('log_id', '')
  1239. audit_status = int(request.POST.get('audit_status', 0)) # -1 审核不通过, 1 审核通过
  1240. if audit_status not in [ComplementCodeLogInfo.AUDIT_REFUSED, ComplementCodeLogInfo.AUDIT_PASS]:
  1241. return response(ComplementCodeStatusCode.COMPLEMENT_CODE_STATUS_INVALID)
  1242. try:
  1243. log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True)
  1244. except ComplementCodeLogInfo.DoesNotExist:
  1245. return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND)
  1246. if log.audit_status != ComplementCodeLogInfo.AUDIT_TODO:
  1247. return response(ComplementCodeStatusCode.COMPLEMENT_CODE_HAS_AUDITED)
  1248. log.audit_status = audit_status
  1249. log.save()
  1250. # 如果"审核通过"
  1251. if log.audit_status == ComplementCodeLogInfo.AUDIT_PASS:
  1252. try:
  1253. brand = BrandInfo.objects.get(brand_id=brand_id)
  1254. except BrandInfo.DoesNotExist:
  1255. brand = None
  1256. try:
  1257. model = ModelInfo.objects.get(model_id=log.model_id)
  1258. except ModelInfo.DoesNotExist:
  1259. model = None
  1260. # brand_id#model_id#distributor_id#sn#time
  1261. # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224
  1262. # brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
  1263. plaintext = '{}#{}#{}#{}#{}'.format(
  1264. brand.pk if brand else 0,
  1265. model.pk if model else 0,
  1266. 0,
  1267. log.sn,
  1268. tc.local_string(format='%Y%m%d')[2:],
  1269. )
  1270. ciphertext = get_ciphertext(plaintext, admin_id, True)
  1271. log.ciphertext = ciphertext
  1272. log.save()
  1273. try:
  1274. user = UserInfo.objects.get(user_id=log.user_id, status=True)
  1275. except UserInfo.DoesNotExist:
  1276. return response(UserStatusCode.USER_NOT_FOUND)
  1277. # Send template_message
  1278. data = {
  1279. "first": {
  1280. "value": u'你的补码申请已通过,请点击消息绑定您的电子保修卡',
  1281. "color": "#173177"
  1282. },
  1283. "keyword1": {
  1284. "value": log.name,
  1285. "color": "#173177"
  1286. },
  1287. "keyword2": {
  1288. "value": log.model_name,
  1289. "color": "#173177"
  1290. },
  1291. "keyword3": {
  1292. "value": log.sn,
  1293. "color": "#173177"
  1294. },
  1295. "remark": {
  1296. "value": u'感谢您的使用',
  1297. "color": "#173177"
  1298. }
  1299. }
  1300. wxcfg = WECHAT.get('MINIAPP', {})
  1301. appid = wxcfg.get('appID')
  1302. sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_COMPLEMENT, data=data, miniappid=appid, minipagepath='/pages/register/consumer/consumer?q={}&marketcode=1'.format(ciphertext))
  1303. return response(data={
  1304. 'ciphertext': ciphertext,
  1305. })
  1306. return response()
  1307. @check_admin
  1308. @transaction.atomic
  1309. def complement_code_contacted(request, administrator):
  1310. log_id = request.POST.get('log_id', '')
  1311. is_contacted = int(request.POST.get('is_contacted', 0)) # 0 未联系, 1 已联系
  1312. try:
  1313. log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True)
  1314. except ComplementCodeLogInfo.DoesNotExist:
  1315. return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND)
  1316. log.is_contacted = is_contacted
  1317. log.save()
  1318. return response()
  1319. @check_admin
  1320. def administrator_list(request, administrator):
  1321. page = request.POST.get('page', 1)
  1322. num = request.POST.get('num', 20)
  1323. if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
  1324. return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
  1325. logs = AdministratorInfo.objects.filter(status=True).order_by('-created_at')
  1326. count = logs.count()
  1327. logs, left = pagination(logs, page, num)
  1328. logs = [log.admindata for log in logs]
  1329. return response(200, 'Get Admin List Success', u'获取后台管理员成功', data={
  1330. 'logs': logs,
  1331. 'left': left,
  1332. 'count': count
  1333. })
  1334. @check_admin
  1335. def administrator_create(request, administrator):
  1336. admin_type = request.POST.get('admin_type', '')
  1337. phone = request.POST.get('phone', '')
  1338. name = request.POST.get('name', '')
  1339. password = request.POST.get('password', '')
  1340. brand_name = request.POST.get('brand_name', '')
  1341. if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
  1342. return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
  1343. encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
  1344. AdministratorInfo.objects.create(
  1345. brand_id=administrator.brand_id,
  1346. brand_name=brand_name or administrator.brand_name,
  1347. admin_type=admin_type,
  1348. phone=phone,
  1349. name=name,
  1350. password='',
  1351. encryption=encryption,
  1352. )
  1353. return response(200, 'Create Admin Success', u'创建后台管理员成功')
  1354. @check_admin
  1355. def administrator_update(request, administrator):
  1356. target_admin_id = request.POST.get('target_admin_id', '')
  1357. admin_type = int(request.POST.get('admin_type', -1))
  1358. phone = request.POST.get('phone', '')
  1359. name = request.POST.get('name', '')
  1360. password = request.POST.get('password', '')
  1361. if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
  1362. return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
  1363. target_admin = AdministratorInfo.objects.get(admin_id=target_admin_id, status=True)
  1364. if admin_type != -1:
  1365. target_admin.admin_type = admin_type
  1366. if phone:
  1367. target_admin.phone = phone
  1368. if name:
  1369. target_admin.name = name
  1370. AdministratorLoginLogInfo.objects.filter(admin_id=target_admin_id).update(admin_name=name)
  1371. if password:
  1372. encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
  1373. target_admin.encryption = encryption
  1374. target_admin.save()
  1375. return response(200, 'Update Admin Success', u'更新后台管理员成功')
  1376. @check_admin
  1377. def administrator_delete(request, administrator):
  1378. target_admin_id = request.POST.get('target_admin_id', '')
  1379. if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
  1380. return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
  1381. AdministratorInfo.objects.filter(admin_id=target_admin_id).update(status=False)
  1382. return response(200, 'Delete Admin Success', u'删除后台管理员成功')
  1383. @check_admin
  1384. def administrator_login_list(request, administrator):
  1385. page = request.POST.get('page', 1)
  1386. num = request.POST.get('num', 20)
  1387. target_admin_id = request.POST.get('target_admin_id', '')
  1388. if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
  1389. return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
  1390. logs = AdministratorLoginLogInfo.objects.filter(status=True).order_by('-login_at')
  1391. if target_admin_id:
  1392. logs = logs.filter(admin_id=target_admin_id)
  1393. count = logs.count()
  1394. logs, left = pagination(logs, page, num)
  1395. logs = [log.admindata for log in logs]
  1396. return response(200, 'Get Administrator Login List Success', u'获取后台管理员登录日志成功', data={
  1397. 'logs': logs,
  1398. 'left': left,
  1399. 'count': count
  1400. })