mopybird 2 years ago
parent
commit
684f755c8f
60 changed files with 0 additions and 5617 deletions
  1. 0 2
      apps/web/api/__init__.py
  2. 0 0
      apps/web/api/cy4/__init__.py
  3. 0 18
      apps/web/api/cy4/urls.py
  4. 0 269
      apps/web/api/cy4/views.py
  5. 0 0
      apps/web/api/dc/__init__.py
  6. 0 15
      apps/web/api/dc/urls.py
  7. 0 148
      apps/web/api/dc/views.py
  8. 0 57
      apps/web/api/exceptions.py
  9. 0 0
      apps/web/api/ft_north/__init__.py
  10. 0 18
      apps/web/api/ft_north/constant.py
  11. 0 63
      apps/web/api/ft_north/models.py
  12. 0 12
      apps/web/api/ft_north/urls.py
  13. 0 398
      apps/web/api/ft_north/utils.py
  14. 0 204
      apps/web/api/ft_north/views.py
  15. 0 0
      apps/web/api/jh/__init__.py
  16. 0 17
      apps/web/api/jh/urls.py
  17. 0 110
      apps/web/api/jh/views.py
  18. 0 0
      apps/web/api/jn/__init__.py
  19. 0 14
      apps/web/api/jn/urls.py
  20. 0 42
      apps/web/api/jn/views.py
  21. 0 0
      apps/web/api/jn_north/__init__.py
  22. 0 13
      apps/web/api/jn_north/constant.py
  23. 0 14
      apps/web/api/jn_north/urls.py
  24. 0 330
      apps/web/api/jn_north/utils.py
  25. 0 372
      apps/web/api/jn_north/views.py
  26. 0 192
      apps/web/api/models.py
  27. 0 0
      apps/web/api/openluat/__init__.py
  28. 0 12
      apps/web/api/openluat/urls.py
  29. 0 72
      apps/web/api/openluat/views.py
  30. 0 0
      apps/web/api/swap/__init__.py
  31. 0 22
      apps/web/api/swap/urls.py
  32. 0 574
      apps/web/api/swap/views.py
  33. 0 0
      apps/web/api/test/__init__.py
  34. 0 12
      apps/web/api/test/urls.py
  35. 0 32
      apps/web/api/test/views.py
  36. 0 30
      apps/web/api/urls.py
  37. 0 304
      apps/web/api/utils.py
  38. 0 0
      apps/web/api/v1/__init__.py
  39. 0 22
      apps/web/api/v1/urls.py
  40. 0 369
      apps/web/api/v1/views.py
  41. 0 0
      apps/web/api/validators.py
  42. 0 781
      apps/web/api/views.py
  43. 0 0
      apps/web/api/ykt_north/__init__.py
  44. 0 92
      apps/web/api/ykt_north/models.py
  45. 0 41
      apps/web/api/ykt_north/utils.py
  46. 0 35
      apps/web/api/ykt_north/view.py
  47. 0 0
      apps/web/api/ymd/__init__.py
  48. 0 15
      apps/web/api/ymd/urls.py
  49. 0 64
      apps/web/api/ymd/views.py
  50. 0 0
      apps/web/api/ytb/__init__.py
  51. 0 17
      apps/web/api/ytb/urls.py
  52. 0 110
      apps/web/api/ytb/views.py
  53. 0 0
      apps/web/api/ywt/__init__.py
  54. 0 18
      apps/web/api/ywt/urls.py
  55. 0 179
      apps/web/api/ywt/views.py
  56. 0 0
      apps/web/api/zhejiang/__init__.py
  57. 0 18
      apps/web/api/zhejiang/constant.py
  58. 0 5
      apps/web/api/zhejiang/exceptions.py
  59. 0 46
      apps/web/api/zhejiang/models.py
  60. 0 439
      apps/web/api/zhejiang/utils.py

+ 0 - 2
apps/web/api/__init__.py

@@ -1,2 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python

+ 0 - 0
apps/web/api/cy4/__init__.py


+ 0 - 18
apps/web/api/cy4/urls.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-
-urlpatterns = patterns('',
-    url(r'^startDeviceForCy4$', startDeviceForCy4, name='startDeviceForCy4'),
-    url(r'^getDevSettingsFromCy4$', getDevSettingsFromCy4, name='getDevSettingsFromCy4'),
-    url(r'^setDevSettingsFromCy4$', setDevSettingsFromCy4, name='setDevSettingsFromCy4'),
-    url(r'^stopChargingPortForCy4$', stopChargingPortForCy4, name='stopChargingPortForCy4'),
-    url(r'^getPortStatusFromCy4$', getPortStatusFromCy4, name='getPortStatusFromCy4'),
-    url(r'^getPortInfoFromCy4$', getPortInfoFromCy4, name='getPortInfoFromCy4'),
-    url(r'^getConsumeRecordsFromCy4ByDeviceCode$', getConsumeRecordsFromCy4ByDeviceCode, name='getConsumeRecordsFromCy4ByDeviceCode'),
-    url(r'^getConsumeRecordsFromCy4ByOrderNo$', getConsumeRecordsFromCy4ByOrderNo, name='getConsumeRecordsFromCy4ByOrderNo'),
-)

+ 0 - 269
apps/web/api/cy4/views.py

@@ -1,269 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.models import APIServiceStartRecord
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apilib.utils_json import JsonResponse
-    from apps.web.dealer.models import Dealer
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def startDeviceForCy4(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    # default_params_list = ['deviceCode', 'price', 'discount', 'port']
-    # params_list = payload.keys()
-
-    # # 1. 判断差集
-    # different_params_list = list(set(default_params_list) - set(params_list))
-    # if len(different_params_list) != 0:
-    #     raise ApiParameterError(errmsg = u'参数内容错误')
-    #
-    # # 2. 判断个数
-    # if len(params_list) != len(default_params_list):
-    #     raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStartDeviceForCy4')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getDevSettingsFromCy4(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetDevSettingsFromCy4')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def setDevSettingsFromCy4(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'time1', 'time2', 'time3', 'time4', 'powerMax1', 'powerMax2', 'powerMax3',
-                           'powerMax4', 'elecCheckMin', 'elecCheckTime', 'voice']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiSetDevSettingsFromCy4')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def stopChargingPortForCy4(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStopChargingPortForCy4')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortStatusFromCy4(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortStatusFromCy4')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortInfoFromCy4(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortInfoFromCy4')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getConsumeRecordsFromCy4ByDeviceCode(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'dataSize', 'reverse']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = {
-        "status": 0,
-        "description": "",
-        "errcode": 0,
-        "result": {},
-        "errmsg": "SUCCESS",
-        "desc": ""
-    }
-    apis = APIServiceStartRecord.objects(logicalCode = payload['deviceCode'])
-    if apis.count() == 0:
-        dataList = []
-    else:
-        apis = apis[0:payload['dataSize']]
-        dataList = [{
-            'orderNo': _.orderNo,
-            'logicalCode': _.logicalCode,
-            'port': _.port,
-            'money': _.money,
-            'needTime': _.needTime,
-            'consumeType': _.consumeType,
-            'cardNo': _.cardNo,
-            'status': _.status,
-            'startTime': _.startTime,
-            'finishReason': _.finishReason,
-            'leftTime': _.leftTime,
-            'duration': _.duration,
-            'spendElec': _.spendElec,
-            'endTime': _.endTime
-        } for _ in apis]
-
-    if payload['reverse'] is True:
-        dataList.sort(key = lambda x: x['startTime'], reverse = True)
-    else:
-        dataList.sort(key = lambda x: x['startTime'])
-
-    resultDict['result'].update({'dataList': dataList})
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getConsumeRecordsFromCy4ByOrderNo(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = {
-        "status": 0,
-        "description": "",
-        "errcode": 0,
-        "result": {},
-        "errmsg": "SUCCESS",
-        "desc": ""
-    }
-    api = APIServiceStartRecord.objects(orderNo = payload['orderNo']).first()
-    if api is None:
-        dataList = []
-    else:
-        dataList = [{
-            'orderNo': api.orderNo,
-            'logicalCode': api.logicalCode,
-            'port': api.port,
-            'money': api.money,
-            'needTime': api.needTime,
-            'consumeType': api.consumeType,
-            'cardNo': api.cardNo,
-            'status': api.status,
-            'startTime': api.startTime,
-            'finishReason': api.finishReason,
-            'leftTime': api.leftTime,
-            'duration': api.duration,
-            'spendElec': api.spendElec,
-            'endTime': api.endTime
-        }]
-
-    resultDict['result'].update({'dataList': dataList})
-
-    return api_ok_response(payload = resultDict)

+ 0 - 0
apps/web/api/dc/__init__.py


+ 0 - 15
apps/web/api/dc/urls.py

@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-
-urlpatterns = patterns('',
-                       url(r'^startDeviceForDc$', startDeviceForDc, name = 'startDeviceForDc'),
-                       url(r'^getPortStatusFromDc$', getPortStatusFromDc, name = 'getPortStatusFromDc'),
-                       url(r'^getPortInfoFromDc$', getPortInfoFromDc, name = 'getPortInfoFromDc'),
-                       url(r'^getDevSettingsFromDc$', getDevSettingsFromDc, name='getDevSettingsFromDc'),
-                       url(r'^setDevSettingsFromDc$', setDevSettingsFromDc, name='setDevSettingsFromDc')
-                       )

+ 0 - 148
apps/web/api/dc/views.py

@@ -1,148 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortStatusFromDc(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortStatusFromDc')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getDevSettingsFromDc(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetDevSettingsFromDc')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def setDevSettingsFromDc(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = [
-        "deviceCode",
-        "power1",
-        "power2",
-        "power3",
-        "power1ratio",
-        "power2ratio",
-        "power3ratio",
-        "fuchongTime",
-        "fuchongPower",
-        "maxPower",
-        "icMoney",
-        "time1",
-        "time2",
-        "time3"
-    ]
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apisetDevSettingsFromDc')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortInfoFromDc(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortInfoFromDc')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def startDeviceForDc(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port', 'price', 'time']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStartDeviceForDc')
-
-    return api_ok_response(payload = resultDict)

+ 0 - 57
apps/web/api/exceptions.py

@@ -1,57 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from apps.web.constant import ErrorCode
-
-class ApiException(Exception):
-    def __init__(self, errcode, errmsg, payload = {}):
-        self.errcode = errcode
-        self.payload = payload
-        self.errmsg = errmsg
-
-    def __repr__(self):
-        return 'api exception. errcode = {}, errmsg = {}, payload = {}'.format(
-            self.errcode, self.errmsg, str(self.payload))
-
-    def __str__(self):
-        return self.__repr__()
-
-    def to_response(self):
-        from apps.web.api.utils import api_error_response
-        return api_error_response(errcode = self.errcode, errmsg = self.errmsg, payload = self.payload)
-
-
-class ApiParameterError(ApiException):
-    def __init__(self, errmsg):
-        super(ApiParameterError, self).__init__(
-            errcode = ErrorCode.API_PARAMETER_ERROR, errmsg = errmsg)
-
-
-class ApiAuthException(ApiException):
-    def __init__(self, errmsg):
-        super(ApiAuthException, self).__init__(
-            errcode = ErrorCode.API_AUTH_ERROR, errmsg = errmsg, payload = {'auth_result': 1})
-
-
-class ApiAuthDeviceException(ApiException):
-    def __init__(self):
-        super(ApiAuthDeviceException, self).__init__(
-            errcode = ErrorCode.API_AUTH_DEVICE_ERROR, errmsg = u'无权操作设备', payload = {'auth_result': 3})
-
-
-class ApiNoDeviceException(ApiException):
-    def __init__(self):
-        super(ApiNoDeviceException, self).__init__(
-            errcode = ErrorCode.API_NO_DEVICE, errmsg = u'设备不存在')
-
-class ApiDeviceModeException(ApiException):
-    def __init__(self):
-        super(ApiDeviceModeException, self).__init__(
-            errcode = ErrorCode.API_NO_DEVICE, errmsg = u'当前设备不在API模式, 请切换API模式(经销商后台->API接口管理->API设备管理)')
-
-class ApiDeviceTypeError(ApiException):
-    def __init__(self, errmsg):
-        super(ApiDeviceTypeError, self).__init__(
-            errcode = ErrorCode.API_ERROR_DEVICE_TYPE, errmsg = errmsg)
-
-

+ 0 - 0
apps/web/api/ft_north/__init__.py


+ 0 - 18
apps/web/api/ft_north/constant.py

@@ -1,18 +0,0 @@
-# coding=utf-8
-
-
-class RESPONSE_CODE(object):
-    SYS_BUSY = -1
-    SYS_ERROR = 500
-
-    SUCCESS = 0
-
-    ERROR_SIGNATURE = 4000
-    ERROR_TOKEN = 4001
-    ERROR_POST = 4002
-    ERROR_PARAM = 4003
-
-class PORT_WORK_STATUS(object):
-    PORT_IDLE = 0
-    PORT_WORKING = 1
-    PORT_FAULT = 2

+ 0 - 63
apps/web/api/ft_north/models.py

@@ -1,63 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import base64
-import hashlib
-import hmac
-import logging
-import time
-from urllib import quote
-
-from mongoengine import StringField, IntField
-
-from apps.web.core.db import Searchable
-
-logger = logging.getLogger(__name__)
-
-
-class FengTuTechnologyNorther(Searchable):
-    northPort = StringField(verbose_name="平台的 域名端口 推送数据给对方平台的时候 服务器的地址", default="")
-    appId = StringField(vebose_name="App key,由丰图提供")
-    appSecret = StringField(vebose_name="签名密钥 可以理解为 我方密码")
-    northToken = StringField(vebose_name="northToken 通过getToken接口获取 ")    # 我们像对方平台获取到的token
-    northTokenExpiredTime = IntField(verbose_name=u"northToken的过期时间", default=time.time)
-    northAppId = StringField(vebose_name="平台ID,由我们提供")
-    meta = {
-        "collection": "feng_tu_norther",
-        "db_alias": "default"
-    }
-
-    def get_sig(self, ts):
-        """
-        生成签名字符串
-        :return:
-        """
-        payload  = {
-            'appid' : str(self.appId),
-            'timestamp' : str(ts)
-        }
-
-        raw = [(k, payload[k]) for k in sorted(payload.keys())]
-        s = str('&'.join('='.join(kv) for kv in raw if kv[1]))
-
-        sigSecret = str(self.appSecret)
-        sigDate = hmac.new(sigSecret,s, hashlib.md5).digest()
-        sig = base64.b64encode(sigDate)
-
-        return quote(sig)
-
-    def join_url(self,path):
-        return "{ipPort}/{path}".format(
-            ipPort=self.northPort,
-            path=path
-        )
-
-    def get_token_data(self):
-        """
-        获取token的载数据 身份验证以平台为维度获取 那么token的范围也以 平台为准 即 northOperatorID
-        """
-        return {
-            "northAppId": self.northAppId,
-        }
-
-

+ 0 - 12
apps/web/api/ft_north/urls.py

@@ -1,12 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url, include
-from apps.web.api.ft_north.views import getOrder,getDeviceInfo,getCoding,getToken
-
-urlpatterns = patterns('',*[
-    url(r'^get/token$', getToken, name = 'getToken'),
-    url(r'^get/order$', getOrder, name = 'getOrder'),
-    url(r'^get/deviceInfo$', getDeviceInfo, name = 'getDeviceInfo'),
-    url(r'^get/coding$', getCoding, name = 'getDeviceInfo'),
-])

+ 0 - 398
apps/web/api/ft_north/utils.py

@@ -1,398 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import base64
-import time
-import itsdangerous
-
-import requests
-import logging
-
-from django.conf import settings
-
-from apps.web.api.ft_north.models import FengTuTechnologyNorther
-from apps.web.constant import DeviceOnlineStatus
-from apps.web.device.models import Device, Group
-from apps.web.api.ft_north.constant import PORT_WORK_STATUS
-from apps.web.api.utils import bd09_to_gcj02, get_coordinates_and_nums
-
-
-logger = logging.getLogger(__name__)
-
-def get_coding_info_by_device(devNo):
-    dev = Device.get_dev(devNo)
-    box = dev.deviceAdapter
-    try:
-        devStatusDict = box.get_port_status()
-    except:
-        return
-    codingInfos = list()
-    for k,v in devStatusDict.items():
-        codingInfo = {}
-        codingInfo['coding'] = k
-        if v['status'] != PORT_WORK_STATUS.PORT_WORKING and v['status'] != PORT_WORK_STATUS.PORT_WORKING:
-            v['status'] = PORT_WORK_STATUS.PORT_FAULT
-        codingInfo['status'] = v['status']
-        codingInfos.append(codingInfo)
-    return codingInfos
-
-def get_coding_info(devNo):
-    """
-    获取端口状态,先找缓存,缓存中没有直接从设备里拿
-    :param devNo:
-    :return:
-    """
-    ctrInfo = Device.get_dev_control_cache(devNo)
-    codingInfo = []
-    if 'allPorts' not in ctrInfo:
-        ctrInfo = get_coding_info_by_device(devNo)
-        if ctrInfo:
-            return ctrInfo
-        else:
-            return [{"coding":"0","status":0}]
-    else:
-        allPorts = ctrInfo.get('allPorts', 10)
-        # allPorts 有的时候会为0, 这个时候强制设置为10
-        if allPorts == 0:
-            allPorts = 10
-        for ii in range(allPorts):
-            statusDict = {}
-            tempDict = ctrInfo.get(str(ii + 1), {})
-            if tempDict.has_key('status'):
-                statusDict['coding'] = str(ii + 1)
-                statusDict['status'] = tempDict.get('status')
-            elif tempDict.has_key('isStart'):
-                if tempDict['isStart']:
-                    statusDict['coding'] = str(ii + 1)
-                    statusDict['status'] = PORT_WORK_STATUS.PORT_WORKING
-                else:
-                    statusDict['coding'] = str(ii + 1)
-                    statusDict['status'] = PORT_WORK_STATUS.PORT_IDLE
-            else:
-                statusDict['coding'] = str(ii + 1)
-                statusDict['status'] = PORT_WORK_STATUS.PORT_IDLE
-            codingInfo.append(statusDict)
-
-        return codingInfo
-
-def get_device_status(devNo):
-    """
-    获取设备状态
-    :param devNo:
-    :return:
-    """
-    dev = Device.get_dev(devNo)
-    devOnline = dev.online
-    if devOnline == DeviceOnlineStatus.DEV_STATUS_ONLINE:
-        devStatus = '1'
-    elif devOnline == DeviceOnlineStatus.DEV_STATUS_OFFLINE:
-        devStatus = '0'
-    else:
-        devStatus = '-1'
-
-    return devStatus
-
-def get_station_Info(groupIds):
-    """
-    推送站点信息
-    :param groupIds:
-    :return:
-    """
-
-    stationInfoList = list()
-
-    groups = Group.get_groups_by_group_ids(groupIds)
-
-    for group in groups.values():
-        # 获取经纬度 获取设备数量 经纬度使用火星坐标系转换
-        lng, lat, count = get_coordinates_and_nums(group.groupId)
-        lng, lat = bd09_to_gcj02(lng, lat)
-
-        stationInfoDict = {
-            "stationId" : group.groupId, # 厂商站点ID
-            "name" : group.groupName, # 充电站名称
-            "brand" : "", # 品牌名称
-            "longitude" : "{:.6f}".format(float(lng)),  # 经度(6位小数),
-            "latitude" : "{:.6f}".format(float(lat)),  # 维度(6位小数)
-            "address" : group.address, # 具体地址
-            "socketNumber" : 0, # 设备路数
-            "hasRainshed" : "", # 是否有雨棚
-            "hasMonitor" : "", # 是否覆盖视频监控
-            "fireFacilities" : "", # 是否配置消防设施
-            "buildingTime" : group.get('dateTimeAdded').get('val').split(" ")[0], # 建设时间
-            "picture" : "", # 站点图片
-            "deviceList" : get_dev_info([group.groupId],group), # 站点下的设备列表
-        }
-        stationInfoList.append(stationInfoDict)
-
-    return stationInfoList
-
-def get_dev_info(groupIds,group):
-    devices = Device.get_devices_by_group(groupIds)
-    deviceInfo = list()
-    for devNo,devInfo in devices.items():
-        devDict = {
-            'stationId':groupIds[0], # 厂商站点ID
-            'deviceNo':devNo, # 设备编号
-            'deviceType':devInfo['devType']["majorDeviceType"], # 设备类型:充电柜、充电桩、桩柜一体、摄像头、烟感、消防器(栓)、喷淋
-            'simCardNo':"", # SIM卡号
-            'wateringPortNum':"", # 浇水口数量
-            'brand':devInfo['devType']["name"], # 品牌名称
-            'useStationInfo':1, # 是否与充电站公用一个位置: 0.否, 1.是
-            'deviceLocation':group.address, # 设备地址,省市区街道+详细地址
-            'longitude':devInfo['lng'], # 径度
-            'latitude':devInfo['lat'], # 纬度
-            'socketNumber':Device.get_dev_control_cache(devNo).get('allPorts'), # 设备路数,充电口数量
-            'buildingYear':devInfo['dateTimeAdded'].split('-')[0] # 建设年份,格式:yyyy
-        }
-        deviceInfo.append(devDict)
-    return deviceInfo
-
-def send_request(url,mode='POST',**kwargs):
-    """
-    主动发送HTTP请求获取数据 密钥及签名
-    :return:
-    """
-
-    headers = {"Content-Type": "application/json;charset=utf-8"}
-    token = kwargs.pop("token", None)
-
-    if token:headers.update({"Authorization": "Basic {}".format(token)})
-    timeout = kwargs.pop("timeout", 5)
-
-    data = kwargs
-
-
-
-    try:
-        if mode == 'POST':
-            response = requests.post(url=url, json=data, headers=headers, timeout=timeout)
-        else:
-            response = requests.get(url=url, headers=headers, timeout=timeout)
-    except requests.Timeout:
-        return dict()
-    except Exception as e:
-        logger.exception(e)
-        return dict()
-
-    if response.status_code != 200:
-        return dict()
-
-    return response.json()
-
-def get_token(norther):
-
-
-    # if norther.token and norther.tokenExpiredTime > int(time.time()) * 1000:
-    #     return norther.token
-
-    timestamp = int(time.time()*1000)
-
-    url = norther.join_url("getToken")
-    sign = norther.get_sig(timestamp)
-
-
-
-    result = send_request(url,appid=norther.appId,timestamp=timestamp,sign=sign)
-    ret = result.get("code")
-    logger.info(ret)
-    if ret != 200:
-        return
-
-    responseJson = result.get("data")
-    tokenAvailableTime = responseJson.get("expireTime", 120)
-
-    token = responseJson.get("token", "")
-
-    # 数据库更新
-    # norther.update(
-    #     token=token,
-    #     tokenExpiredTime=tokenAvailableTime
-    # )
-    #
-    # norther.save()
-    return token
-
-def get_station_Info_manage(groupId):
-    """
-    推送站点信息
-    :param groupId:
-    :return:
-    """
-
-    group = Group.get_group(groupId)
-
-    # 获取经纬度 获取设备数量 经纬度使用火星坐标系转换
-    lng, lat, count = get_coordinates_and_nums(group.groupId)
-    lng, lat = bd09_to_gcj02(lng, lat)
-
-    stationInfoDict = {
-        "stationId" : group.groupId, # 厂商站点ID
-        "name" : group.groupName, # 充电站名称
-        "chargingType":"", # 充电站类型
-        "brand":"",
-        "longitude":lng,
-        "latitude":lat,
-        "address":group.address,
-        "socketNumber":0,
-        "hasRainshed":"",
-        "hasMonitor":"",
-        "fireFacilities":"",
-        "buildingTime":group.get('dateTimeAdded').strftime('%Y-%m-%d'),
-        "picture":"",
-    }
-
-    return stationInfoDict
-
-def get_device_info_manage(devNo):
-    dev = Device.get_dev(devNo)
-    deviceInfo = {
-        "stationId":dev["groupId"], # 厂商站点ID
-        "deviceNo":devNo, # 设备编号
-        "deviceType":dev['devType']["majorDeviceType"], # 设备类型
-        "brand":dev['devType']["name"], # 品牌名称
-        "deviceLocation":Group.get_group(dev["groupId"]).get("address"), # 设备地址
-        "longitude":dev['lng'], # 经度
-        "latitude":dev['lat'], # 纬度
-        "socketNumber":Device.get_dev_control_cache(devNo).get('allPorts',10), # 设备路数
-    }
-    return deviceInfo
-
-def get_alarm_report(devNo,alarmType):
-    dev = Device.get_dev(devNo)
-    data = {
-        "stationId":dev.get('groupId'), # 充电站编号
-        "deviceNo" : devNo,
-        "codingNo" : "",
-        "eventId" : base64.b64encode(dev.get('groupId')+devNo+str(time.time())),
-        "outSourceId" : "",
-        "alarmType":alarmType
-
-    }
-    return data
-
-def generate_json_token(data, expire=None):
-    salt = settings.FENG_TU_TOKEN_SECRET
-    its = itsdangerous.TimedJSONWebSignatureSerializer(salt, expire)
-
-    return its.dumps(data)
-
-def parse_json_token(s, expire=None):
-    salt = settings.FENG_TU_TOKEN_SECRET
-    its = itsdangerous.TimedJSONWebSignatureSerializer(salt, expire)
-
-    try:
-        result = its.loads(s)
-    except itsdangerous.BadData:
-        return dict()
-
-    return result
-
-
-def batchStationInfoReport(groupIds):
-    """
-    主动推送站点信息
-    :param groupIds:
-    :return:
-    """
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = get_station_Info(groupIds)
-        url = north.join_url("batchStationInfo")
-        token = get_token(north)
-        return send_request(url=url, token=token, stationInfoList=data)
-    except Exception as e:
-        logger.exception(e)
-
-
-def addStationReport(groupId):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = get_station_Info_manage(groupId)
-        url = north.join_url("station/add")
-        token = get_token(north)
-        return send_request(url=url, token=token, **data)
-    except Exception as e:
-        logger.exception(e)
-
-
-def deleteStationReport(groupId):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = groupId
-        url = north.join_url("station/delete/{}".format(data))
-        token = get_token(north)
-        return send_request(url=url, mode='GET', token=token)
-    except Exception as e:
-        logger.exception(e)
-
-
-def updateStationReport(groupId):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = get_station_Info_manage(groupId)
-        url = north.join_url("station/update")
-        token = get_token(north)
-        return send_request(url=url, token=token, **data)
-    except Exception as e:
-        logger.exception(e)
-
-
-def addDeviceReport(devNo):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = get_device_info_manage(devNo)
-        url = north.join_url("device/add")
-        token = get_token(north)
-        return send_request(url=url, token=token, **data)
-    except Exception as e:
-        logger.exception(e)
-
-
-def deleteDeviceReport(devNo):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        groupId = Device.get_dev(devNo).get("groupId")
-        url = north.join_url("device/delete/{}/{}".format(groupId,devNo))
-        token = get_token(north)
-        return send_request(url=url, mode='GET', token=token)
-    except Exception as e:
-        logger.exception(e)
-
-
-def updateDeviceReport(devNo):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = get_device_info_manage(devNo)
-        url = north.join_url("device/update")
-        token = get_token(north)
-        return send_request(url=url, token=token, **data)
-    except Exception as e:
-        logger.exception(e)
-
-
-def devHeartbeatReport(devNo):
-    try:
-        data = {
-            "deviceNo":devNo,
-            "deviceStatus":get_device_status(devNo),
-            "codings":get_coding_info(devNo),
-            "eventId": base64.b64encode(devNo+str(time.time()))
-        }
-        north = FengTuTechnologyNorther.objects.filter().first()
-        url = north.join_url("device/heartbeat")
-        token = get_token(north)
-        send_request(url=url, token=token, **data)
-    except Exception as e:
-        logger.exception(e)
-
-
-def alarmReport(devNo,faultName):
-    try:
-        north = FengTuTechnologyNorther.objects.filter().first()
-        data = get_alarm_report(devNo,faultName)
-        url = north.join_url("alarm")
-        token = get_token(north)
-        send_request(url=url, token=token, **data)
-    except Exception as e:
-        logger.exception(e)

+ 0 - 204
apps/web/api/ft_north/views.py

@@ -1,204 +0,0 @@
-# coding=utf-8
-import datetime
-import logging
-import json
-import random
-import time
-
-
-from mongoengine import DoesNotExist
-from django.views.decorators.http import require_POST
-
-
-from apilib.utils_json import JsonResponse
-
-from apps.web.api.ft_north.constant import RESPONSE_CODE
-from apps.web.api.ft_north.models import FengTuTechnologyNorther
-from apps.web.api.ft_north.utils import get_coding_info , get_device_status, generate_json_token,parse_json_token
-
-
-
-logger = logging.getLogger(__name__)
-
-@require_POST
-def getToken(request):
-    """
-    通过账号密码获取token
-    """
-    logger.debug("[queryToken] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"success": False,"code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1001)"})
-
-    try:
-        data = json.loads(request.body).get("data")
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"success": False,"code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1002)"})
-
-    appid = data.get("appid")
-    appSecret = data.get("appSecret")
-
-    logger.debug("[queryToken] appid = {}, appSecret = {}".format(appid, appSecret))
-
-    if not all((appid, appSecret)):
-        return JsonResponse({"success": False,"code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1003)"})
-
-    try:
-        norther = FengTuTechnologyNorther.objects.filter(appId=appid, appSecret=appSecret).first()   # type: FengTuTechnologyNorther
-    except DoesNotExist:
-        return JsonResponse({"success": False,"code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1004)"})
-    except Exception as e:
-        return JsonResponse({"success": False,"code": RESPONSE_CODE.SYS_ERROR, "message": u"系统错误"})
-
-    expire = int(time.time() + 60 * 60 * 24) * 1000
-
-    token = generate_json_token(data=norther.get_token_data(), expire=expire)
-
-    resultData = {
-        "token": token,
-        "expiresTime": expire
-    }
-    return JsonResponse({
-        "success": True,
-        "code": 200,
-        "message": "请求成功",
-        "data": resultData,
-    })
-
-def getOrder(request):
-    """
-    查询订单数量
-    :param request:
-    :return:
-    """
-    # 验证身份
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[getOrder] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"success":False, "code": RESPONSE_CODE.ERROR_TOKEN, "message": u"请求参数错误(1001)"})
-
-    try:
-        data = json.loads(request.body).get("data")
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"success":False, "code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1004)"})
-
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"success":False, "code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1003)"})
-
-    # 查询参数
-    deviceNo = str(data.get('deviceNo'))
-    startTime = data.get('startTime',"2015-01-01 00:00:00")
-    endTime = data.get("endTime",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
-
-
-    result = {
-        "orderNum": random.randint(10, 200)
-    }
-
-    resultData = json.dumps(result)
-
-    return JsonResponse({
-        "success": True,
-        "message": u"请求成功",
-        "code": u"200",
-        "data": resultData,
-    })
-
-def getCoding(request):
-    """
-    查询端口状态
-    :param request:
-    :return:
-    """
-    # 验证身份
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[getOrder] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"success": False, "code": RESPONSE_CODE.ERROR_TOKEN, "message": u"请求参数错误(1001)"})
-
-    try:
-        data = json.loads(request.body).get("data")
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"success": False, "code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1004)"})
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"success": False, "code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1003)"})
-
-    devNo = str(data.get('deviceNo'))
-
-    codingInfo = get_coding_info(devNo)
-    if not codingInfo:
-        return JsonResponse({
-            "success": False,
-            "message": u"设备未启动",
-            "code": u"303"
-        })
-
-    resultData = json.dumps(codingInfo)
-
-    return JsonResponse({
-        "success": True,
-        "message": u"请求成功",
-        "code": u"200",
-        "data": resultData,
-    })
-
-def getDeviceInfo(request):
-    """
-    查询设备状态
-    :param request:
-    :return:
-    """
-
-    # 验证身份
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[getOrder] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"success": False, "code": RESPONSE_CODE.ERROR_TOKEN, "message": u"请求参数错误(1001)"})
-
-    try:
-        data = json.loads(request.body).get("data")
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"success": False, "code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1004)"})
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"success": False, "code": RESPONSE_CODE.ERROR_POST, "message": u"请求参数错误(1003)"})
-
-    devNo = str(data.get('deviceNo'))
-    deviceStatus = get_device_status(devNo)
-
-    result = {
-        "deviceStatus": deviceStatus
-    }
-
-    resultData = json.dumps(result)
-
-    return JsonResponse({
-        "success": True,
-        "message": u"请求成功",
-        "code": u"200",
-        "data": resultData,
-    })

+ 0 - 0
apps/web/api/jh/__init__.py


+ 0 - 17
apps/web/api/jh/urls.py

@@ -1,17 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-"""
-久恒接口对接
-"""
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^getPortStatusFromJh$', getPortStatusFromJh, name = 'getPortStatusFromJh'),
-                       url(r'^startDeviceForJh$', startDeviceForJh, name = 'startDeviceForJh'),
-                       url(r'^getPortInfoFromJh$', getPortInfoFromJh, name = 'getPortInfoFromJh'),
-                       url(r'^stopChargingPortForJh$', stopChargingPortForJh, name = 'stopChargingPortForJh'),
-                       )

+ 0 - 110
apps/web/api/jh/views.py

@@ -1,110 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortStatusFromJh(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortStatusFromJh')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def startDeviceForJh(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port', 'time', 'elec']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStartDeviceForJh')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def stopChargingPortForJh(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStopChargingPortForJh')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortInfoFromJh(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortInfoFromJh')
-
-    return api_ok_response(payload = resultDict)

+ 0 - 0
apps/web/api/jn/__init__.py


+ 0 - 14
apps/web/api/jn/urls.py

@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-"""
-劲能接口对接
-"""
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^getPortStatusFromJn$', getPortStatusFromJn, name = 'getPortStatusFromJn'),
-                       )

+ 0 - 42
apps/web/api/jn/views.py

@@ -1,42 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortStatusFromJn(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortStatusFromJn')
-
-    return api_ok_response(payload = resultDict)
-

+ 0 - 0
apps/web/api/jn_north/__init__.py


+ 0 - 13
apps/web/api/jn_north/constant.py

@@ -1,13 +0,0 @@
-# coding=utf-8
-
-
-class RESPONSE_CODE(object):
-    SYS_BUSY = -1
-    SYS_ERROR = 500
-
-    SUCCESS = 0
-
-    ERROR_SIGNATURE = 4000
-    ERROR_TOKEN = 4001
-    ERROR_POST = 4002
-    ERROR_PARAM = 4003

+ 0 - 14
apps/web/api/jn_north/urls.py

@@ -1,14 +0,0 @@
-# coding=utf-8
-
-from django.conf.urls import patterns, url
-
-from apps.web.api.jn_north.views import queryToken, queryStationsInfo, queryStationStats, queryStationStatus, queryEquipBusinessPolicy
-
-
-urlpatterns = patterns('',*[
-    url(r'^query_token$', queryToken, name = 'queryToken'),
-    url(r'^query_stations_info', queryStationsInfo, name='queryStationsInfo'),
-    url(r'^query_station_stats', queryStationStats, name='queryStationStats'),
-    url(r'^query_station_status', queryStationStatus, name='queryStationStatus'),
-    url(r'^query_equip_business_policy', queryEquipBusinessPolicy, name='queryEquipBusinessPolicy'),
-])

+ 0 - 330
apps/web/api/jn_north/utils.py

@@ -1,330 +0,0 @@
-# coding=utf-8
-
-from apps.web.agent.models import Agent
-from apps.web.api.utils import bd09_to_gcj02, get_coordinates_and_nums
-from apps.web.common.models import District
-from apps.web.constant import Const
-from apps.web.south_intf.shangdong_platform import ShanDongNorther, GroupIdMap, GB2260
-from apps.web.device.models import Part, DeviceDict, GroupDict, Device
-from apps.web.user.models import ConsumeRecord
-
-
-def get_connector(part, norther):     # type:(Part, ShanDongNorther) -> dict
-    """
-    获取部件信息
-    """
-    return {
-        "ConnectorID": str(part.id),
-        "ConnectorName": part.partName,
-        "ConnectorType": 2,
-        "VoltageUpperLimits": 220,
-        "VoltageLowerLimits": 220,
-        "Current": part.attachParas.get("current", 16),
-        "Power": part.attachParas.get("power", 7),
-        "ParkNo": "-",
-        "NationalStandard": 3,
-    }
-
-
-def get_equipment(dev, norther):    # type:(DeviceDict, ShanDongNorther) -> dict
-    agent = Agent.objects.get(id=dev.owner.agentId)
-
-    ConnectorInfo = list()
-    for part in dev.parts:
-        ConnectorInfo.append(get_connector(part, norther))
-
-    data = {
-        "EquipmentID": dev.devNo,
-        "ManufacturerName": agent.productName,
-        "EquipmentModel": dev.get("devType", dict()).get("name", ""),
-        "EquipmentName": dev.get("logicalCode"),
-        "EquipmentType": 2,
-        "EquipmentStatus": 50,
-        "EquipmentPower": 7,
-        "NewNationalStandard": 1,
-        "ConnectorInfos": ConnectorInfo,
-    }
-
-    return data
-
-
-def get_stations_info(group, norther):  # type:(GroupDict, ShanDongNorther) -> dict
-    """
-    获取站点的信息
-    """
-    # 获取经纬度 获取设备数量 经纬度使用火星坐标系转换
-    lng, lat, count = get_coordinates_and_nums(group.groupId)
-    lng, lat = bd09_to_gcj02(lng, lat)
-
-    # 获取设备信息
-    EquipmentInfos = list()
-    devNos = Device.get_devNos_by_group([group.groupId])
-    for devNo in devNos:
-        dev = Device.get_dev(devNo) # type: DeviceDict
-        if dev.majorDeviceType != u"汽车充电桩":
-            continue
-
-        EquipmentInfos.append(get_equipment(dev, norther))
-
-    # 充电站信息
-    stationId = GroupIdMap.get_stationId(group.groupId)
-    dealer = group.owner
-
-    data = {
-        "StationID": stationId,  # 充电站ID 20
-        "OperatorID": norther.agentOperatorID,  # 组织机构代码 9
-        "EquipmentOwnerID": norther.equipOperatorID,  # 设备所属方组织机构代码 9
-        "StationName": group.groupName,  # 充电站名称描述  50
-
-        "CountryCode": "CN",  # 国家代码 固定
-        "AreaCode": GB2260.get_code(District.get_area(group.get("districtId"))),  # 地区编码 20
-        "Address": group.address,  # 详细地址 50
-
-        "StationTel": '-',  # 站点责任人电话,
-        "ServiceTel": '-',  # 站点服务电话
-
-        "StationType": 1,  # 站点类型
-        "StationStatus": 50,  # 站点状态
-
-        "ParkNums": 0,  # 车位数量 0代表未知
-
-        "StationLng": "{:.6f}".format(float(lng)),  # 精度(6位小数)
-        "StationLat": "{:.6f}".format(float(lat)),  # 维度(6位小数)
-
-        "Construction": 255,  # 建设场所
-        "ParkInfo": "-",
-        "ParkName": "-",
-
-        "OpenAllDay": 1,  # 是否全天开放
-
-        "BusineHours": u"24小时全天服务",  # 营业时间描述
-
-        "MinElectricityPric": 0.0,  # 最低充电费率 浮点型
-        "ElectricityFee": "-",  # 充电电费描述,
-        "ServiceFee": "-",  # 服务费率描述
-        "ParkFree": 0,  # 是否停车免费
-        "ParkFee": "-",  # 停车费率描述
-
-        "SupportOrder": 0,  # 是否支持预约
-        "EquipmentInfos": EquipmentInfos,  # 充电站信息,
-        "ElectricityTax": 0.0,
-        "ServiceTax": 0.0
-    }
-
-    return data
-
-def get_get_station_state(stationID,startTime, endTime):
-    groupId = GroupIdMap.get_groupId(stationID)
-    EquipmentStatsInfos = list()
-    devNos = Device.get_devNos_by_group([groupId])
-    elec = float(0)
-    for devNo in devNos:
-        tempState = get_equipment_state(devNo, startTime, endTime)
-        elec += tempState.get("EquipmentElectricity", 0.0)
-        EquipmentStatsInfos.append(tempState)
-    data = {
-        "StationElectricity": elec,
-        "EquipmentStatsInfos": EquipmentStatsInfos
-    }
-
-    return data
-
-def get_equipment_state(devNo, startTime, endTime):
-    """
-    获取充电设备的 一段时间内的统计信息 主要是电量
-    :param devNo:
-    :param startTime:
-    :param endTime:
-    :return:
-    """
-    device = Device.get_dev(devNo)
-    ConnectorStatsInfo = list()
-    parts = Part.objects.filter(logicalCode = device.get("logicalCode"))
-    elec = float(0)
-    for part in parts:
-        tempState = get_part_state(devNo, startTime, endTime, part)
-        elec += tempState.get("ConnectorElectricity", 0.0)
-        ConnectorStatsInfo.append(tempState)
-
-    return {
-        "EquipmentID": str(devNo),
-        "EquipmentElectricity": elec,
-        "ConnectorStatsInfo": ConnectorStatsInfo
-    }
-
-def get_part_state(devNo, startTime, endTime, part):
-    """
-    获取充电端口的 一段时间内的统计信息 主要是电量
-    :param devNo:
-    :param part:
-    :param startTime:
-    :param endTime:
-    :return:
-    """
-    filters = {
-        "devNo": devNo,
-        "finishedTime__gte": startTime,
-        "finishedTime__lte": endTime,
-    }
-    device = Device.get_dev(devNo)
-    if device.get("devType", dict()).get("code") != Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY:
-        filters.update({"attachParas__chargeIndex": part.partNo})
-
-    records = ConsumeRecord.objects.filter(**filters).only("servicedInfo")
-
-    elec = float(0)
-    for item in records:
-        elec += item.servicedInfo.get("elec", 0.0)
-
-    return {
-        "ConnectorID": str(part.id),
-        "ConnectorElectricity": float("{:.1f}".format(float(elec)))
-    }
-
-
-def get_station_status(groupId):  # type:(DeviceDict, ShanDongNorther) -> dict
-    """
-    获取充电站的当前状态
-    """
-    ConnectorStatusInfos = list()
-    devNos = Device.get_devNos_by_group([groupId])
-    for devNo in devNos:
-        device = Device.get_dev(devNo)
-        parts = Part.objects.filter(logicalCode = device.logicalCode)
-        devCache = Device.get_dev_control_cache(devNo)
-
-        online = device.get("online", True)
-
-        for part in parts:
-            if device.get("devType", dict()).get("code") not in [
-                Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY,
-                Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY_V2
-            ]:
-                partNo = part.partNo
-                if partNo in ['allPorts','usedPorts','usePorts']:
-                    continue
-                portCache = devCache.get(part.partNo) or dict()
-            else:
-                portCache = devCache or dict()
-
-            # 判断端口当前状态
-            if not online:
-                status = 0
-            else:
-                status = 3 if portCache.get("isStart") else 1
-
-            data = {
-                "ConnectorID": str(part.id),
-                "Status": status,
-                "CurrentA": 0,
-                "VoltageA": 0,
-                "BeginTime": portCache.get("startTime","-"),  # 开始时间
-                "SOC": 0.0,  # 剩余电量
-                "CurrentKwh": 0.0,  # 已充电量
-                "CurrentMeter": 0.0,  # 当前电表读数
-                "BmsReqVoltage": 0.0,  # BMS需求电压
-                "BmsReqCurrent": 0.0  # BMS需求电流
-
-            }
-
-            ConnectorStatusInfos.append(data)
-
-    return ConnectorStatusInfos
-
-
-def get_policy_info(partId):
-    """
-    获取 端口的计费信息
-    :param partId:
-    :return:
-    """
-    DEFAULT_ELEC_PRICE = 1.500
-
-    ELEC_FUNCS = [get_elec_price_by_package, get_elec_price_by_conf,
-                  get_elec_price_by_consume]
-
-    part = Part.objects.filter(id = partId).first()
-    if not part:
-        return
-
-    devNo = Device.get_devNo_by_logicalCode(part.logicalCode)
-
-    for func in ELEC_FUNCS:
-        try:
-            elecPrice = func(devNo)
-        except Exception:
-            elecPrice = None
-
-        if elecPrice:
-            break
-    else:
-        elecPrice = DEFAULT_ELEC_PRICE
-
-    data = {
-        "StartTime": "000000",
-        "ElecPrice": elecPrice,
-        "SevicePrice": 0.0,
-        "DiscountElecPrice":elecPrice, # 协议电费价格
-        "DiscountServicePrice":0.0 # 协议服务费价格
-    }
-
-    return data
-
-def get_elec_price_by_package(devNo):
-    """
-    通过套餐获取电费
-    :param devNo:
-    :return:
-    """
-    device = Device.get_dev(devNo)
-    package = device.get("washConfig", dict()).get("1", dict())
-    if not package:
-        return
-
-    price = package.get("price")
-    time = package.get("time")
-    unit = package.get("unit")
-    if unit != u"度":
-        return
-    if not all([price, time]):
-        return
-    try:
-        elecPrice = float("{:.4f}".format(float(price) / float(time)))
-    except ZeroDivisionError:
-        return
-
-    return elecPrice
-
-
-def get_elec_price_by_conf(devNo):
-    """
-    通过设备设置设置电费
-    :param devNo:
-    :return:
-    """
-    device = Device.get_dev(devNo)
-    elecPrice = device.get("otherConf", dict()).get("elecPrice")
-    return float("{:.4f}".format(float(elecPrice)))
-
-def get_elec_price_by_consume(devNo):
-    """
-    通过 最近一次的消费记录获取电费
-    :param devNo:
-    :return:
-    """
-    record = ConsumeRecord.objects.filter(devNo=devNo).sort("-id").first()
-    if not record or not record.servicedInfo:
-        return
-
-    elec = record.servicedInfo.get("elec")
-    spend = record.servicedInfo.get("spend")
-
-    if not all([elec, spend]):
-        return
-
-    try:
-        elecPrice = float("{:.4f}".format(float(spend) / float(elec)))
-    except ZeroDivisionError:
-        return
-
-    return elecPrice

+ 0 - 372
apps/web/api/jn_north/views.py

@@ -1,372 +0,0 @@
-# coding=utf-8
-import json
-import logging
-import datetime
-
-from mongoengine import DoesNotExist
-
-from django.views.decorators.http import require_POST
-
-from apilib.utils_datetime import to_datetime
-from apilib.utils_json import JsonResponse
-from apps.web.api.jn_north.constant import RESPONSE_CODE
-from apps.web.api.jn_north.utils import get_stations_info,get_station_status,get_get_station_state,get_policy_info
-from apps.web.api.utils import AES_CBC_PKCS5padding_encrypt, AES_CBC_PKCS5padding_decrypt, generate_json_token, parse_json_token
-from apps.web.device.models import Group, Device
-from apps.web.south_intf.shangdong_platform import ShanDongNorther, GroupIdMap
-
-logger = logging.getLogger(__name__)
-
-
-@require_POST
-def queryToken(request):
-    """
-    通过账号密码获取token
-    """
-    logger.debug("[queryToken] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1001)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(Data))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1002)"})
-
-    OperatorID = data.get("OperatorID")
-    OperatorSecret = data.get("OperatorSecret")
-
-    logger.debug("[queryToken] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
-
-    if not all((OperatorID, OperatorSecret)):
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        norther = ShanDongNorther.objects.filter(northOperatorID=OperatorID, northOperatorSecret=OperatorSecret).first()   # type: ShanDongNorther
-    except DoesNotExist:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-    except Exception as e:
-        return JsonResponse({"Ret": RESPONSE_CODE.SYS_ERROR, "Msg": u"系统错误"})
-
-    expire = 60 * 60 * 24 * 7
-    result = {
-        "OperatorID": norther.agentOperatorID,
-        "SuccStat": 0,
-        "AccessToken": generate_json_token(data=norther.get_token_data(), expire=expire),
-        "TokenAvailableTime": expire,
-        "FailReason": None
-    }
-    logger.debug("[queryToken] return result = {}".format(result))
-
-    # 拉取的时候加密 显式指明加密秘钥为 pull
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=norther.pullDataSecret,
-        dataSecretIV=norther.pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-
-    return JsonResponse({
-        "Ret": RESPONSE_CODE.SUCCESS,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-def queryStationsInfo(request):
-    """
-    查询充电站的信息
-    """
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationsInfo] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-
-    # 获取这个平台下面的所有的northers记录
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    # 这个平台下的所有对接过的经销商
-    dealerIds = [_.dealerId for _ in northers]
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    # 分页以及查询参数
-    pageNo = int(data.get('PageNo', 1))
-    pageSize = int(data.get('PageSize', 10))
-    lastQueryTime = data.get("LastQueryTime")
-
-    # 查找出所有符合条件的地质组的信息
-    query = Group.objects.filter(ownerId__in=dealerIds)
-    if lastQueryTime:
-        dateTime = to_datetime(lastQueryTime)
-        query = query.filter(dateTimeAdded__gte=dateTime)
-
-    # 过滤出有设备的地址组
-    StationInfos = list()
-    groupIds = [str(item.id) for item in query.only("id") if Device.objects.filter(groupId = str(item.id)).count()]
-    groupQuery = Group.objects.filter(id__in=groupIds).only("id").paginate(pageNo, pageSize)
-    for item in groupQuery:
-        # 获取站点信息
-        groupId = str(item.id)
-
-        # 我们的GroupID是24位,省平台的是20位,尝试添加映射
-        GroupIdMap.add(groupId)
-        StationInfos.append(get_stations_info(Group.get_group(item.id), norther))
-
-    result = {
-        "PageNo": pageNo,
-        "ItemSize": pageSize,
-        "PageCount": groupQuery.count(),
-        "StationInfos": StationInfos
-    }
-    logger.debug("[queryStationsInfo] return result = {}".format(result))
-
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-    logger.debug("groupId = {}".format(groupIds[0]))
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-def queryStationStats(request):
-    """
-    取每个充电站在某个周期内的统计信息
-    :param request:
-    :return:
-    """
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationsInfo] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    stationID = data.get("StationID")
-    startTime = data.get("StartTime")
-    endTime = data.get("EndTime")
-
-    startTimeObj = datetime.datetime.strptime(startTime, "%Y-%m-%d")
-    endTimeObj = datetime.datetime.strptime(endTime, "%Y-%m-%d")
-
-    res = get_get_station_state(stationID,startTimeObj, endTimeObj)
-
-    res.update({
-        "StationID": stationID,
-        "StartTime": startTime,
-        "EndTime": endTime
-    })
-
-    result = {"StationStats": res}
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-    logger.debug("[queryStationStats] return result = {}".format(result))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-def queryStationStatus(request):
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationsInfo] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    stationIDs = data.get("StationIDs")
-    if not isinstance(stationIDs, list):
-        return JsonResponse({"Ret": 4004, "Msg": u"系统错误"})
-
-    StationStatusInfos = list()
-    for stationID in stationIDs:
-        groupId = GroupIdMap.get_groupId(stationID)
-
-        StationStatusInfos.append(
-            {
-                "StationID": stationID,
-                "ConnectorStatusInfos": get_station_status(groupId)
-            }
-        )
-
-    result = {
-        "StationStatusInfos": StationStatusInfos
-    }
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-    logger.debug("[queryStationStatus] return result = {}".format(result))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-def queryEquipBusinessPolicy(request):
-    """
-    用于查询运营商的充电设备接口计费模型信息
-    :param request:
-    :return:
-    """
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationsInfo] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    equipBizSeq = data.get("EquipBizSeq")
-    connectorID = data.get("ConnectorID")
-
-    policyInfo = get_policy_info(connectorID)
-
-    result = {
-        "EquipBizSeq": equipBizSeq,
-        "ConnectorID": connectorID,
-        "SuccStat": 0 if policyInfo else 1,
-        "FailReason": 0 if policyInfo else 1,
-        "SumPeriod": 1,
-        "PolicyInfos": [policyInfo] if policyInfo else "-"
-    }
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-
-    logger.debug("[queryEquipBusinessPolicy] return result = {}".format(result))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        'Sig':sig
-    })
-
-
-
-

+ 0 - 192
apps/web/api/models.py

@@ -1,192 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import datetime
-import logging
-
-from mongoengine import BooleanField, StringField, ListField, FloatField, DictField, DateTimeField
-from mongoengine.fields import IntField
-from typing import Optional
-
-from apps.web.constant import Const, ErrorCode
-from apps.web.core.db import Searchable
-
-logger = logging.getLogger(__name__)
-
-
-class DeviceVersionConfig(Searchable):
-    moduleName = StringField(verbose_name = u'设备模块名称', default = '')
-    version = StringField(verbose_name = u'最新版本号', default = '')
-    matchVersions = ListField(verbose_name = u'匹配版本号', default = [])
-    filePath = StringField(verbose_name = u'程序路径', default = '')
-    allowable = BooleanField(verbose_name = u'是否允许升级', default = False)
-
-    meta = {'collection': 'device_upgrade_config', 'db_alias': 'logdata'}
-
-
-class APIServiceStartRecord(Searchable):
-    orderNo = StringField(verbose_name = u'订单编号', default = None, unique = True)
-    devNo = StringField(verbose_name = u'设备编号', default = u'')
-    logicalCode = StringField(verbose_name = u'二维码编号', default = u'')
-    port = StringField(verbose_name = u'端口号', default = u'')
-    money = FloatField(verbose_name = u'消费金额', default = None)
-    needTime = IntField(verbose_name = u'订购时长', default = None)
-    consumeType = StringField(verbose_name = u'启动方式', default = u'')
-    openId = StringField(verbose_name = u'openId', default = u'')
-    cardNo = StringField(verbose_name = u'离线卡号', default = u'')
-    status = StringField(verbose_name = u'订单状态', default = u'')
-    startTime = StringField(verbose_name = u'订单开始时间', default = None)
-    finishReason = StringField(verbose_name = u'订单结束原因', default = u'')
-    leftTime = IntField(verbose_name = u'剩余时间', default = None)
-    duration = IntField(verbose_name = u'使用时长', default = None)
-    spendElec = FloatField(verbose_name = u'消耗电量', default = None)
-    endTime = StringField(verbose_name = u'订单结束时间', default = None)
-
-    extOrderNo = StringField(verbose_name = u'外部订单编号', default = u'')
-
-    meta = {'collection': 'api_service_start_record', 'db_alias': 'default'}
-
-    search_fields = ('openId', 'devNo', 'port', 'status', 'cardNo', 'consumeType')
-
-    @classmethod
-    def record_4_cy4_card(cls, data):
-        if data.get('orderNo', '') != '':
-            cls(
-                orderNo = data['orderNo'],
-                devNo = data['devNo'],
-                logicalCode = data['logicalCode'],
-                port = data['port'],
-                money = data['money'],
-                needTime = data['needTime'],
-                consumeType = data['consumeType'],
-                openId = data['openId'],
-                cardNo = data['cardNo'],
-                status = data['status'],
-                startTime = data['startTime']
-            ).save()
-        else:
-            apiRecord = cls.objects(
-                status = 'PENDING',
-                port = data['port'],
-                devNo = data['devNo'],
-                cardNo = data['cardNo'],
-                startTime__gte = (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime(Const.DATE_FMT)
-            ).order_by('-startTime').first()
-
-            if apiRecord is None:
-                return
-
-            apiRecord.finishReason = data['finishReason']
-            apiRecord.leftTime = data['leftTime']
-            apiRecord.spendElec = data['spendElec']
-            apiRecord.status = data['status']
-            apiRecord.duration = data['duration']
-            apiRecord.endTime = data['endTime']
-            apiRecord.save()
-
-    @classmethod
-    def record_4_cy4_mobile(cls, data):
-        if data.get('orderNo', '') != '':
-            cls(
-                orderNo = data['orderNo'],
-                devNo = data['devNo'],
-                logicalCode = data['logicalCode'],
-                port = data['port'],
-                money = data['money'],
-                needTime = data['needTime'],
-                consumeType = data['consumeType'],
-                status = data['status'],
-                startTime = data['startTime'],
-                extOrderNo = data['extOrderNo']
-            ).save()
-        else:
-            apiRecord = cls.objects(
-                status = 'PENDING',
-                port = data['port'],
-                devNo = data['devNo'],
-                startTime__gte = (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime(Const.DATE_FMT)
-            ).order_by('-startTime').first()
-
-            if apiRecord is None:
-                return
-
-            apiRecord.finishReason = data['finishReason']
-            apiRecord.leftTime = data['leftTime']
-            apiRecord.spendElec = data['spendElec']
-            apiRecord.status = data['status']
-            apiRecord.duration = data['duration']
-            apiRecord.endTime = data['endTime']
-            apiRecord.save()
-
-
-class APIStartDeviceRecord(Searchable):
-    orderNo = StringField(verbose_name = "订单号(extOrderNo)", default = "", max_length = 100)
-    userId = StringField(verbose_name = "用户ID", default = "")
-    ownerId = StringField(verbose_name = '经销商ID', default = "")
-    createTime = StringField(verbose_name = "调用方创建订单时间", default = "")
-    channel = StringField(verbose_name = "channel")
-    deviceCode = StringField(verbose_name = "设备逻辑编码(=logicalCode)", default = "")
-    devNo = StringField(verbose_name = "设备ID", default = "")
-    package = DictField(verbose_name = "套餐", default = {})
-
-    notifyUrl = StringField(verbose_name = "回调通知地址", default = '')
-
-    apiConf = DictField(verbose_name = "api配置", default = {})
-
-    postActionResult = DictField(verbose_name = 'API后续处理', default = {})
-    postActionTriggered = BooleanField(default = False)
-
-    errCode = IntField(verbose_name = '错误码', default = ErrorCode.EXCEPTION)
-    errMsg = StringField(verbose_name = '错误描述', default = u'系统错误')
-
-    attachParas = DictField(verbose_name = '可变参数', default = {})
-    servicedInfo = DictField(verbose_name = '服务信息', default = {})
-
-    datetimeAdded = DateTimeField(verbose_name = "时间", default = datetime.datetime.now)
-
-    meta = {
-        "collection": "APIStartDeviceRecord",
-        "db_alias": "logdata",
-        # 'shard_key': ('orderNo',)
-    }
-
-    def __repr__(self):
-        return 'APIStartDeviceRecord<id={},orderNo={}> user({}) use api to start device({}) with package({})'.format(
-            str(self.id), self.orderNo, self.userId, self.deviceCode, self.package)
-
-    def __str__(self):
-        return self.__repr__()
-
-    @property
-    def used_port(self):
-        if self.attachParas and 'chargeIndex' in self.attachParas and self.attachParas['chargeIndex']:
-            return str(self.attachParas['chargeIndex'])
-
-        return ''
-
-    @property
-    def openId(self):
-        return self.userId
-
-    @classmethod
-    def get_api_record(cls, logicalCode, ext_order_no):
-        # type:(str, str)->Optional[APIStartDeviceRecord]
-        record = (cls.objects(orderNo = ext_order_no, deviceCode = logicalCode)
-                  .order_by('-createdTime')
-                  .first())  # type: APIStartDeviceRecord
-        return record
-
-    @property
-    def is_from_api(self):
-        return True
-
-    @property
-    def is_on_point(self):
-        return False
-
-    @property
-    def is_from_user(self):
-        return False
-
-    def my_package(self, device):
-        return dict(self.package)

+ 0 - 0
apps/web/api/openluat/__init__.py


+ 0 - 12
apps/web/api/openluat/urls.py

@@ -1,12 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       # 合宙在1.2.2版本之前不能自定义升级路径
-                       url(r'^firmware_upgrade$', get_firmware_upgrade_file,
-                           name = 'get_firmware_upgrade_file'),
-                       )

+ 0 - 72
apps/web/api/openluat/views.py

@@ -1,72 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-import os
-
-from django.http import StreamingHttpResponse
-from typing import TYPE_CHECKING
-
-from apilib.utils_json import JsonResponse
-from apps.web.api.models import DeviceVersionConfig
-from apps.web.device.models import Device
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    pass
-
-DEVICE_VERSION_BASE_PATH = '/var/www/uploaded/version'
-DEVICE_VERSION_BUFFER = dict()
-
-
-def get_firmware_upgrade_file(request):
-    def file_iterator(file_name, chunk_size = 512):
-        with open(file_name) as f:
-            while True:
-                c = f.read(chunk_size)
-                if c:
-                    yield c
-                else:
-                    break
-
-    project_key = request.GET.get('project_key')
-    dev_no = request.GET.get('imei')
-    version = str(request.GET.get('version'))
-
-    logger.debug('project key = {}; imei = {}; version = {}'.format(project_key, dev_no, version))
-
-    dev = Device.get_dev(dev_no)
-    if not dev:
-        logger.debug('{} is not exists.'.format(dev_no))
-        return JsonResponse({"payload": {}}, status = 404)
-
-    if project_key not in ['vivostone', 'viveston']:
-        logger.debug('project key {} is not mine.'.format(project_key))
-        return JsonResponse({"payload": {}}, status = 404)
-
-    tokens = version.split('.')
-    match_version = '{}.{}.'.format(tokens[0], tokens[1])
-
-    config = DeviceVersionConfig.objects(matchVersions = match_version,
-                                         allowable = True).first()  # type: DeviceVersionConfig
-    if not config:
-        logger.debug('config is not exits.')
-        return JsonResponse({"payload": {}}, status = 404)
-
-    version_path = '{}/{}'.format(DEVICE_VERSION_BASE_PATH, config.filePath).format(dev['driverCode'])
-    if version_path not in DEVICE_VERSION_BUFFER:
-        if not os.path.isfile(version_path):
-            return JsonResponse({"payload": {}}, status = 404)
-
-        content = file_iterator(version_path)
-        DEVICE_VERSION_BUFFER[version_path] = content
-    else:
-        content = DEVICE_VERSION_BUFFER[version_path]
-
-    response = StreamingHttpResponse(content)
-    response['Content-Type'] = 'application/octet-stream'
-    response['Content-Disposition'] = 'attachment;filename=%s' % version_path
-    response['Content-Length'] = os.path.getsize(version_path)
-
-    return response

+ 0 - 0
apps/web/api/swap/__init__.py


+ 0 - 22
apps/web/api/swap/urls.py

@@ -1,22 +0,0 @@
-# coding=utf-8
-
-from django.conf.urls import patterns, url
-
-from apps.web.api.swap.views import queryToken, queryStationsInfo, queryStationStats, queryStationStatus, \
-queryEquipAuth,queryEquipBusinessPolicy,query_start_charge,query_equip_charge_status,query_stop_charge
-
-
-urlpatterns = patterns('',*[
-    url(r'^wfl_kd/query_token$', queryToken, name = 'queryToken'),
-    url(r'^wfl_kd/query_stations_info$', queryStationsInfo, name='queryStationsInfo'),
-    url(r'^wfl_kd/query_station_stats$', queryStationStats, name='queryStationStats'),
-    url(r'^wfl_kd/query_station_status$', queryStationStatus, name='queryStationStatus'),
-    url(r'^wfl_kd/query_equip_auth$', queryEquipAuth, name='queryEquipAuth'),
-    
-    url(r'^wfl_kd/query_equip_business_policy$', queryEquipBusinessPolicy, name='queryEquipBusinessPolicy'),
-    
-    url(r'^wfl_kd/query_start_charge$', query_start_charge, name='query_start_charge'),
-    url(r'^wfl_kd/query_equip_charge_status$', query_equip_charge_status, name='query_equip_charge_status'),
-    url(r'^wfl_kd/query_stop_charge$', query_stop_charge, name='query_stop_charge'),
-
-])

+ 0 - 574
apps/web/api/swap/views.py

@@ -1,574 +0,0 @@
-# coding=utf-8
-import json
-import logging
-import datetime,time
-
-from mongoengine import DoesNotExist
-from apilib.monetary import VirtualCoin,RMB
-from django.views.decorators.http import require_POST
-from apilib.utils_datetime import to_datetime
-from apilib.utils_json import JsonResponse
-from apps.web.api.jn_north.constant import RESPONSE_CODE
-from apps.web.api.utils import AES_CBC_PKCS5padding_encrypt, AES_CBC_PKCS5padding_decrypt, generate_json_token, parse_json_token
-from apps.web.device.models import Group, Device, SwapGroup,Part
-from apps.web.south_intf.swap_carcharger import SwapContract
-from apps.web.dealer.models import Dealer
-from apps.web.agent.models import Agent
-from apps.web.core.helpers import ActionDeviceBuilder
-from apps.web.core.utils import async_operation
-from apps.web.user.models import ConsumeRecord, RechargeRecord,ServiceProgress
-from apps.web.user.utils import RechargeRecordBuilder
-
-logger = logging.getLogger(__name__)
-
-
-def queryToken(request):
-    """
-    通过账号密码获取token
-    """
-    logger.debug("[queryToken] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1001)"})
-    
-    # 根据路径获取norther
-    swapLabel = request.path.split('/')[3]
-    norther = SwapContract.get_norther_by_label(swapLabel)
-    if not norther:
-        return None, JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求的URL路径错误"})
-    
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(Data,norther.dataSecret2Us,norther.dataSecretIV2Us))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1002)"})
-
-    OperatorID = data.get("OperatorID")
-    OperatorSecret = data.get("OperatorSecret")
-
-    logger.debug("[queryToken] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
-
-    if not all((OperatorID, OperatorSecret)):
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        norther = SwapContract.objects.filter(operatorId2Us=OperatorID, secret2Us=OperatorSecret).first()  # type: SwapContract
-    except DoesNotExist:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-    except Exception as e:
-        return JsonResponse({"Ret": RESPONSE_CODE.SYS_ERROR, "Msg": u"系统错误"})
-
-    expire = 60 * 60 * 24 * 7
-    result = {
-        "OperatorID": norther.OperatorId,
-        "SuccStat": 0,
-        "AccessToken": norther.generate_json_token(data=norther.get_token_data(), expire=expire),
-        "TokenAvailableTime": expire,
-        "FailReason": None
-    }
-    logger.debug("[queryToken] return result = {}".format(result))
-
-    # 拉取的时候加密 显式指明加密秘钥为 pull
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=norther.dataSecret2Us,
-        dataSecretIV=norther.dataSecretIV2Us
-    )
-    sig = norther.get_sig(resultData)
-
-    return JsonResponse({
-        "Ret": RESPONSE_CODE.SUCCESS,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-def check_and_get_norther(request):
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationsInfo] , token = {}'.format(token))
-    
-    # 根据路径获取norther
-    swapLabel = request.path.split('/')[3]
-    norther = SwapContract.get_norther_by_label(swapLabel)
-    if not norther:
-        return None, JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求的URL路径错误"})
-    
-    # 验证身份
-    tokenData = norther.parse_json_token(token)
-    if not tokenData:
-        return None,JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-
-    # 获取这个平台下面的所有的northers记录
-    northers = SwapContract.get_norther(**tokenData)
-    if not northers:
-        return None,JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    if norther.id != northers.first().id:
-        return None,JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"根据token获取数据和实际请求路径不一致(1002)"})
-    
-    return norther, None
-
-def get_request_data(request,norther):
-    dataSecret2Us = norther.dataSecret2Us
-    dataSecretIV2Us = norther.dataSecretIV2Us
-
-    # 验证参数
-    logger.debug("[queryStationsInfo] request body = {}".format(request.body))
-
-    if not request.body:
-        return None,JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=dataSecret2Us,
-            dataSecretIV=dataSecretIV2Us
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return None,JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-    
-    return data,None
-
-def get_reply_reponse(result,norther):
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=norther.dataSecret2Us,
-        dataSecretIV=norther.dataSecretIV2Us
-    )
-    sig = norther.get_sig(resultData)
-    return JsonResponse({"Ret": 0,"Msg": u"请求成功","Data": resultData,"Sig": sig})
-
-    
-def queryStationsInfo(request):
-    """
-    查询充电站的信息
-    """
-    logger.info('function into [queryStationsInfo]')
-    
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-    
-    # 分页以及查询参数
-    pageNo = int(data.get('PageNo', 1))
-    pageSize = int(data.get('PageSize', 10))
-    lastQueryTime = data.get("LastQueryTime")
-    
-    logger.info('[queryStationsInfo],pageNo=%s,pageSize=%s,lastQueryTime=%s' % (pageNo,pageSize,lastQueryTime))
-    
-    # 查找出所有符合条件的信息
-    dealerIds = []
-    if norther.operatorType == 'dealer':
-        dealerIds = [norther.operatorInnerId]
-    elif norther.operatorType == 'agent':
-        dealerIds = [str(dealer.id) for dealer in Dealer.objects(agentId = norther.operatorInnerId) ]
-    elif norther.operatorType == 'manager':
-        agentIds = [str(agent.id) for agent in Agent.objects(managerId = norther.operatorInnerId)]
-        dealerIds = [str(dealer.id) for dealer in Dealer.objects(agentId__in = agentIds) ]
-        
-    
-    if lastQueryTime:
-        dateTime = to_datetime(lastQueryTime)
-        swaps = SwapGroup.objects.filter(ownerId__in=dealerIds,swapFlag=True,deviceChangedTime__gte = dateTime,deviceNum__gt = 0)
-    else:
-        swaps = SwapGroup.objects.filter(ownerId__in=dealerIds,swapFlag=True,deviceNum__gt = 0)
-    
-    StationInfos = []
-    for swap in swaps[(pageNo - 1) * pageSize:pageNo * pageSize]:
-        StationInfos.append(norther.get_station(swap))
-        
-    result = {
-        "PageNo": pageNo,
-        "ItemSize": pageSize,
-        "PageCount": swaps.count(),
-        "StationInfos": StationInfos
-    }
-    logger.debug("[queryStationsInfo] return result = {}".format(result))
-
-    return get_reply_reponse(result,norther)
-
-def queryStationStatus(request):
-    logger.info('function into [queryStationStatus]')
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-    
-    stationIDs = data.get("StationIDs")
-    
-    logger.info('[queryStationStatus],stationIDs=%s' % (','.join(stationIDs)))
-    
-    if not isinstance(stationIDs, list):
-        return JsonResponse({"Ret": 4004, "Msg": u"系统错误"})
-
-    StationStatusInfos = []
-    for stationID in stationIDs:
-
-        StationStatusInfos.append(
-            {
-                "StationID": stationID,
-                "ConnectorStatusInfos": norther.get_connector_status_infos(stationID)
-            }
-        )
-
-    result = {
-        "StationStatusInfos": StationStatusInfos
-    }
-    
-    logger.debug("[queryStationStatus] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)
-
-def queryStationStats(request):
-    """
-    取每个充电站在某个周期内的统计信息
-    :param request:
-    :return:
-    """
-    logger.info('function into [queryStationStats]')
-    
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-
-    stationID = data.get("StationID")
-    startTime = data.get("StartTime")
-    endTime = data.get("EndTime")
-
-    logger.info('[queryStationStats],stationID=%s,startTime=%s,endTime=%s' % (stationID,startTime,endTime))
-    
-    startTimeObj = datetime.datetime.strptime(startTime, "%Y-%m-%d")
-    endTimeObj = datetime.datetime.strptime(endTime, "%Y-%m-%d")
-
-    res = norther.get_station_state(stationID,startTimeObj, endTimeObj)
-
-    res.update({
-        "StationID": stationID,
-        "StartTime": startTime,
-        "EndTime": endTime
-    })
-
-    result = {"StationStats": res}
-    
-    logger.debug("[queryStationStats] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)
-
-def queryEquipAuth(request):
-    logger.info('function into [queryEquipAuth]')
-    
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-    
-    EquipAuthSeq = data.get('EquipAuthSeq')
-    ConnectorID = data.get('ConnectorID')
-    
-    logger.info('[queryEquipAuth],EquipAuthSeq=%s,ConnectorID=%s' % (EquipAuthSeq,ConnectorID))
-    
-    part = Part.objects(id = ConnectorID).first()
-    if not part:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    
-    dev = Device.get_dev_by_l(part.logicalCode) 
-    box = ActionDeviceBuilder.create_action_device(dev)
-    FailReason = 0
-    SuccStat = 0
-    try:
-        devInfo = box.get_port_status_from_dev()
-        portInfo = devInfo.get(str(part.partNo),{})
-    
-        if portInfo['isPlugin'] == 'no':
-            FailReason = 1
-    except Exception,e:
-        FailReason = 2
-    
-    if FailReason != 0:
-        SuccStat = 1
-    
-    result = {
-              'EquipAuthSeq':EquipAuthSeq,
-              'ConnectorID':ConnectorID,
-              'SuccStat':SuccStat,
-              'FailReason':FailReason
-              }
-    
-    logger.debug("[queryEquipAuth] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)
-
-def queryEquipBusinessPolicy(request):
-    """
-    用于查询运营商的充电设备接口计费模型信息
-    :param request:
-    :return:
-    """
-    logger.info('function into [queryEquipBusinessPolicy]')
-    
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-
-    equipBizSeq = data.get("EquipBizSeq")
-    connectorID = data.get("ConnectorID")
-    
-    logger.info('[queryEquipBusinessPolicy],equipBizSeq=%s,connectorID=%s' % (equipBizSeq,connectorID))
-    
-    part = Part.objects(id = connectorID).first()
-    if not part:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    
-    dev = Device.get_dev_by_l(part.logicalCode)
-    devObj = Device.objects.get(devNo = dev['devNo'])
-     
-    feeMode = devObj.otherConf.get('feeMode',{})
-    shiduan = feeMode.get('shiduan','000000000000000000000000000000000000000000000000')
-    elecFeeDict = {'0':feeMode.get('jianFee',0),'1':feeMode.get('fengFee',0),'2':feeMode.get('pingFee',0),'3':feeMode.get('guFee',0)}
-    serveFeeDict = {'0':feeMode.get('jianServeFee',0),'1':feeMode.get('fengServeFee',0),'2':feeMode.get('pingServeFee',0),'3':feeMode.get('guServeFee',0)}
-    
-    PolicyInfos = []
-    for ii in range(48):
-        startHour = 0 + ii/2
-        startMin = '00' if ii%2==0 else '30'
-        startTime = '%02d%s00' % (startHour,startMin)
-        if (ii == 0) or (ii > 0 and shiduan[ii] != shiduan[ii-1]):
-            PolicyInfos.append({'StartTime':startTime,'ElecPrice':elecFeeDict.get(shiduan[ii]),'SevicePrice':serveFeeDict.get(shiduan[ii])})
-    
-    result = {
-        "EquipBizSeq": equipBizSeq,
-        "ConnectorID": connectorID,
-        "SuccStat": 0 if PolicyInfos else 1,
-        "FailReason": 0 if PolicyInfos else 1,
-        "SumPeriod": 1,
-        "PolicyInfos": PolicyInfos
-    }
-    
-    logger.debug("[queryEquipBusinessPolicy] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)
-
-def query_start_charge(request):
-    logger.info('function into [query_start_charge]' )
-    
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-
-    StartChargeSeq = data.get("StartChargeSeq")
-    connectorID = data.get("ConnectorID")
-    
-    logger.info('[query_start_charge],StartChargeSeq=%s,connectorID=%s' % (StartChargeSeq,connectorID))
-    
-    part = Part.objects(id = connectorID).first()
-    if not part:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    dev = Device.get_dev_by_l(part.logicalCode)
-    if not dev:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    group = Group.get_group(dev['groupId'])
-    
-    # 启动设备,这里以能湃的
-    box = ActionDeviceBuilder.create_action_device(dev)
-    SuccStat,FailReason,orderNo = box.start_device_swap(part.partNo)
-    
-    if SuccStat != 0:
-        result = {
-        "StartChargeSeq": StartChargeSeq,
-        "StartChargeSeqStat": 5,
-        "connectorID": connectorID,
-        "SuccStat": SuccStat,
-        "FailReason": FailReason,
-        }
-        
-        # 异步通知北向
-        async_operation(norther.notification_start_charge_result,result)
-        
-        logger.debug("[query_start_charge] return result = {}".format(result))
-        
-        return get_reply_reponse(result, norther)
-
-    # 新建一条充值订单
-    rechargeOrder = RechargeRecordBuilder.new_swap_recharge(norther.swapLabel,dev,group,part.partNo,StartChargeSeq,orderNo)
-    
-    # 记录consume rcd
-    newRecord = {
-            'orderNo': orderNo,
-            'openId': '',
-            'nickname': '',
-            'coin': VirtualCoin(0),
-            'money': RMB(0),
-            'devNo': dev['devNo'],
-            'logicalCode': dev['logicalCode'],
-            'groupId': dev['groupId'],
-            'ownerId': dev['ownerId'],
-            'address': group['address'],
-            'groupNumber': dev['groupNumber'],
-            'groupName': group['groupName'],
-            'devTypeName': dev.devTypeName,
-            'devTypeCode': dev.devTypeCode,
-            'startKey': '',
-            'isNormal': True,
-            'errorDesc': '',
-            'sequanceNo': orderNo,
-            'status': ConsumeRecord.Status.CREATED,
-            'package': {},
-            'remarks':u'互联互通',
-            'rechargeRcdId':str(rechargeOrder.id)
-        }
-    
-    consumeOrder = ConsumeRecord(**newRecord)
-    consumeOrder.save()  # type: ConsumeRecord
-    
-    result = {
-        "StartChargeSeq": StartChargeSeq,
-        "StartChargeSeqStat": 2,
-        "connectorID": connectorID,
-        "SuccStat": SuccStat,
-        "FailReason": FailReason,
-        }
-    
-    new_service_progress = ServiceProgress(
-                device_imei = dev['devNo'],
-                devTypeCode = dev['devType']['code'],
-                port = part.partNo,
-                attachParas = {'StartChargeSeq':StartChargeSeq,'connectorID':connectorID},
-                start_time = int(time.time()),
-                finished_time = int(time.time()) + 3600*24,
-                status = 'waiting',  # 等充电事件上报后,再刷新此状态
-                consumeOrder = {},
-                weifuleOrderNo = orderNo,
-                expireAt = datetime.datetime.now() + datetime.timedelta(days = 91))
-
-    new_service_progress.save()
-            
-    # 异步通知北向
-    async_operation(norther.notification_start_charge_result,result)
-    
-    logger.debug("[query_start_charge] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)
-
-def query_equip_charge_status(request):
-    logger.info('function into [query_equip_charge_status]' )
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-
-    StartChargeSeq = data.get("StartChargeSeq")
-    
-    logger.info('[query_equip_charge_status],StartChargeSeq=%s' % (StartChargeSeq))
-    
-    rechargeRcd = RechargeRecord.objects(wxOrderNo = StartChargeSeq).first()
-    if not rechargeRcd:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-     
-    part = Part.objects(logicalCode = rechargeRcd.logicalCode,partNo = rechargeRcd.extraInfo['portNo']).first()
-    if not part:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    dev = Device.get_dev_by_l(part.logicalCode)
-    if not dev:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    
-    box = ActionDeviceBuilder.create_action_device(dev)
-    result = box.get_charge_status_for_swap(part.partNo,str(part.id))
-    result.update({
-                       'StartChargeSeq':StartChargeSeq,
-                       'ConnectorId':str(part.id),
-                       'StartTime':rechargeRcd.time,
-                       'EndTime':datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
-                       })
-    
-    logger.debug("[query_equip_charge_status] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)
-
-def query_stop_charge(request):
-    logger.info('function into [query_stop_charge]' )
-    norther,response = check_and_get_norther(request)
-    if not norther:
-        return response
-    
-    data,response = get_request_data(request, norther)
-    if not data:
-        return response
-    
-    StartChargeSeq = data.get("StartChargeSeq")
-    connectorID = data.get("ConnectorID")
-    
-    logger.info('[query_stop_charge],StartChargeSeq=%s,connectorID=%s' % (StartChargeSeq,connectorID))
-    
-    part = Part.objects(id = connectorID).first()
-    if not part:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    dev = Device.get_dev_by_l(part.logicalCode)
-    if not dev:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误,没有找到对应的设备接口"})
-    group = Group.get_group(dev['groupId'])
-    
-    # 首先检查下数据库订单情况,是否已经停止了
-    rechargeRcd = RechargeRecord.objects(wxOrderNo = StartChargeSeq).first()
-    if not rechargeRcd:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误,没有找到对应的充值订单"})
-    consumeRcd = ConsumeRecord.objects(orderNo = rechargeRcd.extraInfo['consumeOrderNo']).first()
-    if not consumeRcd:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误,没有找到对应的消费订单"})
-    if consumeRcd.status == ConsumeRecord.Status.FINISHED:
-        result = {
-        "StartChargeSeq": StartChargeSeq,
-        "StartChargeSeqStat": 4, # 已经结束
-        "connectorID": connectorID,
-        "SuccStat": 0,
-        "FailReason": 0,
-        }
-        # 启动异步,通知启动设备成功
-        async_operation(norther.notification_stop_charge_result,result)
-        return get_reply_reponse(result, norther)
-
-    box = ActionDeviceBuilder.create_action_device(dev)
-    SuccStat,FailReason = box.stop_device_swap(part.partNo)
-    
-    result = {
-        "StartChargeSeq": StartChargeSeq,
-        "StartChargeSeqStat": 4,
-        "connectorID": connectorID,
-        "SuccStat": SuccStat,
-        "FailReason": FailReason,
-        }
-    
-    # 启动异步,通知启动设备成功
-    async_operation(norther.notification_stop_charge_result,result)
-    
-    logger.debug("[query_stop_charge] return result = {}".format(result))
-    
-    return get_reply_reponse(result, norther)

+ 0 - 0
apps/web/api/test/__init__.py


+ 0 - 12
apps/web/api/test/urls.py

@@ -1,12 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^zhongtian$', apiTestZhongTian, name = 'apiTestZhongTian'),
-                       url(r'^notify/order$', apiTestNotify, name = 'apiTestNotify'),
-                       url(r'^notify/fault$', apiTestNotify, name = 'apiTestNotify'),
-                       )

+ 0 - 32
apps/web/api/test/views.py

@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-from typing import TYPE_CHECKING
-
-from apps.web.core.utils import JsonOkResponse, DefaultJsonErrorResponse
-from apps.web.utils import error_tolerate
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
-def apiTestZhongTian(request):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-
-    logger.debug('received notify = {}'.format(request.POST))
-    return JsonOkResponse()
-
-
-@error_tolerate(nil = DefaultJsonErrorResponse, logger = logger)
-def apiTestNotify(request):
-    # type: (WSGIRequest)->JsonResponse
-
-    logger.debug('received notify = {}'.format(request.POST))
-    return JsonOkResponse()

+ 0 - 30
apps/web/api/urls.py

@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url, include
-
-from apps.web.api.views import *
-
-urlpatterns = patterns('',
-    #浙江省的消防平台对接接口
-    url(r'^getPublicKey', getPublicKey, name='getPublicKey'),
-    url(r'^login', loginFromNorth, name='loginFromNorth'),
-    url(r'^getBuilding', getBuilding, name='getBuilding'),
-    url(r'^getCompany', getCompany, name='getCompany'),
-    url(r'^getEquipment', getEquipment, name='getEquipment'),
-    url(r'^getParts', getParts, name='getParts'),
-
-    # 山东省的对接
-    url(r'^query_token', queryToken, name='queryToken'),
-    url(r'^query_stations_info', queryStationInfo, name='queryStationInfo'),
-    url(r'^query_station_stats', queryStationStats, name='queryStationStats'),
-    url(r'^query_station_status', queryStationStatus, name='queryStationStatus'),
-    url(r'^query_equip_business_policy', queryEquipBusinessPolicy, name='queryEquipBusinessPolicy'),
-
-    url(r'^jn_north/', include('apps.web.api.jn_north.urls')),
-    # 丰图的对接
-    url(r'^ft_north/', include('apps.web.api.ft_north.urls')),
-    
-    # 互联互通的对接
-    url(r'^swap/', include('apps.web.api.swap.urls')),
-)

+ 0 - 304
apps/web/api/utils.py

@@ -1,304 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import base64
-import logging
-import math
-
-import itsdangerous
-
-from functools import wraps
-
-import simplejson as json
-
-from Crypto.Cipher import AES
-from django.conf import settings
-
-from django.contrib.auth.hashers import check_password
-from django.core.handlers.wsgi import WSGIRequest
-from django.http import JsonResponse
-from django.utils.encoding import force_text
-from mongoengine import NotUniqueError, DoesNotExist
-from typing import TYPE_CHECKING
-
-from apilib.utils_string import md5
-from apps.web.agent.models import Agent
-
-from apps.web.api.exceptions import ApiException, ApiAuthException
-from apps.web.core.exceptions import EmptyInput, InvalidParameter
-from apps.web.dealer.models import Dealer
-from apps.web.constant import ErrorCode
-from apps.web.core.utils import JsonErrorResponse
-from apps.web.device.models import Device
-
-if TYPE_CHECKING:
-    pass
-
-logger = logging.getLogger(__name__)
-
-
-def api_dealer_auth(request):
-    # type: (WSGIRequest)->Dealer
-    """
-    经销商授权
-    :param request:
-    :return:
-    """
-    if request is None:
-        raise ApiAuthException(errmsg = u'请确认传入授权头')
-
-    if 'HTTP_AUTHORIZATION' not in request.META:
-        logger.debug('http header not found')
-        raise ApiAuthException(errmsg = u'请确认传入授权头')
-
-    try:
-        credentials = request.META['HTTP_AUTHORIZATION'].split()[1]
-    except IndexError:
-        raise ApiAuthException(errmsg = u'请确认授权头的格式符合规范')
-
-    auth = base64.b64decode(credentials)
-    username, password = auth.split(":")[0], auth.split(":")[1]
-
-    sign = request.META.get('HTTP_SIGN')
-
-    if sign is None:
-        payload = json.loads(request.body) if request.body else {}
-
-        if not payload or 'sign' not in payload:
-            raise ApiAuthException(errmsg = u'找不到签名')
-
-        sign = payload['sign']
-
-    logger.debug('api = {}; username = {}; sign = {}'.format(str(request.path), username, sign))
-
-    agent = Agent.objects(agentSign = sign).first()
-    if not agent:
-        raise ApiAuthException(errmsg = u'找不到代理商')
-
-    dealer = Dealer.objects(username = username, agentId = str(agent.id)).first()
-
-    if dealer is None:
-        logger.debug('dealer not found')
-        raise ApiAuthException(errmsg = u'找不到经销商')
-
-    if not (check_password(md5(password), dealer.password) or check_password(password, dealer.password)):
-        logger.debug('dealer password does not match')
-        raise ApiAuthException(errmsg = u'经销商账号名或者密码错误')
-
-    setattr(dealer, 'api_conf', {
-        'agentId': str(agent.id),
-        'agentSign': sign,
-        'mySign': agent.mySign,
-        'domain': agent.domain
-    })
-
-    return dealer
-
-
-def api_call(nil = None, logger = None, *accepted_exceptions):
-    logger = logging.getLogger(__name__) if logger is None else logger
-
-    exc_handler_map = {
-        TypeError: u'类型错误',
-        EmptyInput: u'空的输入',
-        NotUniqueError: u'对象已存在',
-        DoesNotExist: u'对象不存在',
-        InvalidParameter: u'参数不合法'
-    }
-
-    def decorator(func):
-        @wraps(func)
-        def wrapper(request, *args, **kwargs):
-            _accepted_exceptions = accepted_exceptions
-            _accepted_exceptions = (Exception,) if not len(_accepted_exceptions) else _accepted_exceptions
-
-            try:
-                dealer = api_dealer_auth(request)
-
-                try:
-                    logger.debug('enter {}'.format(str(request.path)))
-                    return func(request, dealer, *args, **kwargs)
-                finally:
-                    logger.debug('left {}'.format(str(request.path)))
-            except ApiException as e:
-                logger.error(str(e))
-                return e.to_response()
-            except _accepted_exceptions as e:
-                if request.FILES:
-                    logger.error('[error_tolerate]: view({func_name}) error occurred when uploading files'
-                                 .format(func_name = func.__name__))
-                    logger.exception(e)
-
-                else:
-                    logger.exception(
-                        u'[error_tolerate] view({func_name}) caught an error,'
-                        u'(error={error}) (request=(body={request_body},REQUEST={request_request}))'
-                            .format(func_name = func.__name__, error = force_text(e.message),
-                                    request_body = force_text(request.body),
-                                    request_request = force_text(request.REQUEST)))
-
-                if callable(nil):
-                    def get_arg_count(callable_):
-                        code = getattr(callable_, '__code__', None)
-                        if code:
-                            return code.co_argcount
-
-                    exc_type = type(e)
-
-                    if get_arg_count(nil) == 1:
-                        #: 只处理自定义的exceptions,避免暴露python的其他错误
-                        if exc_type in exc_handler_map:
-                            #: 优先返回更详细的报错信息, 无法找到就返回默认的
-                            return nil(next(iter(e.args), exc_handler_map[exc_type]))
-                        else:
-                            return nil(u'系统错误')
-                    else:
-                        return nil()
-
-                else:
-                    return nil or api_exception_response()
-
-        return wrapper
-
-    return decorator
-
-
-deprecated_api_error_response = JsonErrorResponse
-
-
-def api_ok_response(payload = {}):
-    response_dict = {
-        'errcode': ErrorCode.SUCCESS,
-        'errmsg': 'SUCCESS',
-        'result': 1,
-        'payload': payload,
-        'description': ''
-    }
-
-    response_dict.update(payload)
-
-    return JsonResponse(response_dict)
-
-
-def api_ok_response_v2(**data):
-    response_dict = {
-        'errcode': ErrorCode.SUCCESS,
-        'errmsg': 'SUCCESS'
-    }
-    response_dict.update(**data)
-    return JsonResponse(response_dict)
-
-
-def api_error_response(errcode, errmsg, payload = {}):
-    response_dict = {
-        'errcode': errcode,
-        'errmsg': errmsg,
-        'result': 0,
-        'description': errmsg,
-        'payload': payload
-    }
-
-    return JsonResponse(response_dict)
-
-
-def api_exception_response(payload = {}):
-    response_dict = {
-        'errcode': ErrorCode.API_EXCEPTION,
-        'errmsg': u'系统错误',
-        'result': 0,
-        'description': u'系统错误',
-        'payload': payload
-    }
-
-    return JsonResponse(response_dict)
-
-
-def AES_CBC_PKCS5padding_encrypt(s, dataSecret=None, dataSecretIV=None):    # type:(str, str, str) -> str
-    """
-    AES CBC PKCS5padding 加密
-    :param s: 待加密字符串
-    :param dataSecret: 加密秘钥
-    :param dataSecretIV: 加密向量
-    """
-    _mode = AES.MODE_CBC
-    _size = AES.block_size
-
-    _secret = str(dataSecret) if dataSecret else str(settings.AES_CBC_DATA_SECRET)
-    _secretIV = str(dataSecretIV) if dataSecretIV else str(settings.AES_CBC_DATA_SECRET_IV)
-
-    pad = lambda x: x + (_size - len(s) % _size) * chr(_size - len(s) % _size)
-
-    cipher = AES.new(_secret, _mode, _secretIV)
-    crypt = cipher.encrypt(pad(s))
-
-    return base64.b64encode(crypt)
-
-
-def AES_CBC_PKCS5padding_decrypt(s, dataSecret=None, dataSecretIV=None):
-    """
-    AES CBC PKCS5padding 解密
-    :param s: 待加密字符串
-    :param dataSecret: 加密秘钥
-    :param dataSecretIV: 加密向量
-    """
-    _mode = AES.MODE_CBC
-    _size = AES.block_size
-
-    _secret = str(dataSecret) if dataSecret else str(settings.AES_CBC_DATA_SECRET)
-    _secretIV = str(dataSecretIV) if dataSecretIV else str(settings.AES_CBC_DATA_SECRET_IV)
-
-    enc = base64.b64decode(s)
-    unpad = lambda x: x[0:-ord(x[-1])]
-    cipher = AES.new(_secret, _mode, _secretIV)
-
-    return unpad(cipher.decrypt(enc))
-
-
-def generate_json_token(data, expire=None):
-    salt = settings.SHAN_DONG_TOKEN_SECRET
-    its = itsdangerous.TimedJSONWebSignatureSerializer(salt, expire)
-
-    return its.dumps(data)
-
-
-def parse_json_token(s, expire=None):
-    salt = settings.SHAN_DONG_TOKEN_SECRET
-    its = itsdangerous.TimedJSONWebSignatureSerializer(salt, expire)
-
-    try:
-        result = its.loads(s)
-    except itsdangerous.BadData:
-        return dict()
-
-    return result
-
-
-def bd09_to_gcj02(lng, lat):
-    """
-    百度坐标系到google坐标系的经纬度转换
-    :param lng: 百度经度
-    :param lat: 百度维度
-    :return:
-    """
-    if lng == 0.0 or lat == 0.0:
-        return lng, lat
-    x_pi = 3.14159265358979324 * 3000.0 / 180.0
-    x = lng - 0.0065
-    y = lat - 0.006
-    z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
-    theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
-    gg_lng = z * math.cos(theta)
-    gg_lat = z * math.sin(theta)
-    return [gg_lng, gg_lat]
-
-
-def get_coordinates_and_nums(groupId):
-    devices = Device.objects.filter(groupId=groupId)
-    _count = devices.count()
-    if _count == 0:
-        return 0.0, 0.0, _count
-    for dev in devices:
-        if dev.location is not None and dev.location.has_key('coordinates'):
-            coord = dev.location['coordinates']
-            return coord[0], coord[1], _count
-    return 0.0, 0.0, _count

+ 0 - 0
apps/web/api/v1/__init__.py


+ 0 - 22
apps/web/api/v1/urls.py

@@ -1,22 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-"""
-v1接口
-"""
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^device/start$', apiStartDevice, name = 'apiStartDevice'),
-                       url(r'^device/list/by/dealer$', getDeviceListByDealer, name = 'getDeviceListByDealer'),
-                       url(r'^device/status/online$', deviceOnlineStatus, name = 'deviceOnlineStatus'),
-                       url(r'^device/packages$', apiGetDevicePackageList, name = 'apiGetDevicePackageList'),
-                       url(r'^device/package$', apiGetPackage, name = 'apiGetPackage'),
-                       url(r'^order$', order, name = 'order'),
-                       url(r'^device/charger$', apiGetChargerInfo, name = 'apiGetChargerInfo'),
-                       url(r'^device/status$', apiGetDevStatus, name = 'apiGetDevStatus'),
-                       url(r'^device/stop$', apiStopDevice, name = 'apiStopDevice')
-                       )

+ 0 - 369
apps/web/api/v1/views.py

@@ -1,369 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-import logging
-import uuid
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apilib.utils_json import JsonResponse
-from apps.web.agent.models import Agent
-from apps.web.api.exceptions import ApiParameterError, ApiAuthDeviceException, ApiNoDeviceException, ApiDeviceTypeError
-from apps.web.api.utils import api_call, api_exception_response, api_ok_response, api_error_response, \
-    api_ok_response_v2, deprecated_api_error_response
-from apps.web.constant import DeviceCmdCode, ErrorCode, MQTT_TIMEOUT
-from apps.web.core.db import paginate
-from apps.web.core.exceptions import ServiceException
-from apps.web.core.helpers import ActionDeviceBuilder
-from apps.web.core.networking import MessageSender
-from apps.web.dealer.models import Dealer
-from apps.web.dealer.utils import get_devices_by_dealer
-from apps.web.device.models import Device
-from apps.web.api.models import APIStartDeviceRecord
-from apps.web.utils import error_tolerate
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.device.models import DeviceDict
-
-logger = logging.getLogger(__name__)
-
-@api_call(logger = logger, nil = api_exception_response())
-def deviceOnlineStatus(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-
-    payload = json.loads(request.body) if request.body else {}
-
-    if not payload:
-        raise ApiParameterError(errmsg = u'传递为空或payload格式有误,请传JSON格式')
-
-    if 'deviceCode' not in payload:
-        raise ApiParameterError(errmsg = u'必须传递deviceCode参数')
-
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    result = MessageSender.send(device = device, cmd = DeviceCmdCode.GET_DEVINFO, payload = {'IMEI': device['devNo']})
-    if result['rst'] != 0:
-        return api_ok_response(payload = {'online': 0, 'signal': 0})
-    else:
-        return api_ok_response(payload = {'online': 1, 'signal': int(result.get('signal', 0))})
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def apiStartDevice(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-
-    payload = json.loads(request.body) if request.body else {}
-
-    if not payload:
-        raise ApiParameterError(errmsg = u'传递为空或payload格式有误,请传JSON格式')
-
-    if 'deviceCode' not in payload:
-        raise ApiParameterError(errmsg = u'必须传递deviceCode参数')
-
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])  # type: DeviceDict
-    if not device:
-        raise ApiNoDeviceException()
-
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    # 整理额外参数
-    attachParas = payload.get('attachParas', {})
-
-    if 'channel' in payload:
-        channel = payload.get('channel', 'unknown')
-    else:
-        channel = attachParas.pop('channel', '')
-
-    if 'extOrderNo' in payload:
-        orderNo = payload.get('extOrderNo')
-    else:
-        orderNo = attachParas.pop('extOrderNo', str(uuid.uuid4()))
-
-    attachParas['extOrderNo'] = orderNo
-
-    if 'userId' in payload:
-        user_id = payload.get('userId', '')
-    else:
-        user_id = attachParas.pop('userId', '')
-
-    if 'createTime' in payload:
-        create_time = payload.get('createTime')
-    else:
-        create_time = attachParas.pop('createTime', '')
-
-    if 'coins' not in payload and 'package' not in payload:
-        raise ApiParameterError(errmsg = u'coins和package参数不能同时为空')
-
-    if 'coins' in payload:
-        package = {
-            'coins': payload['coins']
-        }
-    else:
-        if isinstance(payload['package'], str):
-            package = device['washConfig'].get(payload['package'])
-        elif isinstance(payload['package'], dict):
-            package = payload['package']
-        else:
-            raise ApiParameterError(errmsg = u'package必须为字符串或者json字典')
-
-    notify_url = payload.get('notify_url', '')
-
-    record = APIStartDeviceRecord(orderNo = orderNo,
-                                  deviceCode = payload['deviceCode'],
-                                  userId = user_id,
-                                  createTime = create_time,
-                                  package = package,
-                                  notifyUrl = notify_url,
-                                  apiConf = getattr(dealer, 'api_conf'),
-                                  channel = channel,
-                                  devNo = device['devNo'],
-                                  ownerId = device['ownerId'],
-                                  attachParas = attachParas)
-    record.save()
-
-    err_code = ErrorCode.EXCEPTION
-    err_msg = u'系统错误'
-
-    try:
-        if 'coins' in payload:
-            # 兼容以前代码, 走的是同步接口
-            result = MessageSender.net_pay(device = device, coins = int(package['coins']),
-                                           timeout = MQTT_TIMEOUT.START_DEVICE)
-        else:
-            smartBox = ActionDeviceBuilder.create_action_device(device)
-            result = smartBox.start_from_api(record = record)
-
-        if result and 'rst' in result:
-            # 这个是同步接口
-            err_code = result.get('rst')
-            err_msg = str(result.get('desc', ''))
-            return api_ok_response(payload = {'status': err_code, 'desc': err_msg})
-        else:
-            # 异步接口没有值返回
-            return api_ok_response(payload = {'status': 0, 'desc': u'成功下发启动设备命令'})
-
-    except ServiceException as e:
-        logger.error('start device({}) failed error(code={},msg={})'.format(device['devNo'], e.result.get('result'),
-                                                                            e.result.get('description')))
-
-        err_code = e.result.get('result')
-        err_msg = str(e.result.get('description'))
-
-        return api_ok_response(payload = {'status': err_code, 'desc': err_msg})
-
-    except Exception as e:
-        logger.exception('start device({}) failed error={}'.format(device['devNo'], e))
-
-        err_code = ErrorCode.EXCEPTION
-        err_msg = str(e)
-
-        return api_error_response(errcode = ErrorCode.API_EXCEPTION, errmsg = u'系统错误')
-
-    finally:
-        try:
-            record.errCode = err_code
-            record.errMsg = err_msg
-            record.save()
-        except Exception as e:
-            logger.exception(e)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def apiGetDevicePackageList(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-
-    payload = json.loads(request.body) if request.body else {}
-
-    if not payload:
-        raise ApiParameterError(errmsg = u'传递为空或payload格式有误,请传JSON格式')
-
-    if 'deviceCode' not in payload:
-        raise ApiParameterError(errmsg = u'必须传递deviceCode参数')
-
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    # 返回errcode, errmsg, packages. 其他为兼容
-    response_dict = {
-        'errcode': ErrorCode.SUCCESS,
-        'errmsg': 'SUCCESS',
-        'result': 1,
-        'payload': device['washConfig'],
-        'packages': device['washConfig'],
-        'description': ''
-    }
-    return JsonResponse(response_dict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def order(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-
-    return api_ok_response(payload = {}, description = u'成功查询订单')
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getDeviceListByDealer(request, dealer):
-    # type:(WSGIRequest, Dealer)->JsonResponse
-
-    pageIndex = 1
-    pageSize = 10
-
-    payload = json.loads(request.body) if request.body else {}
-    if not payload:
-        pageIndex = int(request.GET.get('pageIndex', 1))
-        pageSize = int(request.GET.get('pageSize', 10))
-    else:
-        pageIndex = int(payload.get('pageIndex', 1))
-        pageSize = int(payload.get('pageSize', 10))
-
-    def public_only(device):
-        return {k: v for k, v in device.iteritems() if k not in Device.protected_fields()}
-
-    devices = [public_only(_) for _ in get_devices_by_dealer(dealer)]
-
-    return api_ok_response(payload = {'devices': paginate(devices, pageIndex, pageSize)})
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def apiGetChargerInfo(request, dealer):
-    # type: (WSGIRequest)->JsonResponse
-
-    payload = json.loads(request.body) if request.body else {}
-
-    if not payload:
-        raise ApiParameterError(errmsg = u'传递为空或payload格式有误,请传JSON格式')
-
-    if 'deviceCode' not in payload:
-        raise ApiParameterError(errmsg = u'必须传递deviceCode参数')
-
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])
-    if device is None:
-        raise ApiNoDeviceException()
-
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    data = {}
-    ctrInfo = Device.get_dev_control_cache(device['devNo'])
-
-    if ctrInfo.has_key('elecValue'):
-        data.update({'elec': ctrInfo['elecValue']})
-    else:
-        try:
-            box = ActionDeviceBuilder.create_action_device(device)
-            valueDict = box.get_port_elec_from_dev()
-            data.update({'elec': valueDict})
-        except Exception, e:
-            data.update({'elec': {}})
-
-    if ctrInfo.has_key('temperatureValue'):
-        data.update({'temperature': ctrInfo['temperatureValue']})
-    else:
-        try:
-            box = ActionDeviceBuilder.create_action_device(device)
-            valueDict = box.get_port_temperature_from_dev()
-            data.update({'temperature': valueDict})
-        except Exception, e:
-            data.update({'temperature': {}})
-
-    if ctrInfo.has_key('isYangan'):
-        data.update({'smokeDetected': ctrInfo['isYangan']})
-    else:
-        data.update({'smokeDetected': False})
-
-    return api_ok_response_v2(**data)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def apiGetDevStatus(request, dealer):
-    # type: (WSGIRequest)->JsonResponse
-
-    payload = json.loads(request.body) if request.body else {}
-
-    if not payload:
-        raise ApiParameterError(errmsg = u'传递为空或payload格式有误,请传JSON格式')
-
-    if 'deviceCode' not in payload:
-        raise ApiParameterError(errmsg = u'必须传递deviceCode参数')
-
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])  # type: DeviceDict
-    if device is None:
-        raise ApiNoDeviceException()
-
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    data = {'status': device.status}
-
-    try:
-        box = device.deviceAdapter
-        portStatus = box.get_port_status_from_dev()
-        if portStatus is not None:
-            data.update({'portStatus': portStatus})
-
-        return api_ok_response(payload = data)
-    except NotImplementedError:
-        raise ApiDeviceTypeError(errmsg = u'未找到端口查询函数,请注意是否注册了正确的设备类型')
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def apiStopDevice(request, dealer):
-    # type: (WSGIRequest)->JsonResponse
-
-    payload = json.loads(request.body) if request.body else {}
-
-    if not payload:
-        raise ApiParameterError(errmsg = u'传递为空或payload格式有误,请传JSON格式')
-
-    if 'deviceCode' not in payload:
-        raise ApiParameterError(errmsg = u'必须传递deviceCode参数')
-
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])  # type: DeviceDict
-    if device is None:
-        raise ApiNoDeviceException()
-
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    box = ActionDeviceBuilder.create_action_device(device)
-    oper_result = box.stop()
-
-    Device.invalid_device_control_cache(device['devNo'])
-
-    return api_ok_response(payload = {'status': oper_result['rst']})
-
-
-@error_tolerate(logger = logger, nil = deprecated_api_error_response(description = u'系统错误'))
-def apiGetPackage(request):
-    # type: (WSGIRequest)->JsonResponse
-
-    sign = request.POST.get('sign', None)
-    channel = request.POST.get('channel', None)
-    logicalCode = request.POST.get('deviceCode', None)
-    if None in [sign, channel, logicalCode]:
-        return JsonResponse({'code': '00000001', 'msg': u'缺少必须的参数'})
-
-    # 检查签名是否存在
-    if not sign:
-        return JsonResponse({'code': '00000002', 'msg': u'签名不能为空'})
-    try:
-        agent = Agent.objects.get(agentSign = sign)
-    except Exception, e:
-        logger.exception('get agent error=%s' % e)
-        return JsonResponse({'code': '00000003', 'msg': u'错误的签名'})
-
-    dev = Device.get_dev_by_logicalCode(logicalCode)
-    dealer = Dealer.objects.get(id = dev['ownerId'])
-    if str(agent.id) != dealer['agentId']:
-        return JsonResponse({'code': '00000005', 'msg': u'设备编号和商户ID不匹配'})
-
-    if dev is None:
-        return JsonResponse({'code': '00000004', 'msg': u'未找到对应的设备'})
-
-    return JsonResponse({'code': '00000000', 'msg': '', 'data': dev['washConfig']})

+ 0 - 0
apps/web/api/validators.py


+ 0 - 781
apps/web/api/views.py

@@ -1,781 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import datetime
-import simplejson as json
-from mongoengine import DoesNotExist
-from typing import TYPE_CHECKING
-
-from apilib.utils_datetime import timestamp_to_dt
-from apilib.utils_json import JsonResponse
-from apps.web.api.exceptions import ApiAuthDeviceException, ApiNoDeviceException, ApiDeviceModeException
-from apps.web.api.jn_north.constant import RESPONSE_CODE
-from apps.web.api.utils import AES_CBC_PKCS5padding_decrypt, generate_json_token, AES_CBC_PKCS5padding_encrypt, parse_json_token
-from apps.web.common.models import District, TempValues
-from apps.web.constant import Const, ErrorCode
-from apps.web.core.exceptions import ServiceException
-from apps.web.core.models import SystemSettings
-from apps.web.device.models import Device, Group, Part
-from apps.web.south_intf.shangdong_platform import GroupIdMap, ShanDongNorther
-from apps.web.south_intf.zhejiang_fire import ZhejiangRSA, ZhejiangAddressType, ZhejiangZone, ZhejiangNorther, Company
-from apps.web.api.models import APIStartDeviceRecord
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from apps.web.device.models import DeviceDict
-
-
-# 智慧消防智能管控平台向各平台采集数据
-# 获取公钥,此公钥用来加密密码
-def getPublicKey(request):
-    logger.info('norther some one getPublicKey')
-    publicKey = ZhejiangRSA.publicKeyHear.replace('-----BEGIN PUBLIC KEY-----\n', '').replace(
-        '\n-----END PUBLIC KEY-----', '')
-    publicKey = publicKey.replace('\n', '')
-    #     publicKey = base64.b64encode(publicKey)
-    return JsonResponse({'code': 0, 'message': u'获取成功', 'data': {'publicKey': publicKey}})
-
-
-def loginFromNorth(request):
-    logger.info('norther some one loginFromNorth')
-    username = request.POST.get('username')
-    enPassword = request.POST.get('password')
-
-    password = ZhejiangRSA.decrypt(enPassword)
-    if password is None:
-        return JsonResponse({'code': '1', 'msg': u'用户名或者密码错误', 'data': None})
-    try:
-        obj = ZhejiangNorther.objects.get(usernameFromHear = username, passwordFromHear = password)
-    except Exception, e:
-        return JsonResponse({'code': '1', 'msg': u'用户名或者密码错误', 'data': None})
-
-    return JsonResponse({'code': 0, 'message': u'获取成功', 'data': {'tokenId': obj.tokenId}})
-
-
-def getBuilding(request):
-    def get_coordinates_and_nums(groupId):
-        devs = Device.objects.filter(groupId = groupId)
-        count = devs.count()
-        if count == 0:
-            return 0.0, 0.0, count
-        for dev in devs:
-            if dev.location is not None and dev.location.has_key('coordinates'):
-                coord = dev.location['coordinates']
-                return coord[0], coord[1], count
-        return 0.0, 0.0, count
-
-    agentId = request.META.get('HTTP_TOKENID', None)
-    logger.info('norther getBuilding data ,token is  %s' % agentId)
-    if agentId is None:
-        return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
-    try:
-        norther = ZhejiangNorther.objects.get(tokenId = agentId)
-    except Exception, e:
-        return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
-
-    serviceCode = norther.serviceCodeFromNorth
-
-    pageNo = int(request.POST.get('pageNo'))
-    pageSize = int(request.POST.get('pageSize'))
-
-    if request.POST.has_key('createDateB'):
-        createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
-        createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
-
-    postId = request.POST.get('postId', None)
-
-    if postId is None:
-        dealerIds = [obj.ownerId for obj in Company.objects.filter(agentId = agentId)]
-
-        if request.POST.has_key('updateDateE'):
-            updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
-            updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
-            groups = Group.objects.filter(ownerId__in = dealerIds,
-                                          dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
-        else:
-            groups = Group.objects.filter(ownerId__in = dealerIds,
-                                          dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
-    else:
-        groups = Group.objects.filter(id = postId)
-
-    total = groups.count()
-    pageCount = total / pageSize + 1
-    dataList = []
-    for group in groups.paginate(pageNo, pageSize):
-        lng, lnt, count = get_coordinates_and_nums(str(group.id))
-        data = {
-            'buildingId': str(group.id),
-            'buildingName': group.groupName,
-            'companyId': group.ownerId,
-            'address': group.address,
-            'buildingType': ZhejiangAddressType.get_typeId(group.addressType),
-            'lat': lnt,
-            'lng': lng,
-            'regionCode': ZhejiangZone.get_distinct_id(District.get_area(group.districtId), group.address),
-            'deviceNum': count,
-            'producerCode': serviceCode
-        }
-        dataList.append(data)
-
-    return JsonResponse({'code': 0, 'message': u'获取成功',
-                         'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
-                                  'list': dataList}})
-
-
-def getCompany(request):
-    agentId = request.META.get('HTTP_TOKENID', None)
-    if agentId is None:
-        return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
-
-    logger.info('norther getCompany,token is %s' % agentId)
-
-    try:
-        norther = ZhejiangNorther.objects.get(tokenId = agentId)
-    except Exception, e:
-        return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
-
-    pageNo = int(request.POST.get('pageNo'))
-    pageSize = int(request.POST.get('pageSize'))
-
-    if request.POST.has_key('createDateB'):
-        createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
-        createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
-
-    postId = request.POST.get('postId', None)
-
-    if postId is None:
-        if request.POST.has_key('updateDateE'):
-            updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
-            updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
-            companys = Company.objects.filter(agentId = agentId,
-                                              dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
-        else:
-            companys = Company.objects.filter(agentId = agentId, dateTimeAdded__gte = createDateB,
-                                              dateTimeAdded__lte = createDateE)
-    else:
-        companys = Company.objects.filter(ownerId = postId)
-
-    total = companys.count()
-    pageCount = total / pageSize + 1
-    dataList = []
-    for com in companys.paginate(pageNo, pageSize):
-        data = {
-            'companyId': str(com.ownerId),
-            'companyName': com.name,
-            'companyCode': com.unifiedSocialCreditCode,
-            'address': com.address,
-            'contactName': com.contactName,
-            'contactTel': com.telephone,
-        }
-        dataList.append(data)
-
-    return JsonResponse({'code': 0, 'message': u'获取成功',
-                         'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
-                                  'list': dataList}})
-
-
-def getEquipment(request):
-    agentId = request.META.get('HTTP_TOKENID', None)
-    if agentId is None:
-        return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
-
-    logger.info('norther getEquipment,token is %s' % agentId)
-
-    try:
-        norther = ZhejiangNorther.objects.get(tokenId = agentId)
-    except Exception, e:
-        return JsonResponse({'code': 2, 'message': u'token错误', 'data': None})
-
-    serviceCode = norther.serviceCodeFromNorth
-
-    pageNo = int(request.POST.get('pageNo'))
-    pageSize = int(request.POST.get('pageSize'))
-
-    if request.POST.has_key('createDateB'):
-        createDateB = timestamp_to_dt(int(request.POST.get('createDateB'))).strftime('%Y-%m-%d %H:%M:%S')
-        createDateE = timestamp_to_dt(int(request.POST.get('createDateE'))).strftime('%Y-%m-%d %H:%M:%S')
-
-    postId = request.POST.get('postId', None)
-
-    companyDict = {}
-    if postId is None:
-        dealerIds = []
-        for obj in Company.objects.filter(agentId = agentId):
-            companyDict[obj.ownerId] = obj.manufacturer
-            dealerIds.append(obj.ownerId)
-        if request.POST.has_key('updateDateE'):
-            updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
-            updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
-            devs = Device.objects.filter(ownerId__in = dealerIds,
-                                         dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
-        else:
-            devs = Device.objects.filter(ownerId__in = dealerIds,
-                                         dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
-    else:
-        company = Company.objects.get(ownerId = postId)
-        companyDict[company.ownerId] = company.manufacturer
-        devs = Device.objects.filter(ownerId = postId)
-
-    total = devs.count()
-    pageCount = total / pageSize + 1
-    dataList = []
-    for devObj in devs.paginate(pageNo, pageSize):
-        group = Group.get_group(devObj.groupId)
-
-        dev = Device.get_dev(devObj.devNo)  # type: DeviceDict
-
-        status = dev.status
-        online = dev.online
-        if status == Const.DEV_WORK_STATUS_FORBIDDEN:
-            strStatus = '2'  # 禁用
-        elif not online:
-            strStatus = '3'  # 离线
-        else:
-            strStatus = '1'  # 在线
-
-        partNum = Part.objects.filter(logcicalCode = devObj.logicalCode).count()
-
-        data = {
-            'deviceId': str(devObj.logicalCode),
-            'deviceName': u'充电桩',
-            'deviceType': '5',  # 智能充电桩
-            'address': group.get('address', "") if group is not None else '',
-            'lat': devObj.location['coordinates'][1] if devObj.location is not None and devObj.location.has_key(
-                'coordinates') else 0.0,
-            'lng': devObj.location['coordinates'][0] if devObj.location is not None and devObj.location.has_key(
-                'coordinates') else 0.0,
-            'companyId': devObj.ownerId,
-            'buildingId': devObj.groupId,
-            'producerCode': serviceCode,
-            'installDate': devObj.dateTimeAdded,
-            'deviceStatus': strStatus,
-            'deviceManufactory': companyDict.get(devObj.ownerId, u'充电桩生产厂家'),
-            'partsNum': partNum
-        }
-
-        dataList.append(data)
-
-    return JsonResponse({'code': 0, 'message': u'获取成功',
-                         'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
-                                  'list': dataList}})
-
-
-def getParts(request):
-    agentId = request.META.get('HTTP_TOKENID', None)
-    if agentId is None:
-        return JsonResponse({'code': 2, 'message': u'获取token失败', 'data': None})
-
-    logger.info('norther getParts,token is %s' % agentId)
-
-    pageNo = int(request.POST.get('pageNo'))
-    pageSize = int(request.POST.get('pageSize'))
-
-    if request.POST.has_key('createDateB'):
-        createDateB = timestamp_to_dt(int(request.POST.get('createDateB')))
-        createDateE = timestamp_to_dt(int(request.POST.get('createDateE')))
-
-    postId = request.POST.get('postId', None)
-    companyDict = {}
-    if postId is None:
-        dealerIds = []
-        for obj in Company.objects.filter(agentId = agentId):
-            companyDict[obj.ownerId] = obj.manufacturer
-            dealerIds.append(obj.ownerId)
-
-        lcList = []
-        for dealerId in dealerIds:
-            groupIds = Group.get_group_ids_of_dealer(dealerId)
-            devNoList = Device.get_devNos_by_group(groupIds)
-            for devNo in devNoList:
-                lcList.append(Device.get_logicalCode_by_devNo(devNo))
-
-        if request.POST.has_key('updateDateE'):
-            updateDateB = timestamp_to_dt(int(request.POST.get('updateDateB')))
-            updateDateE = timestamp_to_dt(int(request.POST.get('updateDateE')))
-            parts = Part.objects.filter(logicalCode__in = lcList,
-                                        dateTimeUpdated__gte = updateDateB, dateTimeUpdated__lte = updateDateE)
-        else:
-            parts = Part.objects.filter(logicalCode__in = lcList,
-                                        dateTimeAdded__gte = createDateB, dateTimeAdded__lte = createDateE)
-
-    else:
-        company = Company.objects.get(ownerId = postId)
-        companyDict[company.ownerId] = company.manufacturer
-        lcList = []
-        groupIds = Group.get_group_ids_of_dealer(postId)
-        devNoList = Device.get_devNos_by_group(groupIds)
-        for devNo in devNoList:
-            lcList.append(Device.get_logicalCode_by_devNo(devNo))
-
-        parts = Part.objects.filter(logicalCode__in = lcList)
-
-    total = parts.count()
-    pageCount = total / pageSize + 1
-    dataList = []
-    logicalCodes = set([obj.logicalCode for obj in parts.paginate(pageNo, pageSize)])
-    devDict = {}
-    for lc in logicalCodes:
-        dev = Device.get_dev_by_logicalCode(lc)
-        group = Group.get_group(dev['groupId'])
-        devDict[lc] = group['address']
-
-    for obj in parts.paginate(pageNo, pageSize):
-        data = {
-            'partsId': str(obj.id),
-            'partsName': u'标准充电口',
-            'address': devDict.get(obj.logicalCode),
-            'deviceId': obj.logicalCode,
-            'partsManufactory': companyDict.get(obj.ownerId, u'充电桩生产厂家'),
-            'installDate': obj.dateTimeAdded,
-            'partsStatus': '1',
-            'partsType': Part.objects(id = obj.id)[0].partType,
-        }
-
-        dataList.append(data)
-
-    return JsonResponse({'code': 0, 'message': u'获取成功',
-                         'data': {'pageNo': pageNo, 'pageSize': pageSize, 'pageCount': pageCount, 'count': total,
-                                  'list': dataList}})
-
-
-# ---- 以下为山东省能源局平台接口
-
-def queryToken(request):
-    """
-    省平台 获取token接口
-    OperatorID 组织机构代码
-    OperatorSecret 组织机构的密钥
-    :param request:
-    :return:
-    """
-    payload = json.loads(request.body)
-
-    logger.info("[query token] payload = {}".format(payload))
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(Data))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1002)"})
-
-    OperatorID = data.get("OperatorID")
-    OperatorSecret = data.get("OperatorSecret")
-
-    logger.info("[query token] OperatorID = {}, OperatorSecret = {}".format(OperatorID, OperatorSecret))
-
-    if not all((OperatorID, OperatorSecret)):
-        return JsonResponse({"Ret": 4003, "Msg": u"请求参数错误"})
-
-    try:
-        norther = ShanDongNorther.objects.filter(northOperatorID = OperatorID, northOperatorSecret = OperatorSecret).first()
-    except DoesNotExist:
-        return JsonResponse({"Ret": 4004, "Msg": u"请求参数错误"})
-    except Exception as e:
-        return JsonResponse({"Ret": 500, "Msg": u"系统错误"})
-
-    expire = 60 * 60 * 24 * 7
-    result = {
-        "OperatorID": norther.agentOperatorID,
-        "SuccStat": 0,
-        "AccessToken": generate_json_token(data=norther.get_token_data(), expire=expire),
-        "TokenAvailableTime": expire,
-        "FailReason": None
-    }
-    logger.debug("[queryToken] return result = {}".format(result))
-
-    # 拉取的时候加密 显式指明加密秘钥为 pull
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=norther.pullDataSecret,
-        dataSecretIV=norther.pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-
-    return JsonResponse({
-        "Ret": RESPONSE_CODE.SUCCESS,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-
-def queryStationInfo(request):
-    """
-    省平台拉去数据接口
-    LastQueryTime  上次查询时间 格式 yyyy-MM-dd HH:mm:ss ,可以为空,如果不 填写,则查询所有的充电站信息
-    PageNo
-    PageSize
-    :param request:
-    :return:
-    """
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationsInfo] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-
-    # 获取这个平台下面的所有的northers记录
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    northerMap = {norther.dealerId: norther for norther in northers}
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    # 这个平台下的所有对接过的经销商
-    dealerIds = [_.dealerId for _ in northers]
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    logger.info('[queryStationsInfo] , data = {}'.format(data))
-
-    pageNo = int(data.get('PageNo', 1))
-    pageSize = int(data.get('PageSize', 10))
-
-    filters = {
-        "ownerId__in": dealerIds
-    }
-
-    # 查询充电站信息 (Group)
-    query = Group.objects.filter(**filters).only("id")
-    StationInfos = list()
-
-    # 修改一下 只允许上传的是 汽车装的
-    groupIds = [str(item.id) for item in query if Device.objects.filter(groupId = str(item.id), devType__code__in=[
-        Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY_V2, Const.DEVICE_TYPE_CODE_CAR_CHARGING_CY,
-        Const.DEVICE_TYPE_CODE_CHARGING_HONGZHUO
-    ]).count()]
-
-    groupQuery = Group.objects.filter(id__in = groupIds).only("id", "ownerId")
-    pageCount = groupQuery.count() / pageSize + 1
-    for item in groupQuery.paginate(pageNo, pageSize):
-        # 获取站点信息
-        groupId = str(item.id)
-        _norther = northerMap[item.ownerId]
-
-        dev = Device.objects.filter(groupId = groupId)
-        if not dev:
-            continue
-
-        # 我们的GroupID是24位,省平台的是20位,这个地方做个映射表
-        GroupIdMap.add(groupId)
-
-        StationInfos.append(ShanDongNorther.get_station(groupId, _norther))
-
-    result = {
-        "PageNo": pageNo,
-        "ItemSize": pageSize,
-        "PageCount": pageCount,
-        "StationInfos": StationInfos
-    }
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-
-    logger.info("[queryStationsInfo], result = {}".format(resultData))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-
-def queryStationStats(request):
-    """
-    省平台 省级平台定期获取每个充电站在某个周期内的统计信息
-    StationID
-    StartTime
-    EndTime
-    :param request:
-    :return:
-    """
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationStats] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    logger.debug("[queryStationStats] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    logger.info('[queryStationStats], data = {}'.format(data))
-
-    stationID = data.get("StationID")
-    startTime = data.get("StartTime")
-    endTime = data.get("EndTime")
-
-    startTimeObj = datetime.datetime.strptime(startTime, "%Y-%m-%d")
-    endTimeObj = datetime.datetime.strptime(endTime, "%Y-%m-%d")
-
-    groupId = GroupIdMap.get_groupId(stationID)
-
-    res = ShanDongNorther.get_station_state(groupId, startTimeObj, endTimeObj)
-    res.update({
-        "StationID": stationID,
-        "StartTime": startTime,
-        "EndTime": endTime
-    })
-
-    result = {"StationStats": res}
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-    logger.debug("[queryStationStats] return result = {}".format(result))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-
-def queryStationStatus(request):
-    """
-    省平台 用于批量查询设备实时状态
-    :param request:
-    :return:
-    """
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryStationStatus] , token = {}'.format(token))
-
-    # 验证身份
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    logger.debug("[queryStationStatus] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    stationIDs = data.get("StationIDs")
-    if not isinstance(stationIDs, list):
-        return JsonResponse({"Ret": 4004, "Msg": u"系统错误"})
-
-    StationStatusInfos = list()
-    for stationID in stationIDs:
-        groupId = GroupIdMap.get_groupId(stationID)
-
-        StationStatusInfos.append(
-            {
-                "StationID": stationID,
-                "ConnectorStatusInfos": ShanDongNorther.get_station_status(groupId)
-            }
-        )
-
-    result = {
-        "StationStatusInfos": StationStatusInfos
-    }
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-    logger.debug("[queryStationStatus] return result = {}".format(result))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-
-def queryEquipBusinessPolicy(request):
-    """
-    省平台 用于查询运营商的充电设备接口计费模型信息
-    :param request:
-    :return:
-    """
-    # 验证身份
-    token = request.META.get('HTTP_AUTHORIZATION', "").replace("Bearer", "").strip()
-    logger.info('[queryEquipBusinessPolicy] , token = {}'.format(token))
-
-    tokenData = parse_json_token(token)
-    if not tokenData:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_TOKEN, "Msg": u"请求参数错误(1001)"})
-    northers = ShanDongNorther.get_norther(**tokenData)
-    if not northers:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_PARAM, "Msg": u"请求参数错误(1002)"})
-
-    # 准备token所获取的参数信息
-    norther = northers.first()
-    pullDataSecret = norther.pullDataSecret
-    pullDataSecretIV = norther.pullDataSecretIV
-
-    # 验证参数
-    logger.debug("[queryEquipBusinessPolicy] request body = {}".format(request.body))
-
-    if not request.body:
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1003)"})
-
-    try:
-        Data = json.loads(request.body).get("Data")
-        data = json.loads(AES_CBC_PKCS5padding_decrypt(
-            Data,
-            dataSecret=pullDataSecret,
-            dataSecretIV=pullDataSecretIV
-        ))
-    except Exception as e:
-        logger.exception(e)
-        return JsonResponse({"Ret": RESPONSE_CODE.ERROR_POST, "Msg": u"请求参数错误(1004)"})
-
-    equipBizSeq = data.get("EquipBizSeq")
-    connectorID = data.get("ConnectorID")
-
-    policyInfo = ShanDongNorther.get_policy_info(connectorID)
-
-    result = {
-        "EquipBizSeq": equipBizSeq,
-        "ConnectorID": connectorID,
-        "SuccStat": 0 if policyInfo else 1,
-        "FailReason": 0 if policyInfo else 1,
-        "SumPeriod": 1,
-        "PolicyInfos": [policyInfo] if policyInfo else None
-    }
-    resultData = AES_CBC_PKCS5padding_encrypt(
-        json.dumps(result),
-        dataSecret=pullDataSecret,
-        dataSecretIV=pullDataSecretIV
-    )
-    sig = norther.get_sig(resultData)
-
-    logger.debug("[queryEquipBusinessPolicy] return result = {}".format(result))
-
-    return JsonResponse({
-        "Ret": 0,
-        "Msg": u"请求成功",
-        "Data": resultData,
-        "Sig": sig
-    })
-
-
-#####################
-####   通用接口   ####
-#####################
-def send_api_order(payload, dealer, func):
-    device = Device.get_dev_by_logicalCode(payload['deviceCode'])  # type: DeviceDict
-    if not device:
-        raise ApiNoDeviceException()
-
-    if not device.is_authorized_to_dealer(str(dealer.id)):
-        raise ApiAuthDeviceException()
-
-    if device.isApi == False:
-        raise ApiDeviceModeException()
-
-    record = APIStartDeviceRecord(orderNo = payload.get('orderNo', ''),
-                                  deviceCode = payload.get('deviceCode', ''),
-                                  createTime = payload.get('createTime', ''),
-                                  notifyUrl = payload.get('payload', ''),
-                                  apiConf = getattr(dealer, 'api_conf'),
-                                  channel = payload.get('channel', ''),
-                                  devNo = device['devNo'],
-                                  ownerId = device['ownerId'],
-                                  attachParas = payload.get('attachParas', {}))
-    record.save()
-
-    err_code = ErrorCode.EXCEPTION
-    err_msg = u'系统错误'
-    result = {}
-
-    try:
-        smartBox = device.deviceAdapter
-        result = eval('smartBox.{}(record=payload)'.format(func))
-
-        err_code = result.get('rst')
-        err_msg = str(result.get('desc', ''))
-
-    except ServiceException as e:
-        logger.error('start device({}) failed error(code={},msg={})'.format(device['devNo'], e.result.get('result'),
-                                                                            e.result.get('description')))
-
-        err_code = e.result.get('result')
-        err_msg = str(e.result.get('description'))
-
-    except Exception as e:
-        logger.exception('start device({}) failed error={}'.format(device['devNo'], e))
-        err_code = ErrorCode.EXCEPTION
-        err_msg = str(e)
-
-    finally:
-        try:
-            record.errCode = err_code
-            record.errMsg = err_msg
-            record.servicedInfo = result
-            record.servicedInfo.update({'function': func})
-            record.save()
-        except Exception as e:
-            logger.exception(e)
-
-    return {'status': err_code, 'desc': err_msg, 'result': result}

+ 0 - 0
apps/web/api/ykt_north/__init__.py


+ 0 - 92
apps/web/api/ykt_north/models.py

@@ -1,92 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import hashlib
-import datetime
-from apilib.monetary import RMB
-from apps.web.core.db import Searchable, MonetaryField
-from mongoengine import StringField, DateTimeField, BooleanField, IntField, DoesNotExist
-
-
-class YiKaTongNorther(Searchable):
-    northPort = StringField(verbose_name="域名端口 推送数据给对方平台的时候 服务器的地址", default="")
-    md5Key = StringField(vebose_name="签名密钥 可以理解为 我方密码")
-    meta = {
-        "collection": "yi_ka_tong",
-        "db_alias": "default"
-    }
-
-    def get_sig(self,datadict):
-        keyList = list()
-        for k in datadict:
-            keyList.append(k)
-        keyList.sort()
-        valueList = list()
-        for k in keyList:
-            v = datadict[k]
-            valueList.append(v)
-        signData = '|'.join(valueList)
-        signData = signData + '|' + str(self.md5Key)
-        md5 = hashlib.md5()
-        md5.update(signData.encode('utf-8'))
-        sign = md5.hexdigest().upper()
-        return sign
-
-    def join_url(self,path):
-        return "{ipPort}/{path}".format(
-            ipPort=self.northPort,
-            path=path
-        )
-
-# 建立一张表储存一卡通的卡详细信息,卡号,状态等
-class YiKaTongCard(Searchable):
-    customerId = StringField(verbose_name="一卡通平台唯一识别码", default="")
-    userName= StringField(verbose_name="一卡通用户姓名", default="")
-    userCode = StringField(verbose_name="个人编号", default="")
-    oddFare = MonetaryField(verbose_name="电子账户余额", default = RMB('0.00'))
-    custStatus = IntField(verbose_name = "卡状态", default = 1)
-    cardNo = StringField(verbose_name="当前物理卡号", default="")
-    pastCardNo = StringField(verbose_name="曾用过的物理卡号", default="")
-    dateTimeAdded = StringField(verbose_name='设备添加进来的时间', default="")
-    dateTimeUpdate = StringField(verbose_name='补卡时间', default="")
-
-    meta = {
-        "collection": "yi_ka_tong_card",
-        "db_alias": "default"
-    }
-
-    @staticmethod
-    def get_cardNo(cardNo):
-        try:
-            obj = YiKaTongCard.objects.get(cardNo=cardNo)
-        except:
-            return
-        return obj.pastCardNo
-
-    @staticmethod
-    def update_card(cardInfo):
-        cardNo = cardInfo.get("cardNo")
-        customerId = str(cardInfo.get("customerId"))
-        userName = cardInfo.get("userName")
-        userCode = cardInfo.get("userCode")
-        oddFare = cardInfo.get("oddFare")
-        custStatus = cardInfo.get("custStatus")
-        ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
-        try:
-            obj = YiKaTongCard.objects.get(customerId=customerId)
-
-        except:
-            obj = YiKaTongCard(customerId=customerId, userName=userName, userCode=userCode, oddFare=RMB(oddFare),
-                               custStatus=custStatus, cardNo=cardNo, dateTimeAdded=ts)
-            obj.save()
-        else:
-            obj.customerId = customerId
-            obj.userName = userName
-            obj.userCode = userCode
-            obj.oddFare = RMB(oddFare)
-            obj.custStatus = custStatus
-            if cardNo != obj.cardNo:
-                obj.pastCardNo = obj.cardNo
-                obj.cardNo = cardNo
-                obj.dateTimeUpdate = ts
-            obj.save()

+ 0 - 41
apps/web/api/ykt_north/utils.py

@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-import hashlib
-
-import requests
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-def send_request(url,mode='POST',**kwargs):
-    """
-    主动发送HTTP请求获取数据 密钥及签名
-    :return:
-    """
-
-    headers = {"Content-Type": "application/json;charset=utf-8"}
-    token = kwargs.pop("token", None)
-
-    if token:headers.update({"Authorization": "Basic {}".format(token)})
-    timeout = kwargs.pop("timeout", 5)
-
-    data = kwargs
-
-
-
-    try:
-        if mode == 'POST':
-            response = requests.post(url=url, json=data, headers=headers, timeout=timeout)
-        else:
-            response = requests.get(url=url, headers=headers, timeout=timeout)
-    except requests.Timeout:
-        return dict()
-    except Exception as e:
-        logger.exception(e)
-        return dict()
-
-    if response.status_code != 200:
-        return dict()
-
-    return response.json()

+ 0 - 35
apps/web/api/ykt_north/view.py

@@ -1,35 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-import datetime
-
-
-from apps.web.api.ykt_north.models import YiKaTongNorther
-from apps.web.api.ykt_north.utils import send_request
-
-
-# 一卡通查询消费接口
-def custQueryConsume(cardSnr,orderNo,tradeFare,tradeDate):
-    timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
-    dataDict = {
-        'cardSnr':cardSnr,
-        'orderNo':orderNo,
-        'tradeFare':str(tradeFare),
-        'tradeDate':tradeDate,
-        'time':timestamp
-    }
-    north = YiKaTongNorther().first1()
-    sign = north.get_sig(dataDict)
-    url = north.join_url("custqueryconsume")
-    return send_request(url=url,sign=sign,**dataDict)
-
-# 查询卡接口
-def custquery(cardSnr):
-    timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
-    north = YiKaTongNorther().first1()
-    dataDict = {
-        'cardSnr': cardSnr,
-        'time': timestamp
-    }
-    sign = north.get_sig(dataDict)
-    url = north.join_url("custquery")
-    return send_request(url=url, sign=sign, **dataDict)

+ 0 - 0
apps/web/api/ymd/__init__.py


+ 0 - 15
apps/web/api/ymd/urls.py

@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-"""
-易马达接口对接
-"""
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^getPortStatusFromAx$', getPortStatusFromAx, name = 'getPortStatusFromAx'),
-                       url(r'^stopAxPort$', stopAxPort, name = 'stopAxPort'),
-                       )

+ 0 - 64
apps/web/api/ymd/views.py

@@ -1,64 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortStatusFromAx(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'createTime', 'orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortStatusFromAx')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def stopAxPort(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'createTime', 'orderNo', 'chargeIndex']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStopAxPort')
-
-    return api_ok_response(payload = resultDict)

+ 0 - 0
apps/web/api/ytb/__init__.py


+ 0 - 17
apps/web/api/ytb/urls.py

@@ -1,17 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-"""
-一体板接口对接
-"""
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^startDeviceForYtb$', startDeviceForYtb, name = 'startDeviceForYtb'),
-                       url(r'^getPortStatusFromYtb$', getPortStatusFromYtb, name = 'getPortStatusFromYtb'),
-                       url(r'^getPortInfoFromYtb$', getPortInfoFromYtb, name = 'getPortInfoFromYtb'),
-                       url(r'^stopChargingPortForYtb$', stopChargingPortForYtb, name = 'stopChargingPortForYtb'),
-                       )

+ 0 - 110
apps/web/api/ytb/views.py

@@ -1,110 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortStatusFromYtb(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg=u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg=u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload=payload, dealer=dealer, func='apiGetPortStatusFromYtb')
-
-    return api_ok_response(payload=resultDict)
-
-
-@api_call(logger=logger, nil=api_exception_response())
-def getPortInfoFromYtb(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg=u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg=u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload=payload, dealer=dealer, func='apiGetPortInfoFromYtb')
-
-    return api_ok_response(payload=resultDict)
-
-
-@api_call(logger=logger, nil=api_exception_response())
-def stopChargingPortForYtb(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg=u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg=u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload=payload, dealer=dealer, func='apiStopChargingPortForYtb')
-
-    return api_ok_response(payload=resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def startDeviceForYtb(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'packageId', 'port']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg=u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg=u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload=payload, dealer=dealer, func='apiStartDeviceForYtb')
-
-    return api_ok_response(payload=resultDict)

+ 0 - 0
apps/web/api/ywt/__init__.py


+ 0 - 18
apps/web/api/ywt/urls.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-from django.conf.urls import patterns, url
-
-from .views import *
-
-urlpatterns = patterns('',
-                       url(r'^openCabinetDoor$', openCabinetDoor, name = 'openCabinetDoor'),
-                       url(r'^startCharging$', startCharging, name = 'startCharging'),
-                       url(r'^openAndStartCharging$', openAndStartCharging, name = 'openAndStartCharging'),
-                       url(r'^getDevicePortInfo$', getDevicePortInfo, name = 'getDevicePortInfo'),
-                       url(r'^stopChargingWithOpenDoor$', stopChargingWithOpenDoor,
-                           name = 'stopChargingWithOpenDoor'),
-                       url(r'^stopChargingWithCloseDoor$', stopChargingWithCloseDoor,
-                           name = 'stopChargingWithCloseDoor'),
-                       url(r'^getPortInfoYwt$', getPortInfoYwt, name = 'getPortInfoYwt')
-                       )

+ 0 - 179
apps/web/api/ywt/views.py

@@ -1,179 +0,0 @@
-# -*- coding: utf-8 -*-
-# !/usr/bin/env python
-
-import logging
-
-import simplejson as json
-from typing import TYPE_CHECKING
-
-from apps.web.api.exceptions import ApiParameterError
-from apps.web.api.utils import api_call, api_ok_response, api_exception_response
-from apps.web.api.views import send_api_order
-
-logger = logging.getLogger(__name__)
-
-if TYPE_CHECKING:
-    from django.core.handlers.wsgi import WSGIRequest
-    from apps.web.dealer.models import Dealer
-    from apilib.utils_json import JsonResponse
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getPortInfoYwt(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'createTime', 'orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetPortInfoYwt')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def openCabinetDoor(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'chargeIndex', 'createTime', 'orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiOpenCabinetDoor')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def startCharging(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'chargeIndex', 'createTime', 'orderNo', 'chargeTime']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStartCharging')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def openAndStartCharging(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'chargeIndex', 'createTime', 'orderNo', 'chargeTime']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiOpenAndStartCharging')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def getDevicePortInfo(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'createTime', 'orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiGetDevicePortInfo')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def stopChargingWithOpenDoor(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'chargeIndex', 'createTime', 'orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStopChargingWithOpenDoor')
-
-    return api_ok_response(payload = resultDict)
-
-
-@api_call(logger = logger, nil = api_exception_response())
-def stopChargingWithCloseDoor(request, dealer):
-    # type: (WSGIRequest, Dealer)->JsonResponse
-    payload = json.loads(request.body) if request.body else {}
-
-    default_params_list = ['deviceCode', 'chargeIndex', 'createTime', 'orderNo']
-    params_list = payload.keys()
-
-    # 1. 判断差集
-    different_params_list = list(set(default_params_list) - set(params_list))
-    if len(different_params_list) != 0:
-        raise ApiParameterError(errmsg = u'参数内容错误')
-
-    # 2. 判断个数
-    if len(params_list) != len(default_params_list):
-        raise ApiParameterError(errmsg = u'参数错误')
-
-    # 3. 调用api
-    resultDict = send_api_order(payload = payload, dealer = dealer, func = 'apiStopChargingWithCloseDoor')
-
-    return api_ok_response(payload = resultDict)

+ 0 - 0
apps/web/api/zhejiang/__init__.py


+ 0 - 18
apps/web/api/zhejiang/constant.py

@@ -1,18 +0,0 @@
-# coding=utf-8
-
-class EventDeviceCategory(object):
-    DEVICE = 1
-    PART = 2
-    OTHER = 999
-
-
-class FaultCategory(object):
-    POWER = 1
-    OFFLINE = 3
-    OTHER = 999
-
-
-class AlarmCategory(object):
-    TEMP = 1
-    SMOKE = 2
-    OTHER = 999

+ 0 - 5
apps/web/api/zhejiang/exceptions.py

@@ -1,5 +0,0 @@
-# coding=utf-8
-
-
-class ZheJiangNotifierException(Exception):
-    pass

+ 0 - 46
apps/web/api/zhejiang/models.py

@@ -1,46 +0,0 @@
-# coding=utf-8
-import datetime
-
-from mongoengine import StringField, DateTimeField, IntField, DictField
-
-from apps.web.core.db import Searchable
-from apps.web.dealer.models import Dealer
-
-
-class ZheJiangFireFight(Searchable):
-    """
-    德力西浙江玉环所需最小单位信息
-    """
-    ak = StringField(verbose_name=u"接入ID")
-    sk = StringField(verbose_name=u"接入匹配字段")
-    url = StringField(verbose_name=u"对接平台地址")
-
-    parentId = StringField(verbose_name=u"运营服务机构唯一代码")
-    dealerId = StringField(verbose_name=u"绑定的经销商")
-
-    companyName = StringField(verbose_name=u"联网单位名称")
-    companyCode = StringField(verbose_name=u"统一社会信用码")
-    address = StringField(verbose_name=u"地址信息")
-    regionCode = StringField(verbose_name=u"行政区编码")
-    companyCategory = StringField(verbose_name=u"单位类别", db_field="cCategory")
-    companyType = IntField(verbose_name=u"单位类型", db_field="cType")
-    industryType = StringField(verbose_name=u"行业类型", db_field="iType")
-    fireManager = StringField(verbose_name=u"消防安全管理人", db_field="FM")
-    fireManagerTel = StringField(verbose_name=u"消防安全管理人电话", db_field="FMT")
-    fireLiable = StringField(verbose_name=u"消防安全责任人", db_field="FL")
-    fireLiableTel = StringField(verbose_name=u"消防安全责任人电话", db_field="FLT")
-
-    deviceCreatorMap = DictField(verbose_name=u"设备厂家映射表code-厂家", default=dict)
-
-    createTime = DateTimeField(verbose_name=u"创建时间", default=datetime.datetime.now)
-    updateTime = DateTimeField(verbose_name=u"更新时间", default=datetime.datetime.now)
-
-    @property
-    def dealer(self):
-        dealer = getattr(self, "_dealer", None)
-        if not dealer:
-            dealer = Dealer.objects.get(id=self.dealerId)
-            setattr(self, "_dealer", dealer)
-
-        return dealer
-

+ 0 - 439
apps/web/api/zhejiang/utils.py

@@ -1,439 +0,0 @@
-# coding=utf-8
-import datetime
-import json
-import logging
-import base64
-import hmac
-import time
-import uuid
-
-import typing
-from hashlib import sha256
-from urlparse import urljoin
-
-import requests
-
-from apps.web.api.zhejiang.constant import EventDeviceCategory
-from apps.web.api.zhejiang.models import ZheJiangFireFight
-from apps.web.api.zhejiang.exceptions import ZheJiangNotifierException
-from apps.web.common.models import District
-
-if typing.TYPE_CHECKING:
-    from apps.web.device.models import DeviceDict, Part
-
-
-logger = logging.getLogger(__name__)
-
-
-def get_client_token(ak, sk, timestamp):
-    """
-    获取客户端的token
-    """
-    # 时间戳为毫秒数
-    timestamp *= 1000
-    ak = str(ak)
-    sk = str(sk)
-
-    logger.info("[get_client_token] ak = {}-{}, sk = {}-{}, timestamp = {}-{}".format(type(ak), ak, type(sk), sk, type(timestamp), timestamp))
-    # 获取认证字符串
-    authStr = base64.b64encode("{}{}".format(ak, timestamp))
-
-    # 获取认证摘要字符串 注意要是16进制的字符串
-    auth = hmac.new(key=sk, msg=authStr, digestmod=sha256).hexdigest()
-
-    # 获取clientToken
-    clientToken = base64.b64encode("{}:{}:{}".format(auth, ak, timestamp))
-    logger.info("[get_client_token] token = {}".format(clientToken))
-    return clientToken
-
-
-def verify_client_token(clientToken, ak, sk):
-    ak = str(ak)
-    sk = str(sk)
-
-    vAuth, vAk, vt = clientToken.split(":")
-
-    if ak != vAk:
-        return False
-
-    authStr = base64.b64encode("{}{}".format(ak, vt))
-    auth = base64.b64encode(hmac.new(key=sk, msg=authStr, digestmod=sha256).hexdigest())
-
-    if auth != vAuth:
-        return False
-
-    # 时间戳的单位是毫秒
-    if int(time.time() * 1000) > int(vt):
-        return False
-
-    return True
-
-
-def check_none_value(iterable):
-    """
-    检查必传参数是否有空值 注意和0以及空串区分开
-    """
-    return all(filter(lambda x: x is None, iterable))
-
-
-class ZheJiangNotifier(object):
-
-    URL = ""
-    EXPIRE_TIME = 1000
-
-    def __init__(self, ak, sk, pid, **kwargs):
-        self._ak = ak
-        self._sk = sk
-        self._pid = pid
-
-        if "url" in kwargs:
-            self._baseUrl = kwargs["url"]
-        else:
-            self._baseUrl = self.URL
-
-        if "expire" in kwargs:
-            self._expire = kwargs["expire"]
-        else:
-            self._expire = self.EXPIRE_TIME
-
-    def __str__(self):
-        return "[ZheJiangNotifier]-<{}>".format(self._pid)
-
-    def _get_header(self, **kwargs):
-        """
-        附加请求头
-        """
-        timeStamp = kwargs.pop("timeStamp", None) or (int(time.time()) + self._expire)
-        headers = {
-            "Client-Token": get_client_token(self._ak, self._sk, timeStamp),
-            "Content-Type": "application/json"
-        }
-
-        for _k, _v in kwargs.items():
-            headers[_k] = _v
-
-        return headers
-
-    def _request(self, **kwargs):
-        headers = kwargs.pop("headers", dict())
-        headers = self._get_header(**headers)
-
-        path = kwargs.pop("path")
-        url = urljoin(self._baseUrl, path)
-
-        # 找出操作数据的类型 1---修改或者新增 2----删除
-        payload = {
-            "opt_type": kwargs.pop("opt", 0),
-            "lists": kwargs["lists"]
-        }
-
-        logger.info("[ZheJiangNotifier _request], notifier = {}, headers = {}, url = {}, push payload = {}".format(self, headers, url, json.dumps(payload, indent=4)))
-        try:
-            response = requests.post(url=url, headers=headers, json=payload, verify=False, timeout=10)
-        except requests.Timeout:
-            raise ZheJiangNotifierException(u"请求超时")
-
-        return self._handle_response(response)
-
-    def _handle_response(self, response):
-        try:
-            response.raise_for_status()
-        except requests.RequestException as ree:
-            raise ZheJiangNotifierException(ree.message)
-
-        result = response.json()
-        logger.info("[ZheJiangNotifier _handle_response] notifier = {} result = {}".format(self, json.dumps(result, indent=4)))
-        # TODO 根据code的定义 有可能重新发出请求
-        code = result["code"]
-
-        return result
-
-    def push_company(self, *company):
-        """
-        推送公司信息 保持最小信息推送原则
-        """
-        lists = list()
-        for _item in company:
-            data = {
-                "company_id": _item.pop("companyId", None),
-                "company_name": _item.pop("companyName", None),
-                "parent_id": self._pid,
-                "company_code": _item.pop("companyCode", None),
-                "address": _item.pop("address", None),
-                "region_code": _item.pop("regionCode", None),
-                "company_category": _item.pop("companyCategory", None),
-                "company_type": _item.pop("companyType", None),
-                "industry_type": _item.pop("industryType", None),
-                "fire_manager": _item.pop("fireManager", None),
-                "fire_manager_tel": _item.pop("fireManagerTel", None),
-                "fire_liable": _item.pop("fireLiable", None),
-                "fire_liable_tel": _item.pop("fireLiableTel", None),
-                "create_time": _item.pop("createTime", None),
-                "update_time": _item.pop("updateTime", None),
-            }
-
-            if not check_none_value(data.values()):
-                raise ZheJiangNotifierException(u"推送单位参数错误")
-            lists.append(data)
-
-        logger.info("[ZheJiangNotifier push_company], notifier = {}, push data = {}".format(self, json.dumps(lists, indent=4)))
-        response = self._request(opt=0, lists=lists, path="fire/company/update")
-        return response
-
-    def push_device(self, *device):
-        """
-        推送设备的信息 推送设备类型固定为 小型充电桩(非汽车)
-        """
-        lists = list()
-
-        for _item in device:
-            data = {
-                "device_id": _item.pop("deviceId"),
-                "device_name": _item.pop("logicalCode"),
-                "parentId": self._pid,
-                "device_code": _item.pop("devNo"),
-                "location": _item.pop("location"),
-                "device_manufactory": _item.pop("creator"),
-                "device_type": "44",
-                "relation_type": "1",
-                "relation_id": _item.pop("companyId"),
-                "create_time": _item.pop("createTime"),
-                "update_time": _item.pop("updateTime")
-            }
-
-            if not check_none_value(data.values()):
-                raise ZheJiangNotifierException(u"推送设备参数错误")
-            lists.append(data)
-
-        logger.info("[ZheJiangNotifier push_device], notifier = {}, push data = {}".format(self, json.dumps(lists, indent=4)))
-        response = self._request(opt=0, lists=lists, path="fire/device/update")
-        return response
-
-    def push_part(self, *part):
-        """
-        推送部件的时候 推送部件类型固定为充电口
-        """
-        lists = list()
-
-        for _item in part:
-            data = {
-                "part_id": _item.pop("partId"),
-                "part_name": _item.pop("partName"),
-                "parent_id": self._pid,
-                "sensor_code": _item.pop("sensorCode"),
-                "address": _item.pop("address"),
-                "parts_type": "137",
-                "relation_type": "1",
-                "relation_id": _item.pop("companyId"),
-                "device_id": _item.pop("deviceId"),
-                "create_time": _item.pop("createTime"),
-                "update_time": _item.pop("updateTime")
-            }
-
-            if not check_none_value(data.values()):
-                raise ZheJiangNotifierException(u"推送部件参数错误")
-            lists.append(data)
-
-        logger.info("[ZheJiangNotifier push_part], notifier = {}, push data = {}".format(self, json.dumps(lists, indent=4)))
-        response = self._request(opt=0, lists=lists, path="fire/part/update")
-        return response
-
-    def push_device_state(self, *state):
-        """
-        推送设备的运行状态 应该是设备上线或者设备离线的时候使用
-        """
-        lists = list()
-
-        for _item in state:
-            data = {
-                "event_id": _item.pop("eventId"),
-                "device_category": int(_item.pop("deviceCategory")),
-                "device_id": _item.pop("deviceId"),
-                "parent_id": self._pid,
-                "online_status": int(_item.pop("onlineStatus")),
-                "work_status": int(_item.pop("workStatus")),
-                "event_time": _item.pop("eventTime")
-            }
-
-            if not check_none_value(data.values()):
-                raise ZheJiangNotifierException(u"推送设备运行状态错误")
-            lists.append(data)
-
-        logger.info("[ZheJiangNotifier push_device_state], notifier = {}, push data = {}".format(self, json.dumps(lists, indent=4)))
-        response = self._request(opt=0, lists=lists, path="fire/devicestate/report")
-        return response
-
-    def push_fault(self, **kwargs):
-        """
-        推送故障信息
-        """
-        data = {
-            "event_id": kwargs.pop("eventId"),
-            "device_category": int(kwargs.pop("deviceCategory")),
-            "device_id": kwargs.pop("deviceId"),
-            "parent_id": self._pid,
-            "fault_type": int(kwargs.pop("faultType")),
-            "event_time": kwargs.pop("eventTime")
-        }
-
-        logger.info("[ZheJiangNotifier push_fault], notifier = {}, push data = {}".format(self, json.dumps(data, indent=4)))
-
-        if not check_none_value(data.values()):
-            raise ZheJiangNotifierException(u"推送设备故障状态错误,缺少参数")
-        response = self._request(opt=0, lists=[data], path="fire/fault/report")
-        return response
-
-    def push_fault_handle(self, **kwargs):
-        data = {
-            "event_id": kwargs.pop("eventId"),
-            "device_category": int(kwargs.pop("deviceCategory")),
-            "device_id": kwargs.pop("deviceId"),
-            "parent_id": self._pid,
-            "fault_type": int(kwargs.pop("faultType")),
-            "happen_time": kwargs.pop("happenTime"),
-            "process_type": kwargs.pop("processType")
-        }
-
-        if data["process_type"] == "0":
-            data.update({
-                "fault_content": kwargs.pop("faultContent"),
-                "reportperson_name": kwargs.pop("reportpersonName")
-            })
-
-        logger.info("[ZheJiangNotifier push_fault_handle], notifier = {}, push data = {}".format(self, json.dumps(data, indent=4)))
-
-        if not check_none_value(data.values()):
-            raise ZheJiangNotifierException(u"推送设备信息故障操作信息失败,缺少参数")
-        response = self._request(opt=0, lists=[data], path="fire/faultprocess/report")
-        return response
-
-    def push_alarm(self, **kwargs):
-        """
-        推送火警信息
-        """
-        data = {
-            "event_id": kwargs.pop("eventId"),
-            "device_category": int(kwargs.pop("deviceCategory")),
-            "device_id": kwargs.pop("deviceId"),
-            "parent_id": self._pid,
-            "alarm_type": kwargs.pop("alarmType"),
-            "event_time": kwargs.pop("eventTime")
-        }
-
-        logger.info("[ZheJiangNotifier push_alarm], notifier = {}, push data = {}".format(self, json.dumps(data, indent=4)))
-
-        if not check_none_value(data.values()):
-            raise ZheJiangNotifierException(u"推送设备火警状态错误,缺少参数")
-        response = self._request(opt=0, lists=[data], path="fire/firealarm/report")
-        return response
-
-    def push_alarm_handle(self, **kwargs):
-        data = {
-            "event_id": kwargs.pop("eventId"),
-            "device_category": int(kwargs.pop("deviceCategory")),
-            "device_id": kwargs.pop("deviceId"),
-            "parent_id": self._pid,
-            "alarm_type": int(kwargs.pop("alarmType")),
-            "check_time": kwargs.pop("checkTime"),
-            "handle_time": kwargs.pop("handleTime"),
-            "process_type": kwargs.pop("processType"),
-            "handle_status": kwargs.pop("handleStatus")
-        }
-
-        logger.info("[ZheJiangNotifier push_alarm_handle], notifier = {}, push data = {}".format(self, json.dumps(data, indent=4)))
-
-        if not check_none_value(data.values()):
-            raise ZheJiangNotifierException(u"推送设备火警信息故障操作信息失败,缺少参数")
-        response = self._request(opt=0, lists=[data], path="fire/firealarmprocess/report")
-        return response
-
-
-class ZheJiangNorther(object):
-
-    def __init__(self, fight):   # type:(ZheJiangFireFight) -> None
-        self._firefight = fight
-        self._notifier = ZheJiangNotifier(
-            ak=fight.ak, sk=fight.sk, pid=fight.parentId, url=fight.url
-        )
-
-    def _report_company(self):
-        self._notifier.push_company({
-            "companyId": str(self._firefight.id),
-            "companyName": self._firefight.companyName,
-            "companyCode": self._firefight.companyCode,
-            "address": self._firefight.address,
-            "regionCode": self._firefight.regionCode,
-            "companyCategory": self._firefight.companyCategory,
-            "companyType": self._firefight.companyType,
-            "industryType": self._firefight.industryType,
-            "fireManager": self._firefight.fireManager,
-            "fireManagerTel": self._firefight.fireManagerTel,
-            "fireLiable": self._firefight.fireLiable,
-            "fireLiableTel": self._firefight.fireLiableTel,
-            "createTime": self._firefight.createTime.strftime("%Y-%m-%d %H:%M:%S"),
-            "updateTime": self._firefight.updateTime.strftime("%Y-%m-%d %H:%M:%S")
-        })
-
-    def _report_devices(self):
-        dealer = self._firefight.dealer
-        devices = dealer.get_own_devices()
-
-        dataList = list()
-        dataStateList = list()
-
-        # 逐条推送设备的信息
-        for _dev in devices:    # type: DeviceDict
-            devObj = _dev.my_obj
-
-            dataList.append({
-                "deviceId": str(devObj.id),
-                "logicalCode": _dev.logicalCode,
-                "devNo": _dev.devNo,
-                "location": District.get_district(devObj.districtId),
-                "creator": devObj.mf,
-                "companyId": str(self._firefight.id),
-                "createTime": devObj.dateTimeAdded,
-                "updateTime": devObj.dateTimeUpdated.strftime("%Y-%m-%d %H:%M:%S")
-            })
-
-            # 同时推送一次设备的状态
-            dataStateList.append({
-                "eventId": "".join(str(uuid.uuid4()).split("-")),
-                "deviceCategory": EventDeviceCategory.DEVICE,
-                "deviceId": str(devObj.id),
-                "onlineStatus": 1,
-                "workStatus": 1,
-                "eventTime": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
-            })
-
-        self._notifier.push_device(*dataList)
-        self._notifier.push_device_state(*dataStateList)
-
-    def _report_parts(self):
-        dealer = self._firefight.dealer
-        devices = dealer.get_own_devices()
-
-        for _dev in devices:    # type: DeviceDict
-            _parts = _dev.parts
-
-            partsList = list()
-            for _part in _parts:    # type: Part
-                partsList.append({
-                    "partId": str(_part.id),
-                    "partName": _part.partName,
-                    "sensorCode": "",
-                    "address": "",
-                    "companyId": str(self._firefight.id),
-                    "deviceId": _dev.id,
-                    "createTime": _part.dateTimeAdded.strftime("%Y-%m-%d %H:%M:%S"),
-                    "updateTime": _part.dateTimeUpdated.strftime("%Y-%m-%d %H:%M:%S")
-                })
-
-            self._notifier.push_part(*partsList)
-
-    def report(self):
-        self._report_company()
-
-        self._report_devices()
-
-        self._report_parts()