from apps.third.models import TDevice, Tlog from apps.third.serializers import BindAreaSerializer, BltQuerySerializer, BltSerializer, LabelLocationSerializer, TDeviceSerializer, TlogSerializer from apps.utils.viewsets import CustomGenericViewSet from rest_framework.mixins import ListModelMixin, CreateModelMixin from apps.third.clients import xxClient, dhClient, spClient from apps.third.tapis import xxapis, dhapis, spapis from rest_framework.response import Response from rest_framework.serializers import Serializer from rest_framework.decorators import action from apps.am.models import Area from rest_framework.views import APIView from rest_framework.exceptions import ParseError class BltViewSet(CustomGenericViewSet): """定位标签列表 定位标签列表 """ queryset = TDevice.objects.filter(type=TDevice.DEVICE_BLT) serializer_class = TDeviceSerializer @action(methods=['get'], detail=False, perms_map={'get': '*'}) def count_bind(self, request): """统计绑定定位卡人/设备数 统计绑定定位卡人/设备数 """ qs = self.queryset.exclude(employee=None) ret = {} ret['total'] = qs.count() ret['count_employee'] = qs.filter(employee__type='employee').count() ret['count_remployee'] = qs.filter(employee__type='remployee').count() ret['count_visitor'] = qs.filter(employee__type='visitor').count() return Response(ret) @action(methods=['get'], detail=False, perms_map={'get': '*'}) def count_now(self, request): """统计在厂终端数 统计在厂终端数 """ json = { "pageNum": 1, "numPerPage": 2000, "online": "online" } _, res = xxClient.request(**xxapis['blt_list'], json=json) ret = {} ret['total_blt'] = res['totalCount'] blt_list = res['recordList'] macs = [] for i in blt_list: macs.append(i['mac']) qs = self.queryset.filter().exclude(employee=None, code__in=macs) ret['total'] = qs.count() ret['count_employee'] = qs.filter(employee__type='employee').count() ret['count_remployee'] = qs.filter(employee__type='remployee').count() ret['count_visitor'] = qs.filter(employee__type='visitor').count() return Response(ret) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=BltQuerySerializer) def query(self, request): """在线标签列表信息 在线标签列表信息 """ data = request.data if data.get('area', None): try: railId = Area.objects.get(id=data['area']).third_info['xx_rail']['id'] except Exception: raise ParseError('区域信息不正确') json = { "railId": railId, "type": "" } _, res = xxClient.request(**xxapis['rail_ibeacon_list'], json=json) else: json = { "pageNum": 1, "numPerPage": 2000, "online": "online" } _, res = xxClient.request(**xxapis['blt_list'], json=json) blt_list = res['recordList'] macs = [] for i in blt_list: macs.append(i['mac']) qs = self.queryset.filter(code__in=macs).exclude(employee=None) qs_data = list(BltSerializer(instance=qs, many=True).data) qs_dict = {} for i in qs_data: qs_dict[i['code']] = i for i in blt_list: i['my_info'] = {} if i['mac'] in qs_dict: i['my_info'] = qs_dict[i['mac']] return Response(blt_list) class TDeviceViewSet(ListModelMixin, CustomGenericViewSet): """ 三方设备接口 """ queryset = TDevice.objects.all() serializer_class = TDeviceSerializer ordering = ['code', '-create_time'] filterset_fields = ['type'] @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) def vchannel(self, request): """ 视频通道列表 视频通道列表 """ request.data.update({'channelTypeList': ["1"]}) _, res = dhClient.request(**dhapis['channel_list'], json=request.data) codes = [] if res.get('pageData', None): for i in res['pageData']: codes.append(i['channelCode']) tds_info = TDeviceSerializer(instance=TDevice.objects.filter(code__in=codes), many=True).data for x in res['pageData']: for y in tds_info: if x['channelCode'] == y['code']: x['my_info'] = y return Response(res) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) def speaker(self, request): """ 喇叭列表 喇叭列表 """ _, res = spClient.request(**spapis['device_list'], params=request.data) return Response(res) @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=Serializer) def dchannel(self, request): """ 闸机通道列表 闸机通道列表 """ request.data.update({'channelTypeList': ["7"]}) _, res = dhClient.request(**dhapis['channel_list'], json=request.data) return Response(res) @action(methods=['post'], detail=False, perms_map={'post': 'tdevice:label_location'}, serializer_class=LabelLocationSerializer) def label_location(self, request): """ 标注坐标位置 标注坐标位置 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) vdata = serializer.validated_data td = TDevice.objects.filter(code=vdata['code']).first() if td: td.location = vdata['location'] td.type = vdata['type'] td.area = vdata['area'] td.name = vdata['name'] td.update_by = request.user td.save() td.areas.clear() for i in vdata['areas']: td.areas.add(i) else: td = TDevice() td.type = vdata['type'] td.code = vdata['code'] td.location = vdata['location'] td.area = vdata['area'] td.name = vdata['name'] td.create_by = request.user td.save() td.areas.clear() for i in vdata['areas']: td.areas.add(i) return Response() @action(methods=['post'], detail=False, perms_map={'post': 'tdevice:bind_area'}, serializer_class=BindAreaSerializer) def bind_area(self, request): """ 绑定所在区域 绑定所在区域 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) vdata = serializer.vdata area = Area.objects.get(id=vdata['area']) for i in vdata['codes']: td = TDevice.objects.filter(code=i['code']).first() if td: td.area = area td.update_by = request.user td.save() else: td = TDevice() td.type = TDevice.DEVICE_VCHANNEL td.code = i['code'] td.area = area td.create_by = request.user td.save() return Response() class TlogViewSet(ListModelMixin, CustomGenericViewSet): queryset = Tlog.objects.all() serializer_class = TlogSerializer