| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 | 
              - from __future__ import division
 - from django.conf import settings
 - from django.contrib.auth.hashers import check_password
 - from django.db import transaction
 - from django_logit import logit
 - from django_response import response
 - from pywe_miniapp import get_phone_number
 - from pywe_storage import RedisStorage
 - from TimeConvert import TimeConvert as tc
 - from account.models import UserInfo
 - from integral.models import SaleclerkSubmitLogInfo
 - from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo,
 -                         LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo)
 - from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
 - from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode,
 -                                      ProductModelStatusCode, UserStatusCode)
 - from utils.redis.connect import r
 - from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST, MINI_PROGRAM_GIS_LIST, MEMBER_UPGRADE_INFO
 - WECHAT = settings.WECHAT
 - @logit
 - def optor_login_api(request):
 -     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
 -     if brand_id != settings.KODO_DEFAULT_BRAND_ID:
 -         return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
 -     phone = request.POST.get('phone', '')
 -     password = request.POST.get('password', '')
 -     try:
 -         operator = OperatorInfo.objects.get(phone=phone, status=True)
 -     except OperatorInfo.DoesNotExist:
 -         return response(OperatorStatusCode.OPERATOR_NOT_FOUND)
 -     if operator.user_status == OperatorInfo.DISABLED:
 -         return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED)
 -     elif operator.user_status == OperatorInfo.DELETED:
 -         return response(OperatorStatusCode.OPERATOR_HAS_DELETED)
 -     if not check_password(password, operator.encryption):
 -         return response(OperatorStatusCode.OPERATOR_PASSWORD_ERROR)
 -     return response(200, 'Optor Login Success', u'操作员登录成功', data=operator.kododata)
 - @logit
 - def admin_login_api(request):
 -     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
 -     if brand_id != settings.KODO_DEFAULT_BRAND_ID:
 -         return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
 -     phone = request.POST.get('phone', '')
 -     password = request.POST.get('password', '')
 -     try:
 -         administrator = AdministratorInfo.objects.get(phone=phone, status=True)
 -     except AdministratorInfo.DoesNotExist:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
 -     if administrator.user_status == AdministratorInfo.DISABLED:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED)
 -     elif administrator.user_status == AdministratorInfo.DELETED:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_HAS_DELETED)
 -     if not check_password(password, administrator.encryption):
 -         return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR)
 -     request.session['admin_id'] = administrator.admin_id
 -     return response(200, 'Admin Login Success', u'管理员登录成功', data={
 -         'admin_id': administrator.admin_id,
 -         'admin_type': administrator.admin_type,
 -         'qrurl': settings.KODO_CLERK_AUTH_URL.format(administrator.brand_id),
 -     })
 - @logit
 - def bmd_infos(request):
 -     optor_id = request.POST.get('optor_id', '')
 -     try:
 -         operator = OperatorInfo.objects.get(operator_id=optor_id, status=True)
 -     except OperatorInfo.DoesNotExist:
 -         return response(OperatorStatusCode.OPERATOR_NOT_FOUND)
 -     if operator.user_status == OperatorInfo.DISABLED:
 -         return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED)
 -     brands = BrandInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
 -     brands = [brand.data for brand in brands]
 -     tmpmodels = ModelInfo.objects.filter(brand_id=operator.brand_id, display=True, status=True).order_by('position')
 -     models = [model.data for model in tmpmodels]
 -     
 -     distributors = DistributorInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
 -     distributors = [distributor.data for distributor in distributors]
 -     return response(200, data={
 -         'optor_id': operator.operator_id,
 -         'brands': brands,
 -         'models': models,
 -         
 -         'distributors': distributors,
 -     })
 - @logit
 - def brands_list(request):
 -     brands = BrandInfo.objects.filter(status=True).order_by('position')
 -     brands = [brand.data for brand in brands]
 -     return response(200, data={
 -         'brands': brands,
 -     })
 - @logit
 - def models_list(request):
 -     models = ModelInfo.objects.filter(status=True).order_by('position')
 -     models = [model.data for model in models]
 -     return response(200, data={
 -         'models': models,
 -     })
 - @logit
 - def distributors_list(request):
 -     distributors = DistributorInfo.objects.filter(status=True).order_by('position')
 -     distributors = [distributor.data for distributor in distributors]
 -     return response(200, data={
 -         'distributors': distributors,
 -     })
 - @logit
 - def upgrade_api(request):
 -     """ APP 升级 """
 -     src = request.POST.get('src', '')
 -     if src == 'datascreen':
 -         latestappmodel = LatestAppScreenInfo
 -     else:
 -         latestappmodel = LatestAppInfo
 -     try:
 -         appinfo = latestappmodel.objects.filter(status=True)[0].adr
 -     except IndexError:
 -         appinfo = {
 -             'latest_version_code': '',
 -             'latest_version_name': '',
 -             'latest_url': '',
 -         }
 -     return response(200, 'Get Latest App Success', u'获取最新版信息成功', {
 -         'appinfo': appinfo,
 -     })
 - def getPhoneNumber(request):
 -     user_id = request.POST.get('user_id', '')
 -     wxcfg = WECHAT.get('MINIAPP', {})
 -     appid = wxcfg.get('appID')
 -     
 -     session_key = None if user_id else RedisStorage(r).get('{0}:{1}:sessionKey'.format(appid, ''))
 -     wxcfg = WECHAT.get('MINIAPP', {})
 -     appid = wxcfg.get('appID')
 -     secret = wxcfg.get('appsecret')
 -     iv = request.POST.get('iv', '')
 -     encryptedData = request.POST.get('encryptedData', '')
 -     
 -     
 -     
 -     
 -     
 -     
 -     
 -     
 -     
 -     
 -     phone_number = get_phone_number(appid=appid, secret=secret, unid=user_id, session_key=session_key, encryptedData=encryptedData, iv=iv, storage=RedisStorage(r))
 -     return phone_number.get('purePhoneNumber', '')
 - @logit(res=True)
 - def consumer_phone_api(request):
 -     return response(200, 'Get Consumer Phone Success', u'获取消费者手机号成功', {
 -         'purePhoneNumber': getPhoneNumber(request),
 -     })
 - @logit(res=True)
 - @transaction.atomic
 - def consumer_info_api(request):
 -     user_id = request.POST.get('user_id', '')
 -     iv = request.POST.get('iv', '')
 -     encryptedData = request.POST.get('encryptedData', '')
 -     lat = request.POST.get('lat', .0)
 -     lon = request.POST.get('lon', .0)
 -     brandID = request.POST.get('brand_id', '') or request.POST.get('BrandID', '')
 -     modelID = request.POST.get('ModelID', '')
 -     distributorID = request.POST.get('DistributorID', '')
 -     serialNo = request.POST.get('SerialNo', '')
 -     verifyResult = request.POST.get('verifyResult', '')
 -     purePhoneNumber = request.POST.get('purePhoneNumber', '')
 -     if lat == 'undefined':
 -         lat = .0
 -     if lon == 'undefined':
 -         lon = .0
 -     purePhoneNumber = purePhoneNumber or getPhoneNumber(request)
 -     
 -     try:
 -         user = UserInfo.objects.get(user_id=user_id)
 -     except UserInfo.DoesNotExist:
 -         return response(UserStatusCode.USER_NOT_FOUND)
 -     
 -     user.phone = purePhoneNumber
 -     user.save()
 -     try:
 -         brand = BrandInfo.objects.get(brand_id=brandID)
 -     except BrandInfo.DoesNotExist:
 -         brand = None
 -     if not brand:
 -         try:
 -             brand = BrandInfo.objects.get(pk=brandID)
 -         except BrandInfo.DoesNotExist:
 -             return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
 -         except ValueError:
 -             return response(ProductBrandStatusCode.BRAND_NOT_FOUND)
 -     try:
 -         model = ModelInfo.objects.get(pk=modelID)
 -     except ModelInfo.DoesNotExist:
 -         return response(ProductModelStatusCode.MODEL_NOT_FOUND)
 -     except ValueError:
 -         return response(ProductModelStatusCode.MODEL_NOT_FOUND)
 -     
 -     
 -     
 -     
 -     
 -     
 -     dupload = ConsumeInfoSubmitLogInfo.objects.filter(
 -         brand_id=brand.brand_id,
 -         model_id=model.model_id,
 -         
 -         distributor_id='',
 -         serialNo=serialNo,
 -         verifyResult=1,
 -         test_user=False,
 -     ).exists()
 -     if dupload:
 -         act = None
 -         during_activity = False
 -     else:
 -         act = ActivityInfo.objects.filter(status=True).order_by('-pk').first()
 -         during_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False
 -     
 -     log = ConsumeInfoSubmitLogInfo.objects.create(
 -         user_id=user_id,
 -         phone=purePhoneNumber,
 -         iv=iv,
 -         encryptedData=encryptedData,
 -         lat=lat,
 -         lon=lon,
 -         brand_id=brand.brand_id,
 -         brand_name=brand.brand_name,
 -         model_id=model.model_id,
 -         model_name=model.model_name,
 -         
 -         
 -         distributor_id='',
 -         distributor_name='',
 -         serialNo=serialNo,
 -         verifyResult=verifyResult,
 -         dupload=dupload,
 -         submit_during_activity=during_activity,
 -         activity_id=act.pk if during_activity else 0,
 -         coupon_expire_at=act.coupon_expire_at if during_activity else None,
 -         coupon_value=act.coupon_value if during_activity else 0,
 -         test_user=user.test_user,
 -     )
 -     if not user.test_user and not dupload:
 -         
 -         ymd = tc.local_string(format='%Y%m%d')
 -         cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create(
 -             brand_id=brand.brand_id,
 -             ymd=ymd,
 -         )
 -         cusi.users = list(set(cusi.users + [log.user_id]))
 -         cusi.num = len(cusi.users)
 -         cusi.save()
 -         cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create(
 -             brand_id=brand.brand_id,
 -             ymd=ymd[:6],
 -         )
 -         cusi.users = list(set(cusi.users + [log.user_id]))
 -         cusi.num = len(cusi.users)
 -         cusi.save()
 -         cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create(
 -             brand_id=brand.brand_id,
 -             ymd=ymd[:4],
 -         )
 -         cusi.users = list(set(cusi.users + [log.user_id]))
 -         cusi.num = len(cusi.users)
 -         cusi.save()
 -         
 -         cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create(
 -             brand_id=brand.brand_id,
 -             ymd=ymd,
 -         )
 -         cssi.num += 1
 -         cssi.save()
 -         
 -         cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create(
 -             brand_id=brand.brand_id,
 -             ymd=ymd[:6],
 -         )
 -         cssi.num += 1
 -         cssi.save()
 -         
 -         cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create(
 -             brand_id=brand.brand_id,
 -             ymd=ymd[:4],
 -         )
 -         cssi.num += 1
 -         cssi.save()
 -         
 -         cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
 -             brand_id=brand.brand_id,
 -             model_name=model.model_uni_name,
 -             ymd=ymd,
 -         )
 -         cmssi.users = list(set(cmssi.users + [user_id]))
 -         cmssi.num = len(cmssi.users)
 -         cmssi.save()
 -         
 -         cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
 -             brand_id=brand.brand_id,
 -             model_name=model.model_uni_name,
 -             ymd=ymd[:6],
 -         )
 -         cmssi.users = list(set(cmssi.users + [user_id]))
 -         cmssi.num = len(cmssi.users)
 -         cmssi.save()
 -         
 -         cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create(
 -             brand_id=brand.brand_id,
 -             model_name=model.model_uni_name,
 -             ymd=ymd[:4],
 -         )
 -         cmssi.users = list(set(cmssi.users + [user_id]))
 -         cmssi.num = len(cmssi.users)
 -         cmssi.save()
 -         r.rpushjson(MINI_PROGRAM_GIS_LIST, {
 -             'brand_id': log.brand_id,
 -             'user_id': log.user_id,
 -             'lat': log.lat,
 -             'lon': log.lon,
 -             'phone': log.phone,
 -             'ymd': ymd,
 -         })
 -     
 -     logs = SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk)
 -     for log in logs:
 -         log.has_scan = True
 -         log.save()
 -     if not dupload:
 -         user.shots_num += 1
 -         if user.level < UserInfo.MEMBER_BLACK_GOLD:
 -             user.level += 1
 -             user.integral += model.shot_member_integral
 -             
 -             r.rpushjson(MEMBER_SEND_COUPON_LIST, {
 -                 'brand_id': brand.brand_id,
 -                 'user_id': user_id,
 -             })
 -             
 -             r.set(MEMBER_UPGRADE_INFO % (brand.brand_id, user_id), 1)
 -         user.save()
 -     return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功')
 - @logit(res=True)
 - @transaction.atomic
 - def consumer_snlist_api(request):
 -     user_id = request.POST.get('user_id', '')
 -     
 -     try:
 -         user = UserInfo.objects.get(user_id=user_id)
 -     except UserInfo.DoesNotExist:
 -         return response(UserStatusCode.USER_NOT_FOUND)
 -     
 -     logs = ConsumeInfoSubmitLogInfo.objects.filter(user_id=user_id, status=True).distinct()
 -     seen = set()
 -     seen_add = seen.add
 -     logs = [log.data for log in logs if not (log.serialNo in seen or seen_add(log.serialNo))]
 -     return response(200, 'Get Consumer Submit List Success', u'获取消费者提交列表成功', {
 -         'logs': logs,
 -     })
 
 
  |