GatewayFamilyRoomController.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  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 Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
  13. from Model.models import FamilyRoomDevice, FamilyRoom, GatewaySubDevice, Device_Info
  14. from Object.ResponseObject import ResponseObject
  15. from Object.TokenObject import TokenObject
  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. elif operation == 'all-devices': # 家庭所有设备
  47. return self.all_devices(request_dict, response)
  48. elif operation == 'devices-sort': # 家庭设备排序
  49. return self.devices_sort(request_dict, response)
  50. elif operation == 'device-category': # 获取设备类别
  51. return self.device_category(request_dict, response)
  52. elif operation == 'category-sort': # 设备类别排序
  53. return self.category_sort(request_dict, response)
  54. else:
  55. return response.json(414)
  56. @classmethod
  57. def room_device_save(cls, app_user_id, request_dict, response):
  58. """
  59. 房间加入设备or移除设备
  60. @param app_user_id:
  61. @param request_dict:
  62. @param response:
  63. @return:
  64. """
  65. family_id = request_dict.get('familyId', None)
  66. device_ids = request_dict.get('deviceIds', None)
  67. room_id = request_dict.get('roomId', None)
  68. if not all([family_id, room_id]):
  69. return response.json(444)
  70. family_id = int(family_id)
  71. room_id = int(room_id)
  72. is_owner = EquipmentFamilyView.get_family_owner(app_user_id, family_id)
  73. if not is_owner:
  74. return response.json(404)
  75. try:
  76. with transaction.atomic():
  77. room_qs = FamilyRoom.objects.filter(family_id=family_id, id=room_id)
  78. if not room_qs.exists():
  79. return response.json(173)
  80. qs = FamilyRoomDevice.objects.filter(family_id=family_id, room_id=room_id)
  81. if qs.exists():
  82. qs.update(room_id=0, sort=0)
  83. if device_ids:
  84. device_ids = eval(device_ids)
  85. for i, item in enumerate(device_ids):
  86. device_id = item['id']
  87. device_type = item['type']
  88. device_qs = Device_Info.objects.filter(id=device_id, Type=device_type)
  89. if device_qs.exists():
  90. room_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id)
  91. else:
  92. room_device_qs = FamilyRoomDevice.objects.filter(sub_device=device_id)
  93. if room_device_qs.exists():
  94. room_device_qs.update(room_id=room_id, sort=i)
  95. return response.json(0)
  96. except Exception as e:
  97. print(e)
  98. return response.json(177, repr(e))
  99. @classmethod
  100. def room_del(cls, user_id, request_dict, response):
  101. """
  102. 房间多选删除
  103. @param user_id: 当前登录用户id
  104. @param request_dict: 请求参数
  105. @param response: 响应参数
  106. @return:
  107. """
  108. ids = request_dict.get('roomIds', None)
  109. if not ids:
  110. return response.json(444)
  111. ids = ids.split(',')
  112. room_id = ids[0]
  113. room_info = FamilyRoom.objects.filter(id=room_id)
  114. if not room_info.exists():
  115. return response.json(173)
  116. is_owner = EquipmentFamilyView.get_family_owner(user_id, room_info.first().family_id)
  117. if not is_owner:
  118. return response.json(404)
  119. try:
  120. with transaction.atomic():
  121. for item in ids:
  122. room_id = int(item)
  123. room_device = FamilyRoomDevice.objects.filter(room_id=room_id)
  124. if room_device.exists():
  125. room_device.update(room_id=0)
  126. FamilyRoom.objects.filter(id=room_id).delete()
  127. return response.json(0)
  128. except Exception as e:
  129. print(e)
  130. return response.json(177, repr(e))
  131. @classmethod
  132. def room_sort_save(cls, request_dict, response):
  133. """
  134. 房间排序
  135. @param request_dict: 请求参数
  136. @param response: 响应参数
  137. @return:
  138. """
  139. ids = request_dict.get('ids', None)
  140. if not ids:
  141. return response.json(444)
  142. items = ids.split(',')
  143. for item in items:
  144. item = item.split('-')
  145. room_id, sort = item[0], item[1]
  146. family_room = FamilyRoom.objects.filter(id=int(room_id))
  147. if family_room.exists():
  148. family_room.update(sort=int(sort))
  149. return response.json(0)
  150. @classmethod
  151. def get_room_details(cls, app_user_id, request_dict, response):
  152. """
  153. 房间设备详情(所在当前房间下,和所在家庭不在当前房间下的主设备)
  154. @param app_user_id:
  155. @param request_dict:
  156. @param response:
  157. @return:
  158. """
  159. family_id = request_dict.get('familyId', None)
  160. room_id = request_dict.get('roomId', None)
  161. if not all([family_id, room_id]):
  162. return response.json(444)
  163. is_owner = EquipmentFamilyView.get_family_owner(app_user_id, family_id)
  164. if not is_owner:
  165. return response.json(404)
  166. family_id = int(family_id)
  167. room_id = int(room_id)
  168. room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id, room_id=room_id).values(
  169. 'device_id', 'device__Type', 'device__NickName', 'sub_device').order_by('sort', '-device__data_joined')
  170. device_room = []
  171. if room_device_qs.exists():
  172. room_name = FamilyRoom.objects.filter(id=room_id)
  173. for item in room_device_qs:
  174. if not item['sub_device']:
  175. device_dict = {
  176. 'deviceId': item['device_id'],
  177. 'deviceType': item['device__Type'],
  178. 'nickName': item['device__NickName'],
  179. 'roomName': room_name.first().name if room_name.exists() else '',
  180. }
  181. else:
  182. sub_device_qs = GatewaySubDevice.objects.filter(id=item['sub_device']).values('id',
  183. 'device_type',
  184. 'nickname')
  185. if not sub_device_qs.exists():
  186. continue
  187. device_dict = {
  188. 'deviceId': sub_device_qs[0]['id'],
  189. 'deviceType': sub_device_qs[0]['device_type'],
  190. 'nickName': sub_device_qs[0]['nickname'],
  191. 'roomName': room_name.first().name if room_name.exists() else '',
  192. }
  193. device_room.append(device_dict)
  194. device_not_room = []
  195. device_not_room_qs = FamilyRoomDevice.objects.filter(family_id=family_id)
  196. device_not_room_qs = device_not_room_qs.filter(~Q(room_id=room_id)).values('room_id', 'device_id',
  197. 'device__Type', 'device__NickName',
  198. 'sub_device').order_by('sort',
  199. '-device__data_joined')
  200. if device_not_room_qs.exists():
  201. for item in device_not_room_qs:
  202. name = ''
  203. family_room_qs = FamilyRoom.objects.filter(id=item['room_id'])
  204. if family_room_qs.exists():
  205. name = family_room_qs.first().name
  206. if not item['sub_device']:
  207. device_not_room.append({
  208. 'deviceId': item['device_id'],
  209. 'deviceType': item['device__Type'],
  210. 'nickName': item['device__NickName'],
  211. 'roomName': name
  212. })
  213. else:
  214. sub_device_qs = GatewaySubDevice.objects.filter(id=item['sub_device']).values('id',
  215. 'device_type',
  216. 'nickname')
  217. if not sub_device_qs.exists():
  218. continue
  219. device_not_room.append({
  220. 'deviceId': sub_device_qs[0]['id'],
  221. 'deviceType': sub_device_qs[0]['device_type'],
  222. 'nickName': sub_device_qs[0]['nickname'],
  223. 'roomName': name
  224. })
  225. return response.json(0, {'deviceRooms': device_room, 'deviceNotRooms': device_not_room})
  226. @staticmethod
  227. def all_devices(request_dict, response):
  228. """
  229. 家庭所有设备(网关和摄像头设备)
  230. @param request_dict: 请求参数
  231. @request_dict familyId: 家庭id
  232. @param response: 响应参数
  233. @return:
  234. """
  235. family_id = request_dict.get('familyId', None)
  236. if not family_id:
  237. return response.json(444)
  238. device_room = {
  239. 'gateways': [],
  240. 'cameras': [],
  241. 'sort': []
  242. }
  243. try:
  244. family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id)
  245. family_room_device_qs = family_room_device_qs.filter(~Q(device__isExist=2)) \
  246. .values('device_id', 'device__Type', 'device__NickName', 'room_id',
  247. 'sub_device', 'category', ).order_by('sort', '-device__data_joined')
  248. if not family_room_device_qs.exists():
  249. return response.json(0, device_room)
  250. sort = FamilyRoomDevice.objects.filter(family_id=family_id).values('category').annotate(
  251. count=Count('category')).values('category', 'category_sort').order_by('category_sort')
  252. for item in sort:
  253. if item['category'] == 0:
  254. item['category_name'] = '网关子设备类'
  255. else:
  256. item['category_name'] = '摄像头类'
  257. gateways = []
  258. cameras = []
  259. # 查询房间名称
  260. for device in family_room_device_qs:
  261. room_id = device['room_id']
  262. device_type = device['device__Type']
  263. category = device['category']
  264. room_name = FamilyRoom.objects.filter(id=room_id)
  265. if category == 0: # 网关子设备
  266. if not device['sub_device']:
  267. device_dict = {
  268. 'deviceId': device['device_id'],
  269. 'deviceType': device_type,
  270. 'nickName': device['device__NickName'],
  271. 'roomName': room_name.first().name if room_name.exists() else '',
  272. }
  273. else:
  274. sub_device_qs = GatewaySubDevice.objects.filter(id=device['sub_device']).values('device_type',
  275. 'nickname')
  276. if not sub_device_qs.exists():
  277. continue
  278. device_dict = {
  279. 'deviceId': device['sub_device'],
  280. 'deviceType': sub_device_qs[0]['device_type'],
  281. 'nickName': sub_device_qs[0]['nickname'],
  282. 'roomName': room_name.first().name if room_name.exists() else '',
  283. }
  284. gateways.append(device_dict)
  285. else: # 摄像头设备
  286. cameras.append({
  287. 'deviceId': device['device_id'],
  288. 'deviceType': device_type,
  289. 'nickName': device['device__NickName'],
  290. 'roomName': room_name.first().name if room_name.exists() else '',
  291. })
  292. device_room['gateways'] = gateways
  293. device_room['cameras'] = cameras
  294. device_room['sort'] = list(sort)
  295. return response.json(0, device_room)
  296. except Exception as e:
  297. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  298. @staticmethod
  299. def devices_sort(request_dict, response):
  300. """
  301. 家庭设备排序
  302. @param request_dict: 请求参数
  303. @request_dict 设备id: deviceIds
  304. @param response: 响应参数
  305. @return:
  306. """
  307. device_ids = request_dict.get('deviceIds', None)
  308. if not device_ids:
  309. return response.json(444)
  310. try:
  311. device_ids = eval(device_ids)
  312. with transaction.atomic():
  313. for i, item in enumerate(device_ids):
  314. device_id = item['id']
  315. device_type = item['type']
  316. device_qs = Device_Info.objects.filter(id=device_id, Type=device_type)
  317. if device_qs.exists(): # 更新主设备排序
  318. FamilyRoomDevice.objects.filter(device_id=device_id).update(sort=i)
  319. else: # 更新子设备排序
  320. FamilyRoomDevice.objects.filter(sub_device=device_id).update(sort=i)
  321. return response.json(0)
  322. except Exception as e:
  323. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  324. @staticmethod
  325. def device_category(request_dict, response):
  326. """
  327. 获取设备类别排序
  328. @param request_dict: 请求参数
  329. @request_dict 家庭id: family_id
  330. @param response: 响应参数
  331. @return:
  332. """
  333. family_id = request_dict.get('familyId', None)
  334. if not family_id:
  335. return response.json(444)
  336. try:
  337. family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id).values('category').annotate(
  338. count=Count('category')).values('category', 'category_sort').order_by('category_sort')
  339. for item in family_room_device_qs:
  340. if item['category'] == 0:
  341. item['category_name'] = '网关子设备类'
  342. else:
  343. item['category_name'] = '摄像头类'
  344. return response.json(0, list(family_room_device_qs))
  345. except Exception as e:
  346. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  347. @staticmethod
  348. def category_sort(request_dict, response):
  349. """
  350. 家庭设备排序
  351. @param request_dict: 请求参数
  352. @request_dict 家庭id: family_id
  353. @request_dict 排序列表: category_sort
  354. @param response: 响应参数
  355. @return:
  356. """
  357. family_id = request_dict.get('familyId', None)
  358. category_sort = request_dict.get('categorySort', None)
  359. if not all([family_id, category_sort]):
  360. return response.json(444)
  361. try:
  362. category_sort_list = eval(category_sort)
  363. family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id)
  364. if family_room_device_qs.exists():
  365. with transaction.atomic():
  366. for item in category_sort_list:
  367. category = item['category']
  368. category_sort = item['category_sort']
  369. family_room_device_qs.filter(category=category).update(category_sort=category_sort)
  370. return response.json(0)
  371. except Exception as e:
  372. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))