暂无描述

mch_views.py 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. from django.conf import settings
  4. from django.contrib.auth.hashers import check_password
  5. from django_logit import logit
  6. from django_response import response
  7. from pywe_miniapp import get_phone_number
  8. from pywe_storage import RedisStorage
  9. from TimeConvert import TimeConvert as tc
  10. from account.models import UserInfo
  11. from mch.models import (AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo,
  12. LatestAppScreenInfo, ModelInfo, OperatorInfo)
  13. from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
  14. ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo)
  15. from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode,
  16. ProductDistributorStatusCode, ProductModelStatusCode, SaleclerkStatusCode,
  17. UserStatusCode)
  18. from utils.redis.connect import r
  19. WECHAT = settings.WECHAT
  20. @logit
  21. def optor_login_api(request):
  22. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  23. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  24. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  25. phone = request.POST.get('phone', '')
  26. password = request.POST.get('password', '')
  27. try:
  28. operator = OperatorInfo.objects.get(phone=phone, status=True)
  29. except OperatorInfo.DoesNotExist:
  30. return response(OperatorStatusCode.OPERATOR_NOT_FOUND)
  31. if operator.user_status == OperatorInfo.DISABLED:
  32. return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED)
  33. elif operator.user_status == OperatorInfo.DELETED:
  34. return response(OperatorStatusCode.OPERATOR_HAS_DELETED)
  35. if not check_password(password, operator.encryption):
  36. return response(OperatorStatusCode.OPERATOR_PASSWORD_ERROR)
  37. return response(200, 'Optor Login Success', u'操作员登录成功', data=operator.kododata)
  38. @logit
  39. def admin_login_api(request):
  40. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  41. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  42. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  43. phone = request.POST.get('phone', '')
  44. password = request.POST.get('password', '')
  45. try:
  46. administrator = AdministratorInfo.objects.get(phone=phone, status=True)
  47. except AdministratorInfo.DoesNotExist:
  48. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
  49. if administrator.user_status == AdministratorInfo.DISABLED:
  50. return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED)
  51. elif administrator.user_status == AdministratorInfo.DELETED:
  52. return response(AdministratorStatusCode.ADMINISTRATOR_HAS_DELETED)
  53. if not check_password(password, administrator.encryption):
  54. return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR)
  55. request.session['admin_id'] = administrator.admin_id
  56. return response(200, 'Admin Login Success', u'管理员登录成功', data={
  57. 'qrurl': settings.KODO_CLERK_AUTH_URL.format(administrator.brand_id),
  58. })
  59. @logit
  60. def bmd_infos(request):
  61. optor_id = request.POST.get('optor_id', '')
  62. try:
  63. operator = OperatorInfo.objects.get(operator_id=optor_id, status=True)
  64. except OperatorInfo.DoesNotExist:
  65. return response(OperatorStatusCode.OPERATOR_NOT_FOUND)
  66. if operator.user_status == OperatorInfo.DISABLED:
  67. return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED)
  68. brands = BrandInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
  69. brands = [brand.data for brand in brands]
  70. tmpmodels = ModelInfo.objects.filter(brand_id=operator.brand_id, display=True, status=True).order_by('position')
  71. models = [model.data for model in tmpmodels]
  72. # jancodes = {model.jancode: model.data for model in tmpmodels}
  73. distributors = DistributorInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
  74. distributors = [distributor.data for distributor in distributors]
  75. return response(200, data={
  76. 'optor_id': operator.operator_id,
  77. 'brands': brands,
  78. 'models': models,
  79. # 'jancodes': jancodes,
  80. 'distributors': distributors,
  81. })
  82. @logit
  83. def brands_list(request):
  84. brands = BrandInfo.objects.filter(status=True).order_by('position')
  85. brands = [brand.data for brand in brands]
  86. return response(200, data={
  87. 'brands': brands,
  88. })
  89. @logit
  90. def models_list(request):
  91. models = ModelInfo.objects.filter(status=True).order_by('position')
  92. models = [model.data for model in models]
  93. return response(200, data={
  94. 'models': models,
  95. })
  96. @logit
  97. def distributors_list(request):
  98. distributors = DistributorInfo.objects.filter(status=True).order_by('position')
  99. distributors = [distributor.data for distributor in distributors]
  100. return response(200, data={
  101. 'distributors': distributors,
  102. })
  103. @logit
  104. def upgrade_api(request):
  105. """ APP 升级 """
  106. src = request.POST.get('src', '')
  107. if src == 'datascreen':
  108. latestappmodel = LatestAppScreenInfo
  109. else:
  110. latestappmodel = LatestAppInfo
  111. try:
  112. appinfo = latestappmodel.objects.filter(status=True)[0].adr
  113. except IndexError:
  114. appinfo = {
  115. 'latest_version_code': '',
  116. 'latest_version_name': '',
  117. 'latest_url': '',
  118. }
  119. return response(200, 'Get Latest App Success', u'获取最新版信息成功', {
  120. 'appinfo': appinfo,
  121. })
  122. def getPhoneNumber(request):
  123. user_id = request.POST.get('user_id', '')
  124. # Just for compatible because of store session_key has changed
  125. if not user_id:
  126. return ''
  127. wxcfg = WECHAT.get('MINIAPP', {})
  128. appid = wxcfg.get('appID')
  129. secret = wxcfg.get('appsecret')
  130. iv = request.POST.get('iv', '')
  131. encryptedData = request.POST.get('encryptedData', '')
  132. # {
  133. # "phoneNumber": "13580006666",
  134. # "purePhoneNumber": "13580006666",
  135. # "countryCode": "86",
  136. # "watermark":
  137. # {
  138. # "appid": "APPID",
  139. # "timestamp": TIMESTAMP
  140. # }
  141. # }
  142. phone_number = get_phone_number(appid=appid, secret=secret, unid=user_id, encryptedData=encryptedData, iv=iv, storage=RedisStorage(r))
  143. return phone_number.get('purePhoneNumber', '')
  144. @logit(res=True)
  145. def consumer_phone_api(request):
  146. return response(200, 'Get Consumer Phone Success', u'获取消费者手机号成功', {
  147. 'purePhoneNumber': getPhoneNumber(request),
  148. })
  149. @logit(res=True)
  150. def consumer_info_api(request):
  151. user_id = request.POST.get('user_id', '')
  152. iv = request.POST.get('iv', '')
  153. encryptedData = request.POST.get('encryptedData', '')
  154. lat = request.POST.get('lat', '')
  155. lon = request.POST.get('lon', '')
  156. brandID = request.POST.get('BrandID', '')
  157. modelID = request.POST.get('ModelID', '')
  158. distributorID = request.POST.get('DistributorID', '')
  159. serialNo = request.POST.get('SerialNo', '')
  160. verifyResult = request.POST.get('verifyResult', '')
  161. purePhoneNumber = request.POST.get('purePhoneNumber', '')
  162. purePhoneNumber = purePhoneNumber or getPhoneNumber(request)
  163. # 校验用户是否存在
  164. try:
  165. user = UserInfo.objects.get(user_id=user_id)
  166. except UserInfo.DoesNotExist:
  167. return response(UserStatusCode.USER_NOT_FOUND)
  168. # 更新用户手机号
  169. user.phone = purePhoneNumber
  170. user.save()
  171. try:
  172. brand = BrandInfo.objects.get(pk=brandID)
  173. except BrandInfo.DoesNotExist:
  174. brand = None
  175. except ValueError:
  176. brand = None
  177. if not brand:
  178. try:
  179. brand = BrandInfo.objects.get(brand_id=brandID)
  180. except BrandInfo.DoesNotExist:
  181. return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
  182. try:
  183. model = ModelInfo.objects.get(pk=modelID)
  184. except ModelInfo.DoesNotExist:
  185. return response(ProductModelStatusCode.MODEL_NOT_FOUND)
  186. except ValueError:
  187. return response(ProductModelStatusCode.MODEL_NOT_FOUND)
  188. # try:
  189. # distributor = DistributorInfo.objects.get(pk=distributorID)
  190. # except DistributorInfo.DoesNotExist:
  191. # return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)
  192. # except ValueError:
  193. # return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)
  194. # 记录用户信息提交记录
  195. ConsumeInfoSubmitLogInfo.objects.create(
  196. user_id=user_id,
  197. phone=purePhoneNumber,
  198. iv=iv,
  199. encryptedData=encryptedData,
  200. lat=lat,
  201. lon=lon,
  202. brand_id=brand.brand_id,
  203. brand_name=brand.brand_name,
  204. model_id=model.model_id,
  205. model_name=model.model_name,
  206. # distributor_id=distributor.distributor_id,
  207. # distributor_name=distributor.distributor_name,
  208. distributor_id='',
  209. distributor_name='',
  210. serialNo=serialNo,
  211. verifyResult=verifyResult,
  212. test_user=user.test_user,
  213. )
  214. if not user.test_user:
  215. # TODO: Make statistic async
  216. if ConsumeInfoSubmitLogInfo.objects.filter(
  217. brand_id=brand.brand_id,
  218. model_id=model.model_id,
  219. # distributor_id=distributor.distributor_id,
  220. distributor_id='',
  221. serialNo=serialNo,
  222. verifyResult=1,
  223. test_user=False,
  224. ).count() == 1:
  225. ymd = int(tc.local_string(format='%Y%m%d'))
  226. # 销量统计
  227. ssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create(
  228. brand_id=brand.brand_id,
  229. ymd=ymd,
  230. )
  231. ssi.num += 1
  232. ssi.save()
  233. # 型号销量统计
  234. mssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
  235. brand_id=brand.brand_id,
  236. model_id=model.model_id,
  237. ymd=ymd,
  238. )
  239. mssi.model_name = model.model_name
  240. mssi.num += 1
  241. mssi.save()
  242. mssi2, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
  243. brand_id=brand.brand_id,
  244. model_id=model.model_id,
  245. ymd=0,
  246. )
  247. mssi2.model_name = model.model_name
  248. mssi2.num += 1
  249. mssi2.save()
  250. # # 经销商销量统计
  251. # dssi, _ = ConsumeDistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
  252. # brand_id=brand.brand_id,
  253. # distributor_id=distributor.distributor_id,
  254. # ymd=ymd,
  255. # )
  256. # dssi.distributor_name = distributor.distributor_name
  257. # dssi.num += 1
  258. # dssi.save()
  259. #
  260. # dssi2, _ = ConsumeDistributorSaleStatisticInfo.objects.select_for_update().get_or_create(
  261. # brand_id=brand.brand_id,
  262. # distributor_id=distributor.distributor_id,
  263. # ymd=0,
  264. # )
  265. # dssi2.distributor_name = distributor.distributor_name
  266. # dssi2.num += 1
  267. # dssi2.save()
  268. #
  269. # # 省份销量统计
  270. # pssi, _ = ConsumeProvinceSaleStatisticInfo.objects.select_for_update().get_or_create(
  271. # brand_id=brand.brand_id,
  272. # province_code=distributor.distributor_province_code,
  273. # ymd=ymd,
  274. # )
  275. # pssi.province_name = distributor.distributor_province_name
  276. # pssi.num += 1
  277. # pssi.save()
  278. #
  279. # pssi2, _ = ConsumeProvinceSaleStatisticInfo.objects.select_for_update().get_or_create(
  280. # brand_id=brand.brand_id,
  281. # province_code=distributor.distributor_province_code,
  282. # ymd=0,
  283. # )
  284. # pssi2.province_name = distributor.distributor_province_name
  285. # pssi2.num += 1
  286. # pssi2.save()
  287. return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功')