123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- from __future__ import division
- import json
- 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 ipaddr import client_ip
- from pywe_miniapp import get_phone_number
- from pywe_storage import RedisStorage
- from TimeConvert import TimeConvert as tc
- from account.models import UserInfo
- from coupon.models import CouponInfo, UserCouponInfo
- from integral.models import SaleclerkSubmitLogInfo
- from logs.models import AdministratorLoginLogInfo, MchInfoEncryptLogInfo
- from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo,
- LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo, ConsumeShotUnbindingInfo)
- 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, MEMBER_UPGRADE_INFO, MINI_PROGRAM_GIS_LIST
- WECHAT = settings.WECHAT
- @logit
- def optor_login_api(request):
- brand_id = request.POST.get('brand_id') or 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') or 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)
- AdministratorLoginLogInfo.objects.create(
- admin_id=administrator.admin_id,
- admin_name=administrator.name,
- login_ip=client_ip(request),
- login_at=tc.utc_datetime(),
- )
- 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,
- 'admin_name': administrator.name,
- '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', '')
- 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', 0)
- code_version = request.POST.get('code_version', '')
- activities = json.loads(request.POST.get('activities', '[]'))
- if lat == 'undefined':
- lat = .0
- if lon == 'undefined':
- lon = .0
-
- try:
- user = UserInfo.objects.select_for_update().get(user_id=user_id)
- except UserInfo.DoesNotExist:
- return response(UserStatusCode.USER_NOT_FOUND)
- 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)
-
- if not code_version:
- code_version = 1
- code = filter(lambda ch: ch in '0123456789', serialNo)
- encrypt_logs = MchInfoEncryptLogInfo.objects.filter(model_pk=model.pk, sn=code)
- if encrypt_logs:
- code_version = encrypt_logs[0].version
- user.code_version = code_version
- user.save()
-
-
-
-
-
-
- dupload = ConsumeInfoSubmitLogInfo.objects.filter(
- brand_id=brand.brand_id,
- model_id=model.model_id,
-
- distributor_id='',
- serialNo=serialNo,
- verifyResult=1,
- test_user=False,
- status=True
- ).exists()
- if dupload:
- act = None
- during_activity = False
- else:
- during_activity = True if activities else False
-
- SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk, status=True).update(has_scan=True)
- ymd = tc.local_string(format='%Y%m%d')
-
- log = ConsumeInfoSubmitLogInfo.objects.create(
- user_id=user_id,
- phone=user.phone,
- lat=lat,
- lon=lon,
- brand_id=brand.brand_id,
- brand_name=brand.brand_name,
- model_id=model.model_id,
- model_name=model.model_name,
- model_uni_name=model.model_uni_name,
-
-
- distributor_id='',
- distributor_name='',
- serialNo=serialNo,
- verifyResult=verifyResult,
- dupload=dupload,
- test_user=user.test_user,
- code_version=code_version,
- ym=ymd[:6],
- ymd=ymd,
- province=user.province_name if lat == 0.0 and lon == 0.0 else '',
- submit_during_activity=during_activity
- )
- if not dupload:
- for act in activities:
- try:
- coupon = CouponInfo.objects.get(coupon_id=act['coupon_id'])
- except CouponInfo.DoesNotExist:
- continue
- try:
- activity = ActivityInfo.objects.get(activity_id=act['activity_id'])
- except ActivityInfo.DoesNotExist:
- continue
- UserCouponInfo.objects.create(
- brand_id=coupon.brand_id,
- brand_name=coupon.brand_name,
- coupon_id=coupon.coupon_id,
- user_id=user_id,
- coupon_title=coupon.coupon_title,
- coupon_detail=coupon.coupon_detail,
- coupon_value=coupon.coupon_value,
- coupon_image=coupon.coupon_image,
- active_at=tc.utc_datetime(),
- expire_at=coupon.final_expire_at,
- is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff,
- coupon_valid_period=coupon.coupon_valid_period,
- coupon_limit_model_ids=coupon.coupon_limit_model_ids,
- coupon_from='PROMOTION',
- activity_id=activity.activity_id,
- activity_name=activity.activity_name,
- submit_pk=log.pk,
- )
-
- if not dupload:
- user.resgister_at = log.created_at
- user.save()
- if not user.test_user and not dupload:
-
- 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,
- 'serialNo': serialNo,
- 'model_id': model.model_id,
- 'pk': log.pk,
- })
- if not dupload:
- log.integral = model.shot_member_integral
- log.save()
- user.shots_num += 1
- user.integral += model.shot_member_integral
-
- to_send_coupon = False
- if user.level < UserInfo.MEMBER_BLACK_GOLD and model.shot_type_id != 'V6PkivthL4sdADp4GNpQ4C':
- user.level += 1
- to_send_coupon = True
- user.save()
- if to_send_coupon:
-
- 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)
- 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, log.model_name) in seen or seen_add((log.serialNo, log.model_name)))]
- return response(200, 'Get Consumer Submit List Success', u'获取消费者提交列表成功', {
- 'logs': logs,
- })
- @logit(res=True)
- @transaction.atomic
- def consumer_model_list(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)
-
- models = ModelInfo.objects.filter(shot_type_id__isnull=False, status=True).order_by('-shot_member_name')
- models = [model.consumer_shot_data for model in models]
- return response(200, 'Get Model List Success', u'获取型号列表成功', {
- 'models': models,
- })
- @logit(res=True)
- @transaction.atomic
- def consumer_shot_unbinding(request):
- user_id = request.POST.get('user_id', '')
- submit_pk = request.POST.get('id', '')
- submit_at = request.POST.get('created_at', '')
- model_id = request.POST.get('model_id', '')
- sn = request.POST.get('serialNo', '')
- reason = request.POST.get('reason', '')
-
- try:
- user = UserInfo.objects.get(user_id=user_id)
- except UserInfo.DoesNotExist:
- return response(UserStatusCode.USER_NOT_FOUND)
- ConsumeShotUnbindingInfo.objects.update_or_create(user_id=user_id, submit_pk=submit_pk, defaults={
- 'model_id': model_id,
- 'sn': sn,
- 'submit_at': submit_at,
- 'reason': reason,
- })
-
- return response(200, 'Consume Shot Unbinding Success', u'消费者镜头解绑成功')
-
-
|