views.py 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. web.device.views
  5. ~~~~~~~~~
  6. """
  7. import datetime
  8. import itertools
  9. import logging
  10. from collections import Counter
  11. import simplejson as json
  12. from bson.objectid import ObjectId
  13. from django.conf import settings
  14. from django.core.cache import cache
  15. from django.core.handlers.wsgi import WSGIRequest
  16. from mongoengine.errors import NotUniqueError, DoesNotExist
  17. from typing import List, TYPE_CHECKING, Dict, Union
  18. from voluptuous import MultipleInvalid
  19. from apilib.utils import alphanum_key, natural_sort
  20. from apilib.utils_json import JsonResponse
  21. from apps.dispatch.commands import TopicCommand
  22. from apps.web.agent.models import Agent
  23. from apps.web.common.models import AddressType
  24. from apps.web.common.models import District
  25. from apps.web.constant import Const, DeviceCmdCode, DeviceOnlineStatus, support_policy_weifule, \
  26. support_policy_device
  27. from apps.web.core import ROLE
  28. from apps.web.core.exceptions import ServiceException
  29. from apps.web.core.helpers import ActionDeviceBuilder
  30. from apps.web.core.models import DriverCode, DriverAdapter, DriverEventer
  31. from apps.web.core.networking import MessageSender
  32. from apps.web.core.utils import JsonErrorResponse, JsonOkResponse
  33. from apps.web.dealer.models import Dealer
  34. from apps.web.device.define import DeviceChannelType
  35. from apps.web.device.models import Device, DeviceType, Group, MajorDeviceType, DeviceCommand, Cell, ManagerInputDev, \
  36. SwapGroup, FaultRecord
  37. from apps.web.device.timescale import OfflineCoinsManager
  38. from apps.web.device.validation import equipGroupSchema
  39. from apps.web.exceptions import CustomizedValidationError
  40. from apps.web.helpers import DeviceTypeVisitor, get_user_manager_agent
  41. from apps.web.management.models import Manager
  42. from apps.web.south_intf.swap_carcharger import SwapContract
  43. from apps.web.south_intf.yuhuan_fire import YuhuanNorther
  44. from apps.web.user.models import MyUser, Card
  45. from apps.web.utils import (
  46. translate_sendmsg_error, permission_required, error_tolerate,
  47. check_role, record_operation_behavior, concat_user_login_entry_url, concat_user_center_entry_url
  48. )
  49. from apps.web.wrapper import request_limit_by_user
  50. from taskmanager.mediator import task_caller
  51. logger = logging.getLogger(__name__)
  52. if TYPE_CHECKING:
  53. from apps.web.device.models import GroupDict
  54. from apps.web.device.models import DeviceDict
  55. from apps.web.dealer.models import SubAccount
  56. @permission_required(ROLE.dealer, ROLE.subaccount)
  57. def updateEquipmentRemarks(request):
  58. # type: (WSGIRequest)->JsonResponse
  59. curr_user = request.user # type: Union[Dealer, SubAccount]
  60. if not curr_user.normal:
  61. return JsonErrorResponse(description = u'账号异常,不能进行该操作')
  62. ownerId = str(request.user.bossId)
  63. devNo = request.POST.get('eValue', None)
  64. remarks = request.POST.get('remarks', None)
  65. if devNo is None or remarks is None:
  66. return JsonResponse({"result": 0, "description": u"缺少参数", 'payload': {}})
  67. dev = Device.get_dev(devNo)
  68. if dev is None:
  69. return JsonResponse({"result": 0, "description": u"找不到设备", 'payload': {}})
  70. if dev['remarks'] == remarks: # 已经改了
  71. return JsonResponse({"result": 1, "description": None, 'payload': {}})
  72. try:
  73. dev['remarks'] = remarks
  74. Device.get_collection().update_one({'devNo': devNo}, {'$set': {'remarks': remarks}})
  75. Device.invalid_device_cache(dev['devNo'])
  76. return JsonResponse({"result": 1, "description": None, 'payload': {}})
  77. except Exception, e:
  78. logger.exception('update collection error=%s,devNo=%s,ownerId=%s' % (e, devNo, ownerId))
  79. return JsonResponse({"result": 0, "description": u'修改失败', 'payload': {}})
  80. @permission_required(ROLE.dealer, ROLE.subaccount)
  81. def batchUpdateEquipment(request):
  82. # type: (WSGIRequest)->JsonResponse
  83. curr_user = request.user # type: Union[Dealer, SubAccount]
  84. if not curr_user.normal:
  85. return JsonErrorResponse(description = u'账号异常,不能进行该操作')
  86. if 'value[]' in request.POST:
  87. instructions = request.POST.get('instructions')
  88. devNoList = request.POST.getlist('value[]')
  89. else:
  90. payload = json.loads(request.body)
  91. instructions = payload.get('instructions')
  92. devNoList = payload.get('value')
  93. if not devNoList:
  94. return JsonResponse({'result': 0, 'description': u'请选择设备', 'payload': {}})
  95. filterDevNoList = []
  96. for devNo in devNoList:
  97. device = Device.get_dev(devNo)
  98. if not device:
  99. continue
  100. group = Group.get_group(device['groupId'])
  101. if group['ownerId'] != str(request.user.bossId):
  102. return JsonResponse({'result': 0, 'description': u'不能修改合伙人设备', 'payload': {}})
  103. filterDevNoList.append(devNo)
  104. if not filterDevNoList:
  105. return JsonResponse({'result': 0, 'description': u'设备不存在,请刷新后再试', 'payload': {}})
  106. Device.get_collection().update({'devNo': {'$in': filterDevNoList}}, {'$set': {'instructions': instructions}},
  107. multi = True, upsert = False)
  108. Device.invalid_many_device_cache(devNoList)
  109. return JsonResponse({'result': 1, 'description': None, 'payload': {}})
  110. @permission_required(ROLE.dealer, ROLE.subaccount)
  111. def batchUpdateEquipmentPriceDescription(request):
  112. # type: (WSGIRequest)->JsonResponse
  113. curr_user = request.user # type: Union[Dealer, SubAccount]
  114. if not curr_user.normal:
  115. return JsonErrorResponse(description = u'账号异常,不能进行该操作')
  116. if 'logicalCode[]' in request.POST:
  117. priceDescription = request.POST.get('priceDescription')
  118. logicalCodeList = request.POST.getlist('logicalCode[]')
  119. else:
  120. payload = json.loads(request.body)
  121. priceDescription = payload.get('priceDescription')
  122. logicalCodeList = payload.get('logicalCode')
  123. if not logicalCodeList:
  124. return JsonResponse({'result': 0, 'description': u'请选择设备', 'payload': {}})
  125. filterDevNoList = []
  126. devNos = []
  127. for logicalCode in logicalCodeList:
  128. device = Device.get_dev_by_l(logicalCode)
  129. if not device:
  130. continue
  131. else:
  132. devNos.append(device.devNo)
  133. group = Group.get_group(device['groupId'])
  134. if group['ownerId'] != str(request.user.bossId):
  135. return JsonResponse({'result': 0, 'description': u'不能修改合伙人设备', 'payload': {}})
  136. filterDevNoList.append(logicalCode)
  137. if not filterDevNoList:
  138. return JsonResponse({'result': 0, 'description': u'设备不存在,请刷新后再试', 'payload': {}})
  139. Device.get_collection().update({'devNo': {'$in': devNos}}, {'$set': {'priceDescription': priceDescription}},
  140. multi = True, upsert = False)
  141. Device.invalid_many_device_cache(devNos)
  142. return JsonResponse({'result': 1, 'description': None, 'payload': {}})
  143. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  144. def getEquipmentNumAndAddressList(request):
  145. # type: (WSGIRequest)->JsonResponse
  146. ownerId = request.POST.get('dealerId') or str(request.user.bossId)
  147. groupIds = Group.get_group_ids_of_dealer(ownerId)
  148. partnerGroupIds = Group.get_group_ids_of_partner(ownerId)
  149. groupIds.extend(partnerGroupIds)
  150. groupList = Group.get_groups_by_group_ids(groupIds).values()
  151. for group in groupList:
  152. group['name'] = group['groupName']
  153. if group['groupId'] not in partnerGroupIds:
  154. group['isManager'] = True
  155. else:
  156. group['isManager'] = False
  157. return JsonResponse({
  158. "result": 1,
  159. "description": None,
  160. 'payload': {
  161. "groups": sorted(groupList, key = lambda d: alphanum_key(d["name"]))
  162. }
  163. })
  164. @permission_required(ROLE.dealer, ROLE.subaccount)
  165. def placeInfo(request):
  166. # type: (WSGIRequest)->JsonResponse
  167. ownerId = str(request.user.bossId)
  168. groupIds = Group.get_group_ids_of_dealer(ownerId)
  169. groupPartnerList = Group.get_group_ids_of_partner(ownerId)
  170. groupIds.extend(groupPartnerList)
  171. groupList = Group.get_groups_by_group_ids(groupIds).values()
  172. dataList = []
  173. for group in groupList:
  174. item = {
  175. 'address': group['address'],
  176. 'name': group['groupName'],
  177. 'groupId': group['groupId'],
  178. 'ownerId': group['ownerId']
  179. }
  180. if group['groupId'] in groupPartnerList:
  181. item.update({
  182. 'isManager': False
  183. })
  184. return JsonResponse({"result": 1, "description": None, 'payload': dataList})
  185. @permission_required(ROLE.dealer, ROLE.subaccount)
  186. def devices(request):
  187. # type: (WSGIRequest)->JsonResponse
  188. groupId = request.GET.get('groupId', None)
  189. if groupId is None:
  190. return JsonResponse({"result": 0, "description": u'没有传入正确的参数', 'payload': {}})
  191. devNoList = Device.get_devNos_by_group([groupId])
  192. devDict = Device.get_dev_by_nos(devNoList)
  193. dataList = []
  194. for devNo, dev in devDict.items():
  195. dataList.append({
  196. 'logicalCode': dev['logicalCode'],
  197. 'devNo': dev['devNo'],
  198. 'ownerId': dev['ownerId'],
  199. 'groupNum': dev['groupNumber'],
  200. 'equipmentId': dev['devNo'],
  201. 'equipmentType': dev['devType']['name'],
  202. 'equipmentValue': dev['groupNumber']})
  203. return JsonResponse({"result": 1, "description": None, 'payload': dataList})
  204. @permission_required(ROLE.dealer, ROLE.subaccount)
  205. def getEquipmentsByGroupId(request):
  206. # type: (WSGIRequest)->JsonResponse
  207. payload = json.loads(request.body) if request.body else {}
  208. groupId = payload.get('groupId', None)
  209. if not groupId:
  210. return JsonErrorResponse(description = u'参数错误,请刷新')
  211. groupId = groupId.split("###")[0]
  212. devNoList = Device.get_devNos_by_group([groupId])
  213. devDict = Device.get_dev_by_nos(devNoList) # type: Dict[str, DeviceDict]
  214. dataList = [
  215. {
  216. 'ownerId': device['ownerId'],
  217. 'groupNumber': device['groupNumber'],
  218. 'remarks': device['remarks'],
  219. 'devType': device.devTypeName,
  220. 'logicalCode': device.logicalCode,
  221. 'devNo': device.devNo,
  222. 'groupId': device.groupId,
  223. 'online': device.online,
  224. 'status': device.status,
  225. 'statusInfo': device.statusInfo
  226. }
  227. for devNo, device in devDict.items()
  228. ]
  229. return JsonOkResponse(payload = dataList)
  230. @permission_required(ROLE.dealer, ROLE.subaccount)
  231. def readNewEquipment(request):
  232. # type: (WSGIRequest)->JsonResponse
  233. logicalCode = request.GET.get('logicalCode', None)
  234. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  235. if devNo is None:
  236. return JsonResponse({'result': 0, 'description': u"设备号对应错误", 'payload': {}})
  237. # 因为需要获取电平信息,必须从数据库中获取
  238. dev = Device.get_dev(devNo)
  239. if dev is None:
  240. return JsonResponse({'result': 0, 'description': u"找不到设备", 'payload': {}})
  241. return JsonResponse({
  242. "result": 1,
  243. "description": None,
  244. 'payload': {
  245. 'battery': dev.get('battery', 1),
  246. 'pulseInterval1': dev.get('pulseInterval1', 200),
  247. 'pulseWidth1': dev.get('pulseWidth1', 50)
  248. }
  249. })
  250. @permission_required(ROLE.dealer, ROLE.subaccount)
  251. def setEquipmentGroupNumber(request):
  252. # type: (WSGIRequest)->JsonResponse
  253. logicalCode = request.POST.get('logicalCode', None)
  254. # todo groupNumber必须得填
  255. groupNumber = request.POST.get('groupNumber', None)
  256. if logicalCode is None or groupNumber is None:
  257. return JsonResponse({'result': 0, 'description': u'输入的参数非法', 'payload': {}})
  258. dev = Device.get_dev_by_l(logicalCode)
  259. dev['groupNumber'] = groupNumber
  260. try:
  261. Device.get_collection().update_one({'logicalCode': logicalCode}, {'$set': {'groupNumber': groupNumber}})
  262. Device.invalid_device_cache(dev['devNo'])
  263. except Exception, e:
  264. logger.exception('update device groupNumber error=%s,logicalCode=%s,groupNumber=%s'
  265. % (e, logicalCode, groupNumber))
  266. return JsonResponse({"result": 0, "description": u'保存编号出错,请稍候再试', 'payload': {}})
  267. YuhuanNorther.send_dev_info(dev)
  268. return JsonResponse({"result": 1, "description": None, 'payload': {}})
  269. @permission_required(ROLE.dealer, ROLE.subaccount)
  270. def szNewEquipment(request):
  271. # type: (WSGIRequest)->JsonResponse
  272. logicalCode = request.POST.get('logicalCode', None)
  273. pulseInterval1 = request.POST.get('pulseInterval1', None)
  274. pulseWidth1 = request.POST.get('pulseWidth1', None)
  275. battery = request.POST.get('battery', None)
  276. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  277. if devNo is None or pulseWidth1 is None or pulseInterval1 is None or battery is None:
  278. return JsonResponse({'result': 0, 'description': u'输入的参数非法', 'payload': {}})
  279. dev = Device.get_dev(devNo) # type: DeviceDict
  280. if not dev:
  281. return JsonResponse({'result': 0, 'description': u'找不到该设备', 'payload': {}})
  282. if not dev.online:
  283. return JsonResponse({'result': 0, 'description': u'当前设备不在线,无法进行设置', 'payload': {}})
  284. result = {'rst': 0}
  285. if dev.channelType != DeviceChannelType.Channel_BT:
  286. result = MessageSender.send(dev, DeviceCmdCode.SET_DEVINFO, {
  287. 'IMEI': devNo,
  288. 'pulse_set': {
  289. 'pwm_inter': int(pulseInterval1),
  290. 'pwm_wid': int(pulseWidth1),
  291. 'pwm_idle': int(battery)
  292. }
  293. })
  294. if result['rst'] == 0:
  295. try:
  296. Device.get_collection().update_one(
  297. {'devNo': devNo},
  298. {'$set':
  299. {
  300. 'pulseInterval1': pulseInterval1,
  301. 'pulseWidth1': pulseWidth1, 'battery': battery
  302. }
  303. }
  304. )
  305. Device.invalid_device_cache(devNo)
  306. except Exception as e:
  307. logger.exception(e)
  308. return JsonResponse({'result': 0, 'description': u'数据库操作异常,请稍候重试', 'payload': {}})
  309. else:
  310. return JsonResponse({'result': 0, 'description': translate_sendmsg_error(result['rst']), 'payload': {}})
  311. return JsonResponse({'result': 1, 'description': None, 'payload': {}})
  312. @permission_required(ROLE.dealer, ROLE.subaccount)
  313. def equipmentInfoDetail(request):
  314. # type: (WSGIRequest)->JsonResponse
  315. logicalCode = request.GET.get('logicalCode', None)
  316. ownerId = str(request.user.bossId)
  317. agentId = str(request.user.agentId)
  318. dealer = Dealer.objects(id = ownerId).first()
  319. if dealer is None:
  320. return JsonErrorResponse(description = u'不存在的经销商')
  321. if logicalCode is None:
  322. return JsonErrorResponse(description = u"缺少参数devNo")
  323. dev = Device.get_dev_by_logicalCode(logicalCode) # type: DeviceDict
  324. if dev is None:
  325. return JsonErrorResponse(description = u"找不到设备")
  326. device = dev.my_obj # type: Device
  327. if device is None:
  328. return JsonErrorResponse(description = u"设备不存在")
  329. tempElecPrice = device.otherConf.get('tempElecPrice', '')
  330. item = {
  331. 'devNo': dev.devNo,
  332. 'logicalCode': dev.logicalCode,
  333. 'groupNumber': dev['groupNumber'],
  334. 'online': dev.online,
  335. 'url': concat_user_login_entry_url(l=logicalCode),
  336. 'agentId': agentId,
  337. 'iccid': dev.iccid,
  338. 'sim': dev.imsi,
  339. 'simStatus': dev.simStatus,
  340. 'isFault': dev['isFault'],
  341. 'isDND': dev.get('isDND', False),
  342. 'isRent': dev.get("isRent", False),
  343. 'isDNDTimeInterval': dev.get('isDNDTimeInterval', []),
  344. 'autoRefund': dev.is_auto_refund,
  345. 'status': dev.status,
  346. 'statusInfo': dev.statusInfo,
  347. 'dateTimeAdded': dev['dateTimeAdded'],
  348. 'remarks': dev['remarks'],
  349. 'instructions': dev['instructions'],
  350. 'priceDescription': dev.get('priceDescription', ''),
  351. 'channelType': dev.channelType,
  352. 'lng': dev.lng,
  353. 'lat': dev.lat,
  354. 'isManager': True if dev.ownerId == ownerId else False,
  355. 'devType': dev.devType,
  356. 'remoteOperationOrder': dev.devTypeFeatures.get('remoteOperationOrder', False),
  357. 'tempElecPrice': tempElecPrice,
  358. 'quantity': getattr(device, 'quantity', 0),
  359. 'consumptionQuantity': getattr(device, 'consumptionQuantity', 0),
  360. 'itemType': getattr(device, 'itemType', 0),
  361. 'simChargeAuto': getattr(device, 'simChargeAuto', False),
  362. 'deviceWarning': dev.is_warning
  363. }
  364. item.update({'simExpireDate': dev.formatSimExpireDate})
  365. if dev.devTypeCode in [Const.DEVICE_TYPE_CODE_WEIFULE_POLICY_CLASSIC]:
  366. item.update({'hasTempPackage': False})
  367. elif dev.devTypeCode in support_policy_device + support_policy_weifule:
  368. item.update({'hasTempPackage': True})
  369. else:
  370. item.update({'hasTempPackage': dealer.hasTempPackage})
  371. item.update({'liveUrl': device.otherConf.get('liveUrl', '#')})
  372. item.update({'liveLimitedPrice': device.otherConf.get('liveLimitedPrice', '0.0')})
  373. if device.devType.get('code') in support_policy_weifule:
  374. pass
  375. elif device.devType.get('code') in support_policy_device:
  376. pass
  377. else:
  378. # TODO 根据主类型判断是否需要显示临时电价(只有jndz在用)
  379. if (u"电" in dev["majorDeviceType"]) and (u'电吹风' not in dev["majorDeviceType"]):
  380. item.update({"hasTempElecPrice": dealer.hasTempPackage})
  381. # 特殊处理网关一体化设备
  382. if dev.devTypeCode == Const.DEVICE_TYPE_CODE_CHARGING_BL_GATEWAYPLUG:
  383. rcd = Device.get_collection().find({'logicalCode':logicalCode})[0]
  384. item['gatewayImei'] = rcd['gateImei']
  385. if not dev.groupId:
  386. item['address'] = ''
  387. else:
  388. group = Group.get_group(dev.groupId)
  389. item['groupId'] = dev.groupId
  390. item['address'] = group['address']
  391. item['name'] = group['groupName']
  392. item['groupName'] = group['groupName']
  393. item['defaultInstructions'] = dev.devType.get('instructions', '')
  394. item['autoRefundEnable'] = dev.devType.get('autoRefundEnable', DeviceType.autoRefundEnable.default)
  395. item['devTypeName'] = dev.devTypeName
  396. try:
  397. devTypeDriver = DriverCode.objects.get(code=dev.devTypeCode)
  398. dev.update(devTypeDriver.features)
  399. except Exception as e:
  400. logger.exception('get driver error,dev=%s, e=%s' % (dev, e))
  401. if dev.devTypeCode == Const.DEVICE_TYPE_CODE_TIMESWITCH7:
  402. item['pricePerHour'] = dev['otherConf'].get('pricePerHour', 2.0)
  403. if dev.bill_as_service_feature.support:
  404. item['billAsService'] = dict(dev.bill_as_service_feature)
  405. return JsonOkResponse(payload=item)
  406. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  407. def groupUsedNumber(request):
  408. # type: (WSGIRequest)->JsonResponse
  409. groupId = request.GET.get('groupId', None)
  410. if groupId is None:
  411. return JsonErrorResponse(description = u"缺少参数groupId")
  412. devNoList = Device.get_devNos_by_group([groupId])
  413. devs = Device.get_dev_by_nos(devNoList).values()
  414. para = [{'groupNumber': dev['groupNumber']} for dev in devs]
  415. return JsonOkResponse(payload = sorted(para, key = lambda d: alphanum_key(str(d['groupNumber']))))
  416. @permission_required(ROLE.dealer, ROLE.subaccount)
  417. def groupEquipmentTransfer(request):
  418. # type: (WSGIRequest)->JsonResponse
  419. payload = json.loads(request.body)
  420. toGroupId = payload.get('toGroupId', None)
  421. devNo = payload.get('equipmentId', None)
  422. groupNumber = payload.get('groupNumber', None)
  423. if toGroupId is None or devNo is None or groupNumber is None:
  424. return JsonResponse({"result": 0, "description": u"缺少参数", 'payload': {}})
  425. dev = Device.get_dev(devNo)
  426. if dev is None:
  427. return JsonResponse({"result": 0, "description": u"找不到设备", 'payload': {}})
  428. group = Group.get_group(toGroupId)
  429. if group is None:
  430. return JsonResponse({"result": 0, "description": u"无法找到您想要修改到的组", 'payload': devNo})
  431. if dev['groupId'] == toGroupId and dev['groupNumber'] == groupNumber:
  432. return JsonResponse({"result": 1, "description": u"数据一模一样,不需要更新", 'payload': devNo})
  433. # 更新数据库中的数据
  434. try:
  435. Device.get_collection() \
  436. .update_one({'devNo': devNo}, {'$set': {'groupId': toGroupId, 'groupNumber': groupNumber}})
  437. except Exception, e:
  438. logger.exception('update device error=%s,devNo=%s,togroupId=%s,newgroupNumber=%s' %
  439. (e, devNo, toGroupId, groupNumber))
  440. finally:
  441. Device.invalid_device_cache(devNo)
  442. Device.invalid_group_device_list_cache([dev['groupId'], toGroupId])
  443. return JsonResponse({"result": 1, "description": None, 'payload': devNo})
  444. @permission_required(ROLE.dealer, ROLE.subaccount)
  445. def delGroup(request):
  446. # type: (WSGIRequest)->JsonResponse
  447. ownerId = str(request.user.bossId)
  448. groupId = request.POST.get('groupId', None)
  449. if groupId is None:
  450. return JsonErrorResponse(description = u"缺少参数")
  451. group = Group.get_group(groupId)
  452. if group.ownerId != ownerId:
  453. return JsonErrorResponse(description = u"参数错误")
  454. devNos = Device.get_devNos_by_group([groupId])
  455. if len(devNos) > 0:
  456. return JsonErrorResponse(description = u"该地址下还有设备,请您转移设备到其他地址后,再删除该地址")
  457. userCount = MyUser.get_collection().find({'groupId': groupId}).count()
  458. if userCount > 0:
  459. return JsonErrorResponse(description = u"该地址下还有用户的充值,无法删除地址,建议编辑地址")
  460. card = Card.objects(groupId = groupId).first()
  461. if card:
  462. return JsonErrorResponse(description = u"该地址下还有用户绑定的实体卡,无法删除地址,建议编辑地址")
  463. # 对接丰图平台
  464. if request.user.myBoss.supports('supportFengTu'):
  465. from apps.web.api.ft_north.utils import deleteStationReport
  466. deleteStationReport(groupId)
  467. # 北京丰台平台删除组
  468. if request.user.myBoss.supports('supportBeiJingFengTai'):
  469. from apps.web.south_intf.bj_north.api import delete_station_info
  470. delete_station_info(groupId)
  471. if group.get('swapFlag',False):
  472. SwapGroup.delete_group(groupId)
  473. result = Group.delete_Group(ownerId, groupId)
  474. if not result:
  475. return JsonErrorResponse(description = u'删除地址失败')
  476. return JsonOkResponse()
  477. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  478. def saveEquipmentGroup(request):
  479. """
  480. 地址的修改
  481. :param request:
  482. :return:
  483. """
  484. payload = json.loads(request.body)
  485. try:
  486. data = equipGroupSchema(payload)
  487. except MultipleInvalid as me:
  488. return JsonErrorResponse(description=u"参数校验异常【】".format(me.path[0]))
  489. logger.info("[saveEquipmentGroupDefault], request user = {}; payload = {}".format(request.user.id, data))
  490. # TODO zjl 这个场景需要详细测试
  491. if "customerId" not in payload:
  492. ownerId = str(request.user.bossId)
  493. else:
  494. ownerId = str(payload.get("customerId"))
  495. groupId = data.get('groupId', None)
  496. dealer = Dealer.objects.get(id=ownerId)
  497. # 最后去更新组地址的信息
  498. if groupId is None:
  499. success, description, group_id = Group.add_group(
  500. ownerId=ownerId,
  501. name=data["name"],
  502. districtId=data["districtId"],
  503. address=data["address"],
  504. addressType=data["addressType"],
  505. isDefault=data["isDefault"],
  506. discountRuleDict=dealer.format_default_discount,
  507. discountCardRuleDict=dealer.format_card_discount,
  508. country=data["country"],
  509. tag=data["tag"],
  510. beforeCharge=data["beforeCharge"]
  511. )
  512. else:
  513. success, description, group_id = Group.update_group(
  514. group_id=groupId,
  515. ownerId=ownerId,
  516. groupName=data["name"],
  517. districtId=data["districtId"],
  518. address=data["address"],
  519. addressType=data["addressType"],
  520. isDefault=data["isDefault"],
  521. beforeCharge=data["beforeCharge"],
  522. popPriceDescriptionButton=data.get("popPriceDescriptionButton", False),
  523. country=data["country"],
  524. tag=data["tag"],
  525. )
  526. return JsonOkResponse() if success else JsonErrorResponse(
  527. description=description,
  528. payload={'groupId': group_id}
  529. )
  530. # 经销商扫描设备
  531. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  532. def checkEquipment(request):
  533. # type: (WSGIRequest)->JsonResponse
  534. scannedURL = request.GET.get('uniqueCode', None)
  535. if not scannedURL:
  536. return JsonResponse({'result': 100, 'description': u'错误的二维码或二维码已损坏'})
  537. logger.debug('scan url is {}'.format(scannedURL))
  538. try:
  539. from urlparse import urlparse, parse_qs
  540. if urlparse(scannedURL).hostname != settings.MY_DOMAIN:
  541. return JsonResponse({'result': 100, 'description': u'二维码错误'})
  542. parsedQueryParams = parse_qs(urlparse(scannedURL).query)
  543. if ('l' not in parsedQueryParams) and ('devNo' not in parsedQueryParams):
  544. return JsonResponse({'result': 100, 'description': u'错误的二维码或二维码已损坏'})
  545. devNo = logicalCode = None
  546. if 'l' in parsedQueryParams:
  547. logicalCode = parsedQueryParams['l'][0].strip()
  548. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  549. elif 'devNo' in parsedQueryParams: # 通过devNo扫描进入系统的为遗留设备,这里做兼容处理,devNo == logicalCode
  550. devNo = logicalCode = parsedQueryParams['devNo'][0].strip()
  551. if devNo is None:
  552. return JsonResponse({'result': 101, 'description': u'该机器尚未与软件绑定,请联系客服完成绑定之后再操作'})
  553. dev = Device.get_dev(devNo)
  554. if dev and dev.get('groupId', None):
  555. return JsonResponse(
  556. {'result': 102, 'description': u'设备已经注册', 'payload': {'logicalCode': logicalCode, 'devNo': devNo}})
  557. #: 防止跨代理商绑定,防止串货
  558. #: 暂时停止限制
  559. # if dev and dev.get('ownerId',None):
  560. # oldDealer = Dealer.objects(id=str(dev['ownerId'])).first()
  561. # if oldDealer and request.user.agentId != oldDealer.agentId:
  562. # return JsonResponse({'result': 101, 'description': u'该设备移动支付模块不允许更换到其他代理商名下'})
  563. return JsonResponse({'result': 1,
  564. 'description': u'开始注册',
  565. 'payload': {'devNo': devNo, 'logicalCode': logicalCode, 'typeId': '', 'eType': ''}})
  566. except Exception as e:
  567. logger.exception(e)
  568. return JsonResponse({'result': 0, 'description': u'获取设备出错'})
  569. # 设备未注册,获取默认地址
  570. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  571. def defaultEquipmentGroup(request):
  572. # type: (WSGIRequest)->JsonResponse
  573. # 如果获取的到customerId,即为代理商为经销商注册设备场景
  574. ownerId = request.GET.get('customerId', None)
  575. if ownerId is None:
  576. ownerId = str(request.user.bossId)
  577. group = Group.get_default_group(ownerId)
  578. if not group:
  579. return JsonResponse({"result": 0, "description": u"您还没有设置默认地址喔", 'payload': {}})
  580. district = District.get_district(group['districtId'])
  581. group['district'] = district
  582. data = {'gid': str(group['groupId']),
  583. 'name': group['groupName'],
  584. 'districtId': group['districtId'],
  585. 'district': group['district'],
  586. 'address': group['address'],
  587. 'addressType': group['addressType'],
  588. 'isDefault': group['isDefault']}
  589. return JsonResponse({"result": 1, "description": None, 'payload': data})
  590. @permission_required(ROLE.agent, ROLE.dealer, ROLE.subaccount)
  591. @request_limit_by_user(operation='registerEquipment', limit=100, period=8 * 60 * 60, logger=logger)
  592. def registerEquipment(request):
  593. return registerEquipmentDefault(request)
  594. def registerEquipmentDefault(request):
  595. # type: (WSGIRequest)->JsonResponse
  596. """
  597. 注册设备
  598. :param request:
  599. :return:
  600. """
  601. payload = json.loads(request.body)
  602. logger.debug('registerEquipmentDefault: {}'.format(payload))
  603. if check_role(request.user, ROLE.agent):
  604. ownerId = payload.get('customerId')
  605. else:
  606. ownerId = str(request.user.bossId)
  607. logicalCode = payload.get('logicalCode', None)
  608. devNo = payload.get('devNo') or None
  609. logger.debug('devNo is: {}'.format(devNo))
  610. if devNo is None and logicalCode is not None:
  611. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  612. logger.debug('devNo from cache is: {}'.format(devNo))
  613. if not devNo:
  614. return JsonErrorResponse(description = u'设备绑定关系不存在')
  615. dealer = Dealer.get_dealer(ownerId)
  616. if dealer is None:
  617. return JsonErrorResponse(description = u'经销商不存在')
  618. agent = Agent.get_agent(dealer.get("agentId"))
  619. if agent is None:
  620. return JsonErrorResponse(description = u'代理商不存在')
  621. # 温州郎鑫经销商注册需要 设备必须先被郎鑫录入
  622. manager = Manager.objects.filter(id = agent.get("managerId")).first()
  623. if manager is None:
  624. return JsonErrorResponse(description = u'厂商不存在')
  625. if "inputDevice" in manager.features:
  626. if not ManagerInputDev.objects.filter(devNo = devNo, managerId = str(manager.id)):
  627. return JsonErrorResponse(description = u'设备不存在,请联系厂家')
  628. else:
  629. # 只要是录入的设备, 没有inputDevice特性的厂家所属经销商, 都不允许注册
  630. if ManagerInputDev.objects.filter(devNo=devNo).first() is not None:
  631. return JsonErrorResponse(description=u'设备不允许注册,请联系厂家')
  632. groupId = payload.get('groupId', None)
  633. groupNumber = payload.get('groupNumber', '')
  634. remarks = payload.get('remarks', '')
  635. washConfigs = payload.get('washConfigs', None)
  636. devTypeId = payload.get('typeId', '')
  637. qrCodeUrl = payload.get('qrCodeUrl', '')
  638. policyTemp = payload.get('policyTemp', {})
  639. if not all([devNo, groupId, washConfigs, devTypeId]):
  640. return JsonErrorResponse(description = u"缺少参数")
  641. if qrCodeUrl and settings.MY_DOMAIN not in qrCodeUrl:
  642. return JsonErrorResponse(description = u"不能识别的二维码")
  643. # 获取设备类型和逻辑编码
  644. devType = DeviceType.objects(id = str(devTypeId)).first() # type: DeviceType
  645. if not devType:
  646. return JsonErrorResponse(description = u"设备类型不识别")
  647. devType.update(inc__popularity = 1)
  648. dev = Device.get_dev(devNo) # type: DeviceDict
  649. if not dev:
  650. return JsonErrorResponse(description = u"设备尚未与软件绑定,请联系软件开发公司")
  651. if dev.is_registered:
  652. return JsonErrorResponse(description = u'设备已经注册')
  653. driverCode = DriverCode.objects(code = devType.code).first()
  654. if not driverCode:
  655. return JsonErrorResponse(description = u"设备驱动错误, 请联系软件开发公司")
  656. if devType.autoRefundEnable != driverCode.features.get('autoRefundEnable', True):
  657. devType.update(autoRefundEnable=driverCode.features.get('autoRefundEnable', True))
  658. group = Group.get_group(groupId) # type: GroupDict
  659. if not group:
  660. return JsonErrorResponse(description = u"选择的地址不存在,请刷新后再试")
  661. if group['ownerId'] != ownerId:
  662. return JsonErrorResponse(description = u"必须选择经销商自己创建的地址")
  663. dealer = Dealer.objects(id = ownerId).first()
  664. devCount = len(dealer.get_own_devices())
  665. if devCount >= dealer.limitDevNum:
  666. return JsonErrorResponse(description = u'您已达到最大设备注册数量')
  667. districtId = group.get('districtId', '')
  668. result, description = Device.register_device(
  669. dealer, devNo, dev['logicalCode'], groupId, districtId, groupNumber, remarks, washConfigs, devType,
  670. agentId = request.user.id if check_role(request.user, ROLE.agent) else None, policyTemp=policyTemp)
  671. if not result:
  672. return JsonErrorResponse(description = description)
  673. # 更新otherConf开关字段,以及自动充值字段
  674. displaySwitchs = payload.get('displaySwitchs', {})
  675. simChargeAuto = payload.get('simChargeAuto', False)
  676. devObj = Device.objects.get(devNo = devNo)
  677. devObj.otherConf.update({"displaySwitchs": displaySwitchs})
  678. devObj.simChargeAuto = simChargeAuto
  679. devObj.save()
  680. dealer.devCount = devCount + 1
  681. dealer.save()
  682. # 如果经销商支持丰图平台,在注册设备时添加到丰图平台
  683. if dealer.supports("supportFengTu"):
  684. from apps.web.api.ft_north.utils import addDeviceReport
  685. addDeviceReport(devNo)
  686. # 如果经销商支持北京丰台平台,在注册设备时添加到丰图平台
  687. if dealer.supports('supportBeiJingFengTai'):
  688. from apps.web.south_intf.bj_north.api import push_device_info
  689. push_device_info(devNo)
  690. # 如果地址属于互联互通,就更新下相关时间
  691. if group.get('swapFlag',False):
  692. devNum = 0
  693. if u'直流' in devType.majorDeviceType or u'交流' in devType.majorDeviceType:
  694. devNum = 1
  695. SwapGroup.update_swap_time_and_num(groupId,devNum)
  696. SwapContract.update_swap_time_and_num(groupId, ownerId, agent.id, agent.managerId, devNum)
  697. return JsonOkResponse()
  698. @permission_required(ROLE.agent, ROLE.dealer, ROLE.manager, ROLE.subaccount)
  699. def sendSignal(request):
  700. # type: (WSGIRequest)->JsonResponse
  701. logicalCode = request.GET.get('logicalCode', None)
  702. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  703. if devNo is None:
  704. return JsonErrorResponse(description = u"无法获取IMEI")
  705. dev = Device.get_dev(devNo)
  706. if not dev:
  707. return JsonErrorResponse(description = u'找不到该设备')
  708. try:
  709. box = ActionDeviceBuilder.create_action_device(dev)
  710. except Exception, e:
  711. return JsonErrorResponse(description = u'设备异常,无法通讯,请检查网络情况')
  712. result = box.get_signal()
  713. if result['rst'] == -1:
  714. return JsonErrorResponse(description = u'设备离线,无法获取网络信号情况')
  715. elif result['rst'] != 0:
  716. return JsonErrorResponse(description = translate_sendmsg_error(result['rst']))
  717. signal = result.get('signal', 0)
  718. return JsonOkResponse(description = signal, payload = signal)
  719. @permission_required(ROLE.dealer, ROLE.subaccount)
  720. def getLastDistrict(request):
  721. # type: (WSGIRequest)->JsonResponse
  722. ownerId = str(request.user.bossId)
  723. lastDistrict = cache.get('%s_lastDistrict' % ownerId, None)
  724. if lastDistrict:
  725. return JsonOkResponse(payload = json.loads(lastDistrict))
  726. else:
  727. group = Group.get_default_group(ownerId)
  728. if group:
  729. return JsonOkResponse(payload = {
  730. 'districtId': group['districtId'],
  731. 'district': District.get_district(group['districtId'])
  732. })
  733. else:
  734. return JsonOkResponse()
  735. @permission_required(ROLE.supermanager, ROLE.manager)
  736. def editDevType(request):
  737. # type: (WSGIRequest)->JsonResponse
  738. def check_package_unit(package):
  739. dic = map(lambda x: {'unit': x.get('unit'), }, package)
  740. res = reduce(lambda x, y: x if x == y else None, dic)
  741. return res
  742. try:
  743. payload = json.loads(request.body)
  744. # TODO 校验传入的package
  745. package = payload.get('package')
  746. if not package:
  747. return JsonErrorResponse(description = u"缺少套餐信息")
  748. if not check_package_unit(package):
  749. return JsonErrorResponse(description = u"修改失败,套餐计量单位填写错误")
  750. result = DeviceType.objects(id = payload['id']).update_one(**payload)
  751. if not result:
  752. return JsonErrorResponse(description = u"编辑错误")
  753. else:
  754. return JsonOkResponse()
  755. except CustomizedValidationError, e:
  756. return JsonErrorResponse(description = e.message)
  757. except Exception as e:
  758. logger.exception('edit devType error=%s' % e)
  759. return JsonErrorResponse(description = u"系统错误")
  760. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'删除设备类型列表失败,请重试'))
  761. @permission_required(ROLE.supermanager, ROLE.manager)
  762. def deleteDevType(request):
  763. # type: (WSGIRequest)->JsonResponse
  764. ids = json.loads(request.body)['ids']
  765. for _ in ids:
  766. devType = DeviceType.objects(id = str(_)).first()
  767. if not devType:
  768. return JsonErrorResponse(description = u"没有找到设备类型")
  769. if devType.popularity != 0:
  770. return JsonErrorResponse(description = u"无法删除已经注册的设备类型")
  771. map(lambda _: _.delete(), DeviceType.get_by_ids(ids))
  772. return JsonOkResponse()
  773. @permission_required(ROLE.supermanager, ROLE.manager)
  774. def addDevType(request):
  775. # type: (WSGIRequest)->JsonResponse
  776. payload = json.loads(request.body)
  777. editId = payload['id']
  778. if payload['role'] == 'manager':
  779. manager = Manager.objects(id = editId).first()
  780. if not manager:
  781. return JsonErrorResponse(description = u"该厂商不存在")
  782. payload['agentId'] = str(manager.primeAgentId)
  783. elif payload['role'] == 'agent':
  784. agent = Agent.objects(id = editId).first()
  785. if not agent:
  786. return JsonErrorResponse(description = u"该代理商不存在")
  787. payload['agentId'] = str(agent.id)
  788. try:
  789. payload.pop('id')
  790. DeviceType(**payload).save()
  791. except NotUniqueError:
  792. return JsonErrorResponse(description = u"该条数据已经存在,请检查")
  793. return JsonOkResponse()
  794. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'获取设备类型列表失败,请重试'))
  795. @permission_required(ROLE.dealer, ROLE.agent, ROLE.manager, ROLE.advertisement, ROLE.advertiser, ROLE.supermanager,
  796. ROLE.subaccount)
  797. def getDevTypeList(request):
  798. # type: (WSGIRequest)->JsonResponse
  799. """
  800. 分两种情况获取
  801. 1、超级管理员获取厂商或者代理商的设备类型列表, 或者厂商获取代理商的设备类型列表
  802. 2、各角色获取自己的设备类型列表
  803. :param request:
  804. :return:
  805. """
  806. def visit(user):
  807. try:
  808. devTypes = DeviceTypeVisitor().visit(user)
  809. return JsonOkResponse(payload = {"total": len(devTypes), "dataList": [_.to_dict() for _ in devTypes]})
  810. except DoesNotExist:
  811. return JsonErrorResponse(description = u'用户不存在或配置错误')
  812. currentUser = request.user
  813. role = request.GET.get('role')
  814. if role:
  815. if role == 'agent':
  816. agentId = request.GET.get('id')
  817. if not agentId:
  818. return JsonErrorResponse(description = u'未选择代理商')
  819. model = request.GET.get('model')
  820. if model != 'parent':
  821. return visit(Agent.objects(id = str(agentId)).get())
  822. else:
  823. agent = Agent.objects(id = str(agentId)).get()
  824. return visit(agent.primary_agent)
  825. elif role == 'manager':
  826. managerId = request.GET.get('id')
  827. if managerId is None:
  828. return JsonErrorResponse(description = u'未选择厂商')
  829. else:
  830. manager = Manager.objects(id = managerId).get()
  831. return visit(manager)
  832. else:
  833. return visit(currentUser)
  834. @permission_required(ROLE.manager)
  835. def getDevMapChart(request):
  836. # type: (WSGIRequest)->JsonResponse
  837. """
  838. 查看设备全国分布情况
  839. :param request:
  840. :return:
  841. """
  842. mid = str(request.user.id)
  843. agentIds = [str(agent.id) for agent in Agent.objects(managerId = mid)]
  844. dealerIds = [str(dealer.id) for dealer in Dealer.objects(agentId__in = agentIds)]
  845. registered_devices_devNos = [str(_.devNo) for _ in Device.objects(ownerId__in = dealerIds).only('devNo')]
  846. devices = Device.get_dev_by_nos(registered_devices_devNos).values() # type: List[DeviceDict]
  847. device_count = len(devices)
  848. offline_device_count = len([d.online == DeviceOnlineStatus.DEV_STATUS_OFFLINE for d in devices])
  849. online_device_count = device_count - offline_device_count
  850. sanitize = lambda city_name: city_name.strip(u'市') if u'市' in city_name else city_name
  851. registered_devices_groupIds = [ObjectId(d['groupId']) for d in Device.objects(ownerId__in = dealerIds)]
  852. districts = dict(Counter(
  853. [District.get_district(g.districtId).split(' ')[1]
  854. for g in Group.objects(id__in = registered_devices_groupIds)]))
  855. dataList = [{'name': sanitize(city_name), 'value': count} for city_name, count in districts.items()]
  856. return JsonResponse({
  857. "result": 1,
  858. "description": "",
  859. "payload": {
  860. "online": online_device_count,
  861. "offline": offline_device_count,
  862. "dataList": dataList
  863. }
  864. })
  865. @permission_required(ROLE.dealer, ROLE.agent, ROLE.subaccount)
  866. def groupList(request):
  867. # type: (WSGIRequest)->JsonResponse
  868. # 如果获取的到customerId,即为代理商为经销商注册设备场景
  869. ownerId = request.GET.get('dealerId', None)
  870. if ownerId is None:
  871. ownerId = str(request.user.bossId)
  872. openId = request.GET.get('userId', None)
  873. pageIndex = int(request.GET.get('pageIndex', 1))
  874. pageSize = int(request.GET.get('pageSize', 10))
  875. searchKey = str(request.GET.get('searchKey', ''))
  876. groupIds = Group.get_group_ids_of_dealer(ownerId)
  877. # 过滤下只显示用户的groupId
  878. if openId:
  879. users = MyUser.objects.filter(openId = openId, groupId__in = groupIds).only('groupId')
  880. groupIds = [user.groupId for user in users]
  881. groupList = Group.get_groups_by_group_ids(groupIds).values()
  882. groupList = natural_sort(groupList, 'groupName', False)
  883. dataList = []
  884. # 把addressLabel翻译好
  885. objs = AddressType.objects.all()
  886. typeDict = {}
  887. for obj in objs:
  888. typeDict[obj.value] = obj.label
  889. for grp in groupList:
  890. if searchKey not in grp['groupName']:
  891. continue
  892. devNos = Device.get_devNos_by_group([grp['groupId']])
  893. grp['equipmentCount'] = len(devNos)
  894. grp['isManager'] = True
  895. if grp['isDefault']:
  896. dataList.insert(0, grp)
  897. else:
  898. dataList.append(grp)
  899. groupIds = Group.get_group_ids_of_partner(ownerId)
  900. groupList = Group.get_groups_by_group_ids(groupIds).values()
  901. groupList = natural_sort(groupList, 'groupName', False)
  902. for grp in groupList:
  903. if searchKey not in grp['groupName']:
  904. continue
  905. devNos = Device.get_devNos_by_group([grp['groupId']])
  906. grp['equipmentCount'] = len(devNos)
  907. grp['isManager'] = False
  908. grp['isDefault'] = False
  909. grp['addressLabel'] = typeDict.get(grp['addressType'], u'其他')
  910. if 'swapFlag' not in grp:
  911. grp['swapFlag'] = False
  912. dataList.append(grp)
  913. return JsonResponse({
  914. "result": 1,
  915. "description": None,
  916. 'payload': {
  917. "total": len(dataList) or 1,
  918. "dataList": dataList[(pageIndex - 1) * pageSize: pageIndex * pageSize]
  919. }
  920. })
  921. @permission_required(ROLE.manager)
  922. def getGroupListByDealer(request):
  923. # type: (WSGIRequest)->JsonResponse
  924. """
  925. :param request:
  926. :return:
  927. """
  928. dealerIds = json.loads(request.body).get('dealerIds', [])
  929. dealers = {str(_.id): _.nickname for _ in Dealer.objects(id__in = dealerIds)}
  930. if not dealers: return JsonResponse({'result': 1, 'payload': []})
  931. dataList = [
  932. {
  933. 'dealerName': dealers[str(group['ownerId'])],
  934. 'dealerId': group['ownerId'],
  935. 'groupId': group['groupId'],
  936. 'groupName': group['groupName']
  937. }
  938. for group in itertools.ifilter(
  939. lambda _: bool(all(_) and _),
  940. itertools.imap(
  941. lambda _: Group.get_groups_of_dealer(_), dealerIds))
  942. ]
  943. return JsonResponse({'result': 1, 'payload': {'dataList': dataList, 'total': len(dataList)}})
  944. @permission_required(ROLE.dealer, ROLE.subaccount)
  945. def getInstructionsByType(request):
  946. # type: (WSGIRequest)->JsonResponse
  947. """
  948. :param request:
  949. :return:
  950. """
  951. typeId = request.GET.get('typeId')
  952. devType = DeviceType.objects(id = typeId).first()
  953. instructions = devType.instructions if devType is not None else ''
  954. return JsonResponse({
  955. "result": 1,
  956. "description": None,
  957. 'payload': instructions
  958. })
  959. @record_operation_behavior()
  960. @permission_required(ROLE.dealer, ROLE.subaccount)
  961. def setDevSwitch(request):
  962. # type: (WSGIRequest)->JsonResponse
  963. data = {}
  964. lc = request.POST.get('logicalCode')
  965. if lc is None:
  966. data = json.loads(request.body) if request.body else {}
  967. lc = data.get('logicalCode')
  968. dev = Device.get_dev_by_logicalCode(lc) # type: DeviceDict
  969. if 'autoRefund' in request.POST:
  970. strAutoRefund = request.POST.get('autoRefund', 'false')
  971. autoRefund = True if strAutoRefund == 'true' else False
  972. try:
  973. obj = Device.objects.get(logicalCode = lc)
  974. obj.autoRefundLeftMoney = autoRefund
  975. obj.save()
  976. except Exception as e:
  977. logger.info('set dev=%s switch error=%s' % (lc, e))
  978. return JsonResponse({"result": 0, "description": u"操作出现异常,请您重试", "payload": {}})
  979. elif 'isFault' in request.POST:
  980. isFault = request.POST.get('isFault', False)
  981. try:
  982. obj = Device.objects.get(logicalCode = lc)
  983. obj.isFault = True if isFault == 'true' else False
  984. obj.save()
  985. Device.invalid_device_cache(obj.devNo)
  986. box = ActionDeviceBuilder.create_action_device(dev)
  987. box.set_dev_fault(isFault)
  988. except Exception as e:
  989. logger.info('set dev=%s switch error=%s' % (lc, e))
  990. return JsonResponse({"result": 0, "description": u"操作出现异常,请您重试", "payload": {}})
  991. elif 'simChargeAuto' in request.POST:
  992. strAuto = request.POST.get('simChargeAuto', 'false')
  993. simChargeAuto = True if strAuto == 'true' else False
  994. try:
  995. obj = Device.objects.get(logicalCode = lc)
  996. obj.simChargeAuto = simChargeAuto
  997. obj.save()
  998. except Exception as e:
  999. logger.info('set dev=%s switch error=%s' % (lc, e))
  1000. return JsonResponse({"result": 0, "description": u"操作出现异常,请您重试", "payload": {}})
  1001. elif 'billAsServiceSwitch' in request.POST:
  1002. billAsServiceSwitch = request.POST.get('billAsServiceSwitch')
  1003. billAsServiceSwitch = True if billAsServiceSwitch == 'true' else False
  1004. dev.deviceAdapter.switch_bill_as_service(billAsServiceSwitch)
  1005. return JsonResponse({"result": 1, "description": "", "payload": {}})
  1006. @permission_required(ROLE.dealer, ROLE.subaccount)
  1007. def setBatchDNDSwitch(request):
  1008. data = json.loads(request.body) if request.body else {}
  1009. logicalCodes = data.get('logicalCodes', [])
  1010. isDND = data.get('isDND', False)
  1011. DNDRange = data.get('isDNDTimeInterval', [])
  1012. for t in DNDRange:
  1013. if 'isDNDEndTime' not in t or 'isDNDStartTime' not in t:
  1014. return JsonErrorResponse(description = u'必须同时指定起始时间和结束时间')
  1015. start_time = t['isDNDStartTime']
  1016. end_time = t['isDNDEndTime']
  1017. if start_time > end_time:
  1018. return JsonErrorResponse(description = u'时间设置错误, 开始时间不能大于结束时间')
  1019. try:
  1020. for _ in logicalCodes:
  1021. d = Device.objects(logicalCode = _).first()
  1022. d.isDND = isDND
  1023. d.isDNDTimeInterval = DNDRange
  1024. d.save()
  1025. Device.invalid_device_cache(d.devNo)
  1026. except Exception as e:
  1027. logger.info('set DND switch error=%s' % (e))
  1028. return JsonErrorResponse(description = u'操作出现异常, 请刷新重试')
  1029. return JsonOkResponse()
  1030. def updateLocation(request):
  1031. # type: (WSGIRequest)->JsonResponse
  1032. try:
  1033. lc = request.POST.get('logicalCode', None)
  1034. devNo = Device.get_devNo_by_logicalCode(lc)
  1035. lng = float(request.POST.get('lng'))
  1036. lat = float(request.POST.get('lat'))
  1037. logger.debug('get lbs succeed. devNo = %s; lng = %s; lat = %s' % (devNo, lng, lat))
  1038. dev = Device.get_dev(devNo)
  1039. if dev is None:
  1040. return JsonResponse({'result': 0, 'description': u'设备不存在'})
  1041. Device.get_collection().update({'devNo': devNo}, {'$set': {'location': {
  1042. 'type': 'Point', 'coordinates': [lng, lat]
  1043. }, 'dateTimeUpdated': datetime.datetime.now()}})
  1044. Device.invalid_device_cache(devNo)
  1045. YuhuanNorther.send_dev_info(dev)
  1046. return JsonResponse({'result': 1, 'description': None, 'payload': None})
  1047. except Exception as e:
  1048. logger.exception(e)
  1049. return JsonResponse({'result': 0, 'description': u'更新设备位置出错'})
  1050. @record_operation_behavior()
  1051. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'系统错误'))
  1052. def operDevicePort(request):
  1053. # type: (WSGIRequest)->JsonResponse
  1054. lc = request.POST.get('logicalCode', None)
  1055. devNo = Device.get_devNo_by_logicalCode(lc)
  1056. if request.POST.has_key('active'):
  1057. strActive = request.POST.get('active', 'false')
  1058. lock = False if strActive == 'true' else True
  1059. if str(request.POST.get('portIndex', None)).isdigit():
  1060. portIndex = int(request.POST.get('portIndex', None))
  1061. else:
  1062. portIndex = request.POST.get('portIndex', None)
  1063. dev = Device.get_dev(devNo)
  1064. if dev is None:
  1065. return JsonResponse({'result': 0, 'description': u'设备不存在'})
  1066. smartBox = ActionDeviceBuilder.create_action_device(dev)
  1067. try:
  1068. smartBox.lock_unlock_port(portIndex, lock)
  1069. except ServiceException, e:
  1070. return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': None})
  1071. return JsonResponse({'result': 1, 'description': None, 'payload': None})
  1072. elif request.POST.has_key('stop'):
  1073. strStop = request.POST.get('stop', 'false')
  1074. active = False if strStop == 'true' else True
  1075. if str(request.POST.get('portIndex', None)).isdigit():
  1076. portIndex = int(request.POST.get('portIndex', None))
  1077. else:
  1078. portIndex = request.POST.get('portIndex', None)
  1079. dev = Device.get_dev(devNo)
  1080. if dev is None:
  1081. return JsonResponse({'result': 0, 'description': u'设备不存在'})
  1082. stopType = request.POST.get('type', '')
  1083. if stopType != '':
  1084. Device.update_dev_control_cache(devNo, {str(portIndex): {'stopType': stopType}})
  1085. smartBox = ActionDeviceBuilder.create_action_device(dev)
  1086. try:
  1087. smartBox.active_deactive_port(portIndex, active)
  1088. except ServiceException, e:
  1089. return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': None})
  1090. return JsonResponse({'result': 1, 'description': None, 'payload': None})
  1091. # 换电柜独有的
  1092. elif request.POST.has_key('charge'):
  1093. strCharge = request.POST.get('charge', 'false')
  1094. charge = strCharge == 'true'
  1095. if str(request.POST.get('portIndex', None)).isdigit():
  1096. portIndex = int(request.POST.get('portIndex', None))
  1097. else:
  1098. portIndex = request.POST.get('portIndex', None)
  1099. dev = Device.get_dev(devNo)
  1100. if dev is None:
  1101. return JsonResponse({'result': 0, 'description': u'设备不存在'})
  1102. smartBox = ActionDeviceBuilder.create_action_device(dev)
  1103. try:
  1104. smartBox.active_deactive_port(portIndex, charge)
  1105. except ServiceException, e:
  1106. return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': None})
  1107. return JsonResponse({'result': 1, 'description': None, 'payload': None})
  1108. return JsonResponse({'result': 0, 'description': u'缺少合法参数', 'payload': None})
  1109. def getDeviceFunctionByKey(request):
  1110. # type: (WSGIRequest)->JsonResponse
  1111. try:
  1112. # key = request.GET.get('key', None)
  1113. # logicalCode = request.GET.get('logicalCode', None)
  1114. # if logicalCode:
  1115. # logicalCode = json.loads(logicalCode)[0]
  1116. payload = json.loads(request.body)
  1117. key = payload.get("key")
  1118. logicalCode = payload.get("logicalCode")
  1119. if isinstance(logicalCode, list) and len(logicalCode):
  1120. logicalCode = logicalCode[0]
  1121. else:
  1122. return JsonErrorResponse(description = u"错误的设备编号")
  1123. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  1124. dev = Device.get_dev(devNo)
  1125. box = ActionDeviceBuilder.create_action_device(dev)
  1126. value = box.get_device_function_by_key(key)
  1127. payload = {key: value}
  1128. except ServiceException as e:
  1129. return JsonResponse({"result": 0, "description": e.result.get('description', ''), "payload": {}})
  1130. except Exception as e:
  1131. logger.exception(e)
  1132. return JsonResponse({"result": 0, "description": u'未知错误', "payload": {}})
  1133. return JsonResponse({"result": 1, "description": "", "payload": payload})
  1134. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'系统错误'))
  1135. def setDeviceFunctionByKey(request):
  1136. # type: (WSGIRequest)->JsonResponse
  1137. try:
  1138. data = json.loads(request.body)
  1139. logicalCode = data.get('logicalCode', None)
  1140. if isinstance(logicalCode, list) and len(logicalCode):
  1141. logicalCode = logicalCode[0]
  1142. else:
  1143. return JsonErrorResponse(description = u"错误的设备编号")
  1144. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  1145. dev = Device.get_dev(devNo)
  1146. config = data.get('config', None)
  1147. for key, value in config.items():
  1148. box = ActionDeviceBuilder.create_action_device(dev)
  1149. box.press_down_key(key, value)
  1150. return JsonResponse({"result": 1, "description": '', "payload": {}})
  1151. except ServiceException, e:
  1152. return JsonResponse({"result": 0, "description": e.result.get('description', ''), "payload": {}})
  1153. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'系统错误'))
  1154. def getTotalCoins(request):
  1155. # type: (WSGIRequest)->JsonResponse
  1156. logicalCode = request.GET.get('logicalCode', None)
  1157. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  1158. dev = Device.get_dev(devNo)
  1159. try:
  1160. device_adapter = ActionDeviceBuilder.create_action_device(dev)
  1161. total = device_adapter.get_total_coin()
  1162. return JsonResponse({"result": 1, "description": '', "payload": total})
  1163. except ServiceException, e:
  1164. return JsonResponse({"result": 0, "description": e.result.get('description'), "payload": {}})
  1165. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'系统错误'))
  1166. def getMajorDevTypeList(request):
  1167. # type: (WSGIRequest)->JsonResponse
  1168. majorDevTypeList = [a.to_dict() for a in MajorDeviceType.objects.all()]
  1169. return JsonResponse(
  1170. {
  1171. 'result': 1,
  1172. 'description': '',
  1173. 'payload': {
  1174. 'total': len(majorDevTypeList),
  1175. 'dataList': majorDevTypeList
  1176. }
  1177. })
  1178. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'设置价格失败,请刷新页面重新试试'))
  1179. @permission_required(ROLE.dealer, ROLE.subaccount)
  1180. def setPricePerHour(request):
  1181. # type: (WSGIRequest)->JsonResponse
  1182. payload = json.loads(request.body)
  1183. lc = payload.get('logicalCode')
  1184. pricePerHour = float(payload.get('pricePerHour'))
  1185. dev = Device.objects.get(logicalCode = lc)
  1186. dev.otherConf['pricePerHour'] = pricePerHour
  1187. dev.save()
  1188. return JsonOkResponse(description = u'设置成功')
  1189. #############
  1190. ## Commands #
  1191. #############
  1192. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'获取诊断设备命令列表失败'))
  1193. @permission_required(ROLE.dealer, ROLE.subaccount)
  1194. def getDiagCommands(request):
  1195. # type: (WSGIRequest)->JsonResponse
  1196. # TODO zjl 需要搞清楚这个接口是否有用 哪里有用
  1197. logicalCode = request.GET.get('logicalCode')
  1198. if not logicalCode:
  1199. return JsonErrorResponse(description = u'逻辑码为空')
  1200. dev = Device.get_dev_by_l(logicalCode)
  1201. commands = DeviceCommand.objects(devTypeCode = dev.devType['code'])
  1202. return JsonOkResponse(payload = [command.to_dict() for command in commands])
  1203. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'发送失败'))
  1204. @permission_required(ROLE.dealer, ROLE.subaccount)
  1205. def diagDevice(request):
  1206. # type: (WSGIRequest)->JsonResponse
  1207. # TODO zjl 需要搞清楚这个接口是否有用 哪里有用
  1208. if not request.body: return JsonErrorResponse(description = u'传入数据为空')
  1209. currentDealer = request.user # type: Dealer
  1210. payload = json.loads(request.body)
  1211. logicalCode = payload.get('logicalCode')
  1212. commandId = payload.get('commandId')
  1213. params = payload.get('params')
  1214. command = DeviceCommand.objects(id = commandId).first() # type: DeviceCommand
  1215. if not command:
  1216. return JsonErrorResponse(description = u'未找到命令')
  1217. device = Device.get_dev_by_l(logicalCode)
  1218. if not device: return JsonErrorResponse(description = u'未找到设备')
  1219. if not command.supports(device): return JsonErrorResponse(description = u'该设备不支持所提供命令')
  1220. topic_command = TopicCommand(cmdNo = command.cmd, devNo = device['devNo'], params = params, prefix = 'diag')
  1221. task_caller('send_topic_command', cmdNo = command.cmd, devNo = device['devNo'], params = params, prefix = 'diag')
  1222. return JsonOkResponse(payload = {'topic': topic_command.result_topic, 'pushBrokerUrl': currentDealer.pushBrokerUrl})
  1223. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'查询格子失败'))
  1224. @permission_required(ROLE.dealer, ROLE.subaccount)
  1225. def getDeviceCells(request):
  1226. payload = json.loads(request.body)
  1227. logicalCode = payload.get('logicalCode')
  1228. objs = Cell.objects.filter(logicalCode = logicalCode)
  1229. dev = Device.get_dev_by_logicalCode(logicalCode)
  1230. box = ActionDeviceBuilder.create_action_device(dev)
  1231. lockStatusDict = box.get_all_lock_status()
  1232. dataList = [{'id': str(obj.id), 'cellNo': obj.cellNo, 'boardNo': obj.boardNo,
  1233. 'lockNo': obj.lockNo, 'itemTitle': obj.itemTitle,
  1234. 'itemDesc': obj.itemDesc, 'itemPicUrl': obj.itemPicUrl,
  1235. 'itemPrice': round(obj.itemPrice / 100.0, 2), 'lockStatus': lockStatusDict.get(obj.cellNo, 'close')}
  1236. for obj in objs]
  1237. return JsonResponse({'result': 1, 'description': '', 'payload': {'dataList': dataList}})
  1238. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'编辑格子失败'))
  1239. @permission_required(ROLE.dealer, ROLE.subaccount)
  1240. def addEditCell(request):
  1241. payload = json.loads(request.body)
  1242. logicalCode = payload.get('logicalCode')
  1243. cellId = payload.get('id', None)
  1244. cellNo = payload.get('cellNo')
  1245. boardNo = payload.get('boardNo')
  1246. lockNo = payload.get('lockNo')
  1247. itemTitle = payload.get('itemTitle')
  1248. itemDesc = payload.get('itemDesc')
  1249. itemPicUrl = payload.get('itemPicUrl')
  1250. itemPrice = payload.get('itemPrice')
  1251. try:
  1252. obj = Cell.objects.get(id = cellId)
  1253. obj.cellNo, obj.boardNo, obj.lockNo, obj.itemTitle, obj.itemDesc, obj.itemPicUrl, obj.itemPrice = cellNo, boardNo, lockNo, itemTitle, itemDesc, itemPicUrl, itemPrice
  1254. obj.save()
  1255. except DoesNotExist, e:
  1256. newObj = Cell(logicalCode = logicalCode, cellNo = cellNo, boardNo = boardNo, lockNo = lockNo,
  1257. itemTitle = itemTitle,
  1258. itemDesc = itemDesc, itemPicUrl = itemPicUrl, itemPrice = itemPrice)
  1259. newObj.save()
  1260. except Exception, e:
  1261. return JsonErrorResponse(description = u'未知错误')
  1262. return JsonResponse({"result": 1, "description": '', "payload": None})
  1263. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1264. @permission_required(ROLE.dealer, ROLE.subaccount)
  1265. def deleteCell(request):
  1266. payload = json.loads(request.body)
  1267. cellId = payload.get('id')
  1268. Cell.objects.delete(id = cellId)
  1269. return JsonResponse({"result": 1, "description": '', "payload": None})
  1270. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1271. @permission_required(ROLE.dealer, ROLE.subaccount)
  1272. def getElecMeterReading(request):
  1273. logicalCode = request.GET.get('logicalCode')
  1274. dev = Device.get_dev_by_logicalCode(logicalCode)
  1275. box = ActionDeviceBuilder.create_action_device(dev)
  1276. result = box.get_elec_meter()
  1277. meter = result['meter']
  1278. return JsonResponse({"result": 1, "description": '', "payload": meter})
  1279. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1280. def getDeviceSlave(request):
  1281. def cmp_by_port(x, y):
  1282. if int(x['index']) < int(y['index']):
  1283. return -1
  1284. elif int(x['index']) > int(y['index']):
  1285. return 1
  1286. return 0
  1287. def cmd_by_sortIndex(x, y):
  1288. if int(x['sortIndex']) < int(y['sortIndex']):
  1289. return -1
  1290. elif int(x['sortIndex']) > int(y['sortIndex']):
  1291. return 1
  1292. return 0
  1293. logicalCode = request.GET.get('logicalCode')
  1294. dev = Device.get_dev_by_logicalCode(logicalCode)
  1295. box = ActionDeviceBuilder.create_action_device(dev)
  1296. portDict = box.get_port_status()
  1297. smartBox = ActionDeviceBuilder.create_action_device(dev)
  1298. statsMap = {str(Const.DEV_WORK_STATUS_IDLE): 'idle',
  1299. str(Const.DEV_WORK_STATUS_WORKING): 'busy',
  1300. str(Const.DEV_WORK_STATUS_FAULT): 'fault',
  1301. str(Const.DEV_WORK_STATUS_FORBIDDEN): 'ban'}
  1302. portList = []
  1303. ctrInfo = Device.get_dev_control_cache(dev['devNo'])
  1304. for port, valueDict in portDict.items():
  1305. vStatus = valueDict.get('status', None)
  1306. if vStatus == Const.DEV_WORK_STATUS_WORKING:
  1307. portDetail = smartBox.get_port_using_detail(port, ctrInfo)
  1308. portDetail.update({"id": str(port), "index": str(port), "status": 'busy'})
  1309. tempList = []
  1310. for k, v in portDetail.items():
  1311. if not Const.TRANS_DICT.has_key(k):
  1312. continue
  1313. kConfigDict = Const.TRANS_DICT.get(k)
  1314. attrDict = {'key': k, 'value': v, 'name': kConfigDict['name'], 'sortIndex': kConfigDict['sortIndex']}
  1315. if kConfigDict.has_key('unit'):
  1316. attrDict.update({'unit': kConfigDict.get('unit')})
  1317. tempList.append(attrDict)
  1318. tempList.sort(cmp = cmd_by_sortIndex)
  1319. portDetail['attr'] = tempList
  1320. portList.append(portDetail)
  1321. else:
  1322. portList.append({"id": str(port), 'index': str(port), 'status': statsMap[str(vStatus)]})
  1323. portList.sort(cmp = cmp_by_port)
  1324. return JsonResponse({"result": 1, "description": "", "payload": {"total": len(portList), "dataList": portList}})
  1325. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1326. @permission_required(ROLE.dealer, ROLE.subaccount)
  1327. def editDeviceSlave(request):
  1328. payload = json.loads(request.body)
  1329. logicalCode = payload['logicalCode']
  1330. slaveIndex = int(payload['slaveIndex'])
  1331. dev = Device.get_dev_by_logicalCode(logicalCode)
  1332. box = ActionDeviceBuilder.create_action_device(dev)
  1333. slaveId = payload.get('slaveId', None)
  1334. try:
  1335. if slaveId is not None:
  1336. box.edit_address(int(slaveId), slaveIndex)
  1337. else:
  1338. box.add_address(slaveIndex)
  1339. except ServiceException, e:
  1340. return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': None})
  1341. return JsonResponse({"result": 1, "description": '', "payload": {"id": slaveIndex}})
  1342. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1343. @permission_required(ROLE.dealer, ROLE.subaccount)
  1344. def operDeviceSlave(request):
  1345. payload = json.loads(request.body)
  1346. logicalCode = payload.get('logicalCode', None)
  1347. portIndex = payload.get('index')
  1348. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  1349. dev = Device.get_dev_by_logicalCode(logicalCode)
  1350. if payload.has_key('status'):
  1351. status = payload.get('status')
  1352. devObj = Device.objects.get(devNo = devNo)
  1353. portDict = devObj.otherConf.get('portDict', {})
  1354. if status == 'ban':
  1355. portDict.update({portIndex: Const.DEV_WORK_STATUS_FORBIDDEN})
  1356. else:
  1357. portDict.update({portIndex: Const.DEV_WORK_STATUS_IDLE})
  1358. devObj.save()
  1359. return JsonResponse({'result': 1, 'description': None, 'payload': None})
  1360. elif payload.has_key('stop') and payload['stop']:
  1361. box = ActionDeviceBuilder.create_action_device(dev)
  1362. try:
  1363. box.stop(portIndex)
  1364. except ServiceException, e:
  1365. return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': None})
  1366. return JsonResponse({'result': 1, 'description': u'停止指令已经下发,请您稍后刷新页面,检查端口实时数据,以确定是否停止成功', 'payload': None})
  1367. return JsonResponse({'result': 0, 'description': u'缺少合法参数', 'payload': None})
  1368. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1369. @permission_required(ROLE.dealer, ROLE.subaccount)
  1370. def deleteSlave(request):
  1371. payload = json.loads(request.body)
  1372. ids = payload.get('ids', [])
  1373. logicalCode = payload.get('logicalCode')
  1374. devObj = Device.objects.get(logicalCode = logicalCode)
  1375. for slaveId in ids:
  1376. try:
  1377. devObj.otherConf['portDict'].pop(slaveId)
  1378. except Exception, e:
  1379. continue
  1380. devObj.save()
  1381. return JsonResponse({'result': 0, 'description': u'缺少合法参数', 'payload': None})
  1382. @permission_required(ROLE.dealer, ROLE.subaccount)
  1383. def setDevAutoRefund(request):
  1384. # type: (WSGIRequest)->JsonResponse
  1385. """
  1386. 1. 设备注册 -> 通过DriverCode 给 DeviceType 里面加 auto 字段, 并记录到 dev 缓存里面的 devType 中
  1387. 2. 设备详情 -> 通过查到 dev 缓存中的 devType 里面的 auto 字段来控制自动退款的显示与不显示
  1388. 3. 批量设置自动退款 -> 通过 dev 缓存中的 devType 中的 auto 为 true 来控制批量设置显示不显示
  1389. 4. 设置批量的自动退款 -> 直接设置 Device 中的 autoRefundLeftMoney 来控制设备是否支持自动退款
  1390. 5. autoRefundLeftMoney -> 可以全部都设置, 不会影响不退款的设备, 也不会影响不退款设备的自动退款显示
  1391. :param request:
  1392. :return:
  1393. """
  1394. data = json.loads(request.body) if request.body else {}
  1395. if not data:
  1396. return JsonErrorResponse(u'数据为空,请重试')
  1397. devNos = data['logicalCodes']
  1398. autoRefundStatus = True if data['autoRefund'] == 1 else False
  1399. objs = Device.objects.filter(devNo__in = devNos)
  1400. for obj in objs:
  1401. obj.autoRefundLeftMoney = autoRefundStatus
  1402. try:
  1403. obj.save()
  1404. except Exception as e:
  1405. logger.exception(e)
  1406. continue
  1407. return JsonResponse({"result": 1, "description": u"操作成功", "payload": {}})
  1408. def viewOfflineCoinStatistics(request):
  1409. pageIndex = int(request.GET.get('pageIndex', 1))
  1410. pageSize = int(request.GET.get('pageSize', 10))
  1411. l = request.GET['logicalCode']
  1412. devNo = Device.get_devNo_by_logicalCode(logicalCode = l)
  1413. now_time = datetime.datetime.now()
  1414. before_seven = now_time - datetime.timedelta(days = 7)
  1415. rv = OfflineCoinsManager.instence().get(devNo = devNo, sTime = before_seven, eTime = now_time)
  1416. total = len(rv)
  1417. return JsonResponse({'result': 1, 'description': '',
  1418. 'payload': {'total': total, 'dataList': rv[(pageIndex - 1) * pageSize: pageIndex * pageSize]}})
  1419. @permission_required(ROLE.dealer, ROLE.subaccount)
  1420. def setTempElecPrice(request):
  1421. data = json.loads(request.body) if request.body else {}
  1422. if not data:
  1423. return JsonErrorResponse(u'数据为空,请重试')
  1424. logicalCode = data['logicalCode']
  1425. tempElecPrice = data['tempElecPrice']
  1426. device = Device.objects(logicalCode = logicalCode).first()
  1427. if device is None:
  1428. return JsonErrorResponse(u'设备不存在, 系统错误')
  1429. device.otherConf['tempElecPrice'] = tempElecPrice
  1430. try:
  1431. device.save()
  1432. except Exception as e:
  1433. logger.exception(e)
  1434. return JsonResponse({"result": 1, "description": u"操作成功", "payload": {}})
  1435. @permission_required(ROLE.dealer)
  1436. def unlockPort(request):
  1437. payload = request.POST
  1438. logicalCode = payload.get("logicalCode")
  1439. portIndex = payload.get("portIndex")
  1440. if not portIndex:
  1441. return JsonResponse({"result": 2,
  1442. "description": "数据有误", })
  1443. dev = Device.get_dev_by_l(logicalCode)
  1444. box = ActionDeviceBuilder.create_action_device(dev)
  1445. try:
  1446. box.unlockPort(portIndex)
  1447. except ServiceException:
  1448. return JsonResponse({"result": 2,
  1449. "description": "连接设备失败,请重试", })
  1450. return JsonResponse({"result": 1, "description": ""})
  1451. @permission_required(ROLE.dealer)
  1452. def saveLiveConfig(request):
  1453. payload = json.loads(request.body)
  1454. logicalCode = payload.get('logicalCode', '')
  1455. liveUrl = payload.get('liveUrl', '#')
  1456. liveLimitedPrice = payload.get('liveLimitedPrice', '0.0')
  1457. if logicalCode == '':
  1458. return JsonResponse({"result": 2, "description": "系统异常"})
  1459. try:
  1460. device = Device.objects(logicalCode=logicalCode).first()
  1461. device.otherConf.update({'liveUrl': liveUrl})
  1462. device.otherConf.update({'liveLimitedPrice': liveLimitedPrice})
  1463. device.save()
  1464. Device.invalid_device_cache(device.devNo)
  1465. except Exception as e:
  1466. return JsonResponse({"result": 2, "description": "参数设置失败,请重试"})
  1467. return JsonResponse({"result": 1, "description": ""})
  1468. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'操作失败'))
  1469. @permission_required(ROLE.manager)
  1470. def getDevicePort(request):
  1471. # type: (WSGIRequest)->JsonResponse
  1472. def cmp_by_port(x, y):
  1473. if (str(x['index']).isdigit() and str(y['index']).isdigit()):
  1474. if int(x['index']) < int(y['index']):
  1475. return -1
  1476. elif int(x['index']) > int(y['index']):
  1477. return 1
  1478. return 0
  1479. else:
  1480. if x['index'] < y['index']:
  1481. return -1
  1482. elif x['index'] > y['index']:
  1483. return 1
  1484. return 0
  1485. def charge_pay_coin_unit(p, u):
  1486. """
  1487. 给端口信息中的付费添加上单位
  1488. :param p:
  1489. :param u:
  1490. :return:
  1491. """
  1492. _coins = p.get("coins")
  1493. if not _coins:
  1494. return
  1495. p.update({"coins": "{}{}".format(_coins, u)})
  1496. currentDealer = request.user
  1497. dev = Device.get_dev_by_logicalCode(request.GET.get('logicalCode')) # type: DeviceDict
  1498. group = dev.group # type: GroupDict
  1499. devTypeCode = dev.devType['code']
  1500. smartBox = dev.deviceAdapter
  1501. if hasattr(smartBox, 'dealer_get_device_port'):
  1502. portList = getattr(smartBox, 'dealer_get_device_port')()
  1503. return JsonResponse({"result": 1, "description": "", "payload": {"portList": portList}})
  1504. if devTypeCode in [Const.DEVICE_TYPE_CODE_GEZIGUI_485,
  1505. Const.DEVICE_TYPE_CODE_CHARGE_ZHONGSHAN,Const.DEVICE_TYPE_CODE_CHARGE_WEIFULE_CAR,
  1506. Const.DEVICE_TYPE_CODE_CAR_WEIFULE_CHARGING_DOUB,
  1507. Const.DEVICE_TYPE_CODE_CAR_WEIFULE_21KW,
  1508. Const.DEVICE_TYPE_CODE_CAR_WEIFILE_HOME_JFPG,
  1509. Const.DEVICE_TYPE_CODE_CAR_WEIFILE_HOME_DOUB_JFPG,
  1510. Const.DEVICE_TYPE_CODE_CHARGE_ZHONGSHAN_BILLASSERVICE]:
  1511. portList = smartBox.get_port_status_from_dev()
  1512. return JsonResponse({"result": 1, "description": "", "payload": {"portList": portList}})
  1513. if devTypeCode == Const.DEVICE_TYPE_CODE_WATER_DISPENSER:
  1514. ctrInfo = Device.get_dev_control_cache(dev.devNo)
  1515. if ctrInfo is None or ('1' not in ctrInfo and '2' not in ctrInfo):
  1516. portList = {}
  1517. else:
  1518. statusDict = {}
  1519. statusInfoDict = {}
  1520. for _ in range(1, 3):
  1521. tempPort = str(_)
  1522. if ctrInfo[tempPort].get('status', 0) == 0:
  1523. statusDict[tempPort] = 'idle'
  1524. statusInfoDict[tempPort] = ctrInfo[tempPort].get('statusErrorInfo', u'无')
  1525. elif ctrInfo[tempPort].get('status', 0) == 1:
  1526. statusDict[tempPort] = 'busy'
  1527. statusInfoDict[tempPort] = ctrInfo[tempPort].get('statusErrorInfo', u'无')
  1528. elif ctrInfo[tempPort].get('status', 0) == 3:
  1529. statusDict[tempPort] = 'fault'
  1530. statusInfoDict[tempPort] = ctrInfo[tempPort].get('statusErrorInfo', u'无')
  1531. else:
  1532. statusDict[tempPort] = 'fault'
  1533. statusInfoDict[tempPort] = ctrInfo[tempPort].get('statusErrorInfo', u'无')
  1534. portList = [
  1535. {'index': '1', 'status': statusDict['1'], 'statusErrorInfo': statusInfoDict.get('1', u'无')},
  1536. {'index': '2', 'status': statusDict['2'], 'statusErrorInfo': statusInfoDict.get('2', u'无')}
  1537. ]
  1538. return JsonResponse({"result": 1, "description": "", "payload": {"portList": portList}})
  1539. try:
  1540. # 先从设备上取信息,然后从缓存中取信息
  1541. portDict = smartBox.dealer_get_port_status()
  1542. smartBox.async_update_portinfo_from_dev()
  1543. except ServiceException as e:
  1544. logger.exception(e)
  1545. return JsonResponse({'result': 0, 'description': e.result.get('description'), 'payload': None})
  1546. except Exception as e:
  1547. logger.exception(e)
  1548. return JsonResponse({"result": 0, "description": u"从设备上获取端口信息失败,请您重试", "payload": {}})
  1549. portList = []
  1550. unit = smartBox.show_pay_unit
  1551. statsMap = {str(Const.DEV_WORK_STATUS_IDLE): 'idle',
  1552. str(Const.DEV_WORK_STATUS_WORKING): 'busy',
  1553. str(Const.DEV_WORK_STATUS_FAULT): 'fault',
  1554. str(Const.DEV_WORK_STATUS_FORBIDDEN): 'ban',
  1555. str(Const.DEV_WORK_STATUS_CONNECTED): 'connected',
  1556. str(Const.DEV_WORK_STATUS_FINISHED): 'finished'}
  1557. # TODO zjl get_port_using_detail 这块太复杂 后续一定要整改!!! 目前先做if分支处理
  1558. if devTypeCode in [Const.DEVICE_TYPE_CODE_CHARGING_AQKJ, Const.DEVICE_TYPE_CODE_CHARGING_AQKJ_NEW]:
  1559. elecInfo = smartBox._query_elec()
  1560. for port, valueDict in portDict.items():
  1561. voltage = "{:.2f}".format(float(valueDict.get("voltage", "0")))
  1562. batteryImei = valueDict.get("batteryImei", "")
  1563. doorStatus = valueDict.get("doorStatus")
  1564. doorStatus = smartBox.translate_door_status_to_unicode(doorStatus)
  1565. tempStatus = statsMap.get(str(valueDict.get("status")))
  1566. elecPoint = valueDict.get("elec")
  1567. tempDict = {
  1568. "index": port,
  1569. "status": tempStatus,
  1570. "doorStatus": doorStatus,
  1571. "voltage": voltage,
  1572. "batteryImei": batteryImei if batteryImei else u"无电池",
  1573. "elecPoint": elecPoint
  1574. }
  1575. tempDict.update(elecInfo.get(port))
  1576. portList.append(tempDict)
  1577. portList.sort(cmp=cmp_by_port)
  1578. return JsonResponse({"result": 1, "description": "", "payload": {"portList": portList}})
  1579. if devTypeCode in [Const.DEVICE_TYPE_CODE_CABINET_NEW]:
  1580. doorStatus = smartBox._get_door_status()
  1581. for port, valueDict in portDict.items():
  1582. voltage = "{:.2f}".format(float(valueDict.get("voltage", "0")))
  1583. tempDict = {
  1584. "index": port,
  1585. "status": valueDict["status"],
  1586. "doorStatus": doorStatus.get(port, u"未知"),
  1587. }
  1588. valueDict.update(tempDict)
  1589. portList.append(valueDict)
  1590. portList.sort(
  1591. key=lambda x: int(x['index']) if isinstance(x['index'], str) and x["index"].isdigit() else x['index'])
  1592. return JsonResponse({"result": 1, "description": "", "payload": {"portList": portList}})
  1593. if devTypeCode in [Const.DEVICE_TYPE_CODE_CABINET]:
  1594. for port, valueDict in portDict.items():
  1595. tempStatus = statsMap.get(str(valueDict.get("status")))
  1596. tempDict = {
  1597. "index": port,
  1598. "status": tempStatus,
  1599. }
  1600. valueDict.update(tempDict)
  1601. portList.append(valueDict)
  1602. portList.sort(cmp=cmp_by_port)
  1603. return JsonResponse({"result": 1, "description": "", "payload": {"portList": portList}})
  1604. busyPortList = []
  1605. for port, valueDict in portDict.items():
  1606. vStatus = valueDict.get('status', None)
  1607. if vStatus == Const.DEV_WORK_STATUS_WORKING:
  1608. busyPortList.append(port)
  1609. else:
  1610. portList.append({'index': str(port), 'status': statsMap.get(str(vStatus), "idle")})
  1611. busyPortInfoDict = smartBox.get_many_port_info(busyPortList)
  1612. if devTypeCode in [Const.DEVICE_TYPE_CODE_CHARGING_HAINIAO_DOUBLE]:
  1613. ctrInfo = Device.get_dev_control_cache(dev.devNo)
  1614. for port, valueDict in portDict.items():
  1615. vStatus = valueDict.get('status', None)
  1616. if vStatus == Const.DEV_WORK_STATUS_WORKING:
  1617. portDetail = smartBox.get_port_using_detail(port, ctrInfo)
  1618. if portDetail.get('timeUnit',None)==u'秒':
  1619. portDetail.update({'needTime':str(portDetail['needTime'][:-2])+'秒'})
  1620. portDetail.update({"index": str(port), "status": 'busy'})
  1621. portList.append(portDetail)
  1622. portList.sort(
  1623. key=lambda x: int(x['index']) if isinstance(x['index'], str) and x["index"].isdigit() else x['index'])
  1624. map(charge_pay_coin_unit, portList, [unit for x in xrange(len(portList))])
  1625. for _ in portList:
  1626. if 'elec' in _:
  1627. _.pop('elec')
  1628. portList.sort(cmp=cmp_by_port)
  1629. return JsonOkResponse(payload={"isManager": False, "portList": portList})
  1630. if busyPortInfoDict:
  1631. for info in busyPortInfoDict.values():
  1632. if info['status'] == Const.DEV_WORK_STATUS_WORKING:
  1633. info.update({'status':statsMap[str(info['status'])]})
  1634. if info.has_key('needTime') and str(info['needTime']).isdigit():
  1635. info.update({'needTime':u'%s分钟' % info['needTime']})
  1636. else:
  1637. info = {'status':'idle','index':str(info['index'])}
  1638. portList.append(info)
  1639. else:
  1640. ctrInfo = Device.get_dev_control_cache(dev.devNo)
  1641. for port, valueDict in portDict.items():
  1642. vStatus = valueDict.get('status', None)
  1643. if vStatus == Const.DEV_WORK_STATUS_WORKING:
  1644. portDetail = smartBox.get_port_using_detail(port, ctrInfo)
  1645. portDetail.update({"index": str(port), "status": 'busy'})
  1646. portList.append(portDetail)
  1647. portList.sort(key=lambda x: int(x['index']) if isinstance(x['index'], str) and x["index"].isdigit() else x['index'])
  1648. map(charge_pay_coin_unit, portList, [unit for x in xrange(len(portList))])
  1649. # todo 删掉已充电量, 只保留订购电量 (微付乐的板子需要电量,不能去掉。按道理,这个是业务自己不返回elec,不能放在公共代码这里改)
  1650. if devTypeCode not in [Const.DEVICE_TYPE_CODE_CHANGING_WEIFULE, Const.DEVICE_TYPE_CODE_CHANGING_WEIFULE2,Const.DEVICE_TYPE_CODE_CHANGING_DIANCHUANCARCHARGING]:
  1651. for _ in portList:
  1652. if 'elec' in _:
  1653. _.pop('elec')
  1654. if dev.support_power_graph and (
  1655. 'showPG_in_port_detail' in dev.owner.features or dev.driverCode in [Const.DEVICE_TYPE_CODE_WEIFULE_ANJIAN]):
  1656. for item in portList:
  1657. item['showPG'] = True
  1658. portList.sort(cmp=cmp_by_port)
  1659. return JsonOkResponse(payload={"isManager": False, "portList": portList})
  1660. @permission_required(ROLE.manager)
  1661. @error_tolerate(logger=logger, nil=JsonErrorResponse(u'系统错误,请稍后再试'))
  1662. def getAlarmList(request):
  1663. # type: (WSGIRequest)->JsonResponse
  1664. pageIndex = int(request.GET.get('pageIndex', 1))
  1665. pageSize = int(request.GET.get('pageSize', 10))
  1666. searchKey = request.GET.get('searchKey', '')
  1667. agentIds = [str(_.id) for _ in Agent.objects(managerId = str(request.user.id))]
  1668. dealerIds = [str(_.id) for _ in Dealer.objects(agentId__in = agentIds)]
  1669. if searchKey:
  1670. queryset = FaultRecord.objects(logicalCode = searchKey,dealerId__in=dealerIds).order_by('-createdTime')
  1671. else:
  1672. queryset = FaultRecord.objects(dealerId__in=dealerIds).order_by('-createdTime')
  1673. records = queryset.paginate(pageIndex = pageIndex, pageSize = pageSize) # type: Iterable[FaultRecord]
  1674. total = queryset.count()
  1675. return JsonOkResponse(payload={'dataList': [ _.to_dict() for _ in records ], 'total': total})
  1676. @permission_required(ROLE.dealer, ROLE.subaccount)
  1677. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'系统错误,请稍后再试'))
  1678. def findDevTypeCandidate(request):
  1679. logicalCode = request.GET.get('logicalCode')
  1680. devObj = Device.objects(logicalCode = logicalCode).first() # type: Device
  1681. if not devObj:
  1682. return JsonErrorResponse(description = u'设备不存在,请扫正确的设备二维码')
  1683. recommend, all = DeviceType.find_candidate(devObj, request.user)
  1684. return JsonOkResponse(payload = {'recommend': recommend, 'all': all})
  1685. @permission_required(ROLE.supermanager, ROLE.manager)
  1686. def getDriverCodeList(request):
  1687. # type: (WSGIRequest)->JsonResponse
  1688. devTypes = [d.to_dict() for d in DriverCode.objects()] # type: List[DriverCode]
  1689. return JsonResponse(
  1690. {
  1691. 'result': 1,
  1692. 'description': "",
  1693. 'payload':
  1694. {
  1695. 'total': len(devTypes),
  1696. 'dataList': devTypes
  1697. }
  1698. }
  1699. )
  1700. @permission_required(ROLE.supermanager)
  1701. def addDriverCode(request):
  1702. # type: (WSGIRequest)->JsonResponse
  1703. payload = json.loads(request.body) # type: dict
  1704. try:
  1705. DriverCode(code = payload['code'], name = payload['name'], description = payload['description']).save()
  1706. except NotUniqueError:
  1707. return JsonErrorResponse(description = u'重复数据')
  1708. return JsonResponse({'result': 1, 'description': u'保存成功'})
  1709. @permission_required(ROLE.supermanager)
  1710. def editDriverCode(request):
  1711. # type: (WSGIRequest)->JsonResponse
  1712. payload = json.loads(request.body) # type: dict
  1713. try:
  1714. DriverCode.objects(id = payload.pop('id')).update(**payload)
  1715. except NotUniqueError:
  1716. return JsonErrorResponse(description = u'重复数据')
  1717. return JsonResponse({'result': 1, 'description': u'保存成功'})
  1718. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'删除设备类型列表失败,请重试'))
  1719. @permission_required(ROLE.supermanager)
  1720. def deleteDriverCode(request):
  1721. # type: (WSGIRequest)->JsonResponse
  1722. ids = json.loads(request.body)['ids']
  1723. for _ in ids:
  1724. driverCode = DriverCode.objects(id = str(_)).first()
  1725. if not driverCode:
  1726. return JsonErrorResponse(description = u"没有找到设备驱动编码{}".format(driverCode.code))
  1727. refDevType = DeviceType.objects(code = driverCode.code).first()
  1728. if refDevType:
  1729. return JsonErrorResponse(description = u"{}已经被使用,无法删除".format(driverCode.code))
  1730. map(lambda _: _.delete(), DriverCode.objects(id__in = ids).all())
  1731. return JsonOkResponse()
  1732. @permission_required(ROLE.supermanager)
  1733. def getDriverAdapterList(request):
  1734. # type: (WSGIRequest)->JsonResponse
  1735. rv = [d.to_dict() for d in DriverAdapter.objects()]
  1736. return JsonResponse(
  1737. {
  1738. 'result': 1,
  1739. 'description': "",
  1740. 'payload':
  1741. {
  1742. 'total': len(rv),
  1743. 'dataList': rv
  1744. }
  1745. }
  1746. )
  1747. @permission_required(ROLE.supermanager)
  1748. def addDriverAdapter(request):
  1749. # type: (WSGIRequest)->JsonResponse
  1750. payload = json.loads(request.body) # type: dict
  1751. if not payload['adapterFile'] or not payload['adapter'] or not payload['adapterVer']:
  1752. return JsonErrorResponse(description = u'参数错误')
  1753. try:
  1754. DriverAdapter(
  1755. adapterFile = payload['adapterFile'], adapter = payload['adapter'], adapterVer = payload['adapterVer']).save()
  1756. except NotUniqueError:
  1757. return JsonErrorResponse(description = u'重复数据')
  1758. return JsonResponse({'result': 1, 'description': u'保存成功'})
  1759. @permission_required(ROLE.supermanager)
  1760. def editDriverAdapter(request):
  1761. # type: (WSGIRequest)->JsonResponse
  1762. payload = json.loads(request.body) # type: dict
  1763. if not payload['adapterFile'] or not payload['adapter'] or not payload['adapterVer']:
  1764. return JsonErrorResponse(description = u'参数错误')
  1765. try:
  1766. DriverAdapter.objects(id = payload.pop('id')).update(**payload)
  1767. except NotUniqueError:
  1768. return JsonErrorResponse(description = u'重复数据')
  1769. return JsonResponse({'result': 1, 'description': u'保存成功'})
  1770. @permission_required(ROLE.supermanager)
  1771. def deleteDriverAdapter(request):
  1772. # type: (WSGIRequest)->JsonResponse
  1773. ids = json.loads(request.body)['ids']
  1774. for _ in ids:
  1775. driverAdapter = DriverAdapter.objects(id = str(_)).first()
  1776. if not driverAdapter:
  1777. return JsonErrorResponse(description = u"没有找到设备适配器{}".format(driverAdapter.adapterFile))
  1778. if not driverAdapter.adapterFile:
  1779. continue
  1780. refDriverCode = DriverCode.objects(adapterFile = driverAdapter.adapterFile).first()
  1781. if refDriverCode:
  1782. return JsonErrorResponse(description = u"{}已经被使用,无法删除".format(driverAdapter.adapterFile))
  1783. map(lambda _: _.delete(), DriverAdapter.objects(id__in = ids).all())
  1784. return JsonOkResponse()
  1785. @permission_required(ROLE.supermanager)
  1786. def getDriverEventerList(request):
  1787. # type: (WSGIRequest)->JsonResponse
  1788. rv = [d.to_dict() for d in DriverEventer.objects()]
  1789. return JsonResponse(
  1790. {
  1791. 'result': 1,
  1792. 'description': "",
  1793. 'payload':
  1794. {
  1795. 'total': len(rv),
  1796. 'dataList': rv
  1797. }
  1798. }
  1799. )
  1800. @permission_required(ROLE.supermanager)
  1801. def addDriverEventer(request):
  1802. # type: (WSGIRequest)->JsonResponse
  1803. payload = json.loads(request.body) # type: dict
  1804. if not payload['eventerFile'] or not payload['eventerVer']:
  1805. return JsonErrorResponse(description = u'参数错误')
  1806. try:
  1807. DriverAdapter(
  1808. eventerFile = payload['eventerFile'], eventerVer = payload['eventerVer']).save()
  1809. except NotUniqueError:
  1810. return JsonErrorResponse(description = u'重复数据')
  1811. return JsonResponse({'result': 1, 'description': u'保存成功'})
  1812. @permission_required(ROLE.supermanager)
  1813. def editDriverEventer(request):
  1814. # type: (WSGIRequest)->JsonResponse
  1815. payload = json.loads(request.body) # type: dict
  1816. if not payload['eventerFile'] or not payload['eventerVer']:
  1817. return JsonErrorResponse(description = u'参数错误')
  1818. try:
  1819. DriverEventer.objects(id = payload.pop('id')).update(**payload)
  1820. except NotUniqueError:
  1821. return JsonErrorResponse(description = u'重复数据')
  1822. return JsonResponse({'result': 1, 'description': u'保存成功'})
  1823. @permission_required(ROLE.supermanager)
  1824. def deleteDriverEventer(request):
  1825. # type: (WSGIRequest)->JsonResponse
  1826. ids = json.loads(request.body)['ids']
  1827. for _ in ids:
  1828. driverEventer = DriverEventer.objects(id = str(_)).first()
  1829. if not driverEventer:
  1830. return JsonErrorResponse(description = u"没有找到设备适配器{}".format(driverEventer.eventerFile))
  1831. if not driverEventer.eventerFile:
  1832. continue
  1833. refDriverCode = DriverCode.objects(eventerFile = driverEventer.eventerFile).first()
  1834. if refDriverCode:
  1835. return JsonErrorResponse(description = u"{}已经被使用,无法删除".format(driverEventer.eventerFile))
  1836. map(lambda _: _.delete(), DriverEventer.objects(id__in = ids).all())
  1837. return JsonOkResponse()
  1838. @permission_required(ROLE.manager, ROLE.supermanager)
  1839. def assignDeviceTypeToAgent(request):
  1840. # type: (WSGIRequest)->JsonResponse
  1841. payload = json.loads(request.body)
  1842. agent = Agent.objects(id = payload['id']).first()
  1843. if not agent:
  1844. return JsonResponse({'result': 0, 'description': u'该代理商用户不存在'})
  1845. for deviceType in payload['deviceType']:
  1846. deviceType['agentId'] = str(agent.id)
  1847. deviceType.pop('id')
  1848. DeviceType(**deviceType).save()
  1849. return JsonResponse({'result': 1, 'description': u'配置成功'})
  1850. @permission_required(ROLE.dealer, ROLE.subaccount)
  1851. def getDeviceVirtualQrCode(request):
  1852. """
  1853. 生成设备的二维码推广码
  1854. """
  1855. logicalCode = request.GET.get('logicalCode')
  1856. dev = Device.get_dev_by_l(logicalCode) # type: DeviceDict
  1857. if not dev:
  1858. return JsonErrorResponse(description=u"生成二维码错误(10001)")
  1859. deviceOwner = dev.owner
  1860. if not deviceOwner:
  1861. return JsonErrorResponse(description=u"生成二维码错误(10002)")
  1862. productionAgent = get_user_manager_agent(deviceOwner)
  1863. redirect = '/user/index.html#?path=ticket&logicalCode={}&groupId={}'.format(dev.logicalCode, dev.groupId)
  1864. url = concat_user_center_entry_url(str(productionAgent.id), redirect=redirect)
  1865. logger.debug('{} virtual qr code is: {}'.format(dev, url))
  1866. return JsonOkResponse(payload={'url': url})