views.py 114 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import re
  6. import simplejson as json
  7. from bson.objectid import ObjectId
  8. from django.conf import settings
  9. from django.contrib import auth
  10. from django.views.decorators.http import require_POST, require_GET
  11. from mongoengine.errors import DoesNotExist, NotUniqueError
  12. from typing import TYPE_CHECKING
  13. from voluptuous import MultipleInvalid
  14. from apilib import utils_datetime
  15. from apilib.monetary import RMB, Ratio, VirtualCoin
  16. from apilib.utils import is_number
  17. from apilib.utils_datetime import to_datetime
  18. from apilib.utils_json import JsonResponse
  19. from apilib.utils_string import make_title_from_dict
  20. from apilib.utils_sys import memcache_lock
  21. from apps import serviceCache
  22. from apps.web.agent import api
  23. from apps.web.agent.models import Agent, MoniApp, MoniAppPoint
  24. from apps.web.common.models import AddressType, FAQ, WithdrawBankCard, WithdrawBranchBanks
  25. from apps.web.common.models import Feature
  26. from apps.web.constant import Const, SimStatus
  27. from apps.web.core import ROLE
  28. from apps.web.core.bridge import WechatClientProxy
  29. from apps.web.core.bridge.wechat.v3api import WechatComplaint
  30. from apps.web.core.exceptions import InvalidFileSize, InvalidFileName, \
  31. ManagerServiceTimeOutException, ManagerServiceSerialException, ServiceException, RentDeviceError
  32. from apps.web.core.file import AliOssFileUploader
  33. from apps.web.core.models import AliApp, WechatPayApp
  34. from apps.web.core.models import OfflineTask
  35. from apps.web.core.models import WechatAuthApp
  36. from apps.web.core.models import WechatServiceProvider
  37. from apps.web.core.networking import MessageSender
  38. from apps.web.core.utils import DefaultJsonErrorResponse, JsonErrorResponse, JsonOkResponse
  39. from apps.web.dealer.models import Dealer, ExchangeOrder, DealerRechargeRecord, ApiAppInfo
  40. from apps.web.dealer.transaction_deprecated import refund_cash_to_dealer
  41. from apps.web.dealer.utils import create_dealer_sim_charge_order
  42. from apps.web.device.models import Device, DeviceType, MajorDeviceType, DeviceCommandParam, DeviceCommand, SIMCard, \
  43. Part, Group
  44. from apps.web.device.timescale import SignalManager
  45. from apps.web.exceptions import UserServerException
  46. from apps.web.helpers import get_manual_pay_gateway
  47. from apps.web.management.models import Manager, DeviceReplacement
  48. from apps.web.merchant.constant import MerchantStatus
  49. from apps.web.merchant.models import MerchantSourceInfo, MerchantLog
  50. from apps.web.merchant.utils import get_wechat_proxy, MerchantApplyProxy
  51. from apps.web.promotion.models import InsuranceOrder
  52. from apps.web.superadmin import OfflineTaskType
  53. from apps.web.superadmin.models import SuperManager, WebLog
  54. from apps.web.user.models import RechargeRecord, ConsumeRecord
  55. from apps.web.user.transaction_deprecated import refund_cash
  56. from apps.web.utils import permission_required, error_tolerate, super_manager_login, trace_call
  57. from apps.web.validation import SaveWithdrawBankCardSchema, SavePublicWithdrawBankCardExtraSchema, \
  58. SaveWithdrawBankCardSchemaForSuper
  59. from library.qiben import SimManager
  60. from taskmanager.mediator import task_caller
  61. if TYPE_CHECKING:
  62. from apps.web.device.models import DeviceDict
  63. from django.core.handlers.wsgi import WSGIRequest
  64. from apps.web.core.db import CustomQuerySet
  65. from typing import Dict, List, Callable, Iterable, Union, Any
  66. from apps.web.common.models import UserSearchable
  67. from apps.web.dealer.models import DealerDict
  68. from apps.web.user.models import MyUser
  69. from apps.web.device.models import GroupDict
  70. logger = logging.getLogger(__name__)
  71. def login(request):
  72. # type: (WSGIRequest)->JsonResponse
  73. try:
  74. payload = json.loads(request.body)
  75. username, password = payload['username'], payload['password']
  76. if SuperManager.objects(username = username).first():
  77. return super_manager_login(request, logger, username, password)
  78. else:
  79. return JsonResponse({'result': 0, 'description': u'用户名或者密码错误', 'payload': {}})
  80. except Exception as e:
  81. logger.exception('super manager login error = %s' % e)
  82. return JsonResponse({'result': 0, 'description': u'登录异常', 'payload': {}})
  83. @permission_required(ROLE.supermanager)
  84. def logout(request):
  85. # type: (WSGIRequest)->JsonResponse
  86. auth.logout(request)
  87. return JsonResponse({'result': 1})
  88. @permission_required(ROLE.supermanager)
  89. def getCurrentUserInfo(request):
  90. # type: (WSGIRequest)->JsonResponse
  91. return JsonResponse(
  92. {
  93. "result": 1,
  94. "description": "",
  95. "payload":
  96. {
  97. 'username': request.user.username,
  98. "nickname": request.user.nickname,
  99. "brandName": "厂商管理后台",
  100. "logo": ""
  101. }
  102. })
  103. @permission_required(ROLE.supermanager)
  104. def getManagerList(request):
  105. # type: (WSGIRequest)->JsonResponse
  106. pageIndex = int(request.GET.get('pageIndex', 1))
  107. pageSize = int(request.GET.get('pageSize', 40))
  108. searchKey = request.GET.get('searchKey', None)
  109. searchType = request.GET.get('searchType', None)
  110. if searchType is None:
  111. managers = Manager.search(searchKey).filter(domain = settings.MY_DOMAIN).order_by('-dateTimeAdded')
  112. elif searchType == ROLE.dealer:
  113. dealers = Dealer.objects().search(searchKey)
  114. agents = Agent.objects(id__in = [str(_.agentId) for _ in dealers])
  115. managers = Manager.objects(domain = settings.MY_DOMAIN, id__in = [str(_.managerId) for _ in agents])
  116. elif searchType == ROLE.agent:
  117. agents = Agent.objects().search(searchKey)
  118. managers = Manager.objects(domain = settings.MY_DOMAIN, id__in = [str(_.managerId) for _ in agents])
  119. else:
  120. return JsonErrorResponse(description = u'目前只支持按照代理商查询或经销商查询或厂商通用查询')
  121. total = managers.count()
  122. dataList = []
  123. for manager in managers.paginate(pageIndex = pageIndex, pageSize = pageSize): # type: Manager
  124. dictValue = manager.to_dict(shadow = (not request.user.universal_password_login))
  125. dictValue.update({'agentTotal': Agent.objects(managerId = str(manager.id)).count()})
  126. dataList.append(dictValue)
  127. return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
  128. @permission_required(ROLE.supermanager)
  129. def addManager(request):
  130. # type: (WSGIRequest)->JsonResponse
  131. payload = json.loads(request.body)
  132. username = payload.pop('username')
  133. password = payload.pop('password')
  134. nickname = payload.get('nickname')
  135. logo_path = payload.pop('img', '')
  136. primaryAgentUsername = payload.pop('primaryAgentUsername')
  137. primaryAgentPassword = payload.pop('primaryAgentPassword')
  138. primaryAgentNickName = payload.pop('primaryAgentNickName')
  139. payload.update({'logo': logo_path})
  140. payload.update({'brandName': nickname})
  141. try:
  142. trafficCardCost = RMB(payload.get('trafficCardCost', Const.PLATFORM_DEFAULT_TRAFFIC_COST))
  143. if trafficCardCost < RMB(0):
  144. return JsonErrorResponse(description = u'流量卡年费输入错误')
  145. if 'withdrawFeeRatioCost' in payload:
  146. withdrawFeeRatioCost = Ratio(payload.get('withdrawFeeRatioCost'))
  147. else:
  148. withdrawFeeRatioCost = Const.PLATFORM_DEFAULT_WITHDRAW_FEE_RATIO
  149. if withdrawFeeRatioCost < Const.MIN_DEALER_WITHDRAW_FEE_RATIO or withdrawFeeRatioCost > Const.MAX_DEALER_WITHDRAW_FEE_RATIO:
  150. return JsonErrorResponse(description = u'提现费率输入错误')
  151. try:
  152. manager = Manager.create_user(username, password, **payload)
  153. except NotUniqueError as e:
  154. logger.exception('not unique super admin data, error=%s' % (e,))
  155. return JsonErrorResponse(description = u'重复的超级管理员电话号码')
  156. agent = Agent.create_user(username = primaryAgentUsername, password = primaryAgentPassword, **{
  157. 'managerId': str(manager.id),
  158. 'nickname': primaryAgentNickName,
  159. 'productName': nickname,
  160. 'productLogo': logo_path,
  161. 'annualTrafficCost': trafficCardCost,
  162. 'trafficCardCost': trafficCardCost,
  163. 'withdrawFeeRatio': withdrawFeeRatioCost,
  164. 'withdrawFeeRatioCost': withdrawFeeRatioCost})
  165. except NotUniqueError as e:
  166. logger.exception('not unique primary agent data, error=%s' % (e,))
  167. return JsonErrorResponse(description = u'重复的代理商电话号码')
  168. updated = manager.update(primeAgentId = str(agent.id))
  169. assert updated, u'更新主代理商ID错误'
  170. return JsonOkResponse()
  171. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  172. def editManager(request):
  173. # type: (WSGIRequest)->JsonResponse
  174. payload = json.loads(request.body)
  175. id_ = str(payload.pop('id'))
  176. updated = Manager.objects(id = id_).update(**payload)
  177. if updated:
  178. return JsonOkResponse()
  179. else:
  180. return JsonErrorResponse(description = u'编辑厂商失败')
  181. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  182. @permission_required(ROLE.supermanager)
  183. def editManagerPassword(request):
  184. # type: (WSGIRequest)->JsonResponse
  185. try:
  186. payload = json.loads(request.body)
  187. managerId = payload.get('id')
  188. password = payload.get('password')
  189. agent = Manager.objects.get(id = managerId)
  190. agent.set_password(password)
  191. return JsonResponse({'result': 1, 'description': u'修改成功', 'payload': {}})
  192. except DoesNotExist:
  193. return JsonResponse({'result': 0, 'description': u'厂商不存在,请刷新后再试', 'payload': {}})
  194. except Exception as e:
  195. logger.exception('cannot [editManagerPassword], error=%s' % (e,))
  196. return JsonResponse({'result': 0, 'description': u'修改失败', 'payload': {}})
  197. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  198. @permission_required(ROLE.supermanager)
  199. def editAgentPassword(request):
  200. # type: (WSGIRequest)->JsonResponse
  201. try:
  202. payload = json.loads(request.body)
  203. agentId = payload.get('id')
  204. password = payload.get('password')
  205. agent = Agent.objects.get(id = agentId)
  206. agent.set_password(password)
  207. return JsonResponse({'result': 1, 'description': u'修改成功', 'payload': {}})
  208. except DoesNotExist:
  209. return JsonResponse({'result': 0, 'description': u'代理商不存在,请刷新后再试', 'payload': {}})
  210. except Exception as e:
  211. logger.exception('cannot [editManagerPassword], error=%s' % (e,))
  212. return JsonResponse({'result': 0, 'description': u'修改失败', 'payload': {}})
  213. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  214. @permission_required(ROLE.supermanager)
  215. def editDealerPassword(request):
  216. # type: (WSGIRequest)->JsonResponse
  217. try:
  218. payload = json.loads(request.body)
  219. dealerId = payload.get('id')
  220. password = payload.get('password')
  221. dealer = Dealer.objects.get(id = dealerId)
  222. dealer.set_password(password)
  223. return JsonResponse({'result': 1, 'description': u'修改成功', 'payload': {}})
  224. except DoesNotExist:
  225. return JsonResponse({'result': 0, 'description': u'经销商不存在,请刷新后再试', 'payload': {}})
  226. except Exception as e:
  227. logger.exception('cannot [editManagerPassword], error=%s' % (e,))
  228. return JsonResponse({'result': 0, 'description': u'修改失败', 'payload': {}})
  229. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  230. @permission_required(ROLE.supermanager)
  231. def getDeviceDetailList(request):
  232. # type: (WSGIRequest)->JsonResponse
  233. pageIndex = int(request.GET.get('pageIndex', 1))
  234. pageSize = int(request.GET.get('pageSize', 40))
  235. searchKey = request.GET.get('searchKey', None)
  236. managerId = request.GET.get('managerId', None)
  237. dealerId = request.GET.get('dealerId', None)
  238. agentId = request.GET.get('agentId', None)
  239. online = request.GET.get('online', None)
  240. registered = request.GET.get('registered')
  241. logicalCode = request.GET.get("logicalCode", None)
  242. if logicalCode:
  243. data = Device.accurate_filter(logicalCode = logicalCode, shadow = (not request.user.universal_password_login))
  244. if not data:
  245. return JsonErrorResponse(description = u'无效的logicalCode')
  246. return JsonOkResponse(payload = {'total': 1, 'dataList': [data]})
  247. logicalCodeList = list(set(request.GET.getlist('logicalCodeList', None)))
  248. if logicalCodeList is not None:
  249. if len(logicalCodeList) > 0:
  250. dataList = []
  251. ds = Device.objects(logicalCode__in = logicalCodeList)
  252. for _ in ds.paginate(pageIndex = pageIndex, pageSize = pageSize):
  253. data = Device.accurate_filter(logicalCode = _.logicalCode,
  254. shadow = (not request.user.universal_password_login))
  255. if data is None:
  256. continue
  257. else:
  258. dataList.append(data)
  259. return JsonOkResponse(payload = {'total': ds.count(), 'dataList': dataList})
  260. try:
  261. if online is not None:
  262. online = json.loads(online)
  263. if registered is not None:
  264. registered = json.loads(registered)
  265. except ValueError:
  266. return JsonErrorResponse(description = u'参数不合法')
  267. total, device_list = Device.tree_filter(dealerId,
  268. agentId,
  269. managerId,
  270. searchKey,
  271. pageIndex,
  272. pageSize,
  273. online = online,
  274. registered = registered,
  275. shadow = (not request.user.universal_password_login))
  276. return JsonOkResponse(payload = {'total': total, 'dataList': device_list})
  277. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  278. @permission_required(ROLE.supermanager)
  279. def getOrderDetailList(request):
  280. # type: (WSGIRequest)->JsonResponse
  281. def get_consume_dataList(consumeRcd, index, size):
  282. return [{
  283. 'wxOrderNo': '',
  284. 'orderNo': '',
  285. 'orderResult': '',
  286. 'rechargeUser': '',
  287. 'rechargeType': '',
  288. 'money': '',
  289. 'coins': '',
  290. 'orderDetail': {},
  291. 'orderCreateTime': '',
  292. 'logicalCode': _.logicalCode,
  293. 'devNo': _.devNo,
  294. 'devTypeCode': Device.objects(devNo = _.devNo).first().devType.get('code', '') if Device.objects(
  295. devNo = _.devNo).first() is not None else '',
  296. 'consumeOrderNo': _.orderNo,
  297. 'consumeUser': _.nickname + ' ' + _.openId,
  298. 'consumeCoins': _.coin,
  299. 'consumeResult': u'消费成功' if _.isNormal else u'消费失败',
  300. 'failedReason': _.errorDesc,
  301. 'consumeOrderCreateTime': _.dateTimeAdded.strftime('%Y-%m-%d %H:%M:%S'),
  302. 'consumeDetail': _.attachParas,
  303. 'consumeDict': _.servicedInfo
  304. } for _ in consumeRcd.paginate(pageIndex = index, pageSize = size)]
  305. pageIndex = int(request.GET.get('pageIndex', 1))
  306. pageSize = int(request.GET.get('pageSize', 40))
  307. searchKey = request.GET['searchKey']
  308. searchType = request.GET['searchType']
  309. searchResult = True
  310. if searchType == 'logicalCodeRecharge':
  311. device = Device.objects(logicalCode = searchKey).first()
  312. if device is not None:
  313. devNo = device.devNo
  314. rs = RechargeRecord.objects(devNo = devNo, via__in = ['recharge', 'chargeCard']).order_by('-dateTimeAdded')
  315. dataList = [_.to_dict_for_super_admin() for _ in rs.paginate(pageIndex = pageIndex, pageSize = pageSize)]
  316. else:
  317. return JsonErrorResponse(description = u'设备编号不存在')
  318. elif searchType == 'logicalCodeConsume':
  319. device = Device.objects(logicalCode=searchKey).first()
  320. if device is not None:
  321. devNo = device.devNo
  322. cs = ConsumeRecord.objects(devNo=devNo).order_by('-dateTimeAdded')
  323. dataList = get_consume_dataList(cs, pageIndex, pageSize)
  324. else:
  325. return JsonErrorResponse(description=u'设备编号不存在')
  326. elif searchType == 'wxOrderNo':
  327. rs = RechargeRecord.objects(wxOrderNo = searchKey)
  328. if rs.count() == 0:
  329. searchResult = False
  330. dataList = [_.to_dict_for_super_admin() for _ in rs]
  331. elif searchType == 'orderNo':
  332. rs = RechargeRecord.objects(orderNo = searchKey)
  333. if rs.count() == 0:
  334. searchResult = False
  335. dataList = [_.to_dict_for_super_admin() for _ in rs]
  336. elif searchType == 'consumeOrderNo':
  337. cs = ConsumeRecord.objects(orderNo = searchKey)
  338. if cs.count() == 0:
  339. searchResult = False
  340. c = cs.first()
  341. if c.rechargeRcdId is None or c.rechargeRcdId == '':
  342. dataList = get_consume_dataList(cs, pageIndex, pageSize)
  343. else:
  344. rs = RechargeRecord.objects(id = str(c.rechargeRcdId))
  345. dataList = [_.to_dict_for_super_admin() for _ in rs.paginate(pageIndex = pageIndex, pageSize = pageSize)]
  346. else:
  347. return JsonErrorResponse(description = u'查询方式错误')
  348. if searchResult is False:
  349. return JsonErrorResponse(description = u'没有查询到结果')
  350. else:
  351. return JsonOkResponse(payload = {'total': 0, 'dataList': dataList})
  352. @error_tolerate(nil=JsonErrorResponse(u'退款失败'), logger=logger)
  353. @permission_required(ROLE.supermanager)
  354. def refundCashFromRecharge(request):
  355. # type: (WSGIRequest)->JsonResponse
  356. data = json.loads(request.body)
  357. orderNo = data['orderNo']
  358. money = data['money']
  359. rcd = RechargeRecord.objects(orderNo=orderNo).first() # type: RechargeRecord
  360. if rcd is None:
  361. return JsonErrorResponse(description=u"充值订单不存在,退款失败")
  362. if RMB(money) <= RMB(0):
  363. return JsonErrorResponse(description=u"退费金额错误")
  364. if float(money) > float(str(rcd.money)):
  365. return JsonErrorResponse(description=u"退款金额大于订单金额,退款失败")
  366. if not rcd.is_success():
  367. return JsonErrorResponse(description = u"退款失败,订单状态非成功,请联系平台客服")
  368. if not rcd.is_ledgered:
  369. return JsonErrorResponse(description=u"订单还没有分账,无法退款")
  370. try:
  371. refund_cash(recharge_record=rcd, refundFee=RMB(money), deductCoins=VirtualCoin(rcd.coins))
  372. return JsonOkResponse()
  373. except ServiceException as e:
  374. logger.error(e.result)
  375. return JsonErrorResponse(description=e.result.get("description"))
  376. except UserServerException as e:
  377. logger.error(e.message)
  378. return JsonResponse(e.message)
  379. @error_tolerate(nil = JsonErrorResponse(u'管理员强制删除失败'), logger = logger)
  380. @permission_required(ROLE.supermanager)
  381. def unbindDevByAdmin(request):
  382. # type: (WSGIRequest)->JsonResponse
  383. logicalCode = json.loads(request.body)['logicalCode']
  384. dev = Device.get_dev_by_logicalCode(logicalCode) # type: DeviceDict
  385. if dev is None:
  386. return JsonErrorResponse(description = u"该设备不存在,请刷新后再试")
  387. Device.un_register(dev, force = True, operator = request.user.human_id)
  388. return JsonOkResponse()
  389. ###############
  390. ##: 特性列表 :##
  391. ###############
  392. @error_tolerate(nil = JsonErrorResponse(u'获取特性列表失败'), logger = logger)
  393. @permission_required(ROLE.supermanager)
  394. def getFeatureList(request):
  395. # type: (WSGIRequest)->JsonResponse
  396. """
  397. :param request:
  398. :return:
  399. """
  400. pageIndex = int(request.GET.get('pageIndex', 1))
  401. pageSize = int(request.GET.get('pageSize', 40))
  402. role = request.GET.get('role')
  403. searchKey = request.GET.get('searchKey')
  404. if role is not None:
  405. query = {'role': role}
  406. else:
  407. query = {}
  408. queryset = Feature.objects(**query).search(searchKey)
  409. total = queryset.count()
  410. return JsonOkResponse(
  411. payload = {
  412. 'dataList': [_.to_dict() for _ in queryset.paginate(pageIndex = pageIndex, pageSize = pageSize)],
  413. 'total': total
  414. }
  415. )
  416. @error_tolerate(nil = JsonErrorResponse(u'增加特性失败'), logger = logger)
  417. @permission_required(ROLE.supermanager)
  418. def addFeature(request):
  419. # type: (WSGIRequest)->JsonResponse
  420. try:
  421. Feature(**json.loads(request.body)).save()
  422. except NotUniqueError:
  423. return JsonErrorResponse(description = u'已有相同的角色+特性名,重复数据')
  424. return JsonOkResponse(description = u'添加成功')
  425. @error_tolerate(nil = JsonErrorResponse(u'编辑特性失败'), logger = logger)
  426. @permission_required(ROLE.supermanager)
  427. def editFeature(request):
  428. # type: (WSGIRequest)->JsonResponse
  429. payload = json.loads(request.body)
  430. id_ = payload.pop('id')
  431. feature = Feature.objects(id = str(id_)).get()
  432. result = feature.update(**payload)
  433. if not result:
  434. logger.error(u'{0!r} 编辑特性失败 id={1}'.format(request.user, id_))
  435. return JsonOkResponse(description = u'编辑成功')
  436. @error_tolerate(nil = JsonErrorResponse(u'删除特性失败'), logger = logger)
  437. @permission_required(ROLE.supermanager)
  438. def removeFeatures(request):
  439. # type: (WSGIRequest)->JsonResponse
  440. ids = json.loads(request.body)['ids']
  441. queryset = Feature.objects(id__in = ids) # type: CustomQuerySet
  442. deleted = queryset.delete()
  443. if not deleted:
  444. logger.error(u'{0!r} 删除特性失败 ids={1}'.format(request.user, ids))
  445. return JsonErrorResponse(description = u'删除特性失败')
  446. return JsonOkResponse(description = u'删除成功')
  447. def edit_feature(request, model):
  448. # type: (WSGIRequest, Any)->JsonResponse
  449. payload = json.loads(request.body)
  450. id_ = payload['id']
  451. featureList = payload.get('featureList', [])
  452. specialFeature = payload.get('specialFeature')
  453. user = model.objects(id = id_).first() # type: Union[Dealer, Agent, Manager]
  454. if not user:
  455. return JsonErrorResponse(description = u'未找到该用户')
  456. result = user.edit_feature_list(featureList, specialFeature)
  457. if result:
  458. return JsonOkResponse(description = u'编辑成功')
  459. else:
  460. return JsonErrorResponse(description = u'编辑不成功')
  461. @error_tolerate(nil = JsonErrorResponse(u'编辑特性失败'), logger = logger)
  462. @permission_required(ROLE.supermanager)
  463. def editAgentFeature(request):
  464. # type: (WSGIRequest)->JsonResponse
  465. """
  466. :param request:
  467. :return:
  468. """
  469. return edit_feature(request, Agent)
  470. @error_tolerate(nil = JsonErrorResponse(u'编辑特性失败'), logger = logger)
  471. @permission_required(ROLE.supermanager)
  472. def editDealerFeature(request):
  473. # type: (WSGIRequest)->JsonResponse
  474. """
  475. :param request:
  476. :return:
  477. """
  478. return edit_feature(request, Dealer)
  479. @error_tolerate(nil = JsonErrorResponse(u'编辑特性失败'), logger = logger)
  480. @permission_required(ROLE.supermanager)
  481. def editManagerFeature(request):
  482. # type: (WSGIRequest)->JsonResponse
  483. """
  484. :param request:
  485. :return:
  486. """
  487. return edit_feature(request, Manager)
  488. #########
  489. # Utils #
  490. #########
  491. @error_tolerate(nil = JsonErrorResponse(u'设备更换失败'), logger = logger)
  492. @permission_required(ROLE.supermanager)
  493. def replaceDevice(request):
  494. # type: (WSGIRequest)->JsonResponse
  495. """
  496. 调换设备
  497. 动机:
  498. 部分设备因各种原因退役,但是二维码已经贴在机器上,更换其设备,保持老的逻辑设备即可
  499. :param request:
  500. :return:
  501. """
  502. payload = json.loads(request.body)
  503. oldLogicalCode = payload['old']
  504. newLogicalCode = payload['new']
  505. key = 'device-replacement-{old}-{new}'.format(old = payload['old'], new = payload['new'])
  506. with memcache_lock(key, '1', expire = 60) as acquired:
  507. if acquired:
  508. logger.debug(
  509. '%r started a new device replacement, old=%s, new=%s' % (request.user, oldLogicalCode, newLogicalCode))
  510. try:
  511. Device.replace(oldLogicalCode, newLogicalCode, request.user)
  512. return JsonOkResponse(description = u'替换成功')
  513. except UserServerException as e:
  514. return JsonErrorResponse(description = e.message)
  515. else:
  516. return JsonErrorResponse(description = u'已经同一个替换在进行')
  517. @error_tolerate(nil = JsonErrorResponse(u'设备互换失败'), logger = logger)
  518. @permission_required(ROLE.supermanager)
  519. def swapDevice(request):
  520. # type: (WSGIRequest)->JsonResponse
  521. """
  522. 调换设备
  523. 动机:
  524. 部分设备因各种原因退役,但是二维码已经贴在机器上,更换其设备,保持老的逻辑设备即可
  525. :param request:
  526. :return:
  527. """
  528. payload = json.loads(request.body)
  529. left_lc = payload['left']
  530. right_lc = payload['right']
  531. key = 'device-swap-{left}-{right}'.format(left = left_lc, right = right_lc)
  532. with memcache_lock(key, '1', expire = 60) as acquired:
  533. if acquired:
  534. logger.debug('%r started a new device swap, old=%s, new=%s' % (request.user, left_lc, right_lc))
  535. try:
  536. Device.swap(left_lc, right_lc, request.user)
  537. return JsonOkResponse(description = u'互换成功')
  538. except UserServerException as e:
  539. return JsonErrorResponse(description = e.message)
  540. else:
  541. return JsonErrorResponse(description = u'已经同一个互换在进行')
  542. @error_tolerate(nil = JsonErrorResponse(u'撤销设备更换失败'), logger = logger)
  543. @permission_required(ROLE.supermanager)
  544. def rollbackDeviceReplacement(request):
  545. # type: (WSGIRequest)->JsonResponse
  546. """
  547. 回退调换设备操作
  548. :param request:
  549. :return:
  550. """
  551. payload = json.loads(request.body) if request.body else {}
  552. if 'id' not in payload:
  553. return JsonErrorResponse(description = u'ID未传入')
  554. replacement_id = payload['id']
  555. key = 'device-replacement-revoke-{id}'.format(id = replacement_id)
  556. with memcache_lock(key, '1', expire = 60) as acquired:
  557. if acquired:
  558. try:
  559. Device.rollback_replacement(replacement_id)
  560. return JsonResponse({'result': 1, 'payload': {}, 'description': u'回滚成功'})
  561. except UserServerException as e:
  562. return JsonErrorResponse(description = e.message)
  563. else:
  564. return JsonErrorResponse(description = u'已有同一个回滚操作正在运行')
  565. @error_tolerate(nil = JsonErrorResponse(u'获取设备更换记录失败'), logger = logger)
  566. @permission_required(ROLE.supermanager)
  567. def getDeviceReplacements(request):
  568. # type: (WSGIRequest)->JsonResponse
  569. """
  570. 获取设备更换记录
  571. :param request:
  572. :return:
  573. """
  574. pageIndex = int(request.GET.get('pageIndex', 1))
  575. pageSize = int(request.GET.get('pageSize', 10))
  576. replace_type = request.GET.get('replaceType', 'replace')
  577. replacements = DeviceReplacement.objects(replaceType = replace_type).paginate(pageIndex,
  578. pageSize) # type: Iterable[DeviceReplacement]
  579. return JsonResponse(
  580. {
  581. 'result': 1,
  582. 'description': '',
  583. 'payload': {
  584. 'total': DeviceReplacement.objects().count(),
  585. 'dataList': [_.to_dict() for _ in replacements]
  586. }
  587. }
  588. )
  589. ##: 日志系统
  590. @error_tolerate(nil = JsonErrorResponse(u'获取网志失败'), logger = logger)
  591. @permission_required(ROLE.supermanager)
  592. def getWebLogs(request):
  593. # type: (WSGIRequest)->JsonResponse
  594. """
  595. 获取日志系统
  596. :param request:
  597. :return:
  598. """
  599. pageIndex = int(request.GET.get('pageIndex', 1))
  600. pageSize = int(request.GET.get('pageSize', 40))
  601. searchKey = request.GET.get('searchKey')
  602. logs = WebLog.objects().search(searchKey) \
  603. .order_by('-createdTime') \
  604. .paginate(pageIndex = pageIndex, pageSize = pageSize) # type: Iterable[WebLog]
  605. total = WebLog.objects().search(searchKey).count() # type: int
  606. return JsonResponse(
  607. {
  608. 'result': 1,
  609. 'description': '',
  610. 'payload':
  611. {
  612. 'dataList': [_.to_dict() for _ in logs],
  613. 'total': total
  614. }
  615. }
  616. )
  617. @error_tolerate(nil = JsonErrorResponse(u'添加日志失败'), logger = logger)
  618. @permission_required(ROLE.supermanager)
  619. def addWebLog(request):
  620. # type: (WSGIRequest)->JsonResponse
  621. """
  622. 添加超级管理员日志
  623. :param request:
  624. :return:
  625. """
  626. currentSuperManagerId = ObjectId(request.user.id)
  627. payload = json.loads(request.body)
  628. payload['superManagerId'] = currentSuperManagerId
  629. WebLog(**payload).save()
  630. return JsonResponse({'result': 1, 'description': u'添加成功'})
  631. @error_tolerate(nil = JsonErrorResponse(u'编辑日志失败'), logger = logger)
  632. @permission_required(ROLE.supermanager)
  633. def editWebLog(request):
  634. # type: (WSGIRequest)->JsonResponse
  635. """
  636. 编辑超级管理员日志
  637. :param request:
  638. :return:
  639. """
  640. payload = json.loads(request.body)
  641. log = WebLog.objects(id = payload['id']).get()
  642. updated = log.update(**payload)
  643. if not updated:
  644. return JsonErrorResponse(description = u'编辑失败')
  645. else:
  646. return JsonResponse({'result': 1, 'description': u'编辑成功', 'payload': {}})
  647. @error_tolerate(nil = JsonErrorResponse(u'查询主设备类型失败'), logger = logger)
  648. @permission_required(ROLE.supermanager)
  649. def getMajorDeviceType(request):
  650. # type: (WSGIRequest)->JsonResponse
  651. """
  652. 查询主设备类型
  653. :param request:
  654. :return:
  655. """
  656. pageIndex = int(request.GET.get('pageIndex', 1))
  657. pageSize = int(request.GET.get('pageSize', 10))
  658. searchKey = request.GET.get('searchKey')
  659. types = MajorDeviceType.objects().search(searchKey).order_by('-createdTime').paginate(pageIndex, pageSize)
  660. return JsonResponse(
  661. {
  662. 'result': 1,
  663. 'payload':
  664. {
  665. 'total': MajorDeviceType.objects().count(),
  666. 'dataList': [{'name': _.name, 'createdTime': _.createdTime} for _ in types]
  667. }
  668. }
  669. )
  670. @error_tolerate(nil = JsonErrorResponse(u'添加主设备类型失败'), logger = logger)
  671. @permission_required(ROLE.supermanager)
  672. def addMajorDeviceType(request):
  673. # type: (WSGIRequest)->JsonResponse
  674. """
  675. :param request:
  676. :return:
  677. """
  678. payload = json.loads(request.body)
  679. try:
  680. MajorDeviceType(name = payload['name']).save()
  681. except NotUniqueError:
  682. return JsonErrorResponse(description = u'该主设备类型名称已经存在')
  683. return JsonResponse({'result': 1, 'description': '', 'payload': ''})
  684. @require_GET
  685. @error_tolerate(nil = JsonErrorResponse(u'获取地址类型失败'), logger = logger)
  686. @permission_required(ROLE.supermanager)
  687. def getAddressType(request):
  688. # type: (WSGIRequest)->JsonResponse
  689. """
  690. :param request:
  691. :return:
  692. """
  693. pageIndex = int(request.GET.get('pageIndex', 1))
  694. pageSize = int(request.GET.get('pageSize', 10))
  695. addressTypes = AddressType.objects.all().order_by('-showWeight')
  696. dataList = [
  697. {
  698. 'value': addressType.value,
  699. 'name': addressType.label,
  700. 'count': addressType.showWeight,
  701. 'createdTime': addressType.createdAt
  702. } for addressType in addressTypes
  703. ]
  704. return JsonResponse(
  705. {
  706. 'result': 1,
  707. 'description': '',
  708. 'payload':
  709. {
  710. 'dataList': dataList[(pageIndex - 1) * pageSize: pageIndex * pageSize],
  711. 'total': len(dataList)
  712. }
  713. }
  714. )
  715. @require_POST
  716. @error_tolerate(nil = JsonErrorResponse(u'添加地址类型失败'), logger = logger)
  717. @permission_required(ROLE.supermanager)
  718. def addAddressType(request):
  719. payload = json.loads(request.body)
  720. try:
  721. obj = AddressType(value = payload['value'], label = payload['name'],
  722. showWeight = payload.get('showWeight', 0)).save()
  723. obj.save()
  724. except NotUniqueError:
  725. return JsonErrorResponse(description = u'添加地址类型失败')
  726. return JsonResponse({'result': 1, 'description': u'添加成功', 'payload': {}})
  727. @require_GET
  728. @error_tolerate(nil = JsonErrorResponse(u'获取代理商列表失败'), logger = logger)
  729. @permission_required(ROLE.supermanager)
  730. def getAgentsDetailList(request):
  731. # type: (WSGIRequest)->JsonResponse
  732. """
  733. :param request:
  734. :return:
  735. """
  736. page_index = int(request.GET.get('pageIndex', 1))
  737. page_size = int(request.GET.get('pageSize', 10))
  738. search_key = request.GET.get('searchKey')
  739. manager_id = request.GET.get('managerId')
  740. moniAppId = request.GET.get('moniAppId', None)
  741. total, items = Agent.filter(manager_id = manager_id, search_key = search_key, page_index = page_index,
  742. page_size = page_size, moniAppId = moniAppId,
  743. shadow = (not request.user.universal_password_login))
  744. return JsonOkResponse(
  745. payload =
  746. {
  747. 'total': total,
  748. 'dataList': items
  749. }
  750. )
  751. @require_GET
  752. @error_tolerate(nil = JsonErrorResponse(u'获取经销商列表失败'), logger = logger)
  753. @permission_required(ROLE.supermanager)
  754. def getDealerDetailList(request):
  755. # type: (WSGIRequest)->JsonResponse
  756. """
  757. :param request:
  758. :return:
  759. """
  760. pageIndex = int(request.GET.get('pageIndex', 1))
  761. pageSize = int(request.GET.get('pageSize', 10))
  762. searchKey = request.GET.get('searchKey')
  763. managerId = request.GET.get('managerId')
  764. agentId = request.GET.get('agentId')
  765. forceFollowGzh = request.GET.get('forceFollowGzh', None)
  766. devCountMin = request.GET.get('devCountMin', None)
  767. devCountMax = request.GET.get('devCountMax', None)
  768. query = {}
  769. # if all([managerId is None, agentId is None]) or not ((managerId is None) ^ (agentId is None)):
  770. # return JsonErrorResponse(description=u'代理商ID和厂商ID只能传递一个')
  771. if managerId is not None:
  772. agentIds = [str(_.id) for _ in Agent.objects(managerId = managerId)]
  773. query['agentId__in'] = agentIds
  774. if agentId is not None:
  775. query['agentId'] = agentId
  776. if forceFollowGzh:
  777. query['forceFollowGzh'] = forceFollowGzh
  778. if devCountMin:
  779. query['devCount__gte'] = devCountMin
  780. if devCountMax:
  781. query['devCount__lte'] = devCountMax
  782. dealers = Dealer.objects(**query).search(searchKey)
  783. total = dealers.count() # type: int
  784. pageAgentIds = []
  785. dealerList = []
  786. for dealer in dealers.order_by('-createdTime').paginate(pageIndex = pageIndex, pageSize = pageSize):
  787. dealerList.append(dealer)
  788. pageAgentIds.append(dealer.agentId)
  789. agentMap = {
  790. str(agent.id): agent # '%s - %s' % (agent.username, agent.nickname)
  791. for agent in Agent.objects(id__in = pageAgentIds)
  792. }
  793. def transform(_):
  794. agent = agentMap[_['agentId']]
  795. _['agentInfo'] = '%s-%s' % (agent.username, agent.nickname)
  796. return _
  797. dataList = []
  798. for dealer in dealerList:
  799. agent = agentMap.get(dealer.agentId)
  800. data = dealer.to_dict(shadow = (not request.user.universal_password_login))
  801. moniAppName = MoniApp.get_app_by_agent(str(agent.id)) # type: moniAppName
  802. data.update(
  803. {
  804. 'productName': agent.productName,
  805. 'moniAppName': moniAppName.appName if moniAppName else "",
  806. 'agentForceFollowGzh': agent.forceFollowGzh,
  807. 'devCount': dealer.devCount,
  808. 'agentInfo': '%s-%s' % (agent.username, agent.nickname),
  809. 'maxPackagePrice': float(str(dealer.maxPackagePrice))
  810. }
  811. )
  812. dataList.append(data)
  813. return JsonOkResponse(
  814. payload =
  815. {
  816. 'total': total,
  817. 'dataList': dataList
  818. }
  819. )
  820. @require_POST
  821. @error_tolerate(nil = JsonErrorResponse(u'封禁/解封失败'), logger = logger)
  822. def toggleDealerStatus(request):
  823. # type: (WSGIRequest)->JsonResponse
  824. """
  825. :param request:
  826. :return:
  827. """
  828. payload = json.loads(request.body) # type: dict
  829. dealer_id = payload.get('id')
  830. normal = payload.get('normal')
  831. if dealer_id is None or normal is None:
  832. return JsonErrorResponse(description = u'dealer id 或 normal 为空')
  833. else:
  834. dealer = Dealer.objects(id = ObjectId(dealer_id)).first()
  835. if not dealer:
  836. return JsonErrorResponse(description = u'找不到经销商')
  837. status = 'abnormal' if not normal else 'normal'
  838. updated = dealer.update(status = status)
  839. if not updated:
  840. return JsonErrorResponse(description = u'更新失败')
  841. else:
  842. return JsonOkResponse()
  843. @require_POST
  844. @error_tolerate(nil = JsonErrorResponse(u'封禁/解封失败'), logger = logger)
  845. def toggleDealerWithdrawStatus(request):
  846. # type: (WSGIRequest)->JsonResponse
  847. """
  848. :param request:
  849. :return:
  850. """
  851. payload = json.loads(request.body) # type: dict
  852. dealer_id = payload.get('dealer_id')
  853. noWithdraw = payload.get('noWithdraw')
  854. if dealer_id is None or noWithdraw is None:
  855. return JsonErrorResponse(description = u'dealer id 或 noWithdraw 为空')
  856. else:
  857. dealer = Dealer.objects(id = ObjectId(dealer_id)).first()
  858. if not dealer:
  859. return JsonErrorResponse(description = u'找不到经销商')
  860. status = 'normal' if not noWithdraw else 'noWithdraw'
  861. updated = dealer.update(status = status)
  862. if not updated:
  863. return JsonErrorResponse(description = u'更新失败')
  864. else:
  865. return JsonOkResponse()
  866. @require_POST
  867. @error_tolerate(nil = JsonErrorResponse(u'编辑广告开关失败'), logger = logger)
  868. @permission_required(ROLE.supermanager)
  869. def editAdShow(request):
  870. # type: (WSGIRequest)->JsonResponse
  871. """
  872. :param request:
  873. :return:
  874. """
  875. payload = json.loads(request.body) # type: dict
  876. def handle_manager(ids, adShow):
  877. # type:(List[str], bool)->bool
  878. Manager.get_collection().update_many(
  879. {'_id': {'$in': [ObjectId(_) for _ in ids]}},
  880. {'$set': {'adShow': adShow}})
  881. agents = Agent.get_collection().find({'managerId': {'$in': ids}})
  882. handle_agent([str(_['_id']) for _ in agents], adShow)
  883. return True
  884. def handle_agent(ids, adShow):
  885. # type:(List[str], bool)->bool
  886. Agent.get_collection().update_many(
  887. {'_id': {'$in': [ObjectId(_) for _ in ids]}},
  888. {'$set': {'adShow': adShow}})
  889. dealers = Dealer.get_collection().find({'agentId': {'$in': ids}})
  890. handle_dealer([str(_['_id']) for _ in dealers], adShow)
  891. return True
  892. def handle_dealer(ids, adShow):
  893. # type:(List[str], bool)->bool
  894. map(lambda _: Dealer.invalid_cache(_), ids)
  895. Dealer.get_collection().update_many(
  896. {'_id': {'$in': [ObjectId(_) for _ in ids]}},
  897. {'$set': {'adShow': adShow}})
  898. return True
  899. handler_map = {
  900. 'manager': handle_manager,
  901. 'agent': handle_agent,
  902. 'dealer': handle_dealer
  903. } # type: Dict[str, Callable]
  904. updated = handler_map[payload['role']](payload['ids'], adShow = payload['adShow'])
  905. if updated:
  906. return JsonOkResponse()
  907. else:
  908. return JsonErrorResponse(description = u'更新失败')
  909. @require_POST
  910. @error_tolerate(nil = JsonErrorResponse(u'编辑流量费用失败'), logger = logger)
  911. @permission_required(ROLE.supermanager)
  912. def setTrafficCardCost(request):
  913. # type: (WSGIRequest)->JsonResponse
  914. """
  915. :param request:
  916. :return:
  917. """
  918. payload = json.loads(request.body) # type: dict
  919. ids = payload.get('ids', [])
  920. cost = payload.get('cost')
  921. if cost is None or not ids:
  922. return JsonErrorResponse(description = u'设置错误,代理商ID列表为空或成本没传入')
  923. if RMB(cost) < RMB(0):
  924. return JsonErrorResponse(description = u'流量卡年费成本价格必须大于0')
  925. updated = Agent.objects(id__in = ids).update(set__trafficCardCost = RMB(cost).mongo_amount)
  926. if updated:
  927. return JsonOkResponse()
  928. else:
  929. return JsonErrorResponse(description = u'更新失败')
  930. @require_POST
  931. @error_tolerate(nil = JsonErrorResponse(u'编辑用户信息失败'), logger = logger)
  932. @permission_required(ROLE.supermanager)
  933. def editUserInfo(request):
  934. # type: (WSGIRequest)->JsonResponse
  935. """
  936. :param request:
  937. :return:
  938. """
  939. payload = json.loads(request.body) # type: dict
  940. id_ = payload.get('id')
  941. role = payload.get('role')
  942. info = payload.get('info', {})
  943. if role == 'dealer':
  944. updated = Dealer.objects(id = id_).update(**info)
  945. elif role == 'agent':
  946. updated = Agent.objects(id = id_).update(**info)
  947. else:
  948. return JsonErrorResponse(description = u'不支持编辑的角色')
  949. if updated:
  950. return JsonOkResponse(description = u'编辑成功')
  951. else:
  952. return JsonErrorResponse(description = u'编辑失败')
  953. # Commands
  954. @require_GET
  955. @error_tolerate(nil = JsonErrorResponse(u'获取命令列表失败'), logger = logger)
  956. @permission_required(ROLE.supermanager)
  957. def getDeviceCommands(request):
  958. # type: (WSGIRequest)->JsonResponse
  959. """
  960. :param request:
  961. :return:
  962. """
  963. pageIndex = int(request.GET.get("pageIndex"))
  964. pageSize = int(request.GET.get("pageSize"))
  965. searchKey = request.GET.get('searchKey')
  966. field = request.GET.get('field')
  967. if searchKey and field:
  968. field = None if field == "*" else field
  969. querySet = DeviceCommand.objects.search(searchKey, fields = [field])
  970. else:
  971. querySet = DeviceCommand.objects
  972. total = querySet.count()
  973. dataList = list()
  974. for _item in querySet.paginate(pageIndex, pageSize):
  975. dataList.append(_item.to_dict())
  976. return JsonOkResponse(payload = {"dataList": dataList, "total": total})
  977. @require_POST
  978. @error_tolerate(nil = JsonErrorResponse(u'添加命令失败'), logger = logger)
  979. @permission_required(ROLE.supermanager)
  980. def addDeviceCommand(request):
  981. # type: (WSGIRequest)->JsonResponse
  982. """
  983. :param request:
  984. :return:
  985. """
  986. payload = json.loads(request.body)
  987. params = payload.pop("params", None)
  988. command = DeviceCommand(**payload)
  989. if params:
  990. commandParams = [DeviceCommandParam(**_item) for _item in params]
  991. command.params = commandParams
  992. command.save()
  993. return JsonOkResponse(description = u"命令添加成功")
  994. @require_POST
  995. @error_tolerate(nil = JsonErrorResponse(u'编辑命令失败'), logger = logger)
  996. @permission_required(ROLE.supermanager)
  997. def editDeviceCommand(request):
  998. # type: (WSGIRequest)->JsonResponse
  999. """
  1000. :param request:
  1001. :return:
  1002. """
  1003. payload = json.loads(request.body)
  1004. commandId = payload.pop("id")
  1005. updated = DeviceCommand.objects.filter(id = commandId).update(**payload)
  1006. if updated:
  1007. return JsonOkResponse(description = u"命令更新成功")
  1008. else:
  1009. return JsonErrorResponse(description = u'编辑命令更新失败')
  1010. @require_POST
  1011. @error_tolerate(nil = JsonErrorResponse(u'删除命令失败'), logger = logger)
  1012. @permission_required(ROLE.supermanager)
  1013. def deleteDeviceCommand(request):
  1014. # type: (WSGIRequest)->JsonResponse
  1015. """
  1016. :param request:
  1017. :return:
  1018. """
  1019. payload = json.loads(request.body) if request.body else {}
  1020. result = DeviceCommand.objects(id__in = payload['ids']).delete()
  1021. if result:
  1022. return JsonOkResponse()
  1023. else:
  1024. return JsonErrorResponse(description = u'删除失败')
  1025. @error_tolerate(nil = JsonErrorResponse(u'获取地图失败'), logger = logger)
  1026. @permission_required(ROLE.supermanager)
  1027. def getDevMapChart(request):
  1028. # type: (WSGIRequest)->JsonResponse
  1029. return JsonOkResponse(payload = {'dataList': []})
  1030. @error_tolerate(nil = JsonErrorResponse(u'获取收入趋势失败'), logger = logger)
  1031. @permission_required(ROLE.supermanager)
  1032. def getIncomeTrend(request):
  1033. return JsonOkResponse(payload = {'dataList': []})
  1034. @error_tolerate(nil = JsonErrorResponse(u'获取设备类型统计失败'), logger = logger)
  1035. @permission_required(ROLE.supermanager)
  1036. def getDeviceTypeStatistics(request):
  1037. return JsonOkResponse(payload = {'dataList': []})
  1038. @error_tolerate(nil = JsonErrorResponse(u'获取经销商收入和失败'), logger = logger)
  1039. @permission_required(ROLE.supermanager)
  1040. def getDealerIncomeTotalTop(request):
  1041. return JsonOkResponse(payload = {'dataList': []})
  1042. @error_tolerate(nil = JsonErrorResponse(u'获取用户趋势失败'), logger = logger)
  1043. @permission_required(ROLE.supermanager)
  1044. def getAllUserTrend(request):
  1045. return JsonOkResponse(payload = {'dataList': []})
  1046. @error_tolerate(nil = JsonErrorResponse(u'获取设备注册趋势失败'), logger = logger)
  1047. @permission_required(ROLE.supermanager)
  1048. def getDeviceRegTrend(request):
  1049. return JsonOkResponse(payload = {'dataList': []})
  1050. @error_tolerate(nil = JsonErrorResponse(u'获取反馈趋势失败'), logger = logger)
  1051. @permission_required(ROLE.supermanager)
  1052. def getAllFeedbackTrend(request):
  1053. return JsonOkResponse(payload = {'dataList': []})
  1054. @error_tolerate(nil = JsonErrorResponse(u'获取提现记录失败'), logger = logger)
  1055. @permission_required(ROLE.supermanager)
  1056. def getWithdrawTrend(request):
  1057. return JsonOkResponse(payload = {'dataList': []})
  1058. # noinspection PyUnresolvedReferences
  1059. @error_tolerate(nil = JsonErrorResponse(u'导入sim卡数据失败'), logger = logger)
  1060. @permission_required(ROLE.supermanager)
  1061. def importSim(request):
  1062. current_user = request.user # type: SuperManager
  1063. def get_offline_task_name(task_type, user, source):
  1064. # type: (basestring, SuperManager, str)->basestring
  1065. now_time = datetime.datetime.now()
  1066. tmp_list = [task_type, user.username, source, now_time.strftime('%Y-%m-%d %H:%M:%S'),
  1067. str(utils_datetime.generate_timestamp_ex())]
  1068. return '-'.join(tmp_list)
  1069. payload = json.loads(request.body)
  1070. excel_file = payload.get('file')
  1071. source = payload.get('source')
  1072. offline_task_name = get_offline_task_name(
  1073. task_type = OfflineTaskType.IMPORT_SIM_CARD,
  1074. user = current_user,
  1075. source = source)
  1076. offline_task = OfflineTask.issue(offline_task_name = offline_task_name,
  1077. process_func_name = 'import_simcard_excel_to_db',
  1078. task_type = OfflineTaskType.IMPORT_SIM_CARD,
  1079. userid = str(current_user.id),
  1080. role = ROLE.supermanager)
  1081. task_caller(offline_task.process_func_name,
  1082. offline_task_id = str(offline_task.id),
  1083. excelFile = excel_file,
  1084. source = source)
  1085. return JsonResponse({
  1086. 'result': 1,
  1087. 'description': u'成功创建任务,请您在sim卡任务管理中,查看任务执行情况',
  1088. 'payload': {
  1089. 'offline_task_id': str(offline_task.id)
  1090. }})
  1091. @error_tolerate(nil = JsonErrorResponse(u'查询sim卡数据失败'), logger = logger)
  1092. @permission_required(ROLE.supermanager)
  1093. def getSimCardList(request):
  1094. pageIndex = int(request.GET.get('pageIndex', 1))
  1095. pageSize = int(request.GET.get('pageSize', 10))
  1096. startTimeStr = request.GET.get('startTime', None)
  1097. endTimeStr = request.GET.get('endTime', None)
  1098. searchType = request.GET.get('searchType', '')
  1099. searchKey = request.GET.get('searchKey', '')
  1100. simCardSource = request.GET.get('simCardSource', '')
  1101. startTime = datetime.datetime.strptime(startTimeStr + ' 00:00:00', "%Y-%m-%d %H:%M:%S")
  1102. endTime = datetime.datetime.strptime(endTimeStr + ' 23:59:59', "%Y-%m-%d %H:%M:%S")
  1103. queryArr = ['expireTime__gte=startTime', 'expireTime__lte=endTime']
  1104. if searchType == 'IMSI' and searchKey != '':
  1105. queryArr.append('imsi=searchKey')
  1106. elif searchType == 'ICCID' and searchKey != '':
  1107. queryArr.append('iccid=searchKey')
  1108. else:
  1109. pass
  1110. if simCardSource != '':
  1111. queryArr.append('supplier=searchKey')
  1112. query = ','.join(queryArr)
  1113. ss = eval('SIMCard.objects({})'.format(query))
  1114. dataList = []
  1115. for _ in ss.paginate(pageIndex, pageSize):
  1116. device = Device.objects(iccid = _.iccid).first()
  1117. if device is not None:
  1118. dealer = Dealer.objects(id = device.ownerId).first()
  1119. logicalCode = device.logicalCode
  1120. if dealer is not None:
  1121. dealerStr = dealer.nickname + '_' + dealer.username + '_' + device.ownerId
  1122. agent = Agent.objects(id = dealer.agentId).first()
  1123. if agent is not None:
  1124. agentStr = agent.nickname + '_' + agent.username + '_' + dealer.agentId
  1125. manager = Manager.objects(id = agent.managerId).first()
  1126. if manager is not None:
  1127. managerStr = manager.nickname + '_' + manager.username + '_' + agent.managerId
  1128. else:
  1129. managerStr = ''
  1130. else:
  1131. agentStr = ''
  1132. managerStr = ''
  1133. else:
  1134. dealerStr = ''
  1135. agentStr = ''
  1136. managerStr = ''
  1137. else:
  1138. logicalCode = ''
  1139. dealerStr = ''
  1140. agentStr = ''
  1141. managerStr = ''
  1142. dataList.append({
  1143. 'imsi': _.imsi,
  1144. 'iccid': _.iccid,
  1145. 'simCardBrand': _.supplier,
  1146. 'expireDate': _.expireTime,
  1147. 'logicalCode': logicalCode,
  1148. 'dealerStr': dealerStr,
  1149. 'agentStr': agentStr,
  1150. 'managerStr': managerStr
  1151. })
  1152. return JsonResponse({'result': 1, 'description': '', 'payload': {'total': ss.count(), 'dataList': dataList}})
  1153. @error_tolerate(nil = DefaultJsonErrorResponse)
  1154. @permission_required(ROLE.supermanager)
  1155. def getOfflineTaskList(request):
  1156. # type: (WSGIRequest)->JsonResponse
  1157. """
  1158. 获取离线任务列表
  1159. :param request:
  1160. :return:
  1161. """
  1162. current_user = request.user # type: SuperManager
  1163. page_index = int(request.GET.get('pageIndex', 1))
  1164. page_size = int(request.GET.get('pageSize', 10))
  1165. search_key = request.GET.get('searchKey', None)
  1166. tasks = OfflineTask.objects(ownerId = current_user.id,
  1167. role = current_user.role).search(search_key).order_by('-dateTimeAdded')
  1168. total = tasks.count()
  1169. return JsonOkResponse(
  1170. payload = {
  1171. 'dataList': [t.to_dict() for t in tasks.paginate(pageSize = page_size, pageIndex = page_index)],
  1172. 'total': total
  1173. })
  1174. @error_tolerate(nil = DefaultJsonErrorResponse)
  1175. @permission_required(ROLE.supermanager)
  1176. def getOfflineTaskStatus(request):
  1177. # type: (WSGIRequest)->JsonResponse
  1178. task_id = request.GET.get('id')
  1179. if not task_id:
  1180. return JsonErrorResponse(description = u'查询ID为空')
  1181. task = OfflineTask.objects(id = str(task_id)).get() # type: OfflineTask
  1182. return JsonOkResponse(payload = task.status)
  1183. # noinspection PyUnresolvedReferences
  1184. @error_tolerate(nil = JsonErrorResponse(u'导入sim卡数据失败'), logger = logger)
  1185. @permission_required(ROLE.supermanager)
  1186. def exportExcel(request):
  1187. super_manager = request.user # type: SuperManager
  1188. def get_offline_task_name(task_type, user, **kwargs):
  1189. # type: (basestring, SuperManager, Dict)->basestring
  1190. tmp_list = [task_type, user.username]
  1191. if kwargs['simCardSource'] and kwargs['simCardSource']:
  1192. tmp_list.append(kwargs['simCardSource'])
  1193. tmp_list.append(u'%s至%s' % (kwargs['startTimeStr'], kwargs['endTimeStr']))
  1194. tmp_list.append(str(utils_datetime.generate_timestamp_ex()))
  1195. return '-'.join(tmp_list).replace("/", "_")
  1196. query_dict = {
  1197. 'startTimeStr': request.GET.get('startTime', None),
  1198. 'endTimeStr': request.GET.get('endTime', None),
  1199. 'searchKey': request.GET.get('searchKey', ''),
  1200. 'searchType': request.GET.get('searchType', ''),
  1201. 'simCardSource': request.GET.get('simCardSource', '')
  1202. }
  1203. offline_task_name = get_offline_task_name(
  1204. task_type = OfflineTaskType.EXPORT_SIM_CARD,
  1205. user = super_manager,
  1206. **query_dict)
  1207. file_path, offline_task = OfflineTask.issue_export_report(offline_task_name = offline_task_name,
  1208. process_func_name = 'export_simcard_excel_from_db',
  1209. task_type = OfflineTaskType.EXPORT_SIM_CARD,
  1210. userid = str(super_manager.id),
  1211. role = ROLE.supermanager)
  1212. task_caller(func_name = str(offline_task.process_func_name),
  1213. offline_task_id = str(offline_task.id),
  1214. filepath = file_path,
  1215. queryDict = query_dict)
  1216. return JsonResponse({
  1217. 'result': 1,
  1218. 'description': u"请前往离线任务查看任务处理情况",
  1219. 'payload': str(offline_task.id)
  1220. })
  1221. @error_tolerate(nil = JsonErrorResponse(u'导出设备数据失败'), logger = logger)
  1222. @permission_required(ROLE.supermanager)
  1223. def exportDevice(request):
  1224. super_manager = request.user # type: SuperManager
  1225. def get_offline_task_name(task_type, user, **kwargs):
  1226. # type: (basestring, SuperManager, Dict)->basestring
  1227. tmp_list = [task_type, user.username]
  1228. tmp_list.append(u'设备信息')
  1229. tmp_list.append(str(utils_datetime.generate_timestamp_ex()))
  1230. return '-'.join(tmp_list).replace("/", "_")
  1231. query_dict = {
  1232. 'logicalCodeList': list(set(request.GET.getlist('logicalCodeList', None)))
  1233. }
  1234. offline_task_name = get_offline_task_name(
  1235. task_type = OfflineTaskType.EXPORT_DEVICE,
  1236. user = super_manager,
  1237. **query_dict)
  1238. file_path, offline_task = OfflineTask.issue_export_report(offline_task_name = offline_task_name,
  1239. process_func_name = 'export_device_excel_from_db',
  1240. task_type = OfflineTaskType.EXPORT_DEVICE,
  1241. userid = str(super_manager.id),
  1242. role = ROLE.supermanager)
  1243. task_caller(func_name = str(offline_task.process_func_name),
  1244. offline_task_id = str(offline_task.id),
  1245. filepath = file_path,
  1246. queryDict = query_dict)
  1247. return JsonResponse({
  1248. 'result': 1,
  1249. 'description': u"请前往离线任务查看任务处理情况",
  1250. 'payload': str(offline_task.id)
  1251. })
  1252. @error_tolerate(nil = JsonErrorResponse(u'查询管理日志失败'), logger = logger)
  1253. @permission_required(ROLE.supermanager)
  1254. def getAdminLog(request):
  1255. pageIndex = int(request.GET.get('pageIndex', 1))
  1256. pageSize = int(request.GET.get('pageSize', 10))
  1257. startTime = request.GET.get('startTime', None)
  1258. endTime = request.GET.get('endTime', None)
  1259. searchKey = request.GET.get('searchKey', '')
  1260. return JsonResponse({'result': 1, 'description': '', 'payload': {'total': 0, 'dataList': []}})
  1261. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  1262. @permission_required(ROLE.supermanager)
  1263. def getAliApp(request):
  1264. # type: (WSGIRequest)->JsonResponse
  1265. """
  1266. 更改微信资金平台APP信息
  1267. :param request:
  1268. :return:
  1269. """
  1270. appid = str(request.GET.get('appid'))
  1271. app = AliApp.objects(appid = appid).first() # type: AliApp
  1272. if not app:
  1273. return JsonOkResponse(payload = {})
  1274. else:
  1275. return JsonOkResponse(payload = app.to_dict())
  1276. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  1277. @permission_required(ROLE.supermanager)
  1278. def bindAliApp(request):
  1279. # type: (WSGIRequest)->JsonResponse
  1280. """
  1281. 绑定自定义支付宝
  1282. :param request:
  1283. :return:
  1284. """
  1285. payload = json.loads(request.body) # type: dict
  1286. return api.bindAliApp(payload)
  1287. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  1288. @permission_required(ROLE.supermanager)
  1289. def bindWechatFund(request):
  1290. # type: (WSGIRequest)->JsonResponse
  1291. """
  1292. 绑定自定义微信公众号
  1293. :param request:
  1294. :return:
  1295. """
  1296. payload = json.loads(request.body) # type: dict
  1297. return api.bindWechatFund(payload)
  1298. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  1299. @permission_required(ROLE.supermanager)
  1300. def bindWechatCust(request):
  1301. # type: (WSGIRequest)->JsonResponse
  1302. """
  1303. 绑定自定义微信公众号
  1304. :param request:
  1305. :return:
  1306. """
  1307. payload = json.loads(request.body) # type: dict
  1308. return api.bindWechatCust(payload)
  1309. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  1310. @permission_required(ROLE.supermanager)
  1311. def getWechatFundApp(request):
  1312. # type: (WSGIRequest)->JsonResponse
  1313. """
  1314. 更改微信资金平台APP信息
  1315. :param request:
  1316. :return:
  1317. """
  1318. appid = request.GET.get('appid')
  1319. mchid = request.GET.get('mchid')
  1320. app = WechatPayApp.objects(appid = appid, mchid = mchid).first() # type: WechatPayApp
  1321. if not app:
  1322. return JsonOkResponse(payload = {})
  1323. else:
  1324. return JsonOkResponse(payload = app.to_dict())
  1325. @error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
  1326. @permission_required(ROLE.supermanager)
  1327. def sendCommand(request):
  1328. # type: (WSGIRequest)->JsonResponse
  1329. """
  1330. :param request:
  1331. :return:
  1332. """
  1333. payload = json.loads(request.body)
  1334. devNo = payload.get("devNo")
  1335. cmdID = payload.get("id")
  1336. params = payload.get("params", list())
  1337. dev = Device.get_dev(devNo)
  1338. if not dev:
  1339. return JsonErrorResponse(u"设备获取失败,请尝试重新发送指令")
  1340. command = DeviceCommand.objects.filter(id = cmdID, role = request.user.role).first()
  1341. if not command:
  1342. return JsonErrorResponse(u"命令获取失败,请尝试重新发送指令")
  1343. try:
  1344. commandDict = command.package_command(dev, params)
  1345. except Exception as e:
  1346. logger.exception(u"dev <{}>, command <{}> , package command error <{}>".format(devNo, cmdID, e))
  1347. return JsonErrorResponse(u"命令发送失败,请尝试重新发送指令")
  1348. cmd = commandDict.get("cmd")
  1349. try:
  1350. result = MessageSender.send(dev, cmd = cmd, payload = commandDict, timeout = 20)
  1351. if result.get("rst") == -1:
  1352. raise ManagerServiceTimeOutException()
  1353. if result.get("rst") == 1:
  1354. raise ManagerServiceSerialException()
  1355. except ServiceException as se:
  1356. return JsonErrorResponse(description = se.result.get("description"))
  1357. except Exception as e:
  1358. logger.exception('failed to send command, error = %s where command was %s' % (e, str(command)))
  1359. return JsonErrorResponse(description = u"指令发送异常")
  1360. return JsonResponse({'result': 1, 'description': u'发送成功', 'payload': json.dumps(result)})
  1361. @error_tolerate(nil = DefaultJsonErrorResponse)
  1362. @permission_required(ROLE.supermanager)
  1363. def getCommandByDevice(request):
  1364. # type: (WSGIRequest)->JsonResponse
  1365. """
  1366. :param request:
  1367. :return:
  1368. """
  1369. logicalCode = request.GET.get('logicalCode')
  1370. commands = DeviceCommand.common_and_type_specific(
  1371. logicalCode = logicalCode,
  1372. commander = request.user
  1373. )
  1374. return JsonResponse({
  1375. 'result': 1,
  1376. 'description': '',
  1377. 'payload': {"dataList": commands}
  1378. })
  1379. @error_tolerate(nil = DefaultJsonErrorResponse)
  1380. @permission_required(ROLE.supermanager)
  1381. def getSimDetail(request):
  1382. # type: (WSGIRequest)->JsonResponse
  1383. """
  1384. :param request:
  1385. :return:
  1386. """
  1387. iccid = request.GET.get('iccid')
  1388. if not iccid:
  1389. return JsonResponse({'result': 0, 'description': u'ICCID不合法', 'payload': ''})
  1390. sim = SIMCard.objects().filter(iccid = iccid).first() # type: SIMCard
  1391. if not sim:
  1392. payload = {
  1393. }
  1394. else:
  1395. payload = {
  1396. 'iccid': sim.iccid,
  1397. 'imsi': sim.imsi,
  1398. 'supplier': sim.supplier,
  1399. 'activeTime': sim.activeTime,
  1400. 'expireTime': sim.expireTime,
  1401. 'chargeTime': sim.chargeTime
  1402. }
  1403. if (not payload) or (payload['supplier'] == 'qiben'):
  1404. try:
  1405. response = SimManager().get_card_list(begin_iccid = iccid, end_iccid = iccid, card_type = 2)
  1406. if len(response['records']) > 0:
  1407. record = response['records'][0]
  1408. payload.update({
  1409. 'qiben_openCardTime': record['openCardTime'],
  1410. 'qiben_activateTime': record['activateTime'],
  1411. 'qiben_packageTime': record['packageTime'],
  1412. 'qiben_totalFlow': record['totalFlow'],
  1413. 'qiben_cardFlow': record['cardFlow'],
  1414. 'qiben_leftFlow': record['leftFlow'],
  1415. 'qiben_cardStatus': record['cardStatus']
  1416. })
  1417. except Exception as e:
  1418. logger.exception(e)
  1419. return JsonResponse({
  1420. 'result': 1,
  1421. 'description': '',
  1422. 'payload': payload
  1423. })
  1424. @error_tolerate(logger = logger, nil = JsonErrorResponse(u'二维码文件存储失败,请重新试试'))
  1425. @permission_required(ROLE.supermanager)
  1426. def uploadMoniQrcode(request):
  1427. # type: (WSGIRequest)->JsonResponse
  1428. files = request.FILES.getlist('file')
  1429. if not len(files):
  1430. return JsonResponse({'result': 0, 'description': u'未找到上传的二维码文件,请重新试试', 'payload': ''})
  1431. uploader = AliOssFileUploader(inputFile = request.FILES.getlist('file')[0], uploadType = 'qrcode')
  1432. logger.info('[uploadMoniQrcode] %s is being used' % (repr(uploader),))
  1433. try:
  1434. outputUrl = uploader.upload()
  1435. return JsonResponse({'result': 1, 'description': '', 'payload': outputUrl})
  1436. except InvalidFileSize, e:
  1437. logger.info(
  1438. '%s(id=%s)\'s uploaded file reached limit' % (request.user.__class__.__name__, str(request.user.id),))
  1439. return JsonResponse({'result': 0, 'description': e.message, 'payload': {}})
  1440. except InvalidFileName, e:
  1441. logger.info(
  1442. '%s(id=%s)\'s uploaded file name is not legal' % (request.user.__class__.__name__, str(request.user.id),))
  1443. return JsonResponse({'result': 0, 'description': e.message, 'payload': {}})
  1444. @error_tolerate(nil = DefaultJsonErrorResponse)
  1445. @permission_required(ROLE.supermanager)
  1446. def getMoniApps(request):
  1447. pageIndex = int(request.GET.get('pageIndex', 1))
  1448. pageSize = int(request.GET.get('pageSize', 40))
  1449. objs = MoniApp.objects.all()
  1450. dataList = []
  1451. total = objs.count()
  1452. for obj in objs.paginate(pageIndex = pageIndex, pageSize = pageSize):
  1453. dataList.append({
  1454. 'appName': obj.appName,
  1455. 'appId': obj.appId,
  1456. 'rawAppId': obj.rawAppId,
  1457. 'secret': obj.secret,
  1458. 'appType': obj.appType,
  1459. 'priority': obj.priority,
  1460. 'status': obj.status,
  1461. 'desc': obj.desc,
  1462. 'title': obj.title,
  1463. 'maxDayAddingCount': obj.maxDayAddingCount
  1464. })
  1465. return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
  1466. def createMenu(appId, secret):
  1467. grzx = {
  1468. 'type': 'view',
  1469. 'name': u'个人中心',
  1470. 'url': "http://www.washpayer.com/user/moniUserAccess?moniAppId=%s&redirect=%s" % (appId, 'gerenzhongxin')
  1471. }
  1472. dangqianfuwu = {
  1473. 'type': 'view',
  1474. 'name': u'当前服务',
  1475. 'url': "http://www.washpayer.com/user/moniUserAccess?moniAppId=%s&redirect=%s" % (appId, 'dangqianfuwu')
  1476. }
  1477. changjianwenti = {
  1478. 'type': 'view',
  1479. 'name': u'常见问题',
  1480. 'url': "http://www.washpayer.com/user/moniUserAccess?moniAppId=%s&redirect=%s" % (appId, 'changjianwenti')
  1481. }
  1482. baogaolaoban = {
  1483. 'type': 'view',
  1484. 'name': u'报告老板',
  1485. 'url': "http://www.washpayer.com/user/moniUserAccess?moniAppId=%s&redirect=%s" % (appId, 'baogaolaoban')
  1486. }
  1487. toushushouli = {
  1488. 'type': 'view',
  1489. 'name': u'投诉受理',
  1490. 'url': "http://www.washpayer.com/user/moniUserAccess?moniAppId=%s&redirect=%s" % (appId, 'toushushouli')
  1491. }
  1492. menu = {
  1493. "button":
  1494. [
  1495. {
  1496. "name": u"服务&投诉",
  1497. "sub_button": [dangqianfuwu, changjianwenti, baogaolaoban, toushushouli]
  1498. },
  1499. {
  1500. "type": "scancode_push",
  1501. "name": u"扫一扫",
  1502. "key": "rselfmenu_0_1",
  1503. "sub_button": []
  1504. },
  1505. grzx
  1506. ]
  1507. }
  1508. app = WechatAuthApp(appid = appId, secret = secret)
  1509. proxy = WechatClientProxy(app)
  1510. proxy.client.menu.create(menu)
  1511. @error_tolerate(nil = DefaultJsonErrorResponse)
  1512. @permission_required(ROLE.supermanager)
  1513. def editMoniApp(request):
  1514. payload = json.loads(request.body)
  1515. appId = payload.get('appId', None)
  1516. if appId is None:
  1517. MoniApp.get_collection().insert(payload)
  1518. # 如果是新增加,需要生成菜单
  1519. createMenu(appId, payload['secret'])
  1520. else:
  1521. MoniApp.get_collection().update({'appId': appId}, {'$set': payload}, upsert = True)
  1522. return JsonOkResponse()
  1523. @error_tolerate(nil = DefaultJsonErrorResponse)
  1524. @permission_required(ROLE.supermanager)
  1525. def deleteMoniApp(request):
  1526. payload = json.loads(request.body)
  1527. appIds = payload.get('ids', None)
  1528. MoniApp.get_collection().remove({'appId': {'$in': appIds}})
  1529. return JsonOkResponse()
  1530. @error_tolerate(nil = DefaultJsonErrorResponse)
  1531. @permission_required(ROLE.supermanager)
  1532. def addMoniAppToAgents(request):
  1533. payload = json.loads(request.body)
  1534. agentIds = [ObjectId(_) for _ in payload.get('agentIds', [])]
  1535. moniAppIds = payload.get('moniAppIds', [])
  1536. agents = Agent.objects.filter(id__in = agentIds)
  1537. for agent in agents:
  1538. for appId in moniAppIds:
  1539. if appId not in agent.moniAppList:
  1540. agent.moniAppList.append(appId)
  1541. agent.save()
  1542. return JsonOkResponse()
  1543. @error_tolerate(nil = DefaultJsonErrorResponse)
  1544. @permission_required(ROLE.supermanager)
  1545. def removeMoniAppFromAgents(request):
  1546. payload = json.loads(request.body)
  1547. agentIds = [ObjectId(_) for _ in payload.get('agentIds', [])]
  1548. moniAppId = payload.get('moniAppId', None)
  1549. if moniAppId is None:
  1550. return JsonErrorResponse(description = u'未传入moni appId')
  1551. agents = Agent.objects.filter(id__in = agentIds)
  1552. for agent in agents:
  1553. if moniAppId in agent.moniAppList:
  1554. agent.moniAppList.remove(moniAppId)
  1555. agent.save()
  1556. return JsonOkResponse()
  1557. @error_tolerate(nil = DefaultJsonErrorResponse)
  1558. @permission_required(ROLE.supermanager)
  1559. def queryAgentsForMoniApp(request):
  1560. page_index = int(request.GET.get('pageIndex', 1))
  1561. page_size = int(request.GET.get('pageSize', 10))
  1562. moniAppId = request.GET.get('moniAppId', None)
  1563. if moniAppId is None:
  1564. return JsonErrorResponse(description = u'未传入moni appId')
  1565. total, items = Agent.filter(moniAppList = moniAppId, page_index = page_index,
  1566. page_size = page_size)
  1567. return JsonOkResponse(
  1568. payload =
  1569. {
  1570. 'total': total,
  1571. 'dataList': items
  1572. }
  1573. )
  1574. @error_tolerate(nil = DefaultJsonErrorResponse)
  1575. @permission_required(ROLE.supermanager)
  1576. def getCheckPointForAgent(request):
  1577. agentId = request.GET.get('agentId')
  1578. agent = Agent.objects.get(id = agentId)
  1579. pointDict = agent.moniAppCheckPointDict
  1580. return JsonOkResponse(payload = {'data': pointDict})
  1581. @error_tolerate(nil = DefaultJsonErrorResponse)
  1582. @permission_required(ROLE.supermanager)
  1583. def getCheckPointForDealer(request):
  1584. dealerId = request.GET.get('dealerId')
  1585. dealer = Dealer.objects.get(id = dealerId)
  1586. agent = Agent.objects.get(id = dealer.agentId)
  1587. return JsonOkResponse(
  1588. payload = {'dealerData': dealer.moniAppCheckPointDict, 'agentData': agent.moniAppCheckPointDict})
  1589. @error_tolerate(nil = DefaultJsonErrorResponse)
  1590. @permission_required(ROLE.supermanager)
  1591. def setCheckPointForAgents(request):
  1592. payload = json.loads(request.body)
  1593. agentIds = [ObjectId(_) for _ in payload.get('agentIds', [])]
  1594. pointDict = payload.get('pointDict')
  1595. agents = Agent.objects.filter(id__in = agentIds)
  1596. for agent in agents:
  1597. agent.moniAppCheckPointDict = pointDict
  1598. agent.save()
  1599. return JsonOkResponse()
  1600. @error_tolerate(nil = DefaultJsonErrorResponse)
  1601. @permission_required(ROLE.supermanager)
  1602. def setCheckPointForDealers(request):
  1603. payload = json.loads(request.body)
  1604. dealerIds = [ObjectId(_) for _ in payload.get('dealerIds', [])]
  1605. pointDict = payload.get('pointDict')
  1606. dealers = Dealer.objects.filter(id__in = dealerIds)
  1607. for dealer in dealers:
  1608. dealer.moniAppCheckPointDict = pointDict
  1609. dealer.save()
  1610. return JsonOkResponse()
  1611. def getMoniPointList(request):
  1612. pageIndex = int(request.GET.get('pageIndex', 1))
  1613. pageSize = int(request.GET.get('pageSize', 10))
  1614. objs = MoniAppPoint.objects.all()
  1615. dataList = [{'id': str(obj.id), 'key': obj.key, 'desc': obj.desc, 'name': obj.name} for obj in
  1616. objs.paginate(pageIndex = pageIndex, pageSize = pageSize)]
  1617. return JsonOkResponse(payload = {'dataList': dataList, 'total': objs.count()})
  1618. def editMoniPoint(request):
  1619. payload = json.loads(request.body)
  1620. objId = payload.get('id', None)
  1621. if objId is None:
  1622. MoniAppPoint.get_collection().insert(payload)
  1623. else:
  1624. MoniAppPoint.get_collection().update({'_id': ObjectId(objId)}, {
  1625. '$set': {'name': payload['name'], 'key': payload['key'], 'desc': payload['desc']}}, upsert = True)
  1626. return JsonOkResponse()
  1627. def deleteMoniPoint(request):
  1628. payload = json.loads(request.body)
  1629. ids = [ObjectId(_) for _ in payload.get('ids', [])]
  1630. MoniAppPoint.get_collection().remove({'_id': {'$in': ids}})
  1631. return JsonOkResponse()
  1632. def editMoniAppForAgents(request):
  1633. payload = json.loads(request.body)
  1634. agentIds = [ObjectId(_) for _ in payload.get('agentIds', [])]
  1635. moniApps = payload.get('moniApp')
  1636. agents = Agent.objects.filter(id__in = agentIds)
  1637. for agent in agents:
  1638. for moniApp in moniApps:
  1639. if moniApp['switch'] and (moniApp['appId'] not in agent.moniAppList):
  1640. agent.moniAppList.append(moniApp['appId'])
  1641. elif (not moniApp['switch']) and (moniApp['appId'] in agent.moniAppList):
  1642. agent.moniAppList.remove(moniApp['appId'])
  1643. agent.save()
  1644. return JsonOkResponse()
  1645. def editMoniPointForAgents(request):
  1646. payload = json.loads(request.body)
  1647. agentIds = [ObjectId(_) for _ in payload.get('agentIds', [])]
  1648. points = payload.get('moniPoint')
  1649. agents = Agent.objects.filter(id__in = agentIds)
  1650. for agent in agents:
  1651. for point in points:
  1652. agent.moniAppCheckPointDict.update({point['key']: point['switch']})
  1653. agent.save()
  1654. return JsonOkResponse()
  1655. def editMoniPointForDealers(request):
  1656. payload = json.loads(request.body)
  1657. dealerIds = [ObjectId(_) for _ in payload.get('dealerIds', [])]
  1658. points = payload.get('moniPoint')
  1659. dealers = Dealer.objects.filter(id__in = dealerIds)
  1660. for dealer in dealers:
  1661. for point in points:
  1662. dealer.moniAppCheckPointDict.update({point['key']: point['switch']})
  1663. dealer.save()
  1664. return JsonOkResponse()
  1665. def editDealerFollowGzh(request):
  1666. payload = json.loads(request.body)
  1667. dealerIds = [ObjectId(_) for _ in payload.get('ids', [])]
  1668. forceFollowGzh = payload.get('forceFollowGzh', 'agent')
  1669. if forceFollowGzh != 'never':
  1670. dealers = Dealer.objects.filter(id__in = dealerIds, forceFollowGzh__ne = 'never')
  1671. else:
  1672. dealers = Dealer.objects.filter(id__in = dealerIds)
  1673. needDealerIds = []
  1674. for dealer in dealers:
  1675. # 如果代理商已经never了,这里不允许更新
  1676. agent = Agent.objects.get(id = dealer.agentId)
  1677. if agent.forceFollowGzhForDealer == 'never':
  1678. continue
  1679. needDealerIds.append(dealer.id)
  1680. Dealer.get_collection().update({'_id': {'$in': needDealerIds}}, {'$set': {'forceFollowGzh': forceFollowGzh}},
  1681. multi = True)
  1682. return JsonOkResponse()
  1683. # def editDealerFollowGzh(request):
  1684. # payload = json.loads(request.body)
  1685. # dealerIds = [ObjectId(_) for _ in payload.get('ids',[])]
  1686. # forceFollowGzh = payload.get('forceFollowGzh','agent')
  1687. # Dealer.get_collection().update({'_id':{'$in':dealerIds}},{'$set':{'forceFollowGzh':forceFollowGzh}},multi = True)
  1688. # return JsonOkResponse()
  1689. #### FAQ
  1690. @error_tolerate(nil = DefaultJsonErrorResponse)
  1691. @permission_required(ROLE.supermanager)
  1692. def getFAQDetailList(request):
  1693. # type: (WSGIRequest)->JsonResponse
  1694. """
  1695. 超级管理员获取FAQ列表
  1696. :param request:
  1697. :return:
  1698. """
  1699. faqs = FAQ.objects(managerId = '')
  1700. return JsonResponse(
  1701. {
  1702. 'result': 1,
  1703. 'description': None,
  1704. 'payload': {
  1705. 'dataList': [faq.to_dict() for faq in faqs]
  1706. }
  1707. }
  1708. )
  1709. @error_tolerate(nil = DefaultJsonErrorResponse)
  1710. @permission_required(ROLE.supermanager)
  1711. def addFAQ(request):
  1712. # type: (WSGIRequest)->JsonResponse
  1713. payload = json.loads(request.body)
  1714. payload.update({'managerId': ''})
  1715. faq = FAQ(**payload).save()
  1716. return JsonResponse(
  1717. {
  1718. 'result': 1 if faq else 0,
  1719. 'description': None,
  1720. 'payload': {}
  1721. }
  1722. )
  1723. @error_tolerate(nil = DefaultJsonErrorResponse)
  1724. @permission_required(ROLE.supermanager)
  1725. def editFAQ(request):
  1726. # type: (WSGIRequest)->JsonResponse
  1727. payload = json.loads(request.body)
  1728. updated = FAQ.objects(id = str(payload['id'])).update(**payload)
  1729. return JsonResponse(
  1730. {
  1731. 'result': 1 if updated else 0,
  1732. 'description': None,
  1733. 'payload': {}
  1734. }
  1735. )
  1736. @error_tolerate(nil = DefaultJsonErrorResponse)
  1737. @permission_required(ROLE.supermanager)
  1738. def deleteFAQ(request):
  1739. # type: (WSGIRequest)->JsonResponse
  1740. ids = json.loads(request.body)['ids']
  1741. map(lambda _: _.delete(), FAQ.objects(id__in = ids))
  1742. return JsonResponse({'result': 1, 'description': '', 'payload': {}})
  1743. @error_tolerate(nil = DefaultJsonErrorResponse)
  1744. @permission_required(ROLE.supermanager)
  1745. def editAgentForceFollowGzh(request):
  1746. payload = json.loads(request.body)
  1747. agentStrIds = payload.get('ids', [])
  1748. ids = [ObjectId(_) for _ in agentStrIds]
  1749. forceFollowGzhForDealer = payload.get('forceFollowGzhForDealer', 'free')
  1750. forceFollowGzh = True if payload.get('forceFollowGzh', 'no') == 'yes' else False
  1751. # 先把代理商的统一修改掉
  1752. Agent.get_collection().update({'id': {'$in': ids}}, {'$set': {'forceFollowGzh': forceFollowGzh}}, multi = True)
  1753. # 经销商的,仅仅是把锁住的,全部解锁。或者全部加锁
  1754. if forceFollowGzhForDealer == 'free':
  1755. Dealer.get_collection().update({'agentId': {'$in': agentStrIds}, 'forceFollowGzh': 'never'},
  1756. {'$set': {'forceFollowGzh': 'free'}}, multi = True)
  1757. else:
  1758. Dealer.get_collection().update({'agentId': {'$in': agentStrIds}}, {'$set': {'forceFollowGzh': 'never'}},
  1759. multi = True)
  1760. if forceFollowGzh:
  1761. return JsonOkResponse(description = u'注意,如果打开代理商的强制关注,一定要在代理商系统把代理商的公众号相关信息,比如二维码、appId、secret相关信息配置OK')
  1762. return JsonOkResponse()
  1763. @error_tolerate(nil = DefaultJsonErrorResponse)
  1764. @trace_call(logger = logger)
  1765. @permission_required(ROLE.supermanager)
  1766. def getSignalTrendByDevice(request):
  1767. strStartTime = request.GET.get('startTime')
  1768. strEndTime = request.GET.get('endTime')
  1769. startTime = to_datetime(strStartTime)
  1770. endTime = to_datetime(strEndTime)
  1771. logicalCode = request.GET.get('logicalCode')
  1772. devNo = Device.get_devNo_by_logicalCode(logicalCode)
  1773. dataList = []
  1774. # 把redis的数据也补上去,然后重新排序,为的是防止数据库没有解析记录
  1775. nowTime = datetime.datetime.now()
  1776. tempStartTime = nowTime - datetime.timedelta(days = 7)
  1777. values = SignalManager.instence().get(devNo, tempStartTime, nowTime)
  1778. if values is not None:
  1779. for value in values:
  1780. timePoint = to_datetime(value['time'])
  1781. if timePoint >= startTime and timePoint <= endTime:
  1782. dataList.append('%s=%s' % (value['time'], value['signal']))
  1783. resultList = []
  1784. for data in dataList:
  1785. tempList = data.split('=')
  1786. resultList.append({
  1787. 'dateStr': tempList[0],
  1788. 'signal': tempList[1]
  1789. })
  1790. return JsonOkResponse(payload = {'dataList': resultList})
  1791. @error_tolerate(nil = DefaultJsonErrorResponse)
  1792. @permission_required(ROLE.supermanager)
  1793. def unLoginLock(request):
  1794. payload = json.loads(request.body)
  1795. role = payload['role']
  1796. if role == ROLE.dealer:
  1797. user = Dealer.objects(id = payload['id']).first() # type: UserSearchable
  1798. elif role == ROLE.agent:
  1799. user = Agent.objects(id = payload['id']).first() # type: UserSearchable
  1800. elif role == ROLE.manager or ROLE.manufacturer: # 传过来的字段不一样 constant里面加了一个字段manufacturer 做容错
  1801. user = Manager.objects(id = payload['id']).first() # type: UserSearchable
  1802. else:
  1803. return JsonErrorResponse(description = u'无效的用户类型')
  1804. if not user:
  1805. return JsonErrorResponse(description = u'找不到该用户,请刷新后再试')
  1806. user.unlock_login()
  1807. return JsonOkResponse(description = u'解锁成功')
  1808. @error_tolerate(nil = DefaultJsonErrorResponse)
  1809. @permission_required(ROLE.supermanager)
  1810. def unlockRegisterLimit(request):
  1811. payload = json.loads(request.body)
  1812. dealer = Dealer.objects(id = payload['id']).first()
  1813. if dealer is None:
  1814. return JsonErrorResponse(description = u'不存在的经销商')
  1815. serviceCache.delete('dealer_{}_registerEquipment_{}'.format(str(dealer.id), datetime.datetime.now().strftime(Const.DATE_FMT)))
  1816. return JsonOkResponse(description = u'解锁成功')
  1817. @error_tolerate(nil = DefaultJsonErrorResponse)
  1818. @permission_required(ROLE.supermanager)
  1819. def queryExchangeOrder(request):
  1820. pageIndex = int(request.GET.get('pageIndex', 1))
  1821. pageSize = int(request.GET.get('pageSize', 10))
  1822. searchKey = request.GET.get('searchKey', '')
  1823. managerId = request.GET.get('managerId')
  1824. agentId = request.GET.get('agentId')
  1825. dealerId = request.GET.get('dealerId')
  1826. query = {}
  1827. if managerId is not None:
  1828. query['factoryId'] = ObjectId(managerId)
  1829. if agentId is not None:
  1830. query['agentId'] = ObjectId(agentId)
  1831. if dealerId is not None:
  1832. query['ownerId'] = ObjectId(dealerId)
  1833. orders = ExchangeOrder.objects(**query).search(searchKey).order_by('-dateTimeAdded')
  1834. total = orders.count() # type: int
  1835. dataList = []
  1836. for order in orders.paginate(pageIndex = pageIndex, pageSize = pageSize):
  1837. data = {}
  1838. dealer = Dealer.objects.get(id = order.ownerId)
  1839. agent = Agent.objects.get(id = order.agentId)
  1840. factory = Manager.objects.get(id = order.factoryId)
  1841. data['dealerInfo'] = u'%s:%s' % (dealer.username, dealer.nickname)
  1842. data['agentInfo'] = u'%s:%s' % (agent.productName, agent.nickname)
  1843. data['factoryInfo'] = u'%s' % (factory.brandName)
  1844. data['logicalCode'] = order.logicalCode
  1845. objs = Part.objects.filter(id__in = order.parts)
  1846. data['parts'] = [{'partName': obj.partName, 'registerTime': obj.dateTimeAdded.strftime(Const.DATETIME_FMT),
  1847. 'expiredTime': obj.expiredTime.strftime(Const.DATETIME_FMT), 'SN': obj.partNo} for obj in
  1848. objs]
  1849. data['statusInfo'] = order.make_status_info()
  1850. data['pics'] = order.pics
  1851. data['id'] = str(order.id)
  1852. data['dateTimeAdded'] = order.dateTimeAdded.strftime(Const.DATETIME_FMT)
  1853. data['factoryOrderNo'] = order.factoryOrderNo
  1854. data['dealerOrderNo'] = order.dealerOrderNo
  1855. data['factoryAddr'] = order.factoryAddr
  1856. data['dealerAddr'] = order.dealerAddr
  1857. data['dealerWords'] = order.dealerWords
  1858. data['factoryWords'] = order.factoryWords
  1859. data['more'] = order.more
  1860. dataList.append(data)
  1861. return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
  1862. @error_tolerate(nil = DefaultJsonErrorResponse)
  1863. @permission_required(ROLE.supermanager)
  1864. def operateOrder(request):
  1865. payload = json.loads(request.body)
  1866. orderId = payload['id']
  1867. cmd = payload['status']
  1868. factoryOrderNo = payload.get('factoryOrderNo', '')
  1869. order = ExchangeOrder.objects.get(id = orderId)
  1870. logicalCode = order.logicalCode
  1871. dev = Device.get_dev_by_l(logicalCode)
  1872. group = Group.get_group(groupId = dev['groupId'])
  1873. if cmd == 'agree':
  1874. if order.factoryStatus in ['sended', 'closed']:
  1875. return JsonErrorResponse(description = u'当前维护单已经走下去了,不需要再同意了')
  1876. else:
  1877. order.factoryStatus = 'agreed'
  1878. order.save()
  1879. elif cmd == 'disagree':
  1880. if order.factoryStatus in ['sended', 'closed']:
  1881. return JsonErrorResponse(description = u'当前维护单已经走下去了,不需要再同意了')
  1882. else:
  1883. order.factoryStatus = 'disagreed'
  1884. order.save()
  1885. elif cmd == 'close':
  1886. if order.factoryStatus == 'closed':
  1887. pass
  1888. elif order.dealerStatus == 'created' or order.factoryStatus != 'sended':
  1889. return JsonErrorResponse(description = u'经销商必须把有问题的产品寄回来,厂家必须把置换货发出去后,才允许关闭')
  1890. elif cmd == 'send':
  1891. if order.factoryStatus != 'agreed':
  1892. return JsonOkResponse(description = u'必须同意之后,才能够发货哦')
  1893. if not factoryOrderNo:
  1894. return JsonErrorResponse(description = u'需要输入发货快递单号')
  1895. order.factoryOrderNo = factoryOrderNo
  1896. order.save()
  1897. cmdDescDict = {'agree': u'同意换货', 'disagree': u'不同意换货', 'close': u'成功关闭', 'send': u'已经发货'}
  1898. titleDictList = [
  1899. {u'售后中心': cmdDescDict.get(cmd)},
  1900. {u'设备编号': logicalCode},
  1901. {u'地址名称': group["groupName"]}
  1902. ]
  1903. if cmd == 'send':
  1904. titleDictList.append({u'发货单号': factoryOrderNo})
  1905. dealer = Dealer.objects.get(id = order.ownerId)
  1906. partNames = [_.partName for _ in Part.objects.filter(id__in = order.parts)]
  1907. args = {
  1908. 'title': make_title_from_dict(titleDictList),
  1909. 'customer': u'%s\\n' % (dealer.nickname),
  1910. 'detail': u'质保换货,%s\\n' % u','.join(partNames),
  1911. 'person': u'售后中心\\n',
  1912. 'notifyTime': u'%s\\n' % datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  1913. 'remark': u'您可以在设备管理中,查看详细情况\\n' if cmd != 'send' else u'售后中心已经给您寄货,请您尽快把问题组件寄回给我们\\n'
  1914. }
  1915. if dealer.managerialOpenId:
  1916. task_caller('report_to_dealer_via_wechat', openId = dealer.managerialOpenId,
  1917. dealerId = str(dealer.id),
  1918. templateName = 'exchange_order_notify',
  1919. **args)
  1920. return JsonOkResponse()
  1921. @error_tolerate(nil = DefaultJsonErrorResponse)
  1922. @permission_required(ROLE.supermanager)
  1923. def updateMaintenanceInfo(request):
  1924. payload = json.loads(request.body)
  1925. orderId = payload['id']
  1926. factoryWords = payload['factoryWords']
  1927. more = payload['more']
  1928. factoryAddr = payload['factoryAddr']
  1929. order = ExchangeOrder.objects.get(id = orderId)
  1930. order.more = more
  1931. order.factoryWords = factoryWords
  1932. order.factoryAddr = factoryAddr
  1933. order.save()
  1934. return JsonOkResponse()
  1935. @error_tolerate(nil = DefaultJsonErrorResponse)
  1936. @permission_required(ROLE.supermanager)
  1937. def saveFactoryAddress(request):
  1938. payload = json.loads(request.body)
  1939. name = payload.get('name', None)
  1940. addr = payload.get('addr', None)
  1941. tel = payload.get('tel', None)
  1942. managerId = payload.get('managerId', None)
  1943. if (not name) or (not addr) or (not tel):
  1944. return JsonErrorResponse(description = u'名称、地址、电话都不允许为空')
  1945. manager = Manager.objects(id = managerId).get()
  1946. manager.expressAddr = {'name': name, 'addr': addr, 'tel': tel}
  1947. manager.save()
  1948. return JsonOkResponse()
  1949. @error_tolerate(nil = DefaultJsonErrorResponse)
  1950. @permission_required(ROLE.supermanager)
  1951. def clearDeviceCache(request):
  1952. payload = json.loads(request.body)
  1953. devNo = payload.get('devNo')
  1954. Device.invalid_all_cache(Device.get_dev(devNo))
  1955. return JsonOkResponse()
  1956. @error_tolerate(nil = DefaultJsonErrorResponse)
  1957. @permission_required(ROLE.supermanager)
  1958. def setDeviceDebug(request):
  1959. payload = json.loads(request.body)
  1960. devNo = payload.get('devNo')
  1961. debugFlag = payload.get('debugFlag', '')
  1962. device = Device.objects(devNo = devNo).first() # type: Device
  1963. device.debug = debugFlag
  1964. device.save()
  1965. Device.invalid_device_cache(devNo)
  1966. return JsonOkResponse()
  1967. @error_tolerate(nil = DefaultJsonErrorResponse)
  1968. @permission_required(ROLE.supermanager)
  1969. def changeDealerAnnualTrafficCost(request):
  1970. payload = json.loads(request.body)
  1971. ownerId = payload['ids'][0]
  1972. annualTrafficCost = payload['annualTrafficCost']
  1973. # todo 先单独给德力西改流量费做特殊处理
  1974. if annualTrafficCost < 15:
  1975. return JsonErrorResponse(description = u'DLX改流量费, 经销商最低流量费价格不能小于15')
  1976. dealer = Dealer.objects(id = ownerId).first()
  1977. dealer.annualTrafficCost = RMB(str(annualTrafficCost))
  1978. dealer.trafficCardCost = RMB(str(annualTrafficCost))
  1979. dealer.save()
  1980. ds = Device.objects(ownerId = ownerId)
  1981. for _ in ds:
  1982. _.trafficCardCost = None
  1983. _.annualTrafficCost = None
  1984. _.save()
  1985. Device.invalid_device_cache(_.devNo)
  1986. return JsonOkResponse(description = u'修改成功')
  1987. @error_tolerate(nil = DefaultJsonErrorResponse)
  1988. @permission_required(ROLE.supermanager)
  1989. def getDealerRechargeRecord(request):
  1990. searchType = request.GET['searchType']
  1991. searchKey = request.GET.get('searchKey')
  1992. pageIndex = int(request.GET.get('pageIndex', 1))
  1993. pageSize = int(request.GET.get('pageSize', 40))
  1994. if searchType == u'logicalCode':
  1995. orderNo = ''
  1996. logicalCode = searchKey
  1997. elif searchType == u'orderNo':
  1998. orderNo = searchKey
  1999. logicalCode = ''
  2000. else:
  2001. return JsonErrorResponse(description = u'请输入正确的查询条件')
  2002. dataList = []
  2003. if orderNo != '':
  2004. dealerRechargeRcds = DealerRechargeRecord.objects(orderNo = orderNo, status = 'Paid')
  2005. if dealerRechargeRcds.count() == 0:
  2006. return JsonErrorResponse(description = u'未付款或不存在的订单号')
  2007. elif logicalCode != '':
  2008. dealerRechargeRcds = DealerRechargeRecord.objects(name__contains = ' ' + logicalCode, status = 'Paid')
  2009. if dealerRechargeRcds.count() == 0:
  2010. return JsonErrorResponse(description = u'未付款或不存在的订单号')
  2011. else:
  2012. return JsonErrorResponse(description = u'请输入查询条件')
  2013. for _ in dealerRechargeRcds.paginate(pageIndex = pageIndex, pageSize = pageSize):
  2014. dealer = Dealer.objects(id = _.dealerId).first()
  2015. if dealer is None:
  2016. dealerStr = ''
  2017. else:
  2018. dealerStr = dealer.nickname + ' ' + dealer.username
  2019. dataList.append({
  2020. 'orderNo': _.orderNo,
  2021. 'dealerStr': dealerStr,
  2022. 'orderParams': _.attachParas,
  2023. 'simOrderDict': {
  2024. 'name': _.name
  2025. },
  2026. 'totalFee': str(float(_.totalFee) / 100),
  2027. 'dateTimeAdded': _.finishedTime.strftime('%Y-%m-%d %H:%M:%S')
  2028. })
  2029. return JsonOkResponse(payload = {'dataList': dataList})
  2030. @error_tolerate(nil = DefaultJsonErrorResponse)
  2031. @permission_required(ROLE.supermanager)
  2032. def refundDealerRecharge(request):
  2033. payload = json.loads(request.body)
  2034. refundMoney = RMB(payload.get('refundMoney', '0.0'))
  2035. if refundMoney <= RMB('0.0'):
  2036. return JsonErrorResponse(description = u'未知错误')
  2037. dealerRechargeRecord = DealerRechargeRecord.objects(orderNo = payload.get('orderNo', '')).first()
  2038. if dealerRechargeRecord is None:
  2039. return JsonErrorResponse(description = u'订单编号错误')
  2040. try:
  2041. refund_cash_to_dealer(dealerRechargeRecord, refundMoney)
  2042. except UserServerException as e:
  2043. return JsonErrorResponse(description = e.message)
  2044. except Exception as e:
  2045. return JsonErrorResponse(description = u'系统错误')
  2046. return JsonOkResponse()
  2047. @error_tolerate(nil = DefaultJsonErrorResponse)
  2048. @permission_required(ROLE.supermanager)
  2049. def manualRechargeSimCard(request):
  2050. payload = json.loads(request.body)
  2051. lList = payload['logicalCode']
  2052. if len(lList) == 0:
  2053. return JsonErrorResponse(description = u'没有选择设备编号')
  2054. dealerMap = {}
  2055. for device in Device.objects(logicalCode__in = lList):
  2056. if device.simStatus == SimStatus.Charged:
  2057. logger.debug('sim status of {} is charged.'.format(str(device)))
  2058. continue
  2059. if str(device.ownerId) in dealerMap:
  2060. dealer = dealerMap[str(device.ownerId)]
  2061. else:
  2062. dealer = Dealer.objects(id = device.ownerId).first()
  2063. dealerMap[str(device.ownerId)] = dealer
  2064. payment_gateway = get_manual_pay_gateway(dealer)
  2065. rcd = create_dealer_sim_charge_order(payment_gateway, dealer, [device], payType = "manual")
  2066. if not rcd:
  2067. return JsonErrorResponse(
  2068. description = u'创建订单失败,部分设备线下续费失败,请检查后重试(设备号{})。'.format(device.logicalCode))
  2069. rcd.succeed(rcd.orderNo)
  2070. device.simStatus = u'chargedUnupdated'
  2071. device.save()
  2072. Device.invalid_device_cache(device.devNo)
  2073. return JsonOkResponse()
  2074. @error_tolerate(nil = DefaultJsonErrorResponse)
  2075. @permission_required(ROLE.supermanager)
  2076. def querySupporters(request):
  2077. return JsonOkResponse()
  2078. @error_tolerate(logger = logger, nil = JsonErrorResponse(u"获取免责声明失败"))
  2079. @permission_required(ROLE.supermanager)
  2080. def getAgentDisclaimer(request):
  2081. """
  2082. 获取代理商的免责声明 内容
  2083. :param request:
  2084. :return:
  2085. """
  2086. agentId = request.GET.get("agentId", "")
  2087. agent = Agent.objects.get(id = agentId)
  2088. payload = {
  2089. "content": agent.disclaimerContent,
  2090. "version": agent.disclaimerVersion.split("_")[1],
  2091. "needDisclaimer": agent.needDisclaimer
  2092. }
  2093. return JsonOkResponse(payload = payload)
  2094. @error_tolerate(logger = logger, nil = JsonErrorResponse(u"设置免责声明失败"))
  2095. @permission_required(ROLE.supermanager)
  2096. def setAgentDisclaimer(request):
  2097. """
  2098. 设置代理商的免责声明 内容
  2099. :param request:
  2100. :return:
  2101. """
  2102. payload = json.loads(request.body)
  2103. agentId = payload.get("agentId")
  2104. needDisclaimer = payload.get("needDisclaimer")
  2105. disclaimerContent = payload.get("content")
  2106. version = payload.get("version")
  2107. agent = Agent.objects.get(id = agentId)
  2108. agent.update(needDisclaimer = needDisclaimer)
  2109. agent.disclaimerVersion = version
  2110. agent.disclaimerContent = disclaimerContent
  2111. return JsonOkResponse()
  2112. @error_tolerate(nil = DefaultJsonErrorResponse)
  2113. @permission_required(ROLE.supermanager)
  2114. def modifyDeviceCode(request):
  2115. payload = json.loads(request.body)
  2116. logicalCodes = payload.get('logicalCodeList', [])
  2117. code = payload.get('code')
  2118. if not logicalCodes:
  2119. return JsonErrorResponse(description='没有选中的设备')
  2120. if not code:
  2121. return JsonErrorResponse(description='code输入有误')
  2122. mark = None
  2123. deviceOwner = Device.get_dev_by_l(logicalCodes[0]).owner
  2124. model_device = Device.objects.filter(ownerId=str(deviceOwner.id), devType__code=code).order_by('-id').first()
  2125. if model_device:
  2126. devType = model_device.devType
  2127. washConfig = model_device.washConfig
  2128. otherConf = model_device.otherConf
  2129. logger.info(
  2130. 'washConfig=<{}> otherConf=<{}> devType=<{}> sync params tar=<{}>'.format(washConfig, otherConf, devType,
  2131. logicalCodes))
  2132. mark = 1
  2133. else:
  2134. devType = DeviceType.objects.filter(agentId=deviceOwner.agentId, code=code).first() # type: DeviceType
  2135. if devType:
  2136. package = deviceOwner.defaultWashConfig.get(str(devType.id))
  2137. if not package:
  2138. package = devType.package
  2139. washConfig = dict(map(lambda _: (str(package.index(_) + 1), _), package))
  2140. otherConf = {}
  2141. devType = devType.to_dict()
  2142. logger.info('washConfig=<{}> otherConf=<{}> devType=<{}> sync params!! tar=<{}>'.format(washConfig, otherConf, devType,logicalCodes))
  2143. mark = 2
  2144. else:
  2145. devType = DeviceType.objects.filter(code=code).first() # type: DeviceType
  2146. if devType:
  2147. devType = DeviceType.objects.create(**{
  2148. "role": "manager",
  2149. "online": devType.online,
  2150. "unit": devType.unit,
  2151. "stock": devType.stock,
  2152. "payableWhileBusy": devType.payableWhileBusy,
  2153. "displayCoinsSwitch": True,
  2154. "displayPriceSwitch": True,
  2155. "displayTimeSwitch": True,
  2156. "name": devType.name,
  2157. "package": devType.package,
  2158. "code": code,
  2159. "majorDeviceType": devType.majorDeviceType,
  2160. "devFeatures": getattr(devType, 'devFeatures', []),
  2161. "agentId": deviceOwner.agentId
  2162. })
  2163. else:
  2164. return JsonErrorResponse(description='没有这个code, 去手动添加操作')
  2165. washConfig = dict(map(lambda _: (str(package.index(_)+1), _), devType.package))
  2166. otherConf = {}
  2167. devType = devType.to_dict()
  2168. logger.info('washConfig=<{}> otherConf=<{}> devType=<{}> sync params!!! tar=<{}>'.format(washConfig, otherConf, devType,logicalCodes))
  2169. mark = 3
  2170. devNos = []
  2171. for _ in logicalCodes:
  2172. devNos.append(Device.get_dev_by_logicalCode(_).devNo)
  2173. Device.get_collection().update_one({'devNo': {'$in': devNos}}, {
  2174. '$set': {'devType': devType, 'washConfig': washConfig, 'otherConf': otherConf}})
  2175. Device.invalid_many_device_cache(devNos)
  2176. payload = {'devType': devType, 'washConfig': washConfig, 'otherConf': otherConf, 'logicalCodes': logicalCodes}
  2177. if mark == 1:
  2178. return JsonOkResponse(description='修改成功并与设备:{} 同步参数'.format(model_device.logicalCode), payload=payload)
  2179. elif mark == 2:
  2180. return JsonOkResponse(description='修改成功', payload=payload)
  2181. elif mark == 3:
  2182. return JsonOkResponse(description='修改成功, 并新增一个设备类型<devType: {}>'.format(devType['code']), payload=payload)
  2183. else:
  2184. return JsonErrorResponse(description='修改失败!, 去手动添加操作')
  2185. @error_tolerate(nil = DefaultJsonErrorResponse)
  2186. @permission_required(ROLE.supermanager)
  2187. def getUserComplaintList(request):
  2188. pageIndex = int(request.GET.get('pageIndex', 1)) - 1
  2189. pageSize = int(request.GET.get('pageSize', 10))
  2190. startTime = request.GET.get('startTime', None)
  2191. endTime = request.GET.get('endTime', None)
  2192. complaintId = request.GET.get('complaintId', None)
  2193. stateFilter = request.GET.get('stateFilter', None)
  2194. dataList = []
  2195. total = 0
  2196. if startTime is None and endTime is None and complaintId is None:
  2197. return JsonOkResponse(payload = {'total': total, 'dataList': dataList})
  2198. elif startTime is not None and endTime is not None and complaintId is None:
  2199. wxProvider = WechatServiceProvider.objects(mchid = '398254625').first() # type: WechatServiceProvider
  2200. wechatComplaintUtil = WechatComplaint(
  2201. mchid = wxProvider.mchid,
  2202. asn = wxProvider.apiclient_serial_number,
  2203. slk = wxProvider.sslKey)
  2204. try:
  2205. dataList = wechatComplaintUtil.query_complaint_list(dateStart = startTime, dateEnd = endTime,
  2206. pageIndex = pageIndex, pageSize = pageSize)
  2207. except Exception as e:
  2208. return JsonErrorResponse(description = u'查询条件错误, 不支持大于30天的间隔时间, 或是未知错误。')
  2209. if stateFilter is not None:
  2210. dataList1 = []
  2211. for _ in dataList:
  2212. if _['complaint_state'] == stateFilter:
  2213. dataList1.append(_)
  2214. return JsonOkResponse(payload = {'total': len(dataList1), 'dataList': dataList1})
  2215. return JsonOkResponse(payload = {'total': len(dataList), 'dataList': dataList})
  2216. elif complaintId is not None:
  2217. wxProvider = WechatServiceProvider.objects(mchid = '398254625').first() # type: WechatServiceProvider
  2218. wechatComplaintUtil = WechatComplaint(
  2219. mchid = wxProvider.mchid,
  2220. asn = wxProvider.apiclient_serial_number,
  2221. slk = wxProvider.sslKey)
  2222. dataList = [wechatComplaintUtil.query_complaint_details_from_id(complaintId)]
  2223. return JsonOkResponse(payload = {'total': 1, 'dataList': dataList})
  2224. else:
  2225. return JsonErrorResponse(description = u'查询条件不在业务范围内')
  2226. @error_tolerate(nil = DefaultJsonErrorResponse)
  2227. @permission_required(ROLE.supermanager)
  2228. def replyComplaint(request):
  2229. payload = json.loads(request.body)
  2230. complaintId = payload.get('complaint_id', '')
  2231. remark = payload.get('remark', '')
  2232. wxProvider = WechatServiceProvider.objects(mchid = '398254625').first() # type: WechatServiceProvider
  2233. wechatComplaintUtil = WechatComplaint(
  2234. mchid = wxProvider.mchid,
  2235. asn = wxProvider.apiclient_serial_number,
  2236. slk = wxProvider.sslKey)
  2237. result = wechatComplaintUtil.submit_complaint_reply(complaintId, remark)
  2238. if result == 204:
  2239. return JsonOkResponse(description = u'成功')
  2240. else:
  2241. return JsonErrorResponse(description = u'接口回复失败')
  2242. @error_tolerate(nil = DefaultJsonErrorResponse)
  2243. @permission_required(ROLE.supermanager)
  2244. def submitComplaint(request):
  2245. payload = json.loads(request.body)
  2246. complaintId = payload.get('complaint_id', '')
  2247. wxProvider = WechatServiceProvider.objects(mchid = '398254625').first() # type: WechatServiceProvider
  2248. wechatComplaintUtil = WechatComplaint(
  2249. mchid = wxProvider.mchid,
  2250. asn = wxProvider.apiclient_serial_number,
  2251. slk = wxProvider.sslKey)
  2252. result = wechatComplaintUtil.feedback_complaint_completed(complaintId)
  2253. if result == 204:
  2254. return JsonOkResponse(description = u'成功')
  2255. else:
  2256. return JsonErrorResponse(description = u'接口回复失败')
  2257. @error_tolerate(nil = DefaultJsonErrorResponse)
  2258. @permission_required(ROLE.supermanager)
  2259. def getMerchantInfo(request):
  2260. ownerId = request.GET.get("id")
  2261. dealer = Dealer.objects.get(id=ownerId)
  2262. merchant = MerchantSourceInfo.get_source_record(dealer) # type: MerchantSourceInfo
  2263. payload = {
  2264. "id": str(merchant.id), "merchantType": merchant.merchantType, "status": merchant.merchantStatus, "regEmail": merchant.regEmail, "merchantNo": merchant.merchantNo,
  2265. "errorMsg": merchant.errorDescription,
  2266. "subMerchantId": merchant.wxSource.subMerchantId, "applymentId": merchant.wxSource.applymentId, "createdTime": merchant.dateTimeAdded,
  2267. "updateTime": merchant.dateTimeUpdated, "certificate": merchant.get_certificate_info(), "settle": merchant.get_settlement_info(),
  2268. "business": merchant.get_business_info()
  2269. }
  2270. return JsonOkResponse(payload = payload)
  2271. @error_tolerate(nil = DefaultJsonErrorResponse)
  2272. @permission_required(ROLE.supermanager)
  2273. def wechatReplay(request):
  2274. merchant = MerchantSourceInfo.objects.get(id=request.GET["id"]) # type: MerchantSourceInfo
  2275. if merchant.merchantStatus in [
  2276. MerchantStatus.INIT, MerchantStatus.WAITING, MerchantStatus.FAIL,
  2277. MerchantStatus.CONFIRM, MerchantStatus.SUCCESS, MerchantStatus.AUTH_WAITING
  2278. ]:
  2279. return JsonErrorResponse(description=u"当前状态无需重新上传")
  2280. if merchant.merchantStatus == MerchantStatus.AUTH_SUCCESS:
  2281. return JsonErrorResponse(description=u"当前状态无需重新上传")
  2282. wxApplier = merchant.wxSource
  2283. if wxApplier.applymentId:
  2284. proxy = get_wechat_proxy()
  2285. proxy.cancel_merchant_apply(applyId=wxApplier.applymentId)
  2286. wxApplier.applymentId = ""
  2287. wxApplier.qrCodeData = ""
  2288. wxApplier.save()
  2289. merchant.status = int(MerchantStatus.CONFIRM)
  2290. merchant.save()
  2291. mer = MerchantSourceInfo.objects.get(id=merchant.id)
  2292. MerchantApplyProxy(mer).submit_wechat()
  2293. return JsonOkResponse()
  2294. @error_tolerate(nil = DefaultJsonErrorResponse)
  2295. @permission_required(ROLE.supermanager)
  2296. def refreshMerchantInfo(request):
  2297. _id = request.GET.get("id")
  2298. try:
  2299. merchant = MerchantSourceInfo.objects.get(id=_id)
  2300. except DoesNotExist:
  2301. return JsonErrorResponse(u"未查询到商户信息")
  2302. proxy = MerchantApplyProxy(merchant)
  2303. proxy.query_merchant_audit()
  2304. proxy.query_auth_audit()
  2305. return JsonOkResponse()
  2306. @error_tolerate(nil=DefaultJsonErrorResponse)
  2307. @permission_required(ROLE.supermanager)
  2308. def getMerchantLog(request):
  2309. """
  2310. 获取商户的日志申请记录
  2311. """
  2312. _id = request.GET.get('id')
  2313. pageIndex = request.GET.get("pageIndex", 1)
  2314. pageSize = request.GET.get("pageSize", 10)
  2315. dataList = list()
  2316. query = MerchantLog.objects.filter(merchantId=_id).order_by('-dateTimeAdded')
  2317. for log in query.paginate(pageIndex=pageIndex, pageSize=pageSize):
  2318. dataList.append(log.to_dict())
  2319. return JsonOkResponse(payload={"total": query.count(), "dataList": dataList})
  2320. @error_tolerate(nil = DefaultJsonErrorResponse)
  2321. @permission_required(ROLE.supermanager)
  2322. def rentDevice(request):
  2323. """
  2324. 出租设备
  2325. :param request:
  2326. :return:
  2327. """
  2328. payload = json.loads(request.body)
  2329. logicalCode = payload.get("logicalCode")
  2330. device = Device.objects.get(logicalCode = logicalCode)
  2331. try:
  2332. device.rent()
  2333. except RentDeviceError as renError:
  2334. return JsonErrorResponse(description = renError.message)
  2335. Device.invalid_device_cache(device.devNo)
  2336. return JsonOkResponse()
  2337. @error_tolerate(nil = DefaultJsonErrorResponse)
  2338. @permission_required(ROLE.supermanager)
  2339. def getInsuranceOrder(request):
  2340. """
  2341. 获取
  2342. :param request:
  2343. :return:
  2344. """
  2345. wxOrderNo = request.GET.get("outTradeNo")
  2346. if not wxOrderNo:
  2347. return JsonErrorResponse(u"请输入交易单号查询")
  2348. # 根据外部支付单号 找到唯一的支付订单
  2349. orders = RechargeRecord.objects.filter(wxOrderNo = wxOrderNo, via = 'insurance') # type: RechargeRecord
  2350. dataList = list()
  2351. for _order in orders:
  2352. _insuranceOrder = InsuranceOrder.objects.get(rechargeRcdId = _order.id)
  2353. _dealer = _insuranceOrder.dealer # type: DealerDict
  2354. _user = _insuranceOrder.user # type: MyUser
  2355. _group = _insuranceOrder.group # type: GroupDict
  2356. data = {
  2357. "id": _insuranceOrder.id,
  2358. "price": _insuranceOrder.money,
  2359. "dealerName": "{}".format(_dealer["nickname"], _dealer["username"]),
  2360. "devNo": _insuranceOrder.devNo,
  2361. "groupName": _group.groupName,
  2362. "logicalCode": _insuranceOrder.logicalCode,
  2363. "openId": _insuranceOrder.openId,
  2364. "userNickname": _user.nickname,
  2365. "startTime": _insuranceOrder.startTime,
  2366. "endTime": _insuranceOrder.endTime,
  2367. "via": _order.via,
  2368. "dateTimeAdded": _insuranceOrder.dateTimeAdded,
  2369. "refunded": not bool(_insuranceOrder.effective)
  2370. }
  2371. dataList.append(data)
  2372. return JsonOkResponse(payload = {"total": len(dataList), "dataList": dataList})
  2373. @error_tolerate(nil = DefaultJsonErrorResponse)
  2374. @permission_required(ROLE.supermanager)
  2375. def refundInsuranceOrder(request):
  2376. return JsonErrorResponse(u"保险产品已经下架")
  2377. @error_tolerate(nil = DefaultJsonErrorResponse)
  2378. @permission_required(ROLE.supermanager)
  2379. def setDealerMaxPackagePrice(request):
  2380. payload = json.loads(request.body)
  2381. dealerIds = payload.get('ids', [])
  2382. maxPackagePrice = payload.get('maxPackagePrice', 1)
  2383. if maxPackagePrice > 200:
  2384. return JsonErrorResponse(description = u'套餐金额过大')
  2385. if dealerIds == []:
  2386. return JsonErrorResponse(description = u'未选择经销商')
  2387. try:
  2388. for _ in dealerIds:
  2389. dealer = Dealer.objects(id = _).first()
  2390. if dealer is None:
  2391. continue
  2392. dealer.maxPackagePrice = RMB(int(maxPackagePrice))
  2393. dealer.save()
  2394. except Exception as e:
  2395. return JsonErrorResponse(description = u'未知错误')
  2396. return JsonOkResponse()
  2397. @error_tolerate(nil = DefaultJsonErrorResponse)
  2398. @permission_required(ROLE.supermanager)
  2399. def lockDeviceSimStatus(request):
  2400. payload = json.loads(request.body)
  2401. logicalCodes = payload.get('logicalCode', [])
  2402. if logicalCodes == []:
  2403. return JsonErrorResponse(description = u'未选择设备')
  2404. try:
  2405. for _ in logicalCodes:
  2406. device = Device.objects(logicalCode = _).first()
  2407. if device is None:
  2408. continue
  2409. device.simStatus = u'updated'
  2410. device.save()
  2411. Device.invalid_device_cache(device.devNo)
  2412. except Exception as e:
  2413. return JsonErrorResponse(description = u'未知错误')
  2414. return JsonOkResponse()
  2415. @error_tolerate(nil = DefaultJsonErrorResponse)
  2416. @permission_required(ROLE.supermanager)
  2417. def unlockDeviceSimStatus(request):
  2418. payload = json.loads(request.body)
  2419. logicalCodes = payload.get('logicalCode', [])
  2420. if logicalCodes == []:
  2421. return JsonErrorResponse(description = u'未选择设备')
  2422. try:
  2423. for _ in logicalCodes:
  2424. device = Device.objects(logicalCode = _).first()
  2425. if device is None:
  2426. continue
  2427. device.simStatus = u'chargedUnupdated'
  2428. device.save()
  2429. Device.invalid_device_cache(device.devNo)
  2430. except Exception as e:
  2431. return JsonErrorResponse(description = u'未知错误')
  2432. return JsonOkResponse()
  2433. @error_tolerate(nil = DefaultJsonErrorResponse)
  2434. @permission_required(ROLE.supermanager)
  2435. def showDeviceDevTypes(request):
  2436. payload = json.loads(request.body)
  2437. logicalCodes = payload.get('logicalCode', [])
  2438. if len(logicalCodes) != 1:
  2439. return JsonErrorResponse(description = u'设备选择有误')
  2440. logicalCode = logicalCodes[0]
  2441. device = Device.objects(logicalCode = logicalCode).first()
  2442. if device.ownerId == '':
  2443. return JsonErrorResponse(description = u'设备未注册')
  2444. dealer = Dealer.objects(id = device.ownerId).first()
  2445. if dealer is None:
  2446. return JsonErrorResponse(description = u'经销商不存在')
  2447. agentId = dealer.agentId
  2448. if agentId == '':
  2449. return JsonErrorResponse(description = u'代理商不存在, 系统异常')
  2450. dataList = [{
  2451. 'devTypeCode': _.code,
  2452. 'devTypeName': _.name,
  2453. 'devTypeId': str(_.id)
  2454. } for _ in DeviceType.objects(agentId = agentId)]
  2455. return JsonOkResponse(payload = {"total": len(dataList), "dataList": dataList})
  2456. @error_tolerate(nil = DefaultJsonErrorResponse)
  2457. @permission_required(ROLE.supermanager)
  2458. def changeDeviceDevType(request):
  2459. payload = json.loads(request.body)
  2460. logicalCodes = payload.get('logicalCode', [])
  2461. devTypeId = payload.get('devTypeId', '')
  2462. if len(logicalCodes) != 1:
  2463. return JsonErrorResponse(description = u'设备选择有误')
  2464. logicalCode = logicalCodes[0]
  2465. device = Device.objects(logicalCode = logicalCode).first()
  2466. devType = DeviceType.objects(id = devTypeId).first()
  2467. try:
  2468. Device.objects(logicalCode = logicalCode).update_one(upsert = False, **{'devType': devType.to_dict()})
  2469. except Exception as e:
  2470. return JsonErrorResponse(description = u'操作失败')
  2471. finally:
  2472. Device.invalid_device_cache(device.devNo)
  2473. return JsonOkResponse()
  2474. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"查询失败"))
  2475. @permission_required(ROLE.supermanager)
  2476. def getApiAppInfo(request):
  2477. """
  2478. 获取经销上API注册信息
  2479. """
  2480. dealerId = request.GET.get("dealerId")
  2481. dealer = Dealer.objects(id=dealerId).first()
  2482. if not dealer:
  2483. logger.error('dealer<id={}> is not exists.'.format(dealerId))
  2484. return JsonErrorResponse(description='经销商不存在')
  2485. apiInfo = dealer.api_app # type: ApiAppInfo
  2486. return JsonOkResponse(payload={
  2487. 'people': apiInfo.people,
  2488. 'tel': apiInfo.tel,
  2489. 'callbackUrl': apiInfo.callbackUrl,
  2490. 'apiDeviceMax': apiInfo.apiDeviceMax,
  2491. 'apiDevicePerCost': float(apiInfo.apiDevicePerCost)
  2492. })
  2493. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"设置失败"))
  2494. @permission_required(ROLE.supermanager)
  2495. def editApiAppInfo(request):
  2496. """
  2497. 编辑经销上API注册信息
  2498. """
  2499. def check_url(url):
  2500. return re.match(r'^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+', url)
  2501. payload = json.loads(request.body)
  2502. dealerId = payload.get('dealerId')
  2503. dealer = Dealer.objects(id=dealerId).first()
  2504. if not dealer:
  2505. logger.error('dealer<id={}> is not exists.'.format(dealerId))
  2506. return JsonErrorResponse(description='经销商不存在')
  2507. people = payload.get('people')
  2508. tel = payload.get('tel')
  2509. callbackUrl = payload.get('callbackUrl')
  2510. apiDeviceMax = payload.get('apiDeviceMax')
  2511. apiDevicePerCost = payload.get('apiDevicePerCost')
  2512. if callbackUrl and not check_url(callbackUrl):
  2513. return JsonErrorResponse(description='回调地址Url填写错误')
  2514. if not isinstance(apiDeviceMax, int):
  2515. return JsonErrorResponse(description='API配额参数错误')
  2516. if not is_number(apiDevicePerCost):
  2517. return JsonErrorResponse(description='配额单价参数错误')
  2518. dealer.update_api_app(**{
  2519. 'people': people,
  2520. 'tel': tel,
  2521. 'callbackUrl': callbackUrl,
  2522. 'apiDeviceMax': apiDeviceMax,
  2523. 'apiDevicePerCost': apiDevicePerCost
  2524. })
  2525. return JsonOkResponse()
  2526. @error_tolerate(logger=logger, nil=JsonErrorResponse(u"设置失败"))
  2527. @permission_required(ROLE.supermanager)
  2528. def setServiceButtonStatus(request):
  2529. """
  2530. 设置个人中心正在服务的功能按钮展示
  2531. """
  2532. payload = json.loads(request.body)
  2533. logicalCodes = payload.get('logicalCode', [])
  2534. if len(logicalCodes) != 1:
  2535. return JsonErrorResponse(description='设备数量错误')
  2536. stopUsing = payload.get('stopUsing', None)
  2537. continueToUse = payload.get('continueToUse', None)
  2538. device = Device.objects(logicalCode=logicalCodes[0]).first()
  2539. if device is None:
  2540. return JsonErrorResponse(description='未知错误')
  2541. deviceType = DeviceType.objects(id=device.devType['id']).first()
  2542. if deviceType is None:
  2543. return JsonErrorResponse(description='未知错误')
  2544. if stopUsing is not None:
  2545. deviceType.servicesButtonDict['stopUsing'] = stopUsing
  2546. deviceType.save()
  2547. if continueToUse is not None:
  2548. deviceType.servicesButtonDict['continueToUse'] = continueToUse
  2549. deviceType.save()
  2550. return JsonOkResponse()
  2551. @error_tolerate(logger = logger, nil = JsonErrorResponse(u"获取经销商银行卡失败"))
  2552. @permission_required(ROLE.supermanager)
  2553. def getDealerBanks(request):
  2554. dealerId = request.GET.get('dealerId')
  2555. if not dealerId:
  2556. return JsonErrorResponse(description = u'参数错误')
  2557. dealer = Dealer.objects(id = dealerId).first()
  2558. if not dealer:
  2559. return JsonErrorResponse(description = u'经销商不存在,请刷新后再试')
  2560. return JsonOkResponse(payload = {
  2561. 'dataList': [
  2562. card.to_dict() for card in
  2563. WithdrawBankCard.objects(ownerId = str(dealer.id), role = dealer.role).all()
  2564. ]
  2565. })
  2566. @error_tolerate(logger = logger, nil = JsonErrorResponse(u"保存经销商银行卡失败"))
  2567. @permission_required(ROLE.supermanager)
  2568. def saveDealerBankAccount(request):
  2569. payload = json.loads(request.body)
  2570. dealerId = payload.pop('dealerId', None)
  2571. if not dealerId:
  2572. return JsonErrorResponse(description = u'参数错误')
  2573. dealer = Dealer.objects(id = dealerId).first()
  2574. if not dealer:
  2575. return JsonErrorResponse(description = u'经销商不存在,请刷新后再试')
  2576. bank_card_id = payload.pop('id', None)
  2577. try:
  2578. payload = SaveWithdrawBankCardSchemaForSuper(payload)
  2579. except MultipleInvalid as e:
  2580. logger.exception(e)
  2581. return JsonErrorResponse(description = u"信息不完整(1001)")
  2582. isPublic = payload.pop('isPublic')
  2583. if isPublic:
  2584. try:
  2585. payload = SavePublicWithdrawBankCardExtraSchema(payload)
  2586. except MultipleInvalid as e:
  2587. logger.exception(e)
  2588. return JsonErrorResponse(description = u"信息不完整(1002)")
  2589. branchBank = WithdrawBranchBanks.objects(
  2590. code = payload['branchBankCode']).first() # type: WithdrawBranchBanks
  2591. if not branchBank:
  2592. return JsonErrorResponse(description = u"查询不到支行信息")
  2593. WithdrawBankCard.new_public_withdraw_bank_card(
  2594. id = bank_card_id,
  2595. ownerId = dealerId,
  2596. role = ROLE.dealer,
  2597. bankCode = payload['bankCode'],
  2598. bankName = payload['bankName'],
  2599. accountName = payload['accountName'],
  2600. accountCode = payload['accountCode'],
  2601. phone = payload.get('phone', ''),
  2602. provinceCode = payload['provinceCode'],
  2603. province = payload['province'],
  2604. cityCode = payload['cityCode'],
  2605. city = payload['city'],
  2606. branchBankCode = branchBank.code,
  2607. branchBankName = branchBank.name,
  2608. cnapsCode = branchBank.cnapsCode)
  2609. else:
  2610. WithdrawBankCard.new_personal_withdraw_bank_card(
  2611. id = bank_card_id,
  2612. ownerId = dealerId,
  2613. role = ROLE.dealer,
  2614. phone = payload.get('phone', ''),
  2615. bankName = payload['bankName'],
  2616. accountName = payload['accountName'],
  2617. accountCode = payload['accountCode'])
  2618. return JsonOkResponse()
  2619. @error_tolerate(logger = logger, nil = JsonErrorResponse(u"删除经销商银行卡失败"))
  2620. @permission_required(ROLE.supermanager)
  2621. def deleteDealerBankAccount(request):
  2622. payload = json.loads(request.body)
  2623. bank_card_id = payload.get('id', None)
  2624. if not bank_card_id:
  2625. return JsonErrorResponse(description = u'参数错误')
  2626. WithdrawBankCard.objects(id = bank_card_id).delete()
  2627. return JsonOkResponse()