diff --git a/apps/ecm/service.py b/apps/ecm/service.py new file mode 100644 index 00000000..0e3fa664 --- /dev/null +++ b/apps/ecm/service.py @@ -0,0 +1,14 @@ + + +class EcmService: + """事件处理服务 + """ + + @staticmethod + def dispatch_dahua_alarm(data:dict): + """分发大华事件 + + Args: + data (dict): 信息 + """ + pass diff --git a/apps/opm/migrations/0002_operation_state.py b/apps/opm/migrations/0002_operation_state.py new file mode 100644 index 00000000..7ac6441e --- /dev/null +++ b/apps/opm/migrations/0002_operation_state.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-06-23 03:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('opm', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='operation', + name='state', + field=models.PositiveSmallIntegerField(default=10, verbose_name='作业状态'), + ), + ] diff --git a/apps/opm/models.py b/apps/opm/models.py index 71243255..84d8ffa1 100644 --- a/apps/opm/models.py +++ b/apps/opm/models.py @@ -43,6 +43,7 @@ class Operation(CommonBDModel): name = models.CharField('作业简述', max_length=200) area = models.ForeignKey('am.area', verbose_name='作业区域', on_delete=models.CASCADE) + state = models.PositiveSmallIntegerField('作业状态', default=10) place = models.TextField('具体地点', null=True, blank=True) start_time = models.DateTimeField('作业开始时间') end_time = models.DateTimeField('作业结束时间') diff --git a/apps/third/tee.py b/apps/third/tee.py new file mode 100644 index 00000000..6c463f6d --- /dev/null +++ b/apps/third/tee.py @@ -0,0 +1,3 @@ +{'id': None, 'category': 'alarm', 'method': 'alarm.msg', +'info': {'orgName': '根节点', 'alarmPictureSize': '82496', 'nodeCode': '1000038$1$0$0', 'deviceCode': '1000038', 'alarmCode': '{00A84F4B-7E88-0B4F-910C-CCDA923D9900}', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220622/1/dsf_453810dc-f202-11ec-bd2d-e4246c7d1635_953328_1035824.jpg', 'nodeType': 2, 'deviceName': '10.0.11.23', + 'alarmDate': '1655893102', 'alarmGrade': 2, 'isSave': True, 'unitType': 1, 'unitSeq': 0, 'extend': {'params': {'ObjectType': 'Human', 'GroupId': 0.0, 'ObjectSubType': ''}, 'objectSubType': ''}, 'alarmType': 964, 'channelSeq': 0, 'orgCode': '001', 'channelName': '测试摄像头1', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'admin', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None} diff --git a/apps/third/views.py b/apps/third/views.py index 47bf351b..939cc25f 100755 --- a/apps/third/views.py +++ b/apps/third/views.py @@ -1,4 +1,6 @@ +import json from rest_framework.exceptions import ParseError, APIException +from apps.ecm.service import EcmService from apps.third.tapis import dhapis, xxapis, spapis from apps.third.erros import TAPI_CODE_WRONG from apps.third.clients import dhClient, spClient, xxClient @@ -164,7 +166,7 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): "param": { "monitors": [ { - "monitor": settings.BASE_URL + request.path, + "monitor": settings.BASE_URL + '/api/third/dahua/mq/', "monitorType": "url", "events": [ { @@ -181,8 +183,8 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): ], "subsystem": { "subsystemType": 0, - "name": "127.0.0.1_8000", - "magic": "127.0.0.1_8000" + "name": "10.21.25.158_8000", + "magic": "10.21.25.158_8000" } } } @@ -198,7 +200,7 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): 取消事件订阅 """ dhClient.request(**dhapis['mq_unsubscribe'], - params={'name': '127.0.0.1_8000'}) + params={'name': '10.21.25.158_8000'}) return Response() @action(methods=['post'], detail=False, @@ -209,9 +211,11 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): 大华事件处理 """ - data = request.data + data = json.loads(request.body) method = data['method'] + category = data['category'] subsystem = data.get('subsystem', None) + print(data) # info = data.get('info', {}) if method == 'department.update': pass @@ -221,4 +225,9 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): """ 刷卡事件 """ + elif category == 'alarm' and subsystem == 'admin': + """ + 视频报警 + """ + EcmService.dispatch_dahua_alarm(data=data) return Response() diff --git a/apps/utils/dahua.py b/apps/utils/dahua.py index 2c154358..2d1dc903 100755 --- a/apps/utils/dahua.py +++ b/apps/utils/dahua.py @@ -24,6 +24,7 @@ class DhClient: self.headers = {} self.isGetingToken = False self.isRuning = True + self.token = None self.t = None # 线程 self.setup() @@ -38,24 +39,11 @@ class DhClient: url=settings.DAHUA_BASE_URL + '/evo-apigw/evo-oauth/oauth/token', verify=False) ret = r.json() if ret['success']: + self.token = ret['data']['access_token'] self.headers['Authorization'] = 'bearer ' + ret['data']['access_token'] self.headers['User-Id'] = '1' time.sleep(3600) - def get_token(self): - self.isGetingToken = True - params = { - 'grant_type': 'client_credentials', - 'client_id': self.client_id, - 'client_secret': self.client_secret - } - r = requests.post(params=params, url=settings.DAHUA_BASE_URL + '/evo-apigw/evo-oauth/oauth/token', verify=False) - ret = r.json() - if ret['success']: - self.headers['Authorization'] = 'bearer ' + ret['data']['access_token'] - self.headers['User-Id'] = '1' - self.isGetingToken = False - def setup(self): t = Thread(target=self._get_token_loop, args=(), daemon=True) t.start() @@ -71,46 +59,36 @@ class DhClient: file_path_rela=None, raise_exception=True): if not settings.DAHUA_ENABLED: raise ParseError('大华对接未启用') - if self.isGetingToken: - req_num = 0 - while True: - time.sleep(0.5) - if not self.isGetingToken: - self.request(url, method, params, json, timeout, file_path_rela, raise_exception) - req_num = req_num + 1 - if req_num > 4: - break - else: - files = None - if file_path_rela: # 相对路径 - files = {'file': open(settings.BASE_DIR + file_path_rela, 'rb')} - try: - if params: - url = url.format(**params) - r = getattr(requests, method)('{}{}'.format(settings.DAHUA_BASE_URL, url), - headers=self.headers, params=params, json=json, - timeout=timeout, files=files, verify=False) - except Exception: - if raise_exception: - raise APIException(**DH_REQUEST_ERROR) - return 'error', DH_REQUEST_ERROR - # if settings.DEBUG: - # print_roundtrip(r) - if r.status_code == 200: - ret = r.json() - if ret.get('code') == '27001007': - self.get_token() # 重新获取token - self.request(url, method, params, json, timeout, file_path_rela, raise_exception) - else: - if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: - detail = '大华错误:' + \ - '{}|{}{}{}'.format(str(ret['code']), ret.get('errMsg', ''), - ret.get('desc', ''), str(ret.get('data', ''))) - err_detail = dict(detail=detail, code='dh_'+str(ret['code'])) - if raise_exception: - raise ParseError(**err_detail) - return 'fail', dict(detail=detail, code='dh_'+str(ret['code'])) - return 'success', ret['data'] if 'data' in ret else None + files = None + if file_path_rela: # 相对路径 + files = {'file': open(settings.BASE_DIR + file_path_rela, 'rb')} + try: + if params: + url = url.format(**params) + r = getattr(requests, method)('{}{}'.format(settings.DAHUA_BASE_URL, url), + headers=self.headers, params=params, json=json, + timeout=timeout, files=files, verify=False) + except Exception: + if raise_exception: + raise APIException(**DH_REQUEST_ERROR) + return 'error', DH_REQUEST_ERROR + # if settings.DEBUG: + # print_roundtrip(r) + if r.status_code == 200: + ret = r.json() + if ret.get('code') == '27001007': + self.get_token() # 重新获取token + self.request(url, method, params, json, timeout, file_path_rela, raise_exception) + else: + if ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: + detail = '大华错误:' + \ + '{}|{}{}{}'.format(str(ret['code']), ret.get('errMsg', ''), + ret.get('desc', ''), str(ret.get('data', ''))) + err_detail = dict(detail=detail, code='dh_'+str(ret['code'])) + if raise_exception: + raise ParseError(**err_detail) + return 'fail', dict(detail=detail, code='dh_'+str(ret['code'])) + return 'success', ret['data'] if 'data' in ret else None if raise_exception: raise APIException(**DH_REQUEST_ERROR) return 'error', DH_REQUEST_ERROR diff --git a/apps/utils/serializers.py b/apps/utils/serializers.py index 3b9a1004..a2bb9ba5 100755 --- a/apps/utils/serializers.py +++ b/apps/utils/serializers.py @@ -24,7 +24,7 @@ class CustomModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer): def create(self, validated_data): if self.request: if getattr(self.request, 'user', None): - if getattr(self.request.user, 'create_by', None): + if getattr(self.Meta.model, 'create_by', None): validated_data['create_by'] = self.request.user if 'belong_dept' in validated_data: pass