1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- """
- web.management.views
- ~~~~~~~~~
- """
- import datetime
- import logging
- import math
- import os
- import time,random
- from collections import Counter
- from itertools import groupby
- from operator import itemgetter
- import simplejson as json
- import xlrd
- from bson import ObjectId
- from django.conf import settings
- from django.contrib import auth
- from django.core.cache import cache
- from django.core.handlers.wsgi import WSGIRequest
- from mongoengine import Q
- from mongoengine.errors import NotUniqueError, MultipleObjectsReturned, DoesNotExist
- from typing import Iterable, Any, cast, Dict, Optional, TYPE_CHECKING
- from apilib import utils_datetime
- from apilib.monetary import RMB, Ratio, Percent
- from apilib.utils_datetime import to_datetime, dt_to_timestamp, date_to_datetime_ceiling, date_to_datetime_floor, \
- timestamp_timeformat
- from apilib.utils_json import JsonResponse
- from apps.web.ad.models import Advertisement, Advertiser
- from apps.web.agent import api
- from apps.web.agent.models import Agent
- from apps.web.agent.validation import agentSchema
- from apps.web.south_intf.zhejiang_fire import ZhejiangNorther, Company
- from apps.web.common.models import FAQ, District, WithdrawRecord
- from apps.web.common.proxy import ClientRechargeModelProxy, ClientDealerIncomeModelProxy, ClientConsumeModelProxy
- from apps.web.common.transaction import WithdrawStatus
- from apps.web.common.validation import PASSWORD_RE
- from apps.web.constant import Const, DEALER_CONSUMPTION_AGG_KIND_TRANSLATION, \
- DEALER_CONSUMPTION_AGG_KIND_UNIT, DeviceOnlineStatus,FAULT_RECORD_STATUS
- from apps.web.core import ROLE
- from apps.web.core.db import prepare_query
- from apps.web.core.exceptions import ServiceException, ManagerServiceTimeOutException, ManagerServiceSerialException
- from apps.web.core.helpers import ActionDeviceBuilder
- from apps.web.core.messages.sms import managerForgotPwdSMSProvider, \
- managerRegisterSMSProvider
- from apps.web.core.models import WechatPayApp, OfflineTask, AliApp
- from apps.web.core.networking import MessageSender
- from apps.web.core.sysparas import SysParas
- from apps.web.core.utils import DefaultJsonErrorResponse, JsonErrorResponse, JsonOkResponse
- from apps.web.dealer.models import Dealer, DealerRechargeRecord
- from apps.web.dealer.proxy import DealerIncomeProxy
- from apps.web.device.models import Device, Group, DeviceCommand, DeviceType, PortReport, DeviceDict, \
- ManagerInputDev,FaultRecord
- from apps.web.management import OfflineTaskType
- from apps.web.management.models import ManagerUpScoreRecord, Manager, DummyManagerData
- from apps.web.management.utils import get_dealerMap_by_managerId, query_total_dealer_income_top, get_feed_back_stats, \
- get_user_stats, query_device_consumption, query_device_income, query_user_consume_frequency
- from apps.web.report.models import DeviceDailyStat
- from apps.web.user.models import Card, MyUser, RechargeRecord, ServiceProgress, CardRechargeOrder, ConsumeRecord
- from apps.web.utils import permission_required, manager_login, advertisement_login, error_tolerate, role_from_user
- from taskmanager.mediator import task_caller
- if TYPE_CHECKING:
- from apps.web.common.models import UserSearchable
- from apps.web.core.db import CustomQuerySet
- logger = logging.getLogger(__name__)
- def login(request):
- # type: (WSGIRequest)->JsonResponse
- try:
- payload = json.loads(request.body)
- username, password = payload['username'], payload['password']
- if Manager.objects(username = username, domain = settings.MY_DOMAIN).first():
- return manager_login(request, logger, username, password)
- elif Advertisement.objects(username = username).first():
- return advertisement_login(request, logger, username, password)
- else:
- return JsonResponse({'result': 0, 'description': u'用户名或者密码错误', 'payload': {}})
- except Exception as e:
- logger.exception('manager login error = %s' % e)
- return JsonResponse({'result': 0, 'description': u'登录异常', 'payload': {}})
- def logout(request):
- # type: (WSGIRequest)->JsonResponse
- auth.logout(request)
- return JsonResponse({'result': 1})
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def changePassword(request):
- # type: (WSGIRequest)->JsonResponse
- currentManager = request.user # type: cast(Manager)
- payload = json.loads(request.body)
- password = payload['password']
- if PASSWORD_RE.match(password) is None:
- return JsonErrorResponse(description = u'密码必须大于8位,只能是数字或字母或常见特殊符号')
- currentManager.set_password(payload['password'])
- return JsonResponse({'result': 1})
- #: 设备相关
- @permission_required(ROLE.manager)
- def getDevDetailList(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 获取设备详情列表
- searchKey只能是经销商账号, 设备逻辑码
- """
- mid = str(request.user.id)
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- dealerId = request.GET.get('dealerId', None)
- startLogicalCode = request.GET.get('startLogicalCode', None)
- endLogicalCode = request.GET.get('endLogicalCode', None)
- searchKey = request.GET.get('searchKey', None)
- dealerFilter = Q()
- if not dealerId:
- agentIds = [str(agent['_id']) for agent in Agent.get_collection().find({'managerId': mid}, {'_id': True})]
- dealerFilter &= Q(agentId__in = agentIds)
- if dealerId:
- dealerFilter &= Q(id = ObjectId(dealerId))
- dealerMap = {str(d['_id']): {'nickname': d['nickname'], 'username': d['username']} for d in
- Dealer.get_collection().find(dealerFilter.to_query(Dealer))}
- dealerIds = dealerMap.keys()
- if startLogicalCode and endLogicalCode and not searchKey:
- import re
- res = re.findall(r'\d+', '{},{}'.format(startLogicalCode, endLogicalCode))
- res = [int(res[0]), int(res[1])]
- if max(res) - min(res) > 1000:
- return JsonResponse({'result': 2, 'description': u'范围超过1000', 'payload': {}})
- start = min(res)
- logicalCode_user_input = []
- while start <= max(res):
- logicalCode_user_input.append(u'{}'.format(start))
- start += 1
- devices = Device.objects(ownerId__in = dealerIds, logicalCode__in = logicalCode_user_input)
- if len(devices) == 0:
- devices = Device.objects(ownerId__in = dealerIds)
- logicalCode_id = []
- for device in devices:
- if len(logicalCode_user_input):
- dev = re.findall(logicalCode_user_input[0], '{}'.format(device.logicalCode))
- if len(dev):
- logicalCode_user_input.pop(0)
- logicalCode_id.append(device.logicalCode)
- devices = Device.objects(ownerId__in = dealerIds, logicalCode__in = logicalCode_id)
- else:
- devices = Device.objects(ownerId__in = dealerIds).search(searchKey)
- total = devices.count()
- devNos = []
- groupIds = []
- for d in devices.paginate(pageIndex, pageSize):
- devNos.append(d['devNo'])
- if d['groupId']:
- groupIds.append(d['groupId'])
- groupDict = Group.get_groups_by_group_ids(groupIds)
- devs = Device.get_dev_by_nos(devNos) # type: Optional[Dict[str, DeviceDict]]
- dataList = []
- for devNo, dev in devs.items():
- if dev.ownerId not in dealerIds:
- continue
- group = groupDict.get(dev.groupId, {})
- item = {
- 'devName': dev.devNo,
- 'devType': dev.devType.get('name', u'未指定'),
- 'imei': dev.devNo,
- 'createdTime': dev['dateTimeAdded'],
- 'logicalCode': dev.logicalCode,
- 'dealerName': '',
- 'address': u'%s:%s' % (group.get('groupName'), group.get('address')),
- 'online': u'在线' if dev.online == DeviceOnlineStatus.DEV_STATUS_ONLINE else u'离线',
- 'detail': json.dumps(
- {
- u'设备类型编码': dev.devType.get('code', ''),
- u'设备驱动编码': dev.get('driverCode', ''),
- u'设备驱动版本': dev.get('driverVersion', ''),
- u'当前设备信号强度': dev.signal,
- u'设备IMEI': dev.imsi,
- u'设备SIM卡ICCID': dev.iccid,
- u'心跳间隔': dev['cycle'],
- u'脉冲间隔': dev['pulseInterval1'],
- u'待机电平': dev['battery'],
- u'备注': dev['remarks'],
- u'sim卡过期时间': dev.formatSimExpireDate,
- u'sim卡状态': dev.simStatus,
- u'脉冲宽度': dev['pulseWidth1'],
- u'套餐信息': dev.get('washConfig', {}),
- }, ensure_ascii = False, encoding = 'utf-8'),
- 'lastOffTime': dev.offTime,
- 'serverAddress': dev.server,
- 'signal': dev.signal,
- "disableDevice": dev.get("otherConf", {}).get("disableDevice", False)
- }
- if dev.ownerId:
- item.update(
- {'dealerName': u'%s %s' % (dealerMap[dev.ownerId]['nickname'], dealerMap[dev.ownerId]['username'])})
- dataList.append(item)
- return JsonResponse({
- 'result': 1,
- 'description': '',
- 'payload': {
- 'total': total,
- 'dataList': dataList
- }
- })
- @permission_required(ROLE.manager)
- def sendCommand(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 给设备发送命令并实时返回结果
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- devNo = payload.get("devNo")
- cmdID = payload.get("id")
- params = payload.get("params", list())
- dev = Device.get_dev(devNo)
- if not dev:
- return JsonErrorResponse(u"设备获取失败,请尝试重新发送指令")
- command = DeviceCommand.objects.filter(id = cmdID, role = request.user.role).first()
- if not command:
- return JsonErrorResponse(u"命令获取失败,请尝试重新发送指令")
- try:
- commandDict = command.package_command(dev, params)
- except Exception as e:
- logger.exception(u"dev <{}>, command <{}> , package command error <{}>".format(devNo, cmdID, e))
- return JsonErrorResponse(u"命令发送失败,请尝试重新发送指令")
- cmd = commandDict.get("cmd")
- try:
- result = MessageSender.send(dev, cmd = cmd, payload = commandDict, timeout = 20)
- if result.get("rst") == -1:
- raise ManagerServiceTimeOutException()
- if result.get("rst") == 1:
- raise ManagerServiceSerialException()
- except ServiceException as se:
- return JsonErrorResponse(description = se.result.get("description"))
- except Exception as e:
- logger.exception('failed to send command, error = %s where command was %s' % (e, str(command)))
- return JsonErrorResponse(description = u"指令发送异常")
- return JsonResponse({'result': 1, 'description': u'发送成功', 'payload': json.dumps(result)})
- def setDevicePristine(request):
- """
- 暂时不做,暂时不做解绑后防止代理商串货的限制
- 厂商侧强制解绑,将设备恢复到只有基本绑定关系等初始值的初始状态
- :param request:
- :return:
- """
- # payload = json.loads(request.body)
- # check if the devices belong to this manager
- return JsonResponse({'result': 0})
- #: 处理代理商
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def addAgents(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 后台给代理商开户
- :param request:
- :return:
- """
- currentManager = request.user # type: cast(Manager)
- primeAgent = Agent.objects(id = currentManager.primeAgentId).first()
- if not primeAgent:
- return JsonErrorResponse(description = u'厂商配置数据错误')
- payload = json.loads(request.body)
- payload.update(
- {
- 'productName': currentManager.brandName,
- 'productLogo': currentManager.logo,
- 'managerId': str(currentManager.id)
- }
- )
- payload.update({'trafficCardCost': primeAgent.trafficCardCost})
- if 'annualTrafficCost' in payload and payload['annualTrafficCost']:
- if RMB(payload['annualTrafficCost']) < primeAgent.trafficCardCost:
- return JsonErrorResponse(description = u'代理商流量卡费用下限不能小于流量卡成本价格({})'.format(primeAgent.trafficCardCost))
- else:
- payload.update({'annualTrafficCost': RMB(payload['annualTrafficCost'])})
- else:
- payload.update({'annualTrafficCost': primeAgent.trafficCardCost})
- payload.update({'withdrawFeeRatioCost': primeAgent.withdrawFeeRatioCost})
- if 'withdrawFeeRatio' in payload and payload['withdrawFeeRatio']:
- if Ratio(payload['withdrawFeeRatio']) < primeAgent.withdrawFeeRatioCost:
- return JsonErrorResponse(
- description = u'代理商提现费率不能小于提现费率成本价格(千分之{})'.format(primeAgent.withdrawFeeRatioCost))
- else:
- payload.update({'withdrawFeeRatio': Ratio(payload['withdrawFeeRatio'])})
- else:
- payload.update({'withdrawFeeRatio': primeAgent.withdrawFeeRatio})
- username = payload.pop('username')
- password = payload.pop('password', '1234567')
- try:
- Agent.create_user(username = username,
- password = password,
- adShow = currentManager.adShow,
- **payload)
- except NotUniqueError:
- return JsonErrorResponse(description = u'已存在相同信息的代理商')
- return JsonOkResponse()
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def editAgents(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 修改代理商信息
- :param request:
- :return:
- """
- payload = agentSchema(json.loads(request.body)) # type: dict
- agent = Agent.objects(id = str(payload['id'])).get() # type: Agent
- if 'annualTrafficCost' in payload and RMB(payload['annualTrafficCost']) < agent.trafficCardCost:
- return JsonErrorResponse(description=u'代理商流量卡费用下限不能小于流量卡成本价格({})'.format(agent.trafficCardCost))
- if 'withdrawFeeRatio' in payload and Ratio(payload['withdrawFeeRatio']) < agent.withdrawFeeRatioCost:
- return JsonErrorResponse(description=u'代理商提现费率下限不能低于提现费率成本价格(千分之{})'.format(agent.withdrawFeeRatioCost))
- if 'managerProfitShare' in payload and Percent(payload['managerProfitShare']) < Percent(0):
- return JsonErrorResponse(description=u"代理商设备经营收入比例不能小于0")
- updated = agent.update(**payload)
- if updated:
- return JsonOkResponse()
- else:
- return JsonErrorResponse(description = u'代理商设置失败')
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def editAgentPassword(request):
- # type: (WSGIRequest)->JsonResponse
- try:
- payload = json.loads(request.body)
- agentId = payload.get('id')
- password = payload.get('password')
- agent = Agent.objects.get(id = agentId) # type: Agent
- agent.set_password(password)
- return JsonResponse({'result': 1, 'description': u'修改成功', 'payload': ''})
- except DoesNotExist:
- return JsonResponse({'result': 0, 'description': u'代理商不存在,请刷新后再试', 'payload': ''})
- @permission_required(ROLE.manager)
- def getDealersWithdrawalList(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 获取经销商提现列表
- :param request:
- :return:
- """
- managerId = str(request.user.id)
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- status = request.GET.get('status', None)
- searchKey = request.GET.get('searchKey', None)
- agentIds = [str(_['_id']) for _ in Agent.get_collection().find({'managerId': managerId}, {'_id': 1})]
- dealerIds = [str(_['_id']) for _ in Dealer.get_collection().find({'agentId': {'$in': agentIds}}, {'_id': 1})]
- query = WithdrawRecord.objects(ownerId__in = dealerIds, role = ROLE.dealer, status = int(status)).search(
- searchKey)._query
- front = (pageIndex - 1) if pageIndex >= 1 else 0
- records = WithdrawRecord.get_collection().find(query) \
- .sort('postTime', -1) \
- .skip(front * pageSize) \
- .limit(pageSize) # type: Iterable[dict]
- total = WithdrawRecord.objects(status = int(status), ownerId__in = dealerIds).search(searchKey).count()
- def norm(dict_, key):
- # type: (dict, str)->Any
- return dict_.get(key, '')
- dataList = [
- {
- 'name': norm(r, 'dealerName'),
- 'tel': norm(r, 'userTel'),
- 'dateTime': norm(r, 'postTime'),
- 'orderNo': norm(r, 'order'),
- 'actualPay': norm(r, 'actualPay'),
- 'cardId': norm(r, 'accountCode'),
- 'cardUserName': norm(r, 'cardUserName'),
- 'bankName': norm(r, 'parentBankName'),
- 'subBankName': norm(r, 'subBankName'),
- 'operResult': norm(r, 'status'),
- 'payType': norm(r, 'payType'),
- 'amount': norm(r, 'dealerBalance'),
- 'remarks': norm(r, 'remarks')
- }
- for r in records
- ]
- return JsonResponse(
- {
- 'result': 1,
- 'description': '',
- 'payload': {
- 'total': total,
- 'dataList': dataList
- }
- })
- @permission_required(ROLE.manager)
- def suspendDealer(request):
- """
- 对部分违反准则的经销商予以禁用
- :param request:
- :return:
- """
- return JsonErrorResponse(description = u'暂不支持')
- @error_tolerate(logger = logger)
- @permission_required(ROLE.manager)
- def updateDeviceCardExpireDate(request):
- payload = json.loads(request.body)
- expireDate = str(payload['expireDate'])
- devNoList = payload['idList']
- newExpire = to_datetime(expireDate, '%Y-%m-%d')
- Device.get_collection().update_many({'devNo': {'$in': devNoList}}, {'$set': {'expireDate': newExpire}}, upsert = False)
- Device.invalid_many_device_cache(devNoList)
- return JsonResponse({'result': 1, 'description': u'修改成功', 'payload': ''})
- # third parties
- def collectWechatSubscriptionChatEntries(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 备份用户发往公众号的聊天记录(微信只保留三天),为了完整的追溯事件。有必要进行保留
- 此接口对应微信推送的请求
- :param request:
- :return:
- """
- def getNotificationList(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 管理平台获取公告列表
- :param request:
- :return:
- """
- return JsonResponse(
- {
- "result": 1,
- "description": None,
- 'payload': {
- "total": 0,
- "dataList": []
- }
- }
- )
- # TODO 工人管理
- @permission_required(ROLE.manager)
- def getStaffDetailList(request):
- # type: (WSGIRequest)->JsonResponse
- return JsonResponse(
- {
- 'result': 0,
- 'description': None,
- 'payload': {
- 'dataList': []
- }
- }
- )
- # TODO 工人管理
- @permission_required(ROLE.manager, ROLE.supermanager)
- def getChargeList(request):
- # type: (WSGIRequest)->JsonResponse
- return JsonResponse(
- {
- 'result': 1,
- 'description': None,
- 'payload': {
- 'dataList': []
- }
- }
- )
- # TODO 添加通告消息
- @permission_required(ROLE.manager)
- def addNotice(request):
- # type: (WSGIRequest)->JsonResponse
- return JsonResponse(
- {
- 'result': 1,
- 'description': None,
- 'payload': {}
- }
- )
- # TODO 修改通告消息
- @permission_required(ROLE.manager)
- def editNotice(request):
- # type: (WSGIRequest)->JsonResponse
- return JsonResponse(
- {
- 'result': 1,
- 'description': None,
- 'payload': {}
- }
- )
- # TODO 删除通告消息
- @permission_required(ROLE.manager)
- def deleteNotice(request):
- # type: (WSGIRequest)->JsonResponse
- return JsonResponse(
- {
- 'result': 1,
- 'description': None,
- 'payload': {}
- }
- )
- #### FAQ
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getFAQDetailList(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 管理平台获取FAQ列表
- :param request:
- :return:
- """
- mid = str(request.user.id)
- faqs = FAQ.objects(managerId = mid)
- return JsonResponse(
- {
- 'result': 1,
- 'description': None,
- 'payload': {
- 'dataList': [faq.to_dict() for faq in faqs]
- }
- }
- )
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def addFAQ(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- mid = str(request.user.id)
- payload.update({'managerId': mid})
- faq = FAQ(**payload).save()
- return JsonResponse(
- {
- 'result': 1 if faq else 0,
- 'description': None,
- 'payload': {}
- }
- )
- @permission_required(ROLE.manager)
- def editFAQ(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- updated = FAQ.objects(id = str(payload['id'])).update(**payload)
- return JsonResponse(
- {
- 'result': 1 if updated else 0,
- 'description': None,
- 'payload': {}
- }
- )
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def deleteFAQ(request):
- # type: (WSGIRequest)->JsonResponse
- ids = json.loads(request.body)['ids']
- map(lambda _: _.delete(), FAQ.objects(id__in = ids))
- return JsonResponse({'result': 1, 'description': '', 'payload': {}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def onPoints(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- coins = int(payload['coins'])
- devNo = Device.get_devNo_by_logicalCode(payload['logicalCode'])
- if not devNo:
- return JsonResponse({'result': 0, 'description': u'设备号不存在'})
- dev = Device.get_dev(devNo)
- try:
- dealer = Dealer.objects.get(id = ObjectId(dev['ownerId']))
- agent = Agent.objects.get(id = ObjectId(dealer.agentId))
- if agent.managerId != str(request.user.id):
- return JsonResponse({'result': 0, 'description': u'该设备不属于您的厂家哦!', 'payload': {}})
- except (MultipleObjectsReturned, DoesNotExist) as e:
- logger.exception('cannot get agent or dealer, error = %s' % (e,))
- return JsonResponse({'result': 0, 'description': u'没有找到经销商和代理商数据', 'payload': {}})
- packageId = ''
- for pid, conf in dev['washConfig'].items():
- if int(conf['coins']) == coins:
- packageId = pid
- break
- continue
- if not packageId:
- return JsonResponse(
- {
- 'result': 0,
- 'description': u'没有找到对应的套餐信息,请您重新选择其他分值.或者检查设备是否没有注册到系统',
- 'payload': {}
- }
- )
- smartBox = ActionDeviceBuilder.create_action_device(dev)
- try:
- smartBox.start(packageId)
- except ServiceException, e:
- logger.exception('start device(%s) failed error = %s' % (devNo, e.result.get('description')))
- return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': {}})
- except Exception, e:
- logger.exception('start device(%s) failed error = %s' % (devNo, e))
- return JsonResponse({'result': 0, 'description': u'系统错误', 'payload': {}})
- dealer = Dealer.objects(id = dev['ownerId']).first()
- group = Group.get_group(dev['groupId'])
- record = ManagerUpScoreRecord(devNo = devNo,
- logicalCode = payload['logicalCode'],
- coins = coins,
- devTypeName = dev['devType']['name'],
- dealerTel = getattr(dealer, 'username', ''),
- dealerName = getattr(dealer, 'nickname', ''),
- address = group.get('address', ''),
- groupName = group['groupName'],
- managerId = str(request.user.id))
- record.save()
- return JsonResponse({'result': 1, 'description': u'上分成功!', 'payload': {}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def onPointsRecords(request):
- # type: (WSGIRequest)->JsonResponse
- mid = str(request.user.id)
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- records = ManagerUpScoreRecord.objects(managerId = mid).order_by('-createdTime')
- return JsonResponse(
- {
- 'result': 1,
- 'description': '',
- 'payload': {
- 'total': records.count(),
- 'dataList': [_.to_dict() for _ in records.skip((pageIndex - 1) * pageSize).limit(pageSize)]
- }
- })
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def editDealerPassword(request):
- # type: (WSGIRequest)->JsonResponse
- try:
- payload = json.loads(request.body)
- dealerId = payload.get('id')
- password = payload.get('password')
- dealer = Dealer.objects.get(id = dealerId)
- dealer.set_password(password)
- return JsonResponse({'result': 1, 'description': u'修改成功', 'payload': ''})
- except DoesNotExist:
- return JsonResponse({'result': 0, 'description': u'经销商不存在,请刷新后再试', 'payload': ''})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def unlockDealer(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- dealerId = payload.get('id')
- dealer = Dealer.objects.get(id = str(dealerId))
- dealer.unlock_login()
- return JsonResponse({'result': 1, 'description': u'解锁成功!'})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def unlockAgent(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- agentId = payload.get('id')
- agent = Agent.objects.get(id = str(agentId))
- agent.unlock_login()
- return JsonResponse({'result': 1, 'description': u'解锁成功!'})
- @permission_required(ROLE.manager, ROLE.advertiser, ROLE.advertisement)
- def getCurrentUserInfo(request):
- # type: (WSGIRequest)->JsonResponse
- if request.user.is_authenticated():
- role = role_from_user(request.user)
- if role == ROLE.manager:
- manager = request.user # type: Manager
- else:
- mid = request.user.managerId
- manager = Manager.objects.get(id = ObjectId(mid)) # type: Manager
- return JsonResponse(
- {
- "result": 1,
- "description": "",
- "payload":
- {
- "nickname": request.user.nickname,
- "brandName": manager.brandName,
- "feature_map": manager.feature_boolean_map,
- "logo": manager.logo,
- "role": role
- }
- })
- else:
- return JsonResponse(
- {
- "result": 1,
- "description": "",
- "payload":
- {
- "nickname": "",
- "brandName": "管理后台",
- "logo": ""
- }
- })
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getManagerConfigs(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 获取厂商定向配置项
- :param request:
- :return:
- """
- return JsonResponse({'result': 1, 'description': '', 'payload': {'configs': request.user.configs}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def setManagerConfigs(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 设置厂商定向配置项
- :param request:
- :return:
- """
- manager = request.user # type: cast(MyUser)
- payload = json.loads(request.body)
- manager.set_configs(payload['params'])
- return JsonResponse({'result': 1, 'description': u'更新成功', 'payload': {}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getCommandByDevice(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 获取指令
- :param request:
- :return:
- """
- logicalCode = request.GET.get('logicalCode')
- commands = DeviceCommand.common_and_type_specific(logicalCode = logicalCode, commander = request.user)
- # dataList = [ {'name': c.name, 'command': c.template.safe_substitute(IMEI=device['devNo'])} for c in commands ]
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': commands}})
- ############
- #: 离线任务相关
- ############
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def newOfflineTask(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 新建离线任务
- :param request:
- :return:
- """
- return JsonResponse({'result': 1, 'description': None, 'payload': {}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getOfflineTaskList(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 获取离线任务列表
- :param request:
- :return:
- """
- current_user = request.user # type: Manager
- page_index = int(request.GET.get('pageIndex', 1))
- page_size = int(request.GET.get('pageSize', 10))
- search_key = request.GET.get('searchKey', None)
- tasks = OfflineTask.objects(ownerId = current_user.id,
- role = current_user.role).search(search_key).order_by('-dateTimeAdded')
- total = tasks.count()
- return JsonOkResponse(
- payload = {
- 'dataList': [t.to_dict() for t in tasks.paginate(pageSize = page_size, pageIndex = page_index)],
- 'total': total
- })
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getOfflineTaskStatus(request):
- # type: (WSGIRequest)->JsonResponse
- task_id = request.GET.get('id')
- if not task_id:
- return JsonErrorResponse(description = u'查询ID为空')
- task = OfflineTask.objects(id = str(task_id)).get() # type: OfflineTask
- return JsonOkResponse(payload = task.status)
- #: 广告主相关
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getAdvertiserList(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 获取广告主列表
- :param request:
- :return:
- """
- managerId = str(request.user.id)
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- searchKey = request.GET.get('searchKey')
- activited = request.GET.get('activited')
- if activited:
- cursor = Advertiser.objects(managerId = managerId, activited = json.loads(activited))
- else:
- cursor = Advertiser.objects(managerId = managerId)
- total = cursor.count()
- advertisers = [_.to_dict() for _ in
- cursor.search(searchKey).order_by('-dateTimeAdded').paginate(pageIndex, pageSize)]
- return JsonResponse({'result': 1, 'description': None, 'payload': {'total': total, 'dataList': advertisers}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def addAdvertiser(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 管理员添加广告主
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- payload['managerId'] = str(request.user.id)
- try:
- Advertiser.create_user(**payload)
- except NotUniqueError:
- return JsonResponse({'result': 0, 'description': u'手机号已经存在'})
- return JsonResponse({'result': 1, 'description': None, 'payload': {}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def editAdvertiser(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 编辑广告主
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- advertiser = Advertiser.objects(id = payload.pop('id')).get() # type: Advertiser
- updated = advertiser.update(**payload)
- logger.info('{0!r} edited {1!r}, payload={2} updated={3}'.format(request.user, advertiser, payload, updated))
- return JsonResponse({'result': 1, 'description': u'编辑成功', 'payload': {}})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def toggleAdvertiserActivation(request):
- # type: (WSGIRequest)->JsonResponse
- """
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- advertiser = Advertiser.objects(id = payload['id'], managerId = str(request.user.id)).first()
- if advertiser is None:
- return JsonResponse({'result': 0, 'description': u'广告主不存在'})
- updated = advertiser.update(activited = bool(payload['activited']))
- logger.info('{manager!r} toggled {advertiser!r} status from({old_value}) to ({new_value}) updated={updated}'
- .format(manager = request.user,
- advertiser = advertiser,
- old_value = advertiser.activited,
- new_value = payload['activited'],
- updated = updated))
- return JsonResponse({'result': 1, 'description': u'修改成功'})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def setAdvertiserQuota(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 厂商配置广告商效果额度
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- advertiser = Advertiser.objects(id = payload['id'], managerId = str(request.user.id)).first()
- if advertiser is None:
- return JsonResponse({'result': 0, 'description': u'广告主不存在'})
- old_quota = advertiser.quota
- quota = int(payload['quota'])
- if quota < 0 or quota > Const.A_HUNDRED_MILLION:
- return JsonResponse({'result': 0, 'description': u'额度不合法,最小等于0,最大等于1亿'})
- updated = advertiser.update(quota = quota)
- logger.info('{manager!r} updated {advertiser!r} quota from({old_quota}) to ({new_quota}) updated={updated}'
- .format(manager = request.user,
- advertiser = advertiser,
- old_quota = old_quota,
- new_quota = quota,
- updated = updated))
- return JsonResponse({'result': 1, 'description': u'配置成功'})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- # @permission_required(ROLE.manager)
- def initCardsBalance(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- startNo = payload['cardNoStart']
- endNo = payload['cardNoEnd']
- agentId = payload['agentId']
- balance = float(payload['money'])
- while int(endNo) >= int(startNo) > 0:
- try:
- Card.objects.filter(agentId = agentId, cardNo = str(startNo)).delete()
- newCard = Card(balance = balance, agentId = agentId, cardNo = str(startNo), cardType = 'ID')
- newCard.save()
- except Exception as e:
- logger.exception('initCardsBalance error=%s' % e)
- return JsonResponse({'result': 0, 'description': u'操作异常哦'})
- finally:
- startNo = int(startNo) + 1
- return JsonResponse({'result': 1, 'description': u'分配成功'})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getChargeSIMCardSettlementList(request):
- # type: (WSGIRequest)->JsonResponse
- managerId = str(request.user.id)
- startTime = datetime.datetime.strptime(request.GET.get('startTime') + ' 00:00:00', '%Y-%m-%d %H:%M:%S')
- endTime = datetime.datetime.strptime(request.GET.get('endTime') + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
- agentId = request.GET.get('agentId', '')
- dealerId = request.GET.get('dealerId', '')
- if agentId == '' and dealerId == '':
- agentsIdList = [str(_['_id']) for _ in Agent.get_collection().find({'managerId': managerId}, {'_id': 1})]
- dealersIdList = [str(_['_id']) for _ in
- Dealer.get_collection().find({'agentId': {'$in': agentsIdList}}, {'_id': 1})]
- simRechargeRecords = DealerRechargeRecord.objects(
- dealerId__in = dealersIdList,
- status = DealerRechargeRecord.PayState.Paid,
- finishedTime__gte = startTime,
- finishedTime__lte = endTime
- )
- elif agentId != '' and dealerId == '':
- dealersIdList = [str(_['_id']) for _ in Dealer.get_collection().find({'agentId': agentId}, {'_id': 1})]
- simRechargeRecords = DealerRechargeRecord.objects(
- dealerId__in = dealersIdList,
- status = DealerRechargeRecord.PayState.Paid,
- finishedTime__gte = startTime,
- finishedTime__lte = endTime
- )
- elif agentId != '' and dealerId != '':
- simRechargeRecords = DealerRechargeRecord.objects(
- dealerId = dealerId,
- status = DealerRechargeRecord.PayState.Paid,
- finishedTime__gte = startTime,
- finishedTime__lte = endTime
- )
- else:
- return JsonResponse({'result': 0, 'description': u'错误的查询方式'})
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- dataList = []
- for simRechargeRecord in simRechargeRecords.order_by('-finishedTime').paginate(pageIndex,
- pageSize): # type: DealerRechargeRecord
- dealer = Dealer.objects(id = simRechargeRecord.dealerId).first()
- if not dealer:
- return JsonResponse({'result': 0, 'description': u'该经销商用户不存在'})
- agent = Agent.objects(id = dealer.agentId).first()
- if not agent:
- return JsonResponse({'result': 0, 'description': u'该代理商用户不存在'})
- device = Device.objects(devNo = simRechargeRecord.items[0]['devNo']).first()
- if not device:
- return JsonResponse({'result': 0, 'description': u'该设备信息不存在'})
- try:
- sumPrice = simRechargeRecord.sum_of_price
- except Exception as e:
- continue
- item = {
- 'orderNo': simRechargeRecord.orderNo,
- 'dealerName': dealer.nickname,
- 'dealerTel': dealer.username,
- 'agentName': agent.nickname,
- 'logicalCode': device.logicalCode,
- 'devType': device.devTypeName,
- 'dateTimeAdded': device.dateTimeAdded,
- 'chargeMoney': sumPrice,
- 'chargeTime': simRechargeRecord.to_js_timestamp(simRechargeRecord.finishedTime)
- }
- dataList.append(item)
- return JsonResponse(
- {
- 'result': 1,
- 'description': u'',
- 'payload': {
- 'total': simRechargeRecords.count(),
- 'dataList': dataList
- }
- }
- )
- @error_tolerate(nil = DefaultJsonErrorResponse)
- @permission_required(ROLE.manager)
- def getWithdrawSettlementList(request):
- # type: (WSGIRequest)->JsonResponse
- managerId = str(request.user.id)
- startTime = datetime.datetime.strptime(request.GET.get('startTime') + ' 00:00:00', '%Y-%m-%d %H:%M:%S')
- endTime = datetime.datetime.strptime(request.GET.get('endTime') + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
- agentsIdList = [str(_['_id']) for _ in Agent.get_collection().find({'managerId': managerId}, {'_id': 1})]
- dealersIdList = [str(_['_id']) for _ in
- Dealer.get_collection().find({'agentId': {'$in': agentsIdList}}, {'_id': 1})]
- withdrawRecords = WithdrawRecord.objects(
- ownerId__in = dealersIdList, role = ROLE.dealer,
- status = WithdrawStatus.SUCCEEDED,
- postTime__gte = startTime,
- postTime__lte = endTime
- )
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- dataList = []
- for withdrawRecord in withdrawRecords.order_by('-postTime').paginate(pageIndex, pageSize): # type: WithdrawRecord
- dealer = Dealer.objects(id = withdrawRecord.ownerId).first()
- if not dealer:
- return JsonResponse({'result': 0, 'description': u'该经销商用户不存在'})
- payload = {
- 'orderNo': withdrawRecord.order,
- 'dealerName': dealer.nickname,
- 'dealerTel': dealer.username,
- 'withdrawMoney': withdrawRecord.amount,
- 'withdrawTime': withdrawRecord.to_js_timestamp(withdrawRecord.postTime)
- }
- dataList.append(payload)
- return JsonResponse(
- {
- 'result': 1,
- 'description': u'',
- 'payload':
- {
- 'total': withdrawRecords.count(),
- 'dataList': dataList
- }
- }
- )
- @error_tolerate(nil = JsonErrorResponse(u'生成报表失败'))
- @permission_required(ROLE.manager)
- def exportExcel(request):
- # type: (WSGIRequest)->JsonResponse
- manager = request.user # type: cast(Manager)
- def get_offline_task_name(task_type, user, start_time, end_time):
- tmp_list = [task_type]
- tmp_list.append(user.username)
- tmp_list.append(u'%s至%s' % (start_time, end_time))
- tmp_list.append(str(utils_datetime.generate_timestamp_ex()))
- offline_task_name = '-'.join(tmp_list)
- return '-'.join(tmp_list).replace("/", "_")
- query = prepare_query(request.GET)
- queryAttrs = query.attrs
- queryAttrs['managerId'] = str(manager.id)
- queryAttrs['dateTimeAdded__lte'] = dt_to_timestamp(queryAttrs['dateTimeAdded__lte'])
- queryAttrs['dateTimeAdded__gte'] = dt_to_timestamp(queryAttrs['dateTimeAdded__gte'])
- if queryAttrs['type'] == 'settlementChargeCard':
- task_type = OfflineTaskType.SIM_CHARGE
- process_func_name = 'generate_simCharge_excel_report'
- elif queryAttrs['type'] == 'settlementWithdraw':
- task_type = OfflineTaskType.DEALER_WITHDRAW
- process_func_name = 'generate_dealerWithDraw_excel_report'
- elif queryAttrs['type'] == 'chargeCard':
- task_type = OfflineTaskType.USER_RECHARGE_CARD
- process_func_name = 'generate_biz_stats_for_manager'
- elif queryAttrs['type'] == 'charge':
- task_type = OfflineTaskType.USER_RECHARGE
- process_func_name = 'generate_biz_stats_for_manager'
- elif queryAttrs['type'] == 'consumption':
- task_type = OfflineTaskType.CONSUME_ORDER_REPORT
- process_func_name = 'manager_export_consume_order_excel_from_db'
- else:
- return JsonErrorResponse(description = u'不支持的导出类型')
- offline_task_name = get_offline_task_name(
- task_type = task_type,
- user = manager,
- start_time = query.raw.get('startTime', ''),
- end_time = query.raw.get('endTime', ''))
- file_path, offline_task = OfflineTask.issue_export_report(offline_task_name = offline_task_name,
- process_func_name = process_func_name,
- task_type = task_type,
- userid = str(manager.id),
- role = ROLE.manager)
- task_caller(func_name = str(offline_task.process_func_name),
- offline_task_id = str(offline_task.id),
- filepath = file_path,
- queryAttrs = queryAttrs)
- return JsonResponse({
- 'result': 1,
- 'description': u'请前往离线任务查看任务处理情况',
- 'payload': str(offline_task.id)
- })
- @permission_required(ROLE.manager)
- def getDevMapChart(request):
- # type: (WSGIRequest)->JsonResponse
- currentManager = request.user # type: Manager
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
- if currentManager.supports('show_for_jiuheng'):
- devList = list(Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}, 'devType.code': {'$in': ['100206', '100224', '100202']}},
- {'_id': 0, 'devNo': 1, 'logicalCode': 1, 'cycle': 1, 'groupId': 1}
- ))
- else:
- devList = list(Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}},
- {'_id': 0, 'devNo': 1, 'logicalCode': 1, 'cycle': 1, 'groupId': 1}
- ))
- group_id_list = list(set([dev['groupId'] for dev in devList]))
- groups = Group.get_groups_by_group_ids(group_id_list)
- def get_province(pvc):
- if pvc == u'内蒙古自治区':
- pvc = u'内蒙古'
- elif pvc == u'黑龙江省':
- pvc = u'黑龙江'
- else:
- pvc = pvc[0:2]
- return pvc
- busy = 0
- online = 0
- offline = 0
- deviceDict = {}
- for _ in devList:
- deviceDict[_['devNo']] = {
- 'logicalCode': _['logicalCode'],
- 'cycle': _.get('cycle', Const.DEV_CYCLE_DEFAULT)
- }
- group = groups.get(_['groupId'])
- if not group:
- logger.error('{} has no group.'.format(_['devNo']))
- province = u'未知'
- else:
- distinct_id = group.get('districtId')
- if not distinct_id:
- logger.error('{} has no distinct_id.'.format(_['devNo']))
- else:
- district = District.get_district(distinct_id)
- if not district:
- logger.error('distinct({}) of {} not exists.'.format(str(distinct_id), _['devNo']))
- province = u'未知'
- else:
- province = district.split(' ')[0]
- deviceDict[_['devNo']].update({'province': province})
- counter = {}
- for item in Device.get_many_device_status_cache(deviceDict).values():
- device = DeviceDict(item) # type: DeviceDict
- if device.status == 1:
- busy += 1
- if device.online == 1:
- online += 1
- elif device.online == 0:
- offline += 1
- province = device['province']
- if province not in counter:
- counter[province] = 0
- counter[province] += 1
- dataList = [{'name': get_province(province), 'value': count} for province, count in counter.items()]
-
- if currentManager.id == ObjectId('59974b4b8732d6480fb699e5'):
- return JsonResponse({'result': 1, 'description': u"", 'payload': {
- "busy": int(offline*0.7),
- "online": offline,
- "offline": online-2000,
- "dataList": dataList
- }})
- else:
- return JsonResponse({'result': 1, 'description': u"", 'payload': {
- "busy": busy,
- "online": online,
- "offline": offline,
- "dataList": dataList
- }})
- @permission_required(ROLE.manager)
- def getAllDeviceIncomeList(request):
- # type: (WSGIRequest)->JsonResponse
- def fake_response():
- monthDataList = [{'lineCoins':90000,'payIncome':800000},{'lineCoins':90000,'payIncome':802000},{'lineCoins':90000,'payIncome':804000},
- {'lineCoins':90000,'payIncome':806000},{'lineCoins':90000,'payIncome':808000},{'lineCoins':90000,'payIncome':810000},
- {'lineCoins':90000,'payIncome':812000},{'lineCoins':90000,'payIncome':814000},{'lineCoins':90000,'payIncome':816000},
- {'lineCoins':90000,'payIncome':818000},{'lineCoins':90000,'payIncome':820000},{'lineCoins':90000,'payIncome':822000},
- {'lineCoins':90000,'payIncome':824000},{'lineCoins':90000,'payIncome':826000},{'lineCoins':90000,'payIncome':828000},
- {'lineCoins':90000,'payIncome':830000},{'lineCoins':90000,'payIncome':832000},{'lineCoins':90000,'payIncome':834000},
- {'lineCoins':90000,'payIncome':836000},{'lineCoins':90000,'payIncome':838000},{'lineCoins':90000,'payIncome':840000},
- {'lineCoins':90000,'payIncome':842000},{'lineCoins':90000,'payIncome':844000},{'lineCoins':90000,'payIncome':846000},
- {'lineCoins':90000,'payIncome':848000},{'lineCoins':90000,'payIncome':850000},{'lineCoins':90000,'payIncome':852000},
- {'lineCoins':90000,'payIncome':854000},{'lineCoins':90000,'payIncome':856000},{'lineCoins':90000,'payIncome':858000},
- ]
- nowTime = datetime.datetime.now()
- result = []
- for ii in range(30):
- result.append({'dateStr':(nowTime-datetime.timedelta(days=30-ii)).strftime('%Y-%m-%d'),'lineCoins':monthDataList[ii]['lineCoins']+random.randint(-2000,2000),'payIncome':monthDataList[ii]['payIncome']+random.randint(-10000,10000)})
-
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': result[::-1]}})
-
- if request.user.id == ObjectId('59974b4b8732d6480fb699e5'):
- return fake_response()
-
- data = cache.get('getAllDeviceIncomeList_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': data}})
- else:
-
-
- currentManager = request.user # type: Manager
-
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
-
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
-
- if currentManager.supports('show_for_jiuheng'):
- dealerIdList = [str(_) for _ in Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}, 'devType.code': {'$in': ['100206', '100224', '100202']}},
- {'ownerId': 1}).distinct('ownerId')]
-
- return JsonResponse(
- {'result': 1, 'description': None, 'payload': {'dataList': query_device_income(dealerIdList)}})
-
- @permission_required(ROLE.manager)
- def getAllDeviceConsumption(request):
- # type: (WSGIRequest)->JsonResponse
- def fake_response():
- result =[
- {
- 'consumptionList':[{'unit':u'百万度','name':u'电量','value':14},{'unit':u'百万','name':u'金币','value':28}],
- 'dateStr':'2022-03'
- },
- {
- 'consumptionList':[{'unit':u'百万度','name':u'电量','value':10},{'unit':u'百万','name':u'金币','value':20}],
- 'dateStr':'2022-02'
- },
- {
- 'consumptionList':[{'unit':u'百万度','name':u'电量','value':15},{'unit':u'百万','name':u'金币','value':30}],
- 'dateStr':'2022-01'
- },
- {
- 'consumptionList':[{'unit':u'百万度','name':u'电量','value':15},{'unit':u'百万','name':u'金币','value':29}],
- 'dateStr':'2021-12'
- },
- {
- 'consumptionList':[{'unit':u'百万度','name':u'电量','value':14},{'unit':u'百万','name':u'金币','value':28}],
- 'dateStr':'2021-11'
- },
- {
- 'consumptionList':[{'unit':u'百万度','name':u'电量','value':14},{'unit':u'百万','name':u'金币','value':28}],
- 'dateStr':'2021-10'
- }
- ]
-
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': result}})
-
- if request.user.id == ObjectId('59974b4b8732d6480fb699e5'):
- return fake_response()
-
- data = cache.get('getAllDeviceConsumption_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': data}})
- else:
- currentManager = request.user # type: Manager
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
- if currentManager.supports('show_for_jiuheng'):
- dealerIdList = [str(_) for _ in Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}, 'devType.code': {'$in': ['100206', '100224', '100202']}},
- {'ownerId': 1}).distinct('ownerId')]
- return JsonResponse(
- {'result': 1, 'description': None, 'payload': {'dataList': query_device_consumption(dealerIdList)}})
- @permission_required(ROLE.manager)
- def getAllUserStatistics(request):
- # type: (WSGIRequest)->JsonResponse
- currentManager = request.user # type: Manager
- if currentManager.supports('dummy_big_data'):
- item = DummyManagerData.objects(managerId = str(currentManager.id), dataKey = 'getAllUserStatistics').first()
- if item:
- return JsonResponse({'result': 1, 'description': None, 'payload': item.value})
- else:
- return JsonResponse({'result': 1, 'description': None, 'payload': {
- "userCount": 320232,
- "femaleCount": 37360,
- "maleCount": 224162,
- "todayActiveUsers": 24353
- }})
- data = cache.get('getAllUserStatistics_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse({'result': 1, 'description': None, 'payload': data})
- else:
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
- return JsonResponse({'result': 1, 'description': None, 'payload': get_user_stats(dealerIdList)})
- @permission_required(ROLE.manager)
- def getAllFeedbackStatistics(request):
- # type: (WSGIRequest)->JsonResponse
- data = cache.get('getAllFeedbackStatistics_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse({'result': 1, 'description': None, 'payload': data})
- else:
- currentManager = request.user # type: cast(Manager)
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
- if currentManager.supports('show_for_jiuheng'):
- dealerIdList = [str(_) for _ in Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}, 'devType.code': {'$in': ['100206', '100224', '100202']}},
- {'ownerId': 1}).distinct('ownerId')]
- return JsonResponse({'result': 1, 'description': None, 'payload': get_feed_back_stats(dealerIdList)})
- @permission_required(ROLE.manager)
- def getDealerIncomeTotalTop(request):
- # type: (WSGIRequest)->JsonResponse
- data = cache.get('getDealerIncomeTotalTop_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': data}})
- else:
- currentManager = request.user # type: cast(Manager)
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerDict = {str(item['_id']): item['nickname'] for item in
- Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1, 'nickname': 1})}
- if currentManager.supports('show_for_jiuheng'):
- dealerIdList = [str(_) for _ in Device.get_collection().find(
- {'ownerId': {'$in': dealerDict.keys()}, 'devType.code': {'$in': ['100206', '100224', '100202']}},
- {'ownerId': 1}).distinct('ownerId')]
- for dealerId in dealerIdList:
- dealerDict.pop(dealerId, None)
- return JsonResponse({
- 'result': 1,
- 'description': None,
- 'payload': {'dataList': query_total_dealer_income_top(dealerDict)}})
- @permission_required(ROLE.manager)
- def getUserConsumeFrequency(request):
- # type: (WSGIRequest)->JsonResponse
- currentManager = request.user
- if currentManager.supports('dummy_big_data'):
- item = DummyManagerData.objects(managerId = str(currentManager.id), dataKey = 'getUserConsumeFrequency').first()
- if item:
- return JsonResponse({'result': 1, 'description': None, 'payload': item.value})
- else:
- return JsonResponse({'result': 1, 'description': None, 'payload': {
- 'dataList': [
- {"name": "1次", "percent": 10},
- {"name": "2-5次", "percent": 20},
- {"name": "5-10次", "percent": 30},
- {"name": "10-20次", "percent": 30},
- {"name": "20+次", "percent": 10}
- ]}})
- else:
- data = cache.get('getUserConsumeFrequency_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse({'result': 1, 'description': None, 'payload': {'dataList': data}})
- else:
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
- return JsonResponse(
- {'result': 1, 'description': None, 'payload': {'dataList': query_user_consume_frequency(dealerIdList)}})
- @permission_required(ROLE.manager)
- def getDevBeingUsedTrend(request):
- # type: (WSGIRequest)->JsonResponse
- def fake_response():
- datalist = [{'devBeingUsed':50,'time':'00时'},{'devBeingUsed':50,'time':'01时'},{'devBeingUsed':49,'time':'02时'},
- {'devBeingUsed':47,'time':'03时'},{'devBeingUsed':46,'time':'04时'},{'devBeingUsed':45,'time':'05时'},
- {'devBeingUsed':39,'time':'06时'},{'devBeingUsed':35,'time':'07时'},{'devBeingUsed':30,'time':'08时'},
- {'devBeingUsed':30,'time':'09时'},{'devBeingUsed':30,'time':'10时'},{'devBeingUsed':30,'time':'11时'},
- {'devBeingUsed':28,'time':'12时'},{'devBeingUsed':30,'time':'13时'},{'devBeingUsed':33,'time':'14时'},
- {'devBeingUsed':33,'time':'15时'},{'devBeingUsed':30,'time':'16时'},{'devBeingUsed':30,'time':'17时'},
- {'devBeingUsed':30,'time':'18时'},{'devBeingUsed':39,'time':'19时'},{'devBeingUsed':45,'time':'20时'},
- {'devBeingUsed':46,'time':'21时'},{'devBeingUsed':47,'time':'22时'},{'devBeingUsed':49,'time':'23时'}]
- return JsonResponse(
- {'result': 1, 'description': None, 'payload': {'___comment': '最近24小时内设备使用趋势图', 'dataList': datalist}})
-
- if request.user.id == ObjectId('59974b4b8732d6480fb699e5'):
- return fake_response()
-
- data = cache.get('getDevBeingUsedTrend_%s' % request.user.id, None)
- if data is not None:
- return JsonResponse(
- {'result': 1, 'description': None, 'payload': {'___comment': '最近24小时内设备使用趋势图', 'dataList': data}})
- else:
- currentManager = request.user
-
- agentIdList = [str(_['_id']) for _ in
- list(Agent.get_collection().find({'managerId': str(currentManager.id)}, {'_id': 1}))]
- dealerIdList = [str(_['_id']) for _ in
- list(Dealer.get_collection().find({'agentId': {'$in': agentIdList}}, {'_id': 1}))]
- #
-
- if currentManager.supports('show_for_jiuheng'):
- devList = list(Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}, 'devType.code': {'$in': ['100206', '100224', '100202']}},
- {'devNo': 1, 'groupId': 1, '_id': 0}
- ))
- else:
- devList = list(Device.get_collection().find(
- {'ownerId': {'$in': dealerIdList}},
- {'devNo': 1, 'groupId': 1, '_id': 0}
- ))
-
- devNoList = [_['devNo'] for _ in devList]
- # 找前一天的数据
- def get_hours_time(hoursStr):
- return time.mktime(to_datetime(
- (datetime.date.today() - datetime.timedelta(days = 1)).strftime('%Y-%m-%d') + hoursStr).timetuple())
- yesterdayBegin = get_hours_time(' 00:00:00')
- yesterdayEnd = get_hours_time(' 23:59:59')
- serviceProgress = list(ServiceProgress.get_collection().find(
- {'device_imei': {'$in': devNoList}, 'start_time': {'$gte': int(yesterdayBegin), '$lte': int(yesterdayEnd)}},
- {'_id': 0, 'start_time': 1}
- ))
- dataList = []
- for _ in range(24):
- if _ < 9:
- timeStr = '0' + str(_ + 1) + '时'
- else:
- timeStr = str(_ + 1) + '时'
- dataList.append({
- 'time': timeStr,
- 'devBeingUsed': 0
- })
- for svs in serviceProgress:
- for _ in range(24):
- if _ < 10:
- timeStr = ' ' + '0' + str(_)
- else:
- timeStr = ' ' + str(_)
- begin = timeStr + ':00:00'
- end = timeStr + ':59:59'
- if get_hours_time(begin) <= svs['start_time'] <= get_hours_time(end):
- dataList[_]['devBeingUsed'] += 1
- return JsonResponse({'result': 1, 'description': None, 'payload': {
- "___comment": "最近24小时内设备使用趋势图",
- "dataList": dataList
- }})
- @permission_required(ROLE.manager)
- def getRechargeRecords(request):
- # type: (WSGIRequest)->JsonResponse
- """
- :param request:
- :return:
- """
- currentManager = request.user # type: Manager
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- agentId = request.GET.get('agentId')
- dealerId = request.GET.get('dealerId')
- startTime = date_to_datetime_floor(request.GET.get('startTime'))
- endTime = date_to_datetime_ceiling(request.GET.get('endTime'))
- dealerMap = get_dealerMap_by_managerId(managerId = currentManager.id, agentId = agentId, dealerId = dealerId)
- dealerIds = dealerMap.keys()
- originRecords = ClientRechargeModelProxy.get_data_list(
- startTime = startTime,
- endTime = endTime,
- ownerId__in = dealerIds,
- via = 'recharge',
- result = RechargeRecord.PayResult.SUCCESS) # type: CustomQuerySet
- total = originRecords.count()
- records = originRecords.paginate(pageIndex = pageIndex, pageSize = pageSize)
- dataList = [
- {
- "orderNo": record.orderNo,
- "gatewayOrderNo": record.wxOrderNo,
- "userNickname": record.nickname,
- "dealerName": dealerMap[record.ownerId]['nickname'],
- "agentName": dealerMap[record.ownerId]['agentName'],
- "logicalCode": record.logicalCode,
- "devType": record.dev_type_name,
- "chargeMoney": record.money,
- "groupName": record.groupName,
- "chargeTime": record.to_js_timestamp(record.dateTimeAdded)
- }
- for record in records
- ]
- cache.set('getRechargeRecords_%s' % currentManager.id, originRecords, 60 * 60)
- return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
- @permission_required(ROLE.manager)
- def getBusinessTrend(request):
- currentManager = request.user
- type = request.GET['type']
- if type == u'charge':
- cacheData = cache.get('getRechargeRecords_%s' % currentManager.id)
- elif type == u'consumption':
- cacheData = cache.get('getConsumptionRecord_%s' % currentManager.id)
- else:
- cacheData = None
- if cacheData is not None:
- timeData = [_.dateTimeAdded.strftime("%Y-%m-%d") for _ in cacheData]
- dataListTemp = [{'date': k, 'value': v} for k, v in Counter(timeData).items()]
- dataList = sorted(dataListTemp, key = lambda x: x['date'])
- return JsonOkResponse(payload = {'dataList': dataList})
- else:
- return JsonErrorResponse(u'数据缓存超时, 请重新查询订单')
- @permission_required(ROLE.manager)
- def getUserActivityTrend(request):
- currentManager = request.user
- type = request.GET['type']
- if type == u'charge':
- cacheData = cache.get('getRechargeRecords_%s' % currentManager.id)
- elif type == u'consumption':
- cacheData = cache.get('getConsumptionRecord_%s' % currentManager.id)
- else:
- cacheData = None
- if cacheData is not None:
- timeAndUserData = [{_.dateTimeAdded.strftime("%Y-%m-%d"): _.openId} for _ in cacheData]
- timeAndUserDataStr = list(set([json.dumps(_) for _ in timeAndUserData]))
- timeAndUserDataTemp = [json.loads(_).keys()[0] for _ in timeAndUserDataStr]
- dataListTemp = [{'date': k, 'value': v} for k, v in Counter(timeAndUserDataTemp).items()]
- dataList = sorted(dataListTemp, key = lambda x: x['date'])
- return JsonOkResponse(payload = {'dataList': dataList})
- else:
- return JsonErrorResponse(u'数据缓存超时, 请重新查询订单')
- @permission_required(ROLE.manager)
- def getConsumptionRecord(request):
- currentManager = request.user
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- agentId = request.GET.get('agentId')
- dealerId = request.GET.get('dealerId')
- startTime = request.GET.get('startTime')
- endTime = request.GET.get('endTime')
- dealerMap = get_dealerMap_by_managerId(managerId = currentManager.id, agentId = agentId, dealerId = dealerId)
- dealerIds = dealerMap.keys()
- originRecords = ClientConsumeModelProxy.get_data_list(startTime = startTime,
- endTime = endTime,
- ownerId__in = dealerIds,
- isNormal = True) # type: CustomQuerySet
- total = originRecords.count()
- records = originRecords.paginate(pageIndex = pageIndex, pageSize = pageSize)
- dataList = [
- {
- "orderNo": record.orderNo,
- "userNickname": record.nickname,
- "dealerName": dealerMap[record.ownerId]['nickname'],
- "agentName": dealerMap[record.ownerId]['agentName'],
- "logicalCode": record.logicalCode,
- "devType": record.dev_type_name,
- "coins": record.coin,
- "groupName": record.groupName,
- "createdTime": record.to_js_timestamp(record.dateTimeAdded)
- }
- for record in records
- ]
- cache.set('getConsumptionRecord_%s' % currentManager.id, originRecords, 60 * 60)
- return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
- @permission_required(ROLE.manager)
- def getRechargeCardRecords(request):
- # type: (WSGIRequest)->JsonResponse
- currentManager = request.user # type: Manager
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- agentId = request.GET.get('agentId')
- dealerId = request.GET.get('dealerId')
- startTime = date_to_datetime_floor(request.GET.get('startTime'))
- endTime = date_to_datetime_ceiling(request.GET.get('endTime'))
- dealerMap = get_dealerMap_by_managerId(managerId = currentManager.id, agentId = agentId, dealerId = dealerId)
- dealerIds = dealerMap.keys()
- records = ClientRechargeModelProxy.get_data_list(
- startTime = startTime,
- endTime = endTime,
- ownerId__in = dealerIds,
- via = 'chargeCard',
- result = RechargeRecord.PayResult.SUCCESS) # type: CustomQuerySet
- total = records.count()
- recordsByPage = records.paginate(pageIndex = pageIndex, pageSize = pageSize)
- dataList = []
- for record in recordsByPage: # type: RechargeRecord
- order = CardRechargeOrder.get_by_rechargeRecord(record)
- entry = {
- "orderNo": record.orderNo,
- "gatewayOrderNo": record.wxOrderNo,
- "cardNo": order.cardNo if order else '',
- "userNickname": record.nickname,
- "dealerName": dealerMap[record.ownerId]['nickname'],
- "agentName": dealerMap[record.ownerId]['agentName'],
- "logicalCode": record.logicalCode,
- "chargeMoney": record.money,
- "groupName": record.groupName,
- "chargeTime": record.to_js_timestamp(record.dateTimeAdded) if order else ''
- }
- dataList.append(entry)
- return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
- @permission_required(ROLE.manager)
- def setAgentBanner(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- agent = Agent.objects(id = str(payload['id'])).first()
- if not agent:
- return JsonErrorResponse(u'不存在的经销商')
- agent.bannerList = payload.get('bannerImgList', [])
- agent.save()
- return JsonOkResponse()
- @error_tolerate(nil = DefaultJsonErrorResponse)
- def getCheckCode(request):
- # type: (WSGIRequest)->JsonResponse
- toNumber = request.GET.get('username', '123456')
- manager = Manager.objects(username = toNumber).first()
- if not manager:
- return JsonErrorResponse(u'不存在的厂商')
- productName = manager.brandName
- status, msg = managerForgotPwdSMSProvider.get(phoneNumber = toNumber,
- productName = productName,
- vendor = SysParas.get_sms_vendor(manager.smsVendor))
- if not status:
- return JsonResponse({'result': 0, 'description': msg})
- else:
- return JsonResponse({'result': 1, 'description': ''})
- @error_tolerate(nil = DefaultJsonErrorResponse)
- def verifyForgetCode(request):
- # type: (WSGIRequest)->JsonResponse
- payload = json.loads(request.body)
- username = payload.get('username', None)
- code = payload.get('code', None)
- password = payload.get('password', '')
- manager = Manager.objects(username = username).first()
- while True:
- if manager is None:
- response = JsonErrorResponse(u'该手机号尚未注册,请注册后再进行操作')
- break
- if password == "":
- response = JsonErrorResponse(u"请输入密码")
- break
- status, desc = managerRegisterSMSProvider.verify(username, code)
- if not status:
- response = JsonErrorResponse(desc)
- else:
- manager.set_password(password)
- manager.unlock_login()
- response = JsonResponse({"result": 1, "description": None, "payload": {}})
- break
- return response
- @error_tolerate(nil = DefaultJsonErrorResponse)
- def editAgentZJFirePlatform(request):
- payload = json.loads(request.body)
- agentId = payload['id']
- northPort = ":".join([payload.get("northIp", ""), payload.get("northPort", "")])
- try:
- norther = ZhejiangNorther.objects.get(tokenId = agentId)
- norther.usernameFromHear = payload['loginUsername']
- norther.passwordFromHear = payload['loginPassword']
- norther.mqUser = payload['mqUsername']
- norther.mqPassword = payload['mqPassword']
- norther.serviceCodeFromNorth = payload['code']
- norther.northPort = northPort
- except Exception, e:
- norther = ZhejiangNorther(usernameFromHear = payload['loginUsername'],
- passwordFromHear = payload['loginPassword'],
- mqUser = payload['mqUsername'],
- mqPassword = payload['mqPassword'],
- serviceCodeFromNorth = payload['code'],
- tokenId = agentId,
- northPort = northPort)
- norther.save()
- return JsonOkResponse()
- @error_tolerate(nil = DefaultJsonErrorResponse)
- def editDealerZJFirePlatform(request):
- payload = json.loads(request.body)
- dealerId = payload['id']
- dealer = Dealer.objects.get(id = dealerId)
- try:
- company = Company.objects.get(ownerId = dealerId)
- company.name = payload['companyName']
- company.code = payload['companyCode']
- company.address = payload['companyAddress']
- company.contactName = payload['contactsName']
- company.telephone = payload['contactsTel']
- company.manufacturer = payload['deviceManufacturer']
- company.dateTimeUpdated = datetime.datetime.now()
- except Exception, e:
- company = Company(
- ownerId = payload['id'],
- agentId = dealer.agentId,
- name = payload['companyName'],
- code = payload['companyCode'],
- address = payload['companyAddress'],
- contactName = payload['contactsName'],
- telephone = payload['contactsTel'],
- manufacturer = payload['deviceManufacturer'],
- dateTimeAdded = datetime.datetime.now())
- company.save()
- return JsonOkResponse()
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def getAliApp(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 更改微信资金平台APP信息
- :param request:
- :return:
- """
- appid = str(request.GET.get('appid'))
- app = AliApp.objects(appid = appid).first() # type: AliApp
- if not app:
- return JsonOkResponse(payload = {})
- else:
- return JsonOkResponse(payload = app.to_dict())
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def bindAliApp(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 绑定自定义支付宝
- :param request:
- :return:
- """
- payload = json.loads(request.body) # type: dict
- return api.bindAliApp(payload)
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def bindWechatFund(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 绑定自定义微信公众号
- :param request:
- :return:
- """
- payload = json.loads(request.body) # type: dict
- return api.bindWechatFund(payload)
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def bindWechatCust(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 绑定自定义微信公众号
- :param request:
- :return:
- """
- payload = json.loads(request.body) # type: dict
- return api.bindWechatCust(payload)
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def getWechatFundApp(request):
- # type: (WSGIRequest)->JsonResponse
- """
- 更改微信资金平台APP信息
- :param request:
- :return:
- """
- appid = request.GET.get('appid')
- mchid = request.GET.get('mchid')
- app = WechatPayApp.objects(appid = appid, mchid = mchid).first() # type: WechatPayApp
- if not app:
- return JsonOkResponse(payload = {})
- else:
- return JsonOkResponse(payload = app.to_dict())
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required('Manager')
- def getDeviceRealtimeData(request):
- # type: (WSGIRequest)->JsonResponse
- logicalCode = request.GET.get('logicalCode')
- port = request.GET.get('port')
- startTimeGet = request.GET.get('startTime')
- endTimeGet = request.GET.get('endTime')
- startTimeGet += ' 00:00:00'
- endTimeGet += ' 23:59:59'
- startTime = int(time.mktime(time.strptime(startTimeGet, "%Y-%m-%d %H:%M:%S")))
- endTime = int(time.mktime(time.strptime(endTimeGet, "%Y-%m-%d %H:%M:%S")))
- report = PortReport.get_collection().find({
- 'time': {'$gte': startTime, '$lte': endTime},
- 'logicalCode': logicalCode
- }).sort('time', 1)
- reportList = [i for i in report]
- listLength = len(reportList)
- responeData = {'dataList': []}
- if listLength < 1000:
- for _ in reportList:
- electricity = _['portInfo'].get(port)['electricity']
- portInfoDict = {
- "dateStr": timestamp_timeformat(_['time']),
- "voltage": 220,
- "electricity": electricity,
- "temperature": _['temperature'] if electricity else 0,
- "status": _['portInfo'].get(port)['status']
- }
- responeData['dataList'].append(portInfoDict)
- if listLength > 1000:
- index = math.ceil(listLength / 1000)
- for ii in range(1000):
- num = ii * int(index)
- for _ in reportList[num]:
- electricity = _['portInfo'].get(port)['electricity']
- portInfoDict = {
- "dateStr": timestamp_timeformat(_['time']),
- "voltage": 220,
- "electricity": electricity,
- "temperature": _['temperature'] if electricity else 0,
- "status": _['portInfo'].get(port)['status']
- }
- responeData['dataList'].append(portInfoDict)
- return JsonResponse({'result': 1, 'description': None, 'payload': responeData})
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def editDealer(request):
- payload = json.loads(request.body)
- username = payload.get('tel')
- nickname = payload.get('name')
- id = payload.get('id')
- dealer = Dealer.objects.get(id = id)
- dealer.username = username
- dealer.nickname = nickname
- dealer.save()
- return JsonOkResponse()
- @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
- @permission_required(ROLE.manager)
- def getIncomeOrderList(request):
- managerId = str(request.user.id)
- startDate = request.GET.get('startTime', '')
- endDate = request.GET.get('endTime', '')
- agentId = request.GET.get('agentId', '')
- dealerId = request.GET.get('dealerId', '')
- dealersIdList = []
- dealerDict = {}
- if agentId == '' and dealerId == '':
- agentDict = {}
- agentsIdList = []
- for agent in Agent.get_collection().find({'managerId': managerId}, {'_id': 1, 'username': 1, 'nickname': 1}):
- agentDict[str(agent['_id'])] = '%s %s' % (agent['nickname'], agent['username'])
- agentsIdList.append(str(agent['_id']))
- for dealer in Dealer.get_collection().find({'agentId': {'$in': agentsIdList}},
- {'_id': 1, 'username': 1, 'nickname': 1, 'agentId': 1}):
- dealerDict[str(dealer['_id'])] = {'dealerName': '%s %s' % (dealer['nickname'], dealer['username']),
- 'agentName': agentDict.get(dealer['agentId'], '')}
- dealersIdList.append(str(dealer['_id']))
- elif agentId != '' and dealerId == '':
- agents = Agent.get_collection().find({'_id': ObjectId(agentId)}, {'_id': 1, 'username': 1, 'nickname': 1})
- for dealer in Dealer.get_collection().find({'agentId': agentId},
- {'_id': 1, 'username': 1, 'nickname': 1, 'agentId': 1}):
- dealerDict[str(dealer['_id'])] = {'dealerName': '%s %s' % (dealer['nickname'], dealer['username']),
- 'agentName': '%s %s' % (agents[0]['nickname'], agents[0]['username'])}
- dealersIdList.append(str(dealer['_id']))
- elif agentId != '' and dealerId != '':
- agents = Agent.get_collection().find({'_id': ObjectId(agentId)}, {'_id': 1, 'username': 1, 'nickname': 1})
- dealers = Dealer.get_collection().find({'_id': ObjectId(dealerId)},
- {'_id': 1, 'username': 1, 'nickname': 1, 'agentId': 1})
- dealerDict[str(dealers[0]['_id'])] = {'dealerName': '%s %s' % (dealers[0]['nickname'], dealers[0]['username']),
- 'agentName': '%s %s' % (agents[0]['nickname'], agents[0]['username'])}
- dealersIdList = [dealerId]
- else:
- return JsonResponse({'result': 0, 'description': u'错误的查询方式'})
- records = ClientRechargeModelProxy.get_data_list(startTime = startDate, endTime = endDate,
- ownerId__in = dealersIdList, result = 'success',
- via__nin = ['sendcoin', 'refund']) # type: CustomQuerySet
- pageIndex = int(request.GET.get('pageIndex', 1))
- pageSize = int(request.GET.get('pageSize', 10))
- chargeTypeDict = {'recharge': u'扫码充值', 'sendcoin': u'赠币', 'refund': u'退币', 'chargeCard': u'卡充值'}
- total = records.count()
- dataList = []
- for rcd in records.paginate(pageIndex, pageSize):
- # 检查下如果是卡充值,就需要检查是否已经完成整个流程
- if rcd.via == 'chargeCard' and CardRechargeOrder.objects.filter(rechargeNo = rcd.id,
- status = 'finished').count() == 0:
- continue
- try:
- proxyRcd = ClientDealerIncomeModelProxy.get_one(ref_id = rcd.id,
- groupId = rcd.groupId) # type: DealerIncomeProxy
- user = MyUser.objects.filter(openId = rcd.openId).only('openId', 'nickname', 'sex', 'groupId').first()
- sex = ''
- if user.sex == 0:
- sex = u'女'
- elif user.sex == 1:
- sex = u'男'
- else:
- pass
- except Exception, e:
- continue
- amountDict = DealerIncomeProxy.get_agent_partner_amount(rcd.ownerId, proxyRcd.partition)
- data = {
- 'id': str(rcd.id),
- 'amount': proxyRcd.actualAmountMap.get(rcd.ownerId),
- 'orderAmount': rcd.money,
- 'agentShareAmount': amountDict.get('agentAmount', 0),
- 'partnerShareAmount': amountDict.get('partnerAmount', 0),
- 'tradeType': chargeTypeDict.get(rcd.via, '-'),
- 'gateway': rcd.gateway,
- 'status': rcd.result,
- 'userNickname': user.nickname,
- 'userGender': sex,
- 'groupName': rcd.groupName,
- 'logicalCode': rcd.logicalCode,
- 'devTypeName': rcd.dev_type_name,
- 'createTime': rcd.dateTimeAdded.strftime(Const.DATETIME_FMT),
- 'gatewayTradeNo': rcd.orderNo,
- 'outTradeNo': rcd.wxOrderNo,
- 'agentName': dealerDict.get(rcd.ownerId, {}).get('agentName', ''),
- 'dealerName': dealerDict.get(rcd.ownerId, {}).get('dealerName', '')
- }
- dataList.append(data)
- return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
- def getConsumptionOrderList(request):
- pageIndex = int(request.GET.get('pageIndex'))
- pageSize = int(request.GET.get('pageSize'))
- managerId = str(request.user.id)
- startDate = request.GET.get('startTime', '')
- endDate = request.GET.get('endTime', '')
- agentId = request.GET.get('agentId', '')
- dealerId = request.GET.get('dealerId', '')
- dealerDict = {}
- dealersIdList = []
- if agentId == '' and dealerId == '':
- agentDict = {}
- agentsIdList = []
- for agent in Agent.get_collection().find({'managerId': managerId}, {'_id': 1, 'username': 1, 'nickname': 1}):
- agentDict[str(agent['_id'])] = '%s %s' % (agent['nickname'], agent['username'])
- agentsIdList.append(str(agent['_id']))
- for dealer in Dealer.get_collection().find({'agentId': {'$in': agentsIdList}},
- {'_id': 1, 'username': 1, 'nickname': 1, 'agentId': 1}):
- dealerDict[str(dealer['_id'])] = {'dealerName': '%s %s' % (dealer['nickname'], dealer['username']),
- 'agentName': agentDict.get(dealer['agentId'], '')}
- dealersIdList.append(str(dealer['_id']))
- elif agentId != '' and dealerId == '':
- agents = Agent.get_collection().find({'_id': ObjectId(agentId)}, {'_id': 1, 'username': 1, 'nickname': 1})
- for dealer in Dealer.get_collection().find({'agentId': agentId},
- {'_id': 1, 'username': 1, 'nickname': 1, 'agentId': 1}):
- dealerDict[str(dealer['_id'])] = {'dealerName': '%s %s' % (dealer['nickname'], dealer['username']),
- 'agentName': '%s %s' % (agents[0]['nickname'], agents[0]['username'])}
- dealersIdList.append(str(dealer['_id']))
- elif agentId != '' and dealerId != '':
- agents = Agent.get_collection().find({'_id': ObjectId(agentId)}, {'_id': 1, 'username': 1, 'nickname': 1})
- dealers = Dealer.get_collection().find({'_id': ObjectId(dealerId)},
- {'_id': 1, 'username': 1, 'nickname': 1, 'agentId': 1})
- dealerDict[str(dealers[0]['_id'])] = {'dealerName': '%s %s' % (dealers[0]['nickname'], dealers[0]['username']),
- 'agentName': '%s %s' % (agents[0]['nickname'], agents[0]['username'])}
- dealersIdList = [dealerId]
- else:
- return JsonResponse({'result': 0, 'description': u'错误的查询方式'})
- records = ClientConsumeModelProxy.get_data_list(startTime = startDate,
- endTime = endDate,
- ownerId__in = dealersIdList,
- isNormal = True) # type: CustomQuerySet
- dataList = []
- for rcd in records.paginate(pageIndex, pageSize): # type:ConsumeRecord
- try:
- user = MyUser.objects.filter(openId = rcd.openId).only('openId', 'nickname', 'sex', 'groupId').first()
- if user is None:
- continue
- sex = ''
- if user.sex == 0:
- sex = u'女'
- elif user.sex == 1:
- sex = u'男'
- else:
- pass
- except Exception, e:
- continue
- desc = ' '
- for key, value in rcd.servicedInfo.items():
- if key not in DEALER_CONSUMPTION_AGG_KIND_TRANSLATION:
- continue
- desc += " %s:%s%s" % (
- DEALER_CONSUMPTION_AGG_KIND_TRANSLATION.get(key), value, DEALER_CONSUMPTION_AGG_KIND_UNIT.get(key))
- data = {
- 'id': str(rcd.id),
- 'createTime': rcd.created_date,
- 'title': desc,
- 'userNickname': user.nickname,
- 'userGender': sex,
- 'groupName': rcd.groupName,
- 'logicalCode': rcd.logicalCode,
- 'devTypeName': rcd.dev_type_name,
- 'amount': rcd.coin,
- 'agentName': dealerDict.get(rcd.ownerId, {}).get('agentName', ''),
- 'dealerName': dealerDict.get(rcd.ownerId, {}).get('dealerName', '')
- }
- dataList.append(data)
- return JsonOkResponse(payload = {'dataList': dataList, 'total': records.count()})
- @permission_required(ROLE.manager)
- def exportIncomeOrderList(request):
- manager = request.user
- def get_offline_task_name(task_type, user, **kwargs):
- # type: (basestring, Dealer, Dict)->basestring
- tmp_list = [task_type, user.username]
- if 'logicalCode' in kwargs and kwargs['logicalCode']:
- tmp_list.append(u'设备编号_%s' % (kwargs['logicalCode'],))
- if 'groupId' in kwargs and kwargs['groupId']:
- address = Group.get_group(kwargs['groupId']).get('address', '')
- tmp_list.append(u'地址_%s' % (address,))
- tmp_list.append(u'%s至%s' % (kwargs['startTime'], kwargs['endTime']))
- tmp_list.append(str(utils_datetime.generate_timestamp_ex()))
- return '-'.join(tmp_list).replace("/", "_")
- query_dict = {
- 'startTime': request.GET.get('startTime', '') + ' 00:00:00',
- 'endTime': request.GET.get('endTime', '') + ' 23:59:59',
- 'managerId': str(manager.id),
- 'agentId': request.GET.get('agentId', ''),
- 'dealerId': request.GET.get('dealerId', '')
- }
- offline_task_name = get_offline_task_name(
- task_type = OfflineTaskType.CHARGE_ORDER_REPORT,
- user = manager,
- **query_dict)
- file_path, offline_task = OfflineTask.issue_export_report(offline_task_name = offline_task_name,
- process_func_name = 'manager_export_charge_order_excel_from_db',
- task_type = OfflineTaskType.CHARGE_ORDER_REPORT,
- userid = str(manager.id),
- role = ROLE.manager)
- logger.info('start making charge report=%s' % file_path)
- task_caller(str(offline_task.process_func_name),
- offline_task_id = str(offline_task.id),
- filepath = file_path,
- queryDict = query_dict)
- return JsonResponse({
- 'result': 1,
- 'description': u"请前往离线任务查看任务处理情况",
- 'payload': str(offline_task.id)
- })
- @permission_required(ROLE.manager)
- def exportConsumptionOrderList(request):
- manager = request.user
- def get_offline_task_name(task_type, user, **kwargs):
- # type: (basestring, Dealer, Dict)->basestring
- tmp_list = [task_type, user.username]
- if 'logicalCode' in kwargs and kwargs['logicalCode']:
- tmp_list.append(u'设备编号_%s' % (kwargs['logicalCode'],))
- if 'groupId' in kwargs and kwargs['groupId']:
- address = Group.get_group(kwargs['groupId']).get('address', '')
- tmp_list.append(u'地址_%s' % (address,))
- tmp_list.append(u'%s至%s' % (kwargs['startTime'], kwargs['endTime']))
- tmp_list.append(str(utils_datetime.generate_timestamp_ex()))
- return '-'.join(tmp_list).replace("/", "_")
- query_dict = {
- 'startTime': request.GET.get('startTime', '') + ' 00:00:00',
- 'endTime': request.GET.get('endTime', '') + ' 23:59:59',
- 'managerId': str(manager.id),
- 'agentId': request.GET.get('agentId', ''),
- 'dealerId': request.GET.get('dealerId', '')
- }
- offline_task_name = get_offline_task_name(
- task_type = OfflineTaskType.CONSUME_ORDER_REPORT,
- user = manager,
- **query_dict)
- file_path, offline_task = OfflineTask.issue_export_report(offline_task_name = offline_task_name,
- process_func_name = 'manager_export_consume_order_excel_from_db',
- task_type = OfflineTaskType.CONSUME_ORDER_REPORT,
- userid = str(manager.id),
- role = ROLE.manager)
- logger.info('start making consume report=%s' % file_path)
- task_caller(str(offline_task.process_func_name),
- offline_task_id = str(offline_task.id),
- filepath = file_path,
- queryDict = query_dict)
- return JsonResponse({
- 'result': 1,
- 'description': u"请前往离线任务查看任务处理情况",
- 'payload': str(offline_task.id)
- })
- def inputLogicalCodes(logicalCodes, managerId):
- """
- 录入的二维码保存数据库
- :param logicalCodes: 逻辑码 >>> list
- :param managerId: 厂商ID >>> str
- :return: JsonResponse
- """
- for l in logicalCodes:
- dev = Device.objects.filter(logicalCode = l).first()
- if not dev:
- return JsonResponse({'result': 0, 'description': u'无效的二维码编号'})
- if dev.is_registered:
- return JsonResponse({'result': 0, 'description': u'设备已经被注册!录入设备只能录入尚未注册的设备'})
- data = {
- "devNo": dev.devNo,
- "logicalCode": l,
- "managerId": managerId
- }
- try:
- ManagerInputDev.objects.create(**data)
- except Exception as e:
- logger.exception(e)
- return JsonResponse({'result': 0, 'description': u'注册设备出错!'})
- return JsonResponse({'result': 1, 'description': u'录入成功!'})
- @permission_required(ROLE.manager)
- def inputEquipment(request):
- """
- 手动录入设备 只有厂商录入的设备 才能被旗下的经销商所绑定(温州郎鑫特性)
- :param request: WSGIRequest
- :return: JsonResponse
- """
- logicalCode = json.loads(request.body).get("logicalCode")
- if logicalCode is None:
- return JsonResponse({'result': 0, 'description': u'无效的二维码编号'})
- return inputLogicalCodes([logicalCode], str(request.user.id))
- @permission_required(ROLE.manager)
- def getInputEquipments(request):
- """
- 获取厂商的录入设备列表(温州郎鑫特性)
- :param request: WSGIRequest
- :return: JsonResponse
- """
- pageIndex = int(request.GET.get("pageIndex", 1))
- pageSize = int(request.GET.get("pageSize", 10))
- managerId = str(request.user.id)
- queryset = ManagerInputDev.objects.filter(managerId = managerId)
- count = queryset.count()
- dataList = list()
- for item in queryset.skip((pageIndex - 1) * pageSize).limit(pageSize):
- dev = Device.get_dev(item.devNo)
- dealer = Dealer.get_dealer(dev.get("ownerId"))
- group = Group.get_group(dev.get("groupId"))
- tempData = {
- "id": str(item.id),
- "imei": item.devNo,
- "logicalCode": item.logicalCode,
- "devTypeName": dev.get("devType", {}).get('name'),
- "inputTime": item.inputTime,
- "createdTime": dev.get("dateTimeBinded"),
- "dealerName": dealer.get("nickname") if dealer else "",
- "dealerTel": dealer.get("username") if dealer else "",
- "groupName": group.get("groupName") if group else ""
- }
- dataList.append(tempData)
- payload = {
- "count": count,
- "dataList": dataList
- }
- return JsonResponse({'result': 1, 'description': '', "payload": payload})
- @permission_required(ROLE.manager)
- def deleteInputEquipment(request):
- """
- 删除厂商录入的设备(温州郎鑫特性)
- :param request: WSGIRequest
- :return: JsonResponse
- """
- logicalCodes = json.loads(request.body).get("logicalCode")
- managerId = str(request.user.id)
- for logicalCode in logicalCodes:
- equip = ManagerInputDev.objects.filter(logicalCode = logicalCode, managerId = managerId)
- if not equip:
- return JsonResponse({'result': 0, 'description': u'未查找到设备'})
- dev = Device.get_dev_by_l(logicalCode)
- if not dev:
- return JsonResponse({'result': 0, 'description': u'未查找到设备'})
- if dev.is_registered:
- return JsonResponse({'result': 0, 'description': u'设备已经被经销商注册,不能删除'})
- try:
- ManagerInputDev.objects.filter(logicalCode__in = logicalCodes).delete()
- except Exception as e:
- logger.exception(e)
- return JsonResponse({'result': 0, 'description': u'删除设备错误'})
- return JsonResponse({'result': 1, 'description': u'删除成功'})
- @permission_required(ROLE.manager)
- def uploadLogicalExcel(request):
- """
- 上传logical文件
- :param request:
- :return:
- """
- files = request.FILES.getlist('file')
- if not len(files):
- return JsonResponse({'result': 1, 'description': u'未知的逻辑码文件,请重新试试', 'payload': ''})
- logicalFile = request.FILES.getlist('file')[0]
- ext = os.path.splitext(logicalFile.name)[1]
- if ext not in (".xls", ".xlsx"):
- return JsonErrorResponse(description = u"上传失败,请重新上传excel文件!")
- tempFile = xlrd.open_workbook(file_contents = logicalFile.read())
- sh = tempFile.sheet_by_index(0)
- logicalCodes = sh.row_values(0)
- new_codes = list()
- try:
- for l in logicalCodes:
- new_codes.append(str(int(l)))
- except Exception as e:
- logger.exception(e)
- return inputLogicalCodes(new_codes, str(request.user.id))
- @error_tolerate(logger = logger, nil = JsonErrorResponse(u'禁用设备失败'))
- @permission_required(ROLE.manager)
- def disableDevice(request):
- """
- 厂商禁用设备 昌源需求 下发协议到设备 设备端锁死
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- logicalcode_list = payload.get('logicalCode')
- disable = payload.get('disable')
- for logicalCode in logicalcode_list:
- dev = Device.get_dev_by_logicalCode(logicalCode) # type: DeviceDict
- if not dev:
- logger.error(u'device with logicalCode<{}> is not exists.'.format(logicalCode))
- return JsonErrorResponse(description = u'逻辑码{}对应的设备不存在'.format(logicalCode))
- dealer = Dealer.objects(id = dev.ownerId).first() # type: Dealer
- if not dealer:
- logger.error(u'this device<{}> has invalid owner id<>'.format(repr(dev), dev.ownerId))
- return JsonErrorResponse(description = u'逻辑码{}对应的设备经销商不存在'.format(logicalCode))
- agent = Agent.objects(id = dealer.agentId).first() # type: Agent
- if not agent:
- logger.error(u'this device<{}> has invalid agent id<>'.format(repr(dev), dealer.agentId))
- return JsonErrorResponse(description = u'逻辑码{}对应的设备代理商不存在'.format(logicalCode))
- if agent.managerId != str(request.user.id):
- return JsonErrorResponse(description = u'该设备不属于您的厂家哦!')
- try:
- smartBox = ActionDeviceBuilder.create_action_device(dev)
- smartBox.set_dev_disable(disable)
- Device.objects.filter(devNo = dev.devNo).update(otherConf__disableDevice = disable)
- Device.invalid_device_cache(dev.devNo)
- except ServiceException as e:
- logger.exception('disable device({}) failed error = {}'.format(repr(dev), e.result.get('description')))
- return JsonErrorResponse(description = u'禁用{}失败'.format(logicalCode))
- return JsonOkResponse(description = u"操作成功")
- @error_tolerate(logger = logger, nil = JsonErrorResponse(u'禁用设备失败'))
- @permission_required(ROLE.manager)
- def disableAllDevice(request):
- """
- 厂商禁用设备 昌源需求 下发协议到设备 设备端锁死
- :param request:
- :return:
- """
- payload = json.loads(request.body)
- dealer_id = payload.get('dealerId')
- disable = payload.get('disable')
- dealer = Dealer.objects(id = dealer_id).first() # type: Dealer
- if not dealer:
- return JsonErrorResponse(description = u'备经销商不存在')
- agent = Agent.objects(id = dealer.agentId).first() # type: Agent
- if not agent:
- return JsonErrorResponse(description = u'代理商不存在')
- if agent.managerId != str(request.user.id):
- return JsonErrorResponse(description = u'该设备不属于您的厂家哦!')
- dev_no_list = [item['devNo'] for item in
- Device.get_collection().find({'ownerId': dealer_id}, {'_id': 0, 'devNo': 1})]
- devices = Device.get_dev_by_nos(dev_no_list)
- for dev in devices.values():
- try:
- smartBox = ActionDeviceBuilder.create_action_device(dev)
- smartBox.set_dev_disable(disable)
- Device.objects.filter(devNo = dev.devNo).update(otherConf__disableDevice = disable)
- Device.invalid_device_cache(dev.devNo)
- except ServiceException as e:
- logger.exception('disable device({}) failed error = {}'.format(repr(dev), e.result.get('description')))
- return JsonErrorResponse(description = u'禁用{}失败'.format(dev.devNo))
- return JsonOkResponse(description = u"操作成功")
- @error_tolerate(logger = logger, nil = JsonErrorResponse(u"授权失败"))
- @permission_required(ROLE.manager)
- def dealerDisableDevice(request):
- """
- 授权经销商 能否进行禁用设备操作
- :param request:
- :return:
- """
- dealerId = request.GET.get("id", "")
- grant = json.loads(request.GET.get("disable"))
- dealer = Dealer.objects.filter(id = dealerId).first()
- if not dealer:
- return JsonErrorResponse(description = u"无有效的经销商")
- features = dealer.features
- if grant:
- features.append("dealerDisableDevice")
- else:
- try:
- features.remove("dealerDisableDevice")
- except ValueError:
- pass
- Dealer.objects.filter(id = dealerId).update(features = features)
- cache.delete(Dealer.cache_key(dealerId))
- return JsonOkResponse(description = u"操作成功")
- @permission_required(ROLE.manager)
- def exportDealerDetailList(request):
- def get_offline_task_name(task_type, user, **kwargs):
- # type: (basestring, Dealer, Dict)->basestring
- tmp_list = [task_type, user.username]
- tmp_list.append(str(utils_datetime.generate_timestamp_ex()))
- return '-'.join(tmp_list).replace("/", "_")
- manager = request.user
- query_dict = {"mid": str(request.user.id)}
- offline_task_name = get_offline_task_name(
- task_type = OfflineTaskType.DEALER_INFO_REPORT,
- user = manager,
- **query_dict)
- file_path, offline_task = OfflineTask.issue_export_report(offline_task_name = offline_task_name,
- process_func_name = 'manager_export_dealer_info_excel_from_db',
- task_type = OfflineTaskType.DEALER_INFO_REPORT,
- userid = str(manager.id),
- role = ROLE.manager)
- logger.info('start making charge report=%s' % file_path)
- task_caller(str(offline_task.process_func_name),
- offline_task_id = str(offline_task.id),
- filepath = file_path,
- queryDict = query_dict)
- return JsonResponse({
- 'result': 1,
- 'description': u"请前往离线任务查看任务处理情况",
- 'payload': str(offline_task.id)
- })
|