455 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			455 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
import json
 | 
						|
import logging
 | 
						|
from rest_framework.exceptions import ParseError, APIException
 | 
						|
from apps.ecm.service import dispatch_dahua_event, handle_xx_event, loc_change, rail_in, rail_out
 | 
						|
from apps.hrm.services import HrmService
 | 
						|
from apps.third.tapis import dhapis, xxapis, spapis
 | 
						|
from apps.third.king.king_api import kapis
 | 
						|
from apps.third.king.k import kingClient
 | 
						|
from apps.third.errors import TAPI_CODE_WRONG
 | 
						|
from apps.third.dahua import dhClient
 | 
						|
from apps.third.xunxi import xxClient
 | 
						|
from apps.third.speaker import spClient
 | 
						|
from apps.utils.mixins import MyLoggingMixin
 | 
						|
from rest_framework.response import Response
 | 
						|
from rest_framework.views import APIView
 | 
						|
from rest_framework.permissions import IsAuthenticated, IsAdminUser
 | 
						|
from apps.utils.viewsets import CustomGenericViewSet
 | 
						|
from rest_framework.mixins import CreateModelMixin
 | 
						|
from rest_framework.decorators import action
 | 
						|
 | 
						|
from apps.third.serializers import PicSerializer, RequestCommonSerializer
 | 
						|
from rest_framework import serializers
 | 
						|
from django.conf import settings
 | 
						|
from django.conf import settings
 | 
						|
from django.core.cache import cache
 | 
						|
myLogger = logging.getLogger('log')
 | 
						|
# Create your views here.
 | 
						|
 | 
						|
 | 
						|
class DahuaTestView(MyLoggingMixin, APIView):
 | 
						|
    """大华测试接口
 | 
						|
 | 
						|
    大华测试接口
 | 
						|
    """
 | 
						|
    permission_classes = [IsAuthenticated]
 | 
						|
 | 
						|
    def get(self, request, *args, **kwargs):
 | 
						|
        # res = dhClient.face_search(path='/media/2022/07/13/three.jpg')
 | 
						|
        # res = dhClient.snap(code='1000163$1$0$0')
 | 
						|
        res = dhClient.get_rtsp(code='1000163$1$0$0')
 | 
						|
        return Response(res)
 | 
						|
 | 
						|
 | 
						|
class SpTestView(APIView):
 | 
						|
    """
 | 
						|
    音响测试接口
 | 
						|
    """
 | 
						|
    permission_classes = [IsAuthenticated]
 | 
						|
 | 
						|
    def get(self, request, *args, **kwargs):
 | 
						|
        """
 | 
						|
        音响测试接口
 | 
						|
 | 
						|
        音响测试接口
 | 
						|
        """
 | 
						|
        # spClient.speak('http://1.203.161.103:2800/media/2022/07/15/alarm2.mp3', ['ls20://0201874E9530'], v_num=2)
 | 
						|
        # return Response()
 | 
						|
        # params = {"page": 1, "pageSize": 10000}
 | 
						|
        # _, res = spClient.request(**spapis['device_list'], params=params)
 | 
						|
        _, res = spClient.speak(path='http://192.168.10.249:20309/media/2022/09/01/test.mp3',
 | 
						|
                                sns=['ls20://020277AA7D06'], v_num=5)
 | 
						|
        return Response(res)
 | 
						|
 | 
						|
 | 
						|
class SpeakerViewSet(CustomGenericViewSet):
 | 
						|
    """喇叭视图集
 | 
						|
 | 
						|
    喇叭视图集
 | 
						|
    """
 | 
						|
    perms_map = {}
 | 
						|
    serializer_class = serializers.Serializer
 | 
						|
 | 
						|
    @action(methods=['get'], detail=False,
 | 
						|
            permission_classes=[IsAuthenticated])
 | 
						|
    def headers(self, request, pk=None):
 | 
						|
        """获取headers
 | 
						|
 | 
						|
        获取headers
 | 
						|
        """
 | 
						|
        return Response({'headers': spClient.headers})
 | 
						|
 | 
						|
 | 
						|
class XxTestView(APIView):
 | 
						|
    """
 | 
						|
    寻息测试接口
 | 
						|
    """
 | 
						|
    permission_classes = [IsAuthenticated]
 | 
						|
 | 
						|
    def get(self, request, *args, **kwargs):
 | 
						|
        json = {
 | 
						|
            "railId": "bc0ed1151524490589a9a519685f188f",
 | 
						|
            "type": ""
 | 
						|
        }
 | 
						|
        _, res = xxClient.request(**xxapis['rail_ibeacon_list'], json=json)
 | 
						|
        return Response(res)
 | 
						|
        # ok, res = xxClient.request(
 | 
						|
        #     url='/api/application/build/buildListV2', json={})
 | 
						|
        # if ok == 'success':
 | 
						|
        #     return Response(res)
 | 
						|
        # elif ok == 'fail':
 | 
						|
        #     raise ParseError(**res)
 | 
						|
        # else:
 | 
						|
        #     raise APIException(**res)
 | 
						|
 | 
						|
# 寻息事件订阅
 | 
						|
 | 
						|
 | 
						|
# class XxListener(stomp.ConnectionListener):
 | 
						|
#     def on_error(self, frame):
 | 
						|
#         print('received an error "%s"' % frame.body)
 | 
						|
 | 
						|
#     def on_message(self, frame):
 | 
						|
#         data = json.loads(frame.body)
 | 
						|
#         dispatch_xunxi_event(data)
 | 
						|
#         print('received a message "%s"' % frame.body)
 | 
						|
 | 
						|
 | 
						|
# if settings.XX_ENABLED:
 | 
						|
#     c = stomp.Connection([(settings.XX_MQ_HOST, settings.XX_MQ_PORT)])
 | 
						|
#     c.set_listener('', XxListener())
 | 
						|
#     c.connect(settings.XX_USERNAME, settings.XX_LICENCE)
 | 
						|
#     c.subscribe(settings.XX_QUEUE, id='')
 | 
						|
 | 
						|
 | 
						|
class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
 | 
						|
    perms_map = {'post': '*'}
 | 
						|
    serializer_class = RequestCommonSerializer
 | 
						|
 | 
						|
    def create(self, request, *args, **kwargs):
 | 
						|
        """
 | 
						|
        寻息通用调用接口
 | 
						|
 | 
						|
        寻息通用调用接口
 | 
						|
        """
 | 
						|
        serializer = self.get_serializer(data=request.data)
 | 
						|
        serializer.is_valid(raise_exception=True)
 | 
						|
        vdata = serializer.validated_data
 | 
						|
        if vdata.get('code', ''):
 | 
						|
            xxapi = xxapis.get(vdata['code'], None)
 | 
						|
            if xxapi is None:
 | 
						|
                raise ParseError(**TAPI_CODE_WRONG)
 | 
						|
            vdata['url'] = xxapi['url']
 | 
						|
            vdata['method'] = xxapi['method']
 | 
						|
        _, res = xxClient.request(
 | 
						|
            url=vdata['url'],
 | 
						|
            method=vdata.get('method', 'post'),
 | 
						|
            params=vdata.get('params', {}),
 | 
						|
            json=vdata.get('json', {}))
 | 
						|
        return Response(res)
 | 
						|
 | 
						|
    @action(methods=['get'], detail=False,
 | 
						|
            permission_classes=[IsAuthenticated])
 | 
						|
    def codes(self, request, pk=None):
 | 
						|
        """获取请求短标识
 | 
						|
 | 
						|
        获取请求短标识
 | 
						|
        """
 | 
						|
        return Response(xxapis)
 | 
						|
 | 
						|
    @action(methods=['get'], detail=False,
 | 
						|
            permission_classes=[IsAuthenticated])
 | 
						|
    def token(self, request, pk=None):
 | 
						|
        """获取token
 | 
						|
 | 
						|
        获取token
 | 
						|
        """
 | 
						|
        return Response({'token': cache.get('xx_token', '')})
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            permission_classes=[IsAdminUser],
 | 
						|
            serializer_class=serializers.Serializer)
 | 
						|
    def subscribe(self, request, pk=None):
 | 
						|
        """寻息事件一键订阅
 | 
						|
 | 
						|
        寻息事件一键订阅
 | 
						|
        """
 | 
						|
        xxClient.subscribe('location', '/api/third/xunxi/c_location/')
 | 
						|
        xxClient.subscribe('rail', '/api/third/xunxi/c_rail/')
 | 
						|
        xxClient.subscribe('oneKeyAlarm', '/api/third/xunxi/c_one_key_alarm/')
 | 
						|
        xxClient.subscribe('lowpower', '/api/third/xunxi/c_lowpower/')
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            permission_classes=[IsAdminUser],
 | 
						|
            serializer_class=serializers.Serializer)
 | 
						|
    def unsubscribe(self, request, pk=None):
 | 
						|
        """取消订阅
 | 
						|
 | 
						|
        取消订阅
 | 
						|
        """
 | 
						|
        pass
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[], throttle_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=[])  # 日志
 | 
						|
    def c_location(self, request, pk=None):
 | 
						|
        loc_change(data=request.data['data'])
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[], throttle_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=['POST'])  # 日志
 | 
						|
    def c_rail(self, request, pk=None):
 | 
						|
        data = request.data
 | 
						|
        if data['data']['type'] == 1:
 | 
						|
            # 围栏进入
 | 
						|
            rail_in(data=data['data'])
 | 
						|
        elif data['data']['type'] == 2:
 | 
						|
            # 围栏离开
 | 
						|
            rail_out(data=data['data'])
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[], throttle_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=['POST'])  # 日志
 | 
						|
    def c_one_key_alarm(self, request, pk=None):
 | 
						|
        data = request.data
 | 
						|
        if data['data']['event'] == 'alarm':
 | 
						|
            handle_xx_event(name='one_key_alarm', data=data['data'])
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[], throttle_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=['POST'])  # 日志
 | 
						|
    def c_lowpower(self, request, pk=None):
 | 
						|
        data = request.data
 | 
						|
        handle_xx_event(name='low_power', data=data['data'])
 | 
						|
        return Response()
 | 
						|
 | 
						|
 | 
						|
class KingCommonViewSet(CreateModelMixin, CustomGenericViewSet):
 | 
						|
    perms_map = {'post': '*'}
 | 
						|
    serializer_class = RequestCommonSerializer
 | 
						|
    permission_classes = [IsAdminUser]
 | 
						|
 | 
						|
    def create(self, request, *args, **kwargs):
 | 
						|
        """
 | 
						|
        亚控通用调用接口
 | 
						|
 | 
						|
        亚控通用调用接口
 | 
						|
        """
 | 
						|
        serializer = self.get_serializer(data=request.data)
 | 
						|
        serializer.is_valid(raise_exception=True)
 | 
						|
        vdata = serializer.validated_data
 | 
						|
        if vdata.get('code', ''):
 | 
						|
            kapi = kapis.get(vdata['code'], None)
 | 
						|
            if kapi is None:
 | 
						|
                raise ParseError(**TAPI_CODE_WRONG)
 | 
						|
            vdata['url'] = kapi['url']
 | 
						|
            vdata['method'] = kapi['method']
 | 
						|
        _, res = kingClient.request(
 | 
						|
            url=vdata['url'],
 | 
						|
            method=vdata.get('method', 'post'),
 | 
						|
            params=vdata.get('params', {}),
 | 
						|
            json=vdata.get('json', {}))
 | 
						|
        return Response(res)
 | 
						|
    
 | 
						|
class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
 | 
						|
    perms_map = {'post': '*'}
 | 
						|
    serializer_class = RequestCommonSerializer
 | 
						|
 | 
						|
    def create(self, request, *args, **kwargs):
 | 
						|
        """
 | 
						|
        大华通用调用接口
 | 
						|
 | 
						|
        大华通用调用接口
 | 
						|
        """
 | 
						|
        serializer = self.get_serializer(data=request.data)
 | 
						|
        serializer.is_valid(raise_exception=True)
 | 
						|
        vdata = serializer.validated_data
 | 
						|
        if vdata.get('code', ''):
 | 
						|
            xxapi = dhapis.get(vdata['code'], None)
 | 
						|
            if xxapi is None:
 | 
						|
                raise ParseError(**TAPI_CODE_WRONG)
 | 
						|
            vdata['url'] = xxapi['url']
 | 
						|
            vdata['method'] = xxapi['method']
 | 
						|
        _, res = dhClient.request(
 | 
						|
            url=vdata['url'],
 | 
						|
            method=vdata.get('method', 'post'),
 | 
						|
            params=vdata.get('params', {}),
 | 
						|
            json=vdata.get('json', {}))
 | 
						|
        return Response(res)
 | 
						|
 | 
						|
    @action(methods=['get'], detail=False,
 | 
						|
            permission_classes=[IsAuthenticated])
 | 
						|
    def codes(self, request, pk=None):
 | 
						|
        """获取请求短标识
 | 
						|
 | 
						|
        获取请求短标识
 | 
						|
        """
 | 
						|
        return Response(dhapis)
 | 
						|
 | 
						|
    @action(methods=['get'], detail=False,
 | 
						|
            permission_classes=[IsAuthenticated])
 | 
						|
    def token(self, request, pk=None):
 | 
						|
        """获取token
 | 
						|
 | 
						|
        获取token
 | 
						|
        """
 | 
						|
        ret = {
 | 
						|
            "current": cache.get('dh_token', ''),
 | 
						|
        }
 | 
						|
        dhClient._get_token()
 | 
						|
        ret["new"] = cache.get('dh_token', '')
 | 
						|
        return Response(ret)
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            permission_classes=[IsAuthenticated],
 | 
						|
            serializer_class=PicSerializer)
 | 
						|
    def full_pic(self, request, pk=None):
 | 
						|
        """获取完整图片地址
 | 
						|
 | 
						|
        获取完整图片地址
 | 
						|
        """
 | 
						|
        return Response({'url': dhClient.get_full_pic(path=request.data.get('path'))})
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            permission_classes=[IsAdminUser],
 | 
						|
            serializer_class=serializers.Serializer)
 | 
						|
    def subscribe(self, request, pk=None):
 | 
						|
        """事件订阅
 | 
						|
 | 
						|
        事件订阅
 | 
						|
        """
 | 
						|
        json_data = {
 | 
						|
            "param": {
 | 
						|
                "monitors": [
 | 
						|
                    {
 | 
						|
                        "monitor": settings.BASE_URL + '/api/third/dahua/c_swip/',
 | 
						|
                        "monitorType": "url",
 | 
						|
                        "events": [
 | 
						|
                            {
 | 
						|
                                "category": "alarm",
 | 
						|
                                "subscribeAll": 1,
 | 
						|
                                "domainSubscribe": 2,
 | 
						|
                                "authorities": [
 | 
						|
                                    {
 | 
						|
                                        "types": ["42", "43", "44", "45", "46", "48", "49", "51", "52", "53",
 | 
						|
                                                  "54", "55", "56", "57", "61", "62", "1420", "1425", "1430",
 | 
						|
                                                  "1433", "1434", "1435", "1436", "1437", "1438",
 | 
						|
                                                  "1439", "1441", "1442", "1443", "1448", "1449",
 | 
						|
                                                  "1450", "1455", "1456", "1461", "1462", "1463",
 | 
						|
                                                  "1464", "1467", "1468", "1469", "1470", "1471",
 | 
						|
                                                  "1472", "1473", "1474", "1475", "1476", "1487",
 | 
						|
                                                  "1488", "1489", "1490", "1491", "1492", "1493",
 | 
						|
                                                  "1494", "1667", "4603", "4604", "4626", "4627",
 | 
						|
                                                  "4632", "4633"]
 | 
						|
                                    }
 | 
						|
                                ]
 | 
						|
                            },
 | 
						|
                        ]
 | 
						|
                    },
 | 
						|
                    {
 | 
						|
                        "monitor": settings.BASE_URL + '/api/third/dahua/c_monitor/',
 | 
						|
                        "monitorType": "url",
 | 
						|
                        "events": [
 | 
						|
                            {
 | 
						|
                                "category": "alarm",
 | 
						|
                                "subscribeAll": 1,
 | 
						|
                                "domainSubscribe": 2,
 | 
						|
                                "authorities": [
 | 
						|
                                    {
 | 
						|
                                        "types": ["3", "302", "303", "305", "306", "307", "309", "311", "313", "314", "316",
 | 
						|
                                                  "319", "326", "564", "574", "575", "577",
 | 
						|
                                                  "578", "586", "587", "594", "596", "597",
 | 
						|
                                                  "613", "614", "639", "665", "672", "675",
 | 
						|
                                                  "819", "822", "823", "824", "826", "828",
 | 
						|
                                                  "861", "873", "881", "882", "888", "962",
 | 
						|
                                                  "963", "964", "965", "972", "973", "974",
 | 
						|
                                                  "980", "981", "989", "1001000", "1001001",
 | 
						|
                                                  "1001003", "1001004", "1001005", "1001006", "1001007", "1001008"]
 | 
						|
                                    }
 | 
						|
                                ]
 | 
						|
                            },
 | 
						|
                        ]
 | 
						|
                    },
 | 
						|
                    {
 | 
						|
                        "monitor": settings.BASE_URL + '/api/third/dahua/c_swip/',
 | 
						|
                        "monitorType": "url",
 | 
						|
                        "events": [
 | 
						|
                            {
 | 
						|
                                "category": "business",
 | 
						|
                                "subscribeAll": 1,
 | 
						|
                                "domainSubscribe": 2,
 | 
						|
                                "authorities": [
 | 
						|
                                    {
 | 
						|
                                        "types": ["cardRecord.offline"]
 | 
						|
                                    }
 | 
						|
                                ]
 | 
						|
                            },
 | 
						|
                        ]
 | 
						|
                    }
 | 
						|
                ],
 | 
						|
                "subsystem": {
 | 
						|
                    "subsystemType": 0,
 | 
						|
                    "name": settings.DAHUA_SUBSCRIBE,
 | 
						|
                    "magic": settings.DAHUA_SUBSCRIBE
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        dhClient.request(**dhapis['mq_subscribe'], json=json_data)
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['delete'], detail=False,
 | 
						|
            permission_classes=[IsAdminUser],
 | 
						|
            serializer_class=serializers.Serializer)
 | 
						|
    def unsubscribe(self, request, pk=None):
 | 
						|
        """取消事件订阅
 | 
						|
 | 
						|
        取消事件订阅
 | 
						|
        """
 | 
						|
        dhClient.request(**dhapis['mq_unsubscribe'],
 | 
						|
                         params={'name': settings.DAHUA_SUBSCRIBE})
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[], throttle_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=['POST'])  # 日志
 | 
						|
    def c_swip(self, request, pk=None):
 | 
						|
        """门禁事件
 | 
						|
 | 
						|
        门禁事件
 | 
						|
        """
 | 
						|
        data = request.data
 | 
						|
        method = data['method']
 | 
						|
        subsystem = data.get('subsystem', None)
 | 
						|
        if method == 'alarm.msg' and subsystem == 'evo-accesscontrol':
 | 
						|
            HrmService.swipe(data=data)
 | 
						|
        elif method == 'cardRecord.offline' and subsystem == 'evo-accesscontrol':
 | 
						|
            HrmService.swipe_offline(data=data)
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[], throttle_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=['POST'])  # 日志
 | 
						|
    def c_monitor(self, request, pk=None):
 | 
						|
        """监控事件
 | 
						|
 | 
						|
        监控事件
 | 
						|
        """
 | 
						|
        data = request.data
 | 
						|
        dispatch_dahua_event(data=data)
 | 
						|
        return Response()
 | 
						|
 | 
						|
    @action(methods=['post'], detail=False,
 | 
						|
            authentication_classes=[], permission_classes=[],
 | 
						|
            serializer_class=serializers.Serializer, logging_methods=[])  # 日志
 | 
						|
    def face_deploy(self, request, pk=None):
 | 
						|
        """人脸库同步到所有智能设备
 | 
						|
 | 
						|
        人脸库同步到所有智能设备
 | 
						|
        """
 | 
						|
        dhClient.face_deploy(request.data.get('minSim', 90))
 | 
						|
        return Response()
 |