GatewayFamilyRoomController.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : GatewayFamilyRoomController.py
  4. @Time : 2022/5/24 19:43
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. from django.db import transaction
  10. from django.db.models import Q, Count
  11. from django.views.generic.base import View
  12. from Model.models import FamilyRoomDevice, FamilyRoom
  13. from Object.ResponseObject import ResponseObject
  14. from Object.TokenObject import TokenObject
  15. from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
  16. # 家庭房间管理
  17. class GatewayFamilyRoomView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. return self.validation(request.GET, request, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.POST, request, operation)
  26. def validation(self, request_dict, request, operation):
  27. token = request.META.get('HTTP_AUTHORIZATION')
  28. token = TokenObject(token)
  29. lang = request_dict.get('lang', token.lang)
  30. response = ResponseObject(lang)
  31. if token.code != 0:
  32. return response.json(token.code)
  33. app_user_id = token.userID
  34. # 添加设备关联房间
  35. if operation == 'device-changes':
  36. return self.room_device_save(app_user_id, request_dict, response)
  37. # 房间排序
  38. elif operation == 'sort':
  39. return self.room_sort_save(request_dict, response)
  40. # 房间删除
  41. elif operation == 'del':
  42. return self.room_del(app_user_id, request_dict, response)
  43. # 房间详情
  44. elif operation == 'details':
  45. return self.get_room_details(app_user_id, request_dict, response)
  46. @classmethod
  47. def room_device_save(cls, app_user_id, request_dict, response):
  48. """
  49. 房间加入设备or移除设备
  50. @param app_user_id:
  51. @param request_dict:
  52. @param response:
  53. @return:
  54. """
  55. family_id = request_dict.get('familyId', None)
  56. device_ids = request_dict.getlist('deviceIds', None)
  57. room_id = request_dict.get('roomId', None)
  58. operate = request_dict.get('operate', None)
  59. if not all([family_id, device_ids, operate, room_id]):
  60. return response.json(444)
  61. operate = int(operate)
  62. is_owner = EquipmentFamilyView.get_family_owner(app_user_id, family_id)
  63. if not is_owner:
  64. return response.json(404)
  65. with transaction.atomic():
  66. room_qs = FamilyRoom.objects.filter(family_id=family_id, id=room_id)
  67. if not room_qs.exists():
  68. return response.json(173)
  69. for item in device_ids:
  70. qs = FamilyRoomDevice.objects.filter(family_id=family_id, device_id=item)
  71. if qs.exists():
  72. qs.update(room_id=0) if operate == 1 else qs.update(room_id=int(room_id))
  73. return response.json(0)
  74. @classmethod
  75. def room_del(cls, user_id, request_dict, response):
  76. """
  77. 房间多选删除
  78. @param user_id: 当前登录用户id
  79. @param request_dict: 请求参数
  80. @param response: 响应参数
  81. @return:
  82. """
  83. ids = request_dict.get('roomIds', None)
  84. if not ids:
  85. return response.json(444)
  86. ids = ids.split(',')
  87. room_id = ids[0]
  88. room_info = FamilyRoom.objects.filter(id=room_id)
  89. if not room_info.exists():
  90. return response.json(173)
  91. is_owner = EquipmentFamilyView.get_family_owner(user_id, room_info.first().family_id)
  92. if not is_owner:
  93. return response.json(404)
  94. try:
  95. with transaction.atomic():
  96. for item in ids:
  97. room_id = int(item)
  98. room_device = FamilyRoomDevice.objects.filter(room_id=room_id)
  99. if room_device.exists():
  100. room_device.update(room_id=0)
  101. FamilyRoom.objects.filter(id=room_id).delete()
  102. return response.json(0)
  103. except Exception as e:
  104. print(e)
  105. return response.json(177, repr(e))
  106. @classmethod
  107. def room_sort_save(cls, request_dict, response):
  108. """
  109. 房间排序
  110. @param request_dict: 请求参数
  111. @param response: 响应参数
  112. @return:
  113. """
  114. ids = request_dict.get('ids', None)
  115. if not ids:
  116. return response.json(444)
  117. items = ids.split(',')
  118. for item in items:
  119. vals = item.split('-')
  120. room_id = vals[0]
  121. sort = vals[1]
  122. family_room = FamilyRoom.objects.filter(id=int(room_id))
  123. if family_room.exists():
  124. family_room.update(sort=int(sort))
  125. return response.json(0)
  126. @classmethod
  127. def get_room_details(cls, app_user_id, request_dict, response):
  128. """
  129. 房间设备详情
  130. @param app_user_id:
  131. @param request_dict:
  132. @param response:
  133. @return:
  134. """
  135. family_id = request_dict.get('familyId', None)
  136. room_id = request_dict.get('roomId', None)
  137. page_no = request_dict.get('pageNo', None)
  138. page_size = request_dict.get('pageSize', None)
  139. if not all([family_id, room_id, page_no, page_size]):
  140. return response.json(444)
  141. room_count = FamilyRoomDevice.objects.filter(family_id=int(family_id), room_id=int(room_id)).values(
  142. 'device_id').annotate(count=Count('device_id')).count()
  143. device_room = []
  144. # 房间设备列表
  145. if room_count > 0:
  146. device_room_list = EquipmentFamilyView.get_family_device_list(user_id=app_user_id, page_no=1,
  147. page_size=room_count,
  148. family_id=int(family_id),
  149. room_id=int(room_id))
  150. if device_room_list:
  151. room_name = FamilyRoom.objects.get(id=room_id).name
  152. for item in device_room_list:
  153. device_room.append({
  154. 'deviceId': item['id'],
  155. 'deviceType': item['Type'],
  156. 'nickName': item['NickName'],
  157. 'roomName': room_name,
  158. })
  159. device_not_room = []
  160. device_not_room_count = FamilyRoomDevice.objects.filter(family_id=int(family_id), room_id=0).values(
  161. 'device_id').annotate(count=Count('device_id')).count()
  162. if device_not_room_count > 0:
  163. not_room_device_list = EquipmentFamilyView.get_family_device_list(user_id=app_user_id, page_no=int(page_no),
  164. page_size=int(page_size),
  165. family_id=int(family_id), room_id=0,
  166. is_room_other=True)
  167. if not_room_device_list:
  168. for item in not_room_device_list:
  169. room_device_qs = FamilyRoomDevice.objects.filter(family_id=int(family_id))
  170. room_device_qs = room_device_qs.filter(~Q(room_id=0))
  171. name = ''
  172. if room_device_qs.exists():
  173. family_room_qs = FamilyRoom.objects.filter(id=room_device_qs.first().room_id)
  174. if family_room_qs.exists():
  175. name = family_room_qs.first().name
  176. device_not_room.append({
  177. 'deviceId': item['id'],
  178. 'deviceType': item['Type'],
  179. 'nickName': item['NickName'],
  180. 'roomName': name
  181. })
  182. return response.json(0, {'deviceRooms': device_room, 'deviceNotRooms': device_not_room})