| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 | # -*- encoding: utf-8 -*-"""@File    : UserDeviceService.py@Time    : 2022/11/18 11:40@Author  : stephen@Email   : zhangdongming@asj6.wecom.work@Software: PyCharm"""import loggingfrom django.db.models import Qfrom Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, UnicomDeviceInfo, \    UIDModel, DeviceChannelUserSet, DeviceChannelUserPermission, DeviceSharePermissionfrom Service.CommonService import CommonServiceLOGGER = logging.getLogger('info')class UserDeviceService:    @classmethod    def query_device_list(cls, user_id, uid, nickname, page, line):        """        查询设备列表        @param user_id: 用户user_id        @param uid: uid        @param nickname: 昵称        @param page: 页数        @param line: 每页条数        @return: dv_list, uid_list        """        dv_qs = Device_Info.objects.filter(userID_id=user_id)        # 过滤已重置的设备        dv_qs = dv_qs.filter(~Q(isExist=2))        if nickname:            dv_qs = dv_qs.filter(NickName=nickname)        if uid:            dv_qs = dv_qs.filter(UID=uid)        # 周视首页过滤网关以及插座类型        dv_qs = dv_qs.exclude(Type__in=[200, 201])        dv_qs = dv_qs.values('id', 'userID', 'NickName', 'UID', 'View_Account', 'View_Password', 'ChannelIndex',                             'Type', 'isShare', 'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID',                             'vodPrimaryMaster', 'userID__userEmail', 'version', 'isVod', 'isExist', 'NotificationMode',                             'isCameraOpenCloud', 'serial_number')[(page - 1) * line:page * line]        dv_list = CommonService.qs_to_list(dv_qs)        uid_list = []        for item in dv_list:            if item['primaryUserID'] and item['id'] == item['primaryUserID']:                item['isPrimaryUser'] = 1            else:                item['isPrimaryUser'] = 0            uid_list.append(item['UID'])        return dv_list, uid_list    @classmethod    def query_device_uid_bucket(cls, uid_list):        """        查询uid关联存储桶套餐        @param uid_list: uid集合        @return: UID_Bucket        """        return UID_Bucket.objects.filter(uid__in=uid_list). \            values('bucket__content', 'status', 'channel', 'endTime', 'uid')    @classmethod    def query_device_preview(cls, uid_list):        """        查询设备uid预览图        @param uid_list: uid集合        @return: UID_Preview        """        return UID_Preview.objects.filter(uid__in=uid_list).order_by('channel') \            .values('id', 'uid', 'channel')    @classmethod    def query_device_uid_set(cls, uid_list):        """        查询设备属性        @return: UidSetModel        """        return UidSetModel.objects.filter(uid__in=uid_list) \            .values('id', 'uid', 'version', 'nickname', 'ucode',                    'detect_status', 'detect_group',                    'detect_interval', 'isSupportFourPoint',                    'region_alexa', 'is_alexa', 'deviceModel',                    'TimeZone', 'TimeStatus', 'SpaceUsable',                    'SpaceSum', 'MirrorType', 'RecordType',                    'OutdoorModel', 'WIFIName', 'isDetector',                    'DetectorRank', 'is_human', 'is_custom_voice',                    'is_ptz', 'double_wifi', 'is_ai', 'mobile_4g',                    'ai_type')    @classmethod    def query_device_channel(cls, uid_list):        """        获取设备通道配置属性        @param uid_list: uid集合        @return: uv_dict        """        us_qs = cls.query_device_uid_set(uid_list)        uv_dict = {}        for us in us_qs:            uv_dict[us['uid']] = {                'version': us['version'],                'nickname': us['nickname'],                'ucode': us['ucode'],                'detect_interval': us['detect_interval'],                'detect_group': us['detect_group'],                'detect_status': us['detect_status'],                'region_alexa': us['region_alexa'],                'is_alexa': us['is_alexa'],                'deviceModel': us['deviceModel'],                'TimeZone': us['TimeZone'],                'TimeStatus': us['TimeStatus'],                'SpaceUsable': us['SpaceUsable'],                'SpaceSum': us['SpaceSum'],                'MirrorType': us['MirrorType'],                'RecordType': us['RecordType'],                'OutdoorModel': us['OutdoorModel'],                'WIFIName': us['WIFIName'],                'isDetector': us['isDetector'],                'DetectorRank': us['DetectorRank'],                'is_human': us['is_human'],                'is_custom_voice': us['is_custom_voice'],                'is_ptz': us['is_ptz'],                'double_wifi': us['double_wifi'],                'mobile4G': us['mobile_4g'],                'is_ai': us['is_ai'],                'ai_type': us['ai_type'],                'isSupportFourPoint': us['isSupportFourPoint'],            }            uv_dict[us['uid']]['channels'] = cls.query_device_channel_set(us['id'])        return uv_dict    @classmethod    def query_device_channel_set(cls, uid):        """        查询通道配置        @param uid: 设备uid        @return: channels        """        ucs_qs = UidChannelSetModel.objects.filter(uid__id=uid)        ucs_qs = ucs_qs.values('channel', 'channel_name',                               'pir_audio', 'mic_audio',                               'battery_status', 'battery_level',                               'sleep_status', 'sleep_time',                               'light_night_model',                               'light_alarm_type',                               'light_alarm_level',                               'light_alarm_man_en',                               'light_alarm_vol',                               'light_long_light'                               )        channels = []        for ucs in ucs_qs:            channels_dict = {                'channel': ucs['channel'],                'channel_name': ucs['channel_name'],                'pir_audio': ucs['pir_audio'],                'mic_audio': ucs['mic_audio'],                'battery_status': ucs['battery_status'],                'battery_level': ucs['battery_level'],                'sleep_status': ucs['sleep_status'],                'sleep_time': ucs['sleep_time'],                'light_night_model': ucs['light_night_model'],                'light_alarm_type': ucs['light_alarm_type'],                'light_alarm_level': ucs['light_alarm_level'],                'light_alarm_man_en': ucs['light_alarm_man_en'],                'light_alarm_vol': ucs['light_alarm_vol'],                'light_long_light': ucs['light_long_light']            }            channels.append(channels_dict)        return channels    @classmethod    def get_sim_by_serial_number(cls, p_vo):        """        根据序列号获取SIM卡属性        @param p_vo:        @return:        """        if p_vo['serial_number']:            u_device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=p_vo['serial_number'])            if u_device_info_qs.exists():                p_vo['iccid'] = u_device_info_qs.first().iccid                p_vo['iccidType'] = u_device_info_qs.first().card_type    @classmethod    def get_uid_info(cls, p_vo, uid):        """        获取uid信息        @param p_vo: 设备对象        @param uid: 设备uid        @return:        """        uid_qs = UIDModel.objects.filter(uid=uid).values('platform', 'init_string', 'init_string_app')        if uid_qs.exists():            p_vo['platform'] = uid_qs[0]['platform']            p_vo['initString'] = uid_qs[0]['init_string']            p_vo['initStringApp'] = uid_qs[0]['init_string_app']    @classmethod    def get_device_info_dto(cls, p_vo, p_uid, uv_dict, user_id=None):        """        获取设备信息DTO        @param user_id: 用户ID        @param p_vo: 设备信息        @param p_uid: 设备uid        @param uv_dict: 设备通道信息        """        uidversion = uv_dict[p_uid]['version']        if len(uidversion) > 6:            uidversion = uidversion[0: uidversion.rfind('.')]        p_vo['uid_version'] = uidversion        p_vo['ucode'] = '72V201233AA' if uv_dict[p_uid]['mobile4G'] == 1 else uv_dict[p_uid]['ucode']        p_vo['detect_interval'] = uv_dict[p_uid]['detect_interval']        p_vo['detect_status'] = uv_dict[p_uid]['detect_status']        p_vo['detect_group'] = uv_dict[p_uid]['detect_group']        p_vo['region_alexa'] = uv_dict[p_uid]['region_alexa']        p_vo['is_alexa'] = uv_dict[p_uid]['is_alexa']        p_vo['deviceModel'] = uv_dict[p_uid]['deviceModel']        p_vo['TimeZone'] = uv_dict[p_uid]['TimeZone']        p_vo['TimeStatus'] = uv_dict[p_uid]['TimeStatus']        p_vo['SpaceUsable'] = uv_dict[p_uid]['SpaceUsable']        p_vo['SpaceSum'] = uv_dict[p_uid]['SpaceSum']        p_vo['MirrorType'] = uv_dict[p_uid]['MirrorType']        p_vo['RecordType'] = uv_dict[p_uid]['RecordType']        p_vo['OutdoorModel'] = uv_dict[p_uid]['OutdoorModel']        p_vo['WIFIName'] = uv_dict[p_uid]['WIFIName']        p_vo['isDetector'] = uv_dict[p_uid]['isDetector']        p_vo['DetectorRank'] = uv_dict[p_uid]['DetectorRank']        p_vo['is_human'] = uv_dict[p_uid]['is_human']        p_vo['is_custom_voice'] = uv_dict[p_uid]['is_custom_voice']        p_vo['is_ptz'] = uv_dict[p_uid]['is_ptz']        p_vo['channels'] = cls.get_channel_permission_by_user(user_id, p_vo['isShare'], p_uid,                                                              uv_dict[p_uid]['channels'])        p_vo['double_wifi'] = uv_dict[p_uid]['double_wifi']        p_vo['mobile4G'] = uv_dict[p_uid]['mobile4G']        p_vo['isCameraOpenCloud'] = 0 if uv_dict[p_uid]['mobile4G'] == 1 else p_vo['isCameraOpenCloud']        p_vo['is_ai'] = uv_dict[p_uid]['is_ai']        p_vo['ai_type'] = uv_dict[p_uid]['ai_type']        p_vo['isSupportFourPoint'] = uv_dict[p_uid]['isSupportFourPoint']        # 设备昵称 调用影子信息昵称,先阶段不可        if uv_dict[p_uid]['nickname']:            p_vo['NickName'] = uv_dict[p_uid]['nickname']    @staticmethod    def get_channel_permission_by_user(user_id, is_share, uid, channels):        """        根据用户获取设备通道权限        @param user_id: 用户ID        @param is_share: 是否分享设备        @param uid: 设备UID        @param channels: 通道信息        @return: channels        """        try:            if not is_share:                return channels            # 获取设备权限            channel_set_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid).values('id', 'channels')            if not channel_set_qs.exists() or not channels:                return channels            channel_list = [int(val) for val in channel_set_qs[0]['channels'].split(',')]            channel_permission_qs = DeviceChannelUserPermission.objects \                .filter(channel_user_id=channel_set_qs[0]['id']).values('permission_id')            ids = [val['permission_id'] for val in channel_permission_qs]            channel_permission_qs = DeviceSharePermission.objects \                .all().values('id', 'code').order_by('sort')            channel_permission_list = []            default_permissions = []            if not channel_permission_qs.exists():                return channels            for item in channel_permission_qs:                default_permissions.append({'permissionId': item['id'], 'code': item['code'], 'isSelect': 0})                p_data = {'permissionId': item['id'], 'code': item['code'], 'isSelect': 1 if item['id'] in ids else 0}                channel_permission_list.append(p_data)            for item in channels:                channel = item['channel']                if channel in channel_list:                    item['channelPermissions'] = channel_permission_list                else:                    item['channelPermissions'] = default_permissions            return channels        except Exception as e:            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))            return channels    @staticmethod    def update_device_channel(uid):        """        UID通道同步更新        @param uid: 设备UID        @return: True | False        """        try:            uid_set_qs = UidSetModel.objects.filter(uid=uid).values('id', 'channel')            if not uid_set_qs.exists():                return False            uid_set_id = uid_set_qs[0]['id']            channel_index = uid_set_qs[0]['channel']            uid_channel_qs = UidChannelSetModel.objects.filter(uid_id=uid_set_id).values('channel')            if uid_channel_qs.exists() and uid_channel_qs.count() != channel_index:                uid_channel_list = []                channels = [val['channel'] for val in uid_channel_qs]                for i in range(1, channel_index + 1):                    if i in channels:                        continue                    channel_name = 'channel' + str(i)  # channel1,channel2...                    UidChannelSet = UidChannelSetModel(uid_id=uid_set_id, channel=i, channel_name=channel_name)                    uid_channel_list.append(UidChannelSet)                if not uid_channel_list:                    return True                UidChannelSetModel.objects.bulk_create(uid_channel_list)            return True        except Exception as e:            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))            return False
 |