|
@@ -9,9 +9,12 @@
|
|
|
import datetime
|
|
|
import logging
|
|
|
import time
|
|
|
+import calendar
|
|
|
from decimal import Decimal
|
|
|
|
|
|
+from dateutil.parser import parse
|
|
|
from django.db import transaction
|
|
|
+from django.db.models import Sum
|
|
|
from django.http import QueryDict
|
|
|
from django.views import View
|
|
|
|
|
@@ -63,16 +66,16 @@ class SmartSocketView(View):
|
|
|
return self.save_count_down(request_dict, response)
|
|
|
elif operation == 'saveSchedule': # 添加插座排程
|
|
|
return self.save_socket_schedule(request_dict, response)
|
|
|
- elif operation == 'get-today-scene': # 查询当天插座电量
|
|
|
+ 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)
|
|
|
+ return self.get_log(request_dict, response)
|
|
|
elif operation == 'editor-socket-device': # 编辑设备信息
|
|
|
- return self.editor_socket_device(request_dict, response, user_id)
|
|
|
+ return self.editor_socket_device(request_dict, response)
|
|
|
return response.json(404)
|
|
|
|
|
|
@classmethod
|
|
@@ -343,134 +346,155 @@ class SmartSocketView(View):
|
|
|
@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]):
|
|
|
+ serialNumber = request_dict.get('serialNumber', None)
|
|
|
+ if not serialNumber:
|
|
|
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():
|
|
|
+ socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serialNumber).values('power',
|
|
|
+ 'accumulated_time',
|
|
|
+ 'electricity')
|
|
|
+ socket_info_qs = SocketInfo.objects.filter(serial_number=serialNumber).values('status', 'online',
|
|
|
+ 'count_down_time')
|
|
|
+ if not socket_info_qs.exists() or not socket_power_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'
|
|
|
+ data = {'serialNumber': serialNumber,
|
|
|
+ 'power': socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0.00,
|
|
|
+ 'electricity': socket_power_qs[0]['electricity'] if socket_power_qs[0]['electricity'] else 0.00,
|
|
|
+ 'accumulatedTime': socket_power_qs[0]['accumulated_time'] if socket_power_qs[0][
|
|
|
+ 'accumulated_time'] else '0:00',
|
|
|
+ 'status': socket_info_qs[0]['status'] if socket_info_qs[0]['status'] else False,
|
|
|
+ 'online': socket_info_qs[0]['online'] if socket_info_qs[0]['online'] else False,
|
|
|
+ '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)
|
|
|
+ return response.json(500, repr(e))
|
|
|
|
|
|
@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 all([unit, serial_number, startTime, endTime]):
|
|
|
+ return response.json(444, {'error param': 'unit or serial_number or startTime or endTime'})
|
|
|
+ socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values('electricity',
|
|
|
+ 'accumulated_time',
|
|
|
+ 'power',
|
|
|
+ 'created_time')
|
|
|
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 = {}
|
|
|
+ # 设备累计电量
|
|
|
+ all_electricity = socket_power_qs.aggregate(total=Sum('electricity'))
|
|
|
+ data['electricityAll'] = all_electricity['total'] if all_electricity['total'] else 0.00
|
|
|
+ # 当天使用电量
|
|
|
+ data['electricityToday'] = socket_power_qs[0]['electricity'] if socket_power_qs[0][
|
|
|
+ '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 = []
|
|
|
+
|
|
|
+ # 本月电费
|
|
|
+ nowTime = int(time.time())
|
|
|
+ nowTime = CommonService.timestamp_to_str(nowTime)
|
|
|
+ year, month = str(nowTime).split('-')[0], str(nowTime).split('-')[1]
|
|
|
+ end = calendar.monthrange(int(year), int(month))[1]
|
|
|
+ startTime_now = parse('%s-%s-01 00:00:00' % (year, month))
|
|
|
+ endTime_now = parse('%s-%s-%s 23:59:59' % (year, month, end))
|
|
|
+ startTime_now = CommonService.str_to_timestamp(str(startTime_now))
|
|
|
+ endTime_now = CommonService.str_to_timestamp(str(endTime_now))
|
|
|
+ electricity = socket_power_qs.filter(created_time__gte=startTime_now,
|
|
|
+ created_time__lt=endTime_now).aggregate(
|
|
|
+ total=Sum('electricity'))
|
|
|
+ data['electricityMonth'] = electricity['total'] if electricity['total'] else 0.00
|
|
|
+
|
|
|
+ # 昨天使用电量
|
|
|
+ today = datetime.date.today() # 获取今日日期
|
|
|
+ yesterday = today - datetime.timedelta(days=1)
|
|
|
+ # 昨天开始时间戳
|
|
|
+ yesterday_start_time = int(time.mktime(time.strptime(str(yesterday), '%Y-%m-%d')))
|
|
|
+ # 昨天结束时间戳
|
|
|
+ yesterday_end_time = int(time.mktime(time.strptime(str(today), '%Y-%m-%d'))) - 1
|
|
|
+ socket_qs = socket_power_qs.filter(created_time__gte=yesterday_start_time,
|
|
|
+ created_time__lt=yesterday_end_time).values('electricity')
|
|
|
+ data['electricityYesterday'] = socket_qs[0]['electricity'] if socket_qs[0][
|
|
|
+ 'electricity'] else 0.00
|
|
|
+
|
|
|
+ # 时间和功耗
|
|
|
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
|
|
|
+ socket_qs = socket_power_qs.filter(created_time__gte=startTime, created_time__lt=endTime).aggregate(
|
|
|
+ electricity=Sum('electricity'), accumulatedTime=Sum('accumulated_time'))
|
|
|
+ new_list.append({
|
|
|
+ 'electricityAll': socket_qs['electricity'] if socket_qs['electricity'] else 0.00,
|
|
|
+ 'accumulatedTimeAll': socket_qs['accumulatedTime'] if socket_qs['accumulatedTime'] else '0:00'
|
|
|
+ })
|
|
|
+
|
|
|
+ # 分割时间
|
|
|
+ diction = cls.splittings_time(startTime, endTime, unit)
|
|
|
+ if unit == 'year':
|
|
|
+ # 开始月
|
|
|
+ socket_qs = socket_power_qs.filter(created_time__gte=startTime,
|
|
|
+ created_time__lt=diction['startMonth_time']).aggregate(
|
|
|
+ electricity=Sum('electricity'), accumulatedTime=Sum('accumulated_time'))
|
|
|
+ startTime = time.localtime(int(startTime)) # 把时间戳转换成时间元祖
|
|
|
+ startTime = time.strftime('%Y-%m', startTime)
|
|
|
+ new_list.append({
|
|
|
+ 'startTime': startTime,
|
|
|
+ 'electricity': socket_qs['electricity'] if socket_qs['electricity'] else 0.00
|
|
|
+ })
|
|
|
+ # 分割时间
|
|
|
+ # 查询天月
|
|
|
+ for item in diction['time_list']:
|
|
|
+ socket_qs = socket_power_qs.filter(created_time__gte=item[0],
|
|
|
+ created_time__lt=item[1]).aggregate(electricity=Sum('electricity'))
|
|
|
+ hearTime = time.localtime(item[0]) # 把时间戳转换成时间元祖
|
|
|
+ if unit == 'year':
|
|
|
+ startTime = time.strftime('%Y-%m', hearTime)
|
|
|
+ else:
|
|
|
+ startTime = time.strftime('%Y-%m-%d', hearTime)
|
|
|
+ electricity = socket_qs['electricity'] if socket_qs[
|
|
|
+ 'electricity'] else 0.00
|
|
|
new_list.append({
|
|
|
- 'time': items,
|
|
|
+ 'startTime': startTime,
|
|
|
'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
|
|
|
+
|
|
|
+ if unit == 'year':
|
|
|
+ # 结束月
|
|
|
+ socket_qs = socket_power_qs.filter(created_time__gte=diction['endMonth_time'],
|
|
|
+ created_time__lt=endTime).aggregate(
|
|
|
+ electricity=Sum('electricity'))
|
|
|
+ endTime = time.localtime(int(endTime)) # 把时间戳转换成时间元祖
|
|
|
+ endTime = time.strftime('%Y-%m', endTime)
|
|
|
+ new_list.append({
|
|
|
+ 'startTime': endTime,
|
|
|
+ 'electricity': socket_qs['electricity'] if socket_qs['electricity'] else 0.00
|
|
|
+ })
|
|
|
+
|
|
|
data['week_or_month_or_year'] = new_list
|
|
|
return response.json(0, data)
|
|
|
except Exception as e:
|
|
|
- print(e)
|
|
|
- return response.json(500)
|
|
|
+ return response.json(500, repr(e))
|
|
|
|
|
|
@staticmethod
|
|
|
def get_socket_schedule(request_dict, response):
|
|
@@ -492,8 +516,11 @@ class SmartSocketView(View):
|
|
|
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()
|
|
|
+ 'repeat', 'task_status',
|
|
|
+ 'time_type',
|
|
|
+ 'created_time',
|
|
|
+ 'updated_time',
|
|
|
+ 'device_id')
|
|
|
socket_schedule_qs = socket_schedule_qs[(page - 1) * size:page * size]
|
|
|
if not socket_schedule_qs.exists():
|
|
|
return response.json(173)
|
|
@@ -501,24 +528,25 @@ class SmartSocketView(View):
|
|
|
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,
|
|
|
+ 'deviceID': socket_schedule['device_id'],
|
|
|
+ 'serialNumber': serial_number,
|
|
|
+ 'timeType': socket_schedule['time_type'],
|
|
|
+ 'startTime': socket_schedule['start_time'],
|
|
|
+ 'endTime': socket_schedule['end_time'],
|
|
|
+ 'switchStatus': socket_schedule['switch_status'] if socket_schedule['switch_status'] else False,
|
|
|
+ 'taskStatus': socket_schedule['task_status'] if socket_schedule['task_status'] else False,
|
|
|
# 需转换进制
|
|
|
- 'repeat': socket_schedule['repeat']
|
|
|
+ 'repeat': socket_schedule['repeat'],
|
|
|
})
|
|
|
- return response.json(0, {'list': schedule_list, 'total': count})
|
|
|
+ return response.json(0, schedule_list)
|
|
|
except Exception as e:
|
|
|
- print(e)
|
|
|
- return response.json(500)
|
|
|
+ return response.json(500, repr(e))
|
|
|
|
|
|
@staticmethod
|
|
|
- def get_log(request_dict, response, user_id):
|
|
|
+ def get_log(request_dict, response):
|
|
|
"""
|
|
|
智能插座开关日志记录查询
|
|
|
@param request_dict: 请求参数
|
|
|
- @param user_id: 用户ID
|
|
|
@request_dict page: 页数
|
|
|
@request_dict size: 条数
|
|
|
@request_dict serialNumber: 设备序列号
|
|
@@ -527,21 +555,21 @@ class SmartSocketView(View):
|
|
|
@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 = []
|
|
|
+ # 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):
|
|
|
+ def editor_socket_device(request_dict, response):
|
|
|
"""
|
|
|
编辑设备
|
|
|
"""
|
|
@@ -597,3 +625,49 @@ class SmartSocketView(View):
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
return response.json(500)
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def splittings_time(cls, startTime, endTime, unit):
|
|
|
+ diction = {}
|
|
|
+ time_list = []
|
|
|
+ # 开始时间
|
|
|
+ startTime = CommonService.timestamp_to_str(int(startTime))
|
|
|
+ endTime = CommonService.timestamp_to_str(int(endTime))
|
|
|
+ startYear, startMonth, startDay = \
|
|
|
+ str(startTime).split('-')[0], str(startTime).split('-')[1], str(startTime).split('-')[2]
|
|
|
+ # 结束时间
|
|
|
+ endYear, endMonth, endDay = str(endTime).split('-')[0], str(endTime).split('-')[1], str(endTime).split('-')[2]
|
|
|
+ if unit == 'week' or unit == 'month':
|
|
|
+ startTime = parse('%s-%s-%s' % (startYear, startMonth, startDay))
|
|
|
+ endTime = parse('%s-%s-%s' % (endYear, endMonth, endDay))
|
|
|
+ time_list = CommonService.cutting_time(startTime, endTime, time_unit='day')
|
|
|
+ elif unit == 'year':
|
|
|
+ startYear, startMonth = int(startTime.split('-')[0]), int(startTime.split('-')[1])
|
|
|
+ endYear, endMonth = int(endTime.split('-')[0]), int(endTime.split('-')[1])
|
|
|
+ # 获取下个月的第一天
|
|
|
+ if startMonth == 12:
|
|
|
+ startYear += 1
|
|
|
+ startMonth = 1
|
|
|
+ else:
|
|
|
+ startMonth += 1
|
|
|
+ # 计算(开始月,结束月)
|
|
|
+ startYear = str(startYear)
|
|
|
+ startMonth = str(startMonth)
|
|
|
+ startTime = parse('%s-%s-01 00:00:00' % (startYear, startMonth))
|
|
|
+ # 获取上个月最后一天
|
|
|
+ if endMonth == 1:
|
|
|
+ endYear -= 1
|
|
|
+ endMonth = 12
|
|
|
+ else:
|
|
|
+ endMonth -= 1
|
|
|
+ endDay = calendar.monthrange(endYear, endMonth)[1]
|
|
|
+ endYear = str(endYear)
|
|
|
+ endMonth = str(endMonth)
|
|
|
+ endTime = parse('%s-%s-%s 23:59:59' % (endYear, endMonth, endDay))
|
|
|
+ time_list = CommonService.cutting_time(startTime, endTime, time_unit='month')
|
|
|
+ startMonth_time = CommonService.str_to_timestamp(str(startTime))
|
|
|
+ endMonth_time = CommonService.str_to_timestamp(str(endTime))
|
|
|
+ diction['startMonth_time'] = startMonth_time
|
|
|
+ diction['endMonth_time'] = endMonth_time
|
|
|
+ diction['time_list'] = time_list
|
|
|
+ return diction
|