SmartSocketStatisticsController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import operator
  2. import time
  3. import datetime
  4. from django.db import transaction
  5. from django.forms import model_to_dict
  6. from django.http import JsonResponse
  7. from django.views import View
  8. from Model.models import SocketPowerStatistics, SocketInfo, Device_User, Device_Info, SocketSchedule, \
  9. CompanySerialModel, UIDCompanySerialModel, SocketRecordsLog, UidSetModel
  10. from Object.ResponseObject import ResponseObject
  11. from Service.CommonService import CommonService
  12. class SmartSocketStatisticsView(View):
  13. def get(self, request, *args, **kwargs):
  14. request.encoding = 'utf-8'
  15. operation = kwargs.get('operation')
  16. return self.validation(request.GET, request, operation)
  17. def post(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.POST, request, operation)
  21. def validation(self, request_dict, request, operation):
  22. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  23. if token_code != 0:
  24. return response.json(token_code)
  25. elif operation == 'get-today-scene': # 查询当天插座电量
  26. return self.get_today_scene(request_dict, response)
  27. elif operation == 'get-all-scene': # 统计智能插座电量
  28. return self.get_all_scene(request_dict, response)
  29. elif operation == 'get-socket-schedule': # 智能插座排程记录查询
  30. return self.get_socket_schedule(request_dict, response)
  31. elif operation == 'get-log': # 智能插座开关日志记录查询
  32. return self.get_log(request_dict, response, user_id)
  33. elif operation == 'editor-socket-device': # 编辑设备信息
  34. return self.editor_socket_device(request_dict, response, user_id)
  35. else:
  36. return response.json(414)
  37. @staticmethod
  38. def get_today_scene(request_dict, response):
  39. """
  40. 查询当天插座电量
  41. @request_dict serialNumber: 序列号
  42. @param request_dict: 请求数据
  43. @param response: 响应
  44. @return: response
  45. """
  46. serial_number = request_dict.get('serialNumber', None)
  47. if not all([serial_number]):
  48. return response.json(444)
  49. socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values('power',
  50. 'accumulated_time',
  51. 'electricity')
  52. if not socket_power_qs.exists():
  53. return response.json(173)
  54. socket_info_qs = SocketInfo.objects.filter(serial_number=serial_number).values('status', 'online',
  55. 'count_down_time')
  56. if not socket_info_qs.exists():
  57. return response.json(173)
  58. try:
  59. data = {}
  60. data['serialNumber'] = serial_number
  61. data['power'] = socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0.00
  62. data['electricity'] = socket_power_qs[0]['electricity'] if socket_power_qs[0]['electricity'] else 0.00
  63. data['accumulatedTime'] = socket_power_qs[0]['accumulated_time'] if socket_power_qs[0][
  64. 'accumulated_time'] else '0:00'
  65. data['status'] = socket_info_qs[0]['status'] if socket_info_qs[0]['status'] else False
  66. data['online'] = socket_info_qs[0]['online'] if socket_info_qs[0]['online'] else False
  67. data['count_down_time'] = socket_info_qs[0]['count_down_time'] if socket_info_qs[0][
  68. 'count_down_time'] else '00:00:00'
  69. return response.json(0, data)
  70. except Exception as e:
  71. print(e)
  72. return response.json(500)
  73. @classmethod
  74. def get_all_scene(cls, request_dict, response):
  75. '''
  76. 统计智能插座电量
  77. @request_dict serialNumber: 序列号
  78. @request_dict unit: 时间单位
  79. @param request_dict: 请求数据
  80. @param response: 响应
  81. @return: response
  82. '''
  83. serial_number = request_dict.get('serialNumber', None)
  84. unit = request_dict.get('unit', None)
  85. # 确定是否会传值
  86. startTime = request_dict.get('startTime', None)
  87. endTime = request_dict.get('endTime', None)
  88. if not all([unit, serial_number]):
  89. return response.json(444)
  90. socket_power_qs = SocketPowerStatistics.objects.filter(serial_number=serial_number).values(
  91. 'electricity', 'accumulated_time', 'power')
  92. if not socket_power_qs.exists():
  93. return response.json(173)
  94. data = {}
  95. # for device_info in device_info_qs:
  96. # device_id = device_info['id']
  97. # device_list.append(device_id)
  98. try:
  99. data = {
  100. 'electricityToday': '',
  101. 'accumulated_time': '',
  102. 'power': '',
  103. 'electricityYesterday': '',
  104. 'electricityMonth': '',
  105. 'allElectricity': '',
  106. 'accumulatedTime': '',
  107. 'accumulatedPower': '',
  108. }
  109. nowTime = endTime
  110. data['electricity'] = socket_power_qs[0]['electricity'] if socket_power_qs[0]['electricity'] else 0.00
  111. # 昨天使用电量
  112. # data['electricityYesterday'] = socket_power_qs[1]['electricity'] if socket_power_qs[1][
  113. # 'electricity'] else 0.00
  114. data['accumulated_time'] = socket_power_qs[0]['accumulated_time'] if socket_power_qs[0][
  115. 'accumulated_time'] else 0.00
  116. data['power'] = socket_power_qs[0]['power'] if socket_power_qs[0]['power'] else 0.00
  117. time_list = []
  118. if not endTime:
  119. nowTime = 1679241600
  120. if unit == 'week':
  121. startTime = startTime
  122. if not startTime:
  123. startTime = datetime.datetime.fromtimestamp(int(nowTime)) - datetime.timedelta(days=7)
  124. end_time = datetime.datetime.fromtimestamp(int(nowTime))
  125. time_list = CommonService.cutting_time(startTime, end_time, time_unit='day')
  126. elif unit == 'month':
  127. startTime = startTime
  128. if not startTime:
  129. startTime = datetime.datetime.fromtimestamp(int(nowTime)) - datetime.timedelta(days=30)
  130. end_time = datetime.datetime.fromtimestamp(int(nowTime))
  131. time_list = CommonService.cutting_time(startTime, end_time, time_unit='day')
  132. elif unit == 'year':
  133. startTime = startTime
  134. if not startTime:
  135. startTime = datetime.datetime.fromtimestamp(int(nowTime)) - datetime.timedelta(days=365)
  136. end_time = datetime.datetime.fromtimestamp(int(nowTime))
  137. time_list = CommonService.cutting_time(startTime, end_time, time_unit='month')
  138. # all_time_list = []
  139. new_list = []
  140. for item in time_list:
  141. socket_power_qs = socket_power_qs.filter(created_time__gte=item[0], created_time__lt=item[1])
  142. time_tuple = time.localtime(item[-1]) # 把时间戳转换成时间元祖
  143. items = time.strftime('%Y-%m-%d', time_tuple)
  144. electricity = 0.00
  145. new_list.append({
  146. 'time': items,
  147. 'electricity': electricity
  148. })
  149. # #字典key相同则value放一起
  150. # socket_list = list(socket_power_qs)
  151. # new_list.append(socket_list[0])
  152. # for socket in range(1,len(socket_list)):
  153. # for new in new_list:
  154. # if operator.eq(new.keys(), socket_list[socket].keys()):
  155. # for key in new.keys():
  156. # new[key] += socket_list[socket][key]
  157. # break
  158. # elif operator.eq(new, new_list[-1]):
  159. # new_list.append(socket_list[socket])
  160. # break
  161. # data['dict'] = new_list
  162. data['week_or_month_or_year'] = new_list
  163. return response.json(0, data)
  164. except Exception as e:
  165. print(e)
  166. return response.json(500)
  167. @staticmethod
  168. def get_socket_schedule(request_dict, response):
  169. """
  170. 智能插座排程记录查询
  171. @param request_dict: 请求参数
  172. @request_dict page: 页数
  173. @request_dict size: 条数
  174. @request_dict serialNumber: 设备序列号
  175. @param response: 响应对象
  176. @return: response
  177. """
  178. page = request_dict.get('pageNo', None)
  179. size = request_dict.get('pageSize', None)
  180. serial_number = request_dict.get('serialNumber', None)
  181. if not all([page, size, serial_number]):
  182. return response.json(444)
  183. page, size = int(page), int(size)
  184. socket_schedule_qs = SocketSchedule.objects.filter(serial_number=serial_number).values('switch_status',
  185. 'start_time', 'end_time',
  186. 'repeat', 'task_status')
  187. count = socket_schedule_qs.count()
  188. socket_schedule_qs = socket_schedule_qs[(page - 1) * size:page * size]
  189. if not socket_schedule_qs.exists():
  190. return response.json(173)
  191. try:
  192. schedule_list = []
  193. for socket_schedule in socket_schedule_qs:
  194. schedule_list.append({
  195. 'start_time': socket_schedule['start_time'],
  196. 'end_time': socket_schedule['end_time'],
  197. 'switch_status': socket_schedule['switch_status'] if socket_schedule['switch_status'] else False,
  198. 'task_status': socket_schedule['task_status'] if socket_schedule['task_status'] else False,
  199. # 需转换进制
  200. 'repeat': socket_schedule['repeat']
  201. })
  202. return response.json(0, {'list': schedule_list, 'total': count})
  203. except Exception as e:
  204. print(e)
  205. return response.json(500)
  206. @staticmethod
  207. def get_log(request_dict, response, user_id):
  208. """
  209. 智能插座开关日志记录查询
  210. @param request_dict: 请求参数
  211. @param user_id: 用户ID
  212. @request_dict page: 页数
  213. @request_dict size: 条数
  214. @request_dict serialNumber: 设备序列号
  215. @request_dict startTime: 开始时间
  216. @request_dict endTime: 结束时间
  217. @param response: 响应对象
  218. @return: response
  219. """
  220. page = request_dict.get('pageNo', None)
  221. size = request_dict.get('pageSize', None)
  222. serial_number = request_dict.get('serialNumber', None)
  223. start_time = request_dict.get('startTime', None)
  224. end_time = request_dict.get('endTime', None)
  225. if not all([page, size, serial_number]):
  226. return response.json(444)
  227. socket_info_qs = SocketInfo.objects.filter(serial_number=serial_number)
  228. device_id_list = []
  229. pass
  230. @staticmethod
  231. def editor_socket_device(request_dict, response, user_id):
  232. """
  233. 编辑设备
  234. """
  235. # 编辑插座信息
  236. serial_number = request_dict.get('serialNumber', None)
  237. NickName = request_dict.get('NickName', None)
  238. #room_save
  239. # familyRoom = request_dict.get('familyRoom', None)
  240. type_switch = request_dict.get('typeSwitch', None) # 1:倒计时开关
  241. status = request_dict.get('status', None) # 开关状态 0:关闭,1:开启'
  242. # 编辑插座排程
  243. count_down_time = request_dict.get('countDownTime', None) # 倒计时时间戳
  244. time_type = request_dict.get('timeType', None) # 排查时间类型 0:按时间 1:按时间段划分'
  245. switch_status = request_dict.get('switchStatus', None) # 开关状态 0:关闭,1:开启
  246. start_time = request_dict.get('startTime', None)
  247. end_time = request_dict.get('endTime', None)
  248. repeat = request_dict.get('repeat', None) # 重复周期用数值表示
  249. if not all([serial_number]):
  250. return response.json(444)
  251. socket_info_qs = SocketInfo.objects.filter(serial_number=serial_number)
  252. if not socket_info_qs.exists():
  253. return response.json(173)
  254. try:
  255. with transaction.atomic():
  256. if NickName:
  257. Device_Info.objects.update(NickName=NickName)
  258. UidSetModel.objects.update(nickname=NickName)
  259. elif type_switch:
  260. socket_info_qs.update(type_switch=type_switch)
  261. elif status:
  262. socket_info_qs.update(status=status)
  263. elif count_down_time:
  264. socket_info_qs.update(count_down_time=count_down_time)
  265. socket_qs = SocketSchedule.objects.filter(serial_number=serial_number)
  266. if not socket_qs.exists():
  267. socket_info_qs.save()
  268. return response(0)
  269. elif time_type:
  270. socket_qs.update(time_type=time_type)
  271. elif switch_status:
  272. socket_qs.update(switch_status=switch_status)
  273. elif start_time:
  274. socket_qs.update(start_time=start_time)
  275. elif end_time:
  276. socket_qs.update(end_time=end_time)
  277. elif repeat:
  278. socket_qs.update(repeat=repeat)
  279. socket_info_qs.save()
  280. socket_qs.save()
  281. return response.json(0)
  282. except Exception as e:
  283. print(e)
  284. return response.json(500)