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,
- })
|