|  | @@ -0,0 +1,300 @@
 | 
	
		
			
				|  |  | +import operator
 | 
	
		
			
				|  |  | +import time
 | 
	
		
			
				|  |  | +import datetime
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from django.db import transaction
 | 
	
		
			
				|  |  | +from django.forms import model_to_dict
 | 
	
		
			
				|  |  | +from django.http import JsonResponse
 | 
	
		
			
				|  |  | +from django.views import View
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from Model.models import SocketPowerStatistics, SocketInfo, Device_User, Device_Info, SocketSchedule, \
 | 
	
		
			
				|  |  | +    CompanySerialModel, UIDCompanySerialModel, SocketRecordsLog, UidSetModel
 | 
	
		
			
				|  |  | +from Object.ResponseObject import ResponseObject
 | 
	
		
			
				|  |  | +from Service.CommonService import CommonService
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class SmartSocketStatisticsView(View):
 | 
	
		
			
				|  |  | +    def get(self, request, *args, **kwargs):
 | 
	
		
			
				|  |  | +        request.encoding = 'utf-8'
 | 
	
		
			
				|  |  | +        operation = kwargs.get('operation')
 | 
	
		
			
				|  |  | +        return self.validation(request.GET, request, operation)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def post(self, request, *args, **kwargs):
 | 
	
		
			
				|  |  | +        request.encoding = 'utf-8'
 | 
	
		
			
				|  |  | +        operation = kwargs.get('operation')
 | 
	
		
			
				|  |  | +        return self.validation(request.POST, request, operation)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def validation(self, request_dict, request, operation):
 | 
	
		
			
				|  |  | +        token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
 | 
	
		
			
				|  |  | +        if token_code != 0:
 | 
	
		
			
				|  |  | +            return response.json(token_code)
 | 
	
		
			
				|  |  | +        elif operation == 'get-today-scene':  # 查询当天插座电量
 | 
	
		
			
				|  |  | +            return self.get_today_scene(request_dict, response)
 | 
	
		
			
				|  |  | +        elif operation == 'get-all-scene':  # 统计智能插座电量
 | 
	
		
			
				|  |  | +            return self.get_all_scene(request_dict, response)
 | 
	
		
			
				|  |  | +        elif operation == 'get-socket-schedule':  # 智能插座排程记录查询
 | 
	
		
			
				|  |  | +            return self.get_socket_schedule(request_dict, response)
 | 
	
		
			
				|  |  | +        elif operation == 'get-log':  # 智能插座开关日志记录查询
 | 
	
		
			
				|  |  | +            return self.get_log(request_dict, response, user_id)
 | 
	
		
			
				|  |  | +        elif operation == 'editor-socket-device':  # 编辑设备信息
 | 
	
		
			
				|  |  | +            return self.editor_socket_device(request_dict, response, user_id)
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            return response.json(414)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @staticmethod
 | 
	
		
			
				|  |  | +    def get_today_scene(request_dict, response):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        查询当天插座电量
 | 
	
		
			
				|  |  | +        @request_dict serialNumber: 序列号
 | 
	
		
			
				|  |  | +        @param request_dict: 请求数据
 | 
	
		
			
				|  |  | +        @param response: 响应
 | 
	
		
			
				|  |  | +        @return: response
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        serial_number = request_dict.get('serialNumber', None)
 | 
	
		
			
				|  |  | +        if not all([serial_number]):
 | 
	
		
			
				|  |  | +            return response.json(444)
 | 
	
		
			
				|  |  | +        socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values('power',
 | 
	
		
			
				|  |  | +                                                                                                   'accumulated_time',
 | 
	
		
			
				|  |  | +                                                                                                   'electricity')
 | 
	
		
			
				|  |  | +        if not socket_power_qs.exists():
 | 
	
		
			
				|  |  | +            return response.json(173)
 | 
	
		
			
				|  |  | +        socket_info_qs = SocketInfo.objects.filter(serial_number=serial_number).values('status', 'online',
 | 
	
		
			
				|  |  | +                                                                                       'count_down_time')
 | 
	
		
			
				|  |  | +        if not socket_info_qs.exists():
 | 
	
		
			
				|  |  | +            return response.json(173)
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            data = {}
 | 
	
		
			
				|  |  | +            data['serialNumber'] = serial_number
 | 
	
		
			
				|  |  | +            data['power'] = socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0.00
 | 
	
		
			
				|  |  | +            data['electricity'] = socket_power_qs[0]['electricity'] if socket_power_qs[0]['electricity'] else 0.00
 | 
	
		
			
				|  |  | +            data['accumulatedTime'] = socket_power_qs[0]['accumulated_time'] if socket_power_qs[0][
 | 
	
		
			
				|  |  | +                'accumulated_time'] else '0:00'
 | 
	
		
			
				|  |  | +            data['status'] = socket_info_qs[0]['status'] if socket_info_qs[0]['status'] else False
 | 
	
		
			
				|  |  | +            data['online'] = socket_info_qs[0]['online'] if socket_info_qs[0]['online'] else False
 | 
	
		
			
				|  |  | +            data['count_down_time'] = socket_info_qs[0]['count_down_time'] if socket_info_qs[0][
 | 
	
		
			
				|  |  | +                'count_down_time'] else '00:00:00'
 | 
	
		
			
				|  |  | +            return response.json(0, data)
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            print(e)
 | 
	
		
			
				|  |  | +            return response.json(500)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @classmethod
 | 
	
		
			
				|  |  | +    def get_all_scene(cls, request_dict, response):
 | 
	
		
			
				|  |  | +        '''
 | 
	
		
			
				|  |  | +        统计智能插座电量
 | 
	
		
			
				|  |  | +        @request_dict serialNumber: 序列号
 | 
	
		
			
				|  |  | +        @request_dict unit: 时间单位
 | 
	
		
			
				|  |  | +        @param request_dict: 请求数据
 | 
	
		
			
				|  |  | +        @param response: 响应
 | 
	
		
			
				|  |  | +        @return: response
 | 
	
		
			
				|  |  | +        '''
 | 
	
		
			
				|  |  | +        serial_number = request_dict.get('serialNumber', None)
 | 
	
		
			
				|  |  | +        unit = request_dict.get('unit', None)
 | 
	
		
			
				|  |  | +        # 确定是否会传值
 | 
	
		
			
				|  |  | +        startTime = request_dict.get('startTime', None)
 | 
	
		
			
				|  |  | +        endTime = request_dict.get('endTime', None)
 | 
	
		
			
				|  |  | +        if not all([unit, serial_number]):
 | 
	
		
			
				|  |  | +            return response.json(444)
 | 
	
		
			
				|  |  | +        socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values(
 | 
	
		
			
				|  |  | +                    'electricity', 'accumulated_time', 'power')
 | 
	
		
			
				|  |  | +        if not socket_power_qs.exists():
 | 
	
		
			
				|  |  | +            return response.json(173)
 | 
	
		
			
				|  |  | +        data = {}
 | 
	
		
			
				|  |  | +        # for device_info in device_info_qs:
 | 
	
		
			
				|  |  | +        #     device_id = device_info['id']
 | 
	
		
			
				|  |  | +        #     device_list.append(device_id)
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            data = {
 | 
	
		
			
				|  |  | +                'electricityToday': '',
 | 
	
		
			
				|  |  | +                'accumulated_time': '',
 | 
	
		
			
				|  |  | +                'power': '',
 | 
	
		
			
				|  |  | +                'electricityYesterday': '',
 | 
	
		
			
				|  |  | +                'electricityMonth': '',
 | 
	
		
			
				|  |  | +                'allElectricity': '',
 | 
	
		
			
				|  |  | +                'accumulatedTime': '',
 | 
	
		
			
				|  |  | +                'accumulatedPower': '',
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            nowTime = endTime
 | 
	
		
			
				|  |  | +            data['electricity'] = socket_power_qs[0]['electricity'] if socket_power_qs[0]['electricity'] else 0.00
 | 
	
		
			
				|  |  | +            # 昨天使用电量
 | 
	
		
			
				|  |  | +            # data['electricityYesterday'] = socket_power_qs[1]['electricity'] if socket_power_qs[1][
 | 
	
		
			
				|  |  | +            #     'electricity'] else 0.00
 | 
	
		
			
				|  |  | +            data['accumulated_time'] = socket_power_qs[0]['accumulated_time'] if socket_power_qs[0][
 | 
	
		
			
				|  |  | +                'accumulated_time'] else 0.00
 | 
	
		
			
				|  |  | +            data['power'] = socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0.00
 | 
	
		
			
				|  |  | +            time_list = []
 | 
	
		
			
				|  |  | +            if not endTime:
 | 
	
		
			
				|  |  | +                nowTime = 1679241600
 | 
	
		
			
				|  |  | +            if unit == 'week':
 | 
	
		
			
				|  |  | +                startTime = startTime
 | 
	
		
			
				|  |  | +                if not startTime:
 | 
	
		
			
				|  |  | +                    startTime = datetime.datetime.fromtimestamp(int(nowTime)) - datetime.timedelta(days=7)
 | 
	
		
			
				|  |  | +                end_time = datetime.datetime.fromtimestamp(int(nowTime))
 | 
	
		
			
				|  |  | +                time_list = CommonService.cutting_time(startTime, end_time, time_unit='day')
 | 
	
		
			
				|  |  | +            elif unit == 'month':
 | 
	
		
			
				|  |  | +                startTime = startTime
 | 
	
		
			
				|  |  | +                if not startTime:
 | 
	
		
			
				|  |  | +                    startTime = datetime.datetime.fromtimestamp(int(nowTime)) - datetime.timedelta(days=30)
 | 
	
		
			
				|  |  | +                end_time = datetime.datetime.fromtimestamp(int(nowTime))
 | 
	
		
			
				|  |  | +                time_list = CommonService.cutting_time(startTime, end_time, time_unit='day')
 | 
	
		
			
				|  |  | +            elif unit == 'year':
 | 
	
		
			
				|  |  | +                startTime = startTime
 | 
	
		
			
				|  |  | +                if not startTime:
 | 
	
		
			
				|  |  | +                    startTime = datetime.datetime.fromtimestamp(int(nowTime)) - datetime.timedelta(days=365)
 | 
	
		
			
				|  |  | +                end_time = datetime.datetime.fromtimestamp(int(nowTime))
 | 
	
		
			
				|  |  | +                time_list = CommonService.cutting_time(startTime, end_time, time_unit='month')
 | 
	
		
			
				|  |  | +            # all_time_list = []
 | 
	
		
			
				|  |  | +            new_list = []
 | 
	
		
			
				|  |  | +            for item in time_list:
 | 
	
		
			
				|  |  | +                socket_power_qs = socket_power_qs.filter(created_time__gte=item[0], created_time__lt=item[1])
 | 
	
		
			
				|  |  | +                time_tuple = time.localtime(item[-1])  # 把时间戳转换成时间元祖
 | 
	
		
			
				|  |  | +                items = time.strftime('%Y-%m-%d', time_tuple)
 | 
	
		
			
				|  |  | +                electricity = 0.00
 | 
	
		
			
				|  |  | +                new_list.append({
 | 
	
		
			
				|  |  | +                    'time': items,
 | 
	
		
			
				|  |  | +                    'electricity': electricity
 | 
	
		
			
				|  |  | +                })
 | 
	
		
			
				|  |  | +                # #字典key相同则value放一起
 | 
	
		
			
				|  |  | +                # socket_list = list(socket_power_qs)
 | 
	
		
			
				|  |  | +                # new_list.append(socket_list[0])
 | 
	
		
			
				|  |  | +                # for socket in range(1,len(socket_list)):
 | 
	
		
			
				|  |  | +                #     for new in new_list:
 | 
	
		
			
				|  |  | +                #         if operator.eq(new.keys(), socket_list[socket].keys()):
 | 
	
		
			
				|  |  | +                #             for key in new.keys():
 | 
	
		
			
				|  |  | +                #                 new[key] += socket_list[socket][key]
 | 
	
		
			
				|  |  | +                #             break
 | 
	
		
			
				|  |  | +                #         elif operator.eq(new, new_list[-1]):
 | 
	
		
			
				|  |  | +                #             new_list.append(socket_list[socket])
 | 
	
		
			
				|  |  | +                #             break
 | 
	
		
			
				|  |  | +            # data['dict'] = new_list
 | 
	
		
			
				|  |  | +            data['week_or_month_or_year'] = new_list
 | 
	
		
			
				|  |  | +            return response.json(0, data)
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            print(e)
 | 
	
		
			
				|  |  | +            return response.json(500)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @staticmethod
 | 
	
		
			
				|  |  | +    def get_socket_schedule(request_dict, response):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        智能插座排程记录查询
 | 
	
		
			
				|  |  | +        @param request_dict: 请求参数
 | 
	
		
			
				|  |  | +        @request_dict page: 页数
 | 
	
		
			
				|  |  | +        @request_dict size: 条数
 | 
	
		
			
				|  |  | +        @request_dict serialNumber: 设备序列号
 | 
	
		
			
				|  |  | +        @param response: 响应对象
 | 
	
		
			
				|  |  | +        @return: response
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        page = request_dict.get('pageNo', None)
 | 
	
		
			
				|  |  | +        size = request_dict.get('pageSize', None)
 | 
	
		
			
				|  |  | +        serial_number = request_dict.get('serialNumber', None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if not all([page, size, serial_number]):
 | 
	
		
			
				|  |  | +            return response.json(444)
 | 
	
		
			
				|  |  | +        page, size = int(page), int(size)
 | 
	
		
			
				|  |  | +        socket_schedule_qs = SocketSchedule.objects.filter(serial_number=serial_number).values('switch_status',
 | 
	
		
			
				|  |  | +                                                                                               'start_time', 'end_time',
 | 
	
		
			
				|  |  | +                                                                                               'repeat', 'task_status')
 | 
	
		
			
				|  |  | +        count = socket_schedule_qs.count()
 | 
	
		
			
				|  |  | +        socket_schedule_qs = socket_schedule_qs[(page - 1) * size:page * size]
 | 
	
		
			
				|  |  | +        if not socket_schedule_qs.exists():
 | 
	
		
			
				|  |  | +            return response.json(173)
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            schedule_list = []
 | 
	
		
			
				|  |  | +            for socket_schedule in socket_schedule_qs:
 | 
	
		
			
				|  |  | +                schedule_list.append({
 | 
	
		
			
				|  |  | +                    'start_time': socket_schedule['start_time'],
 | 
	
		
			
				|  |  | +                    'end_time': socket_schedule['end_time'],
 | 
	
		
			
				|  |  | +                    'switch_status': socket_schedule['switch_status'] if socket_schedule['switch_status'] else False,
 | 
	
		
			
				|  |  | +                    'task_status': socket_schedule['task_status'] if socket_schedule['task_status'] else False,
 | 
	
		
			
				|  |  | +                    # 需转换进制
 | 
	
		
			
				|  |  | +                    'repeat': socket_schedule['repeat']
 | 
	
		
			
				|  |  | +                })
 | 
	
		
			
				|  |  | +            return response.json(0, {'list': schedule_list, 'total': count})
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            print(e)
 | 
	
		
			
				|  |  | +            return response.json(500)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @staticmethod
 | 
	
		
			
				|  |  | +    def get_log(request_dict, response, user_id):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        智能插座开关日志记录查询
 | 
	
		
			
				|  |  | +        @param request_dict: 请求参数
 | 
	
		
			
				|  |  | +        @param user_id: 用户ID
 | 
	
		
			
				|  |  | +        @request_dict page: 页数
 | 
	
		
			
				|  |  | +        @request_dict size: 条数
 | 
	
		
			
				|  |  | +        @request_dict serialNumber: 设备序列号
 | 
	
		
			
				|  |  | +        @request_dict startTime: 开始时间
 | 
	
		
			
				|  |  | +        @request_dict endTime: 结束时间
 | 
	
		
			
				|  |  | +        @param response: 响应对象
 | 
	
		
			
				|  |  | +        @return: response
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        page = request_dict.get('pageNo', None)
 | 
	
		
			
				|  |  | +        size = request_dict.get('pageSize', None)
 | 
	
		
			
				|  |  | +        serial_number = request_dict.get('serialNumber', None)
 | 
	
		
			
				|  |  | +        start_time = request_dict.get('startTime', None)
 | 
	
		
			
				|  |  | +        end_time = request_dict.get('endTime', None)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if not all([page, size, serial_number]):
 | 
	
		
			
				|  |  | +            return response.json(444)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        socket_info_qs = SocketInfo.objects.filter(serial_number=serial_number)
 | 
	
		
			
				|  |  | +        device_id_list = []
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @staticmethod
 | 
	
		
			
				|  |  | +    def editor_socket_device(request_dict, response, user_id):
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        编辑设备
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        # 编辑插座信息
 | 
	
		
			
				|  |  | +        serial_number = request_dict.get('serialNumber', None)
 | 
	
		
			
				|  |  | +        NickName = request_dict.get('NickName', None)
 | 
	
		
			
				|  |  | +        #room_save
 | 
	
		
			
				|  |  | +        # familyRoom = request_dict.get('familyRoom', None)
 | 
	
		
			
				|  |  | +        type_switch = request_dict.get('typeSwitch', None)  # 1:倒计时开关
 | 
	
		
			
				|  |  | +        status = request_dict.get('status', None)  # 开关状态 0:关闭,1:开启'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        # 编辑插座排程
 | 
	
		
			
				|  |  | +        count_down_time = request_dict.get('countDownTime', None)  # 倒计时时间戳
 | 
	
		
			
				|  |  | +        time_type = request_dict.get('timeType', None)  # 排查时间类型 0:按时间 1:按时间段划分'
 | 
	
		
			
				|  |  | +        switch_status = request_dict.get('switchStatus', None)  # 开关状态 0:关闭,1:开启
 | 
	
		
			
				|  |  | +        start_time = request_dict.get('startTime', None)
 | 
	
		
			
				|  |  | +        end_time = request_dict.get('endTime', None)
 | 
	
		
			
				|  |  | +        repeat = request_dict.get('repeat', None)  # 重复周期用数值表示
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if not all([serial_number]):
 | 
	
		
			
				|  |  | +            return response.json(444)
 | 
	
		
			
				|  |  | +        socket_info_qs = SocketInfo.objects.filter(serial_number=serial_number)
 | 
	
		
			
				|  |  | +        if not socket_info_qs.exists():
 | 
	
		
			
				|  |  | +            return response.json(173)
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            with transaction.atomic():
 | 
	
		
			
				|  |  | +                if NickName:
 | 
	
		
			
				|  |  | +                    Device_Info.objects.update(NickName=NickName)
 | 
	
		
			
				|  |  | +                    UidSetModel.objects.update(nickname=NickName)
 | 
	
		
			
				|  |  | +                elif type_switch:
 | 
	
		
			
				|  |  | +                    socket_info_qs.update(type_switch=type_switch)
 | 
	
		
			
				|  |  | +                elif status:
 | 
	
		
			
				|  |  | +                    socket_info_qs.update(status=status)
 | 
	
		
			
				|  |  | +                elif count_down_time:
 | 
	
		
			
				|  |  | +                    socket_info_qs.update(count_down_time=count_down_time)
 | 
	
		
			
				|  |  | +                socket_qs = SocketSchedule.objects.filter(serial_number=serial_number)
 | 
	
		
			
				|  |  | +                if not socket_qs.exists():
 | 
	
		
			
				|  |  | +                    socket_info_qs.save()
 | 
	
		
			
				|  |  | +                    return response(0)
 | 
	
		
			
				|  |  | +                elif time_type:
 | 
	
		
			
				|  |  | +                    socket_qs.update(time_type=time_type)
 | 
	
		
			
				|  |  | +                elif switch_status:
 | 
	
		
			
				|  |  | +                    socket_qs.update(switch_status=switch_status)
 | 
	
		
			
				|  |  | +                elif start_time:
 | 
	
		
			
				|  |  | +                    socket_qs.update(start_time=start_time)
 | 
	
		
			
				|  |  | +                elif end_time:
 | 
	
		
			
				|  |  | +                    socket_qs.update(end_time=end_time)
 | 
	
		
			
				|  |  | +                elif repeat:
 | 
	
		
			
				|  |  | +                    socket_qs.update(repeat=repeat)
 | 
	
		
			
				|  |  | +                socket_info_qs.save()
 | 
	
		
			
				|  |  | +                socket_qs.save()
 | 
	
		
			
				|  |  | +                return response.json(0)
 | 
	
		
			
				|  |  | +        except Exception as e:
 | 
	
		
			
				|  |  | +            print(e)
 | 
	
		
			
				|  |  | +            return response.json(500)
 |