CloudTransfer.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2020/12/16 8:44
  4. @Auth : Locky
  5. @File :CloudTransfer.py
  6. @IDE :PyCharm
  7. """
  8. import json
  9. import time
  10. from django.db import transaction
  11. from django.db.models import Q
  12. from django.views.generic.base import View
  13. from Model.models import Device_User, Device_Info, Order_Model, UID_Bucket, StsCrdModel, VodHlsModel, Unused_Uid_Meal, \
  14. VodBucketModel, UnicomDeviceInfo, LogModel, UidPushModel, AiService, UidSetModel, UserFamily, FamilyRoomDevice
  15. from Object.ResponseObject import ResponseObject
  16. from Object.TokenObject import TokenObject
  17. from Service.CommonService import CommonService
  18. from Service.ModelService import ModelService
  19. from Service.VodHlsService import SplitVodHlsObject
  20. class cloudTestView(View):
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.GET, request, operation)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.POST, request, operation)
  29. def validation(self, request_dict, request, operation):
  30. lang = request_dict.get('lang', None)
  31. response = ResponseObject(lang) if lang else ResponseObject()
  32. if operation is None:
  33. return response.json(444, 'error path')
  34. else:
  35. token = request_dict.get('token', None)
  36. # 设备主键uid
  37. tko = TokenObject(token)
  38. if tko.code != 0:
  39. return response.json(tko.code)
  40. userID = tko.userID
  41. if operation == 'deviceTransfer':
  42. return self.deviceTransfer(request, request_dict, response)
  43. elif operation == 'mealTransfer':
  44. return self.mealTransfer(request, request_dict, response, userID)
  45. elif operation == 'expireMeal':
  46. return self.expireMeal(request_dict, response)
  47. def deviceTransfer(self, request, request_dict, response):
  48. # 设备转移,一个用户下的设备转移到另一个用户
  49. oldUserID = request_dict.get("oldUserID", None)
  50. username = request_dict.get("username", None)
  51. uid = request_dict.get('uid', None)
  52. lang = request_dict.get('lang', None)
  53. now_time_stamp = int(time.time())
  54. now_time = CommonService.timestamp_to_str(now_time_stamp)
  55. try:
  56. # 查询该userID下是否存在此设备
  57. old_deviceInfo_qs = Device_Info.objects.filter(userID_id=oldUserID, UID=uid, isExist=1) \
  58. .values('isShare', 'vodPrimaryUserID', 'serial_number', 'userID__username', 'id')
  59. if not old_deviceInfo_qs.exists():
  60. return response.json(10008)
  61. old_user_name = old_deviceInfo_qs[0]['userID__username']
  62. newUserID = ModelService.get_userID_byname(username) # 根据username获取userID
  63. if newUserID is None: # 没有此用户
  64. return response.json(104)
  65. if newUserID == oldUserID: # 新用户的userID跟旧用户的一样
  66. return response.json(10009)
  67. # 分享的设备不能转移
  68. isShare = old_deviceInfo_qs[0]['isShare']
  69. if isShare:
  70. return response.json(10015)
  71. # 旧用户是设备主用户才能转移
  72. vodPrimaryUserID = old_deviceInfo_qs[0]['vodPrimaryUserID']
  73. if vodPrimaryUserID != '' and vodPrimaryUserID != oldUserID:
  74. return response.json(10037)
  75. # uid_mian = UIDMainUser.objects.filter(UID=uid).values('UID', 'user_id')
  76. # if uid_mian.exists():
  77. # vodPrimaryUserID = uid_mian[0]['user_id']
  78. # if vodPrimaryUserID != '' and vodPrimaryUserID != oldUserID:
  79. # return response.json(10037)
  80. # 判断新用户是否已有此设备
  81. new_deviceInfo_qs = Device_Info.objects.filter(userID_id=newUserID, UID=uid, isExist=1)
  82. if new_deviceInfo_qs:
  83. return response.json(10009)
  84. # 旧用户如果开启云存自动续费,不可转移
  85. hasCycle = Order_Model.objects.filter(userID=oldUserID, UID=uid)
  86. hasCycle = hasCycle.filter(~Q(agreement_id=''))
  87. if hasCycle.exists():
  88. return response.json(10056)
  89. # 获取新设备的username、userEmail
  90. newUserQs = Device_User.objects.get(userID=newUserID)
  91. newUserName = newUserQs.username
  92. newUserEmail = newUserQs.userEmail
  93. vodPrimaryUserID = newUserID
  94. vodPrimaryMaster = newUserName
  95. # 获取用户家庭信息
  96. device_id = old_deviceInfo_qs[0]['id']
  97. user_family_qs = UserFamily.objects.filter(user_id=newUserID).values('id')
  98. with transaction.atomic():
  99. serial_number = old_deviceInfo_qs[0]['serial_number']
  100. # 删除旧用户此设备的uid_push数据
  101. UidPushModel.objects.filter(userID_id=oldUserID, uid_set__uid=uid).delete()
  102. # 更新旧设备的userID,设备添加时间,关闭推送消息提醒
  103. old_deviceInfo_qs.update(userID=newUserID, data_joined=now_time, NotificationMode=0)
  104. # 更新设备的主用户信息
  105. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID,
  106. vodPrimaryMaster=vodPrimaryMaster)
  107. VodHlsModel.objects.filter(uid=uid).delete()
  108. # 删除vod_hls分表数据
  109. split_vod_hls_obj = SplitVodHlsObject()
  110. split_vod_hls_obj.del_vod_hls_data(uid=uid)
  111. if not serial_number:
  112. serial_number = CommonService.query_serial_with_uid(uid)
  113. u_dev_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
  114. if u_dev_info_qs.exists():
  115. now_time = int(time.time())
  116. u_dev_info_qs.update(user_id=newUserID, updated_time=now_time)
  117. # 转移设备到家庭
  118. if user_family_qs.exists():
  119. family_id = user_family_qs[0]['id']
  120. else:
  121. family_name = newUserName if newUserName else newUserEmail
  122. family_name = family_name + "的家" if lang == 'cn' else family_name + " home"
  123. user_family = UserFamily.objects.create(user_id=newUserID, name=family_name,
  124. updated_time=now_time_stamp,
  125. created_time=now_time_stamp)
  126. family_id = user_family.id
  127. family_device = FamilyRoomDevice.objects.filter(family_id=family_id, category=1).values('category_sort')
  128. category_sort = family_device[0]['category_sort'] if family_device.exists() else 0
  129. old_family_device = FamilyRoomDevice.objects.filter(device_id=device_id)
  130. if old_family_device.exists():
  131. old_family_device.update(family_id=family_id, category_sort=category_sort,
  132. updated_time=now_time_stamp, room_id=0, sort=0)
  133. else:
  134. FamilyRoomDevice.objects.create(family_id=family_id, category=1, device_id=device_id,
  135. updated_time=now_time_stamp, created_time=now_time_stamp)
  136. # 记录设备转移日志
  137. ip = CommonService.get_ip_address(request)
  138. content = json.loads(json.dumps(request_dict))
  139. log = {
  140. 'ip': ip,
  141. 'user_id': 1,
  142. 'status': 200,
  143. 'time': int(time.time()),
  144. 'url': 'cloudTransfer/deviceTransfer',
  145. 'content': json.dumps(content),
  146. 'operation': '用户{}的设备{}转移给了用户{}'.format(old_user_name, uid, newUserName),
  147. }
  148. LogModel.objects.create(**log)
  149. # UIDMainUser.objects.filter(UID=uid).delete()
  150. # uid_main_dict = {
  151. # 'UID': uid,
  152. # 'user_id': newUserID
  153. # }
  154. # UIDMainUser.objects.create(**uid_main_dict)
  155. except Exception as e:
  156. # print(e)
  157. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  158. else:
  159. return response.json(0)
  160. def mealTransfer(self, request, request_dict, response, userID):
  161. # 云存套餐转移,同一用户下不同设备间的云存套餐转移
  162. old_uid = request_dict.get("old_uid", None)
  163. new_uid = request_dict.get("new_uid", None)
  164. nowTime = int(time.time())
  165. try:
  166. # 查询两个UID是否在同一账号下
  167. old_deviceInfo_qs = Device_Info.objects.filter(userID_id=userID, UID=old_uid).values('isExist',
  168. 'vodPrimaryUserID',
  169. 'userID__username')
  170. new_deviceInfo_qs = Device_Info.objects.filter(userID_id=userID, UID=new_uid).values('isExist')
  171. if not (old_deviceInfo_qs.exists() and new_deviceInfo_qs.exists()):
  172. return response.json(10010)
  173. username = old_deviceInfo_qs[0]['userID__username']
  174. # 不是主用户无法转移
  175. vodPrimaryUserID = old_deviceInfo_qs[0]['vodPrimaryUserID']
  176. if vodPrimaryUserID != '' and vodPrimaryUserID != userID:
  177. return response.json(10038)
  178. vodPrimaryUserID = userID
  179. vodPrimaryMaster = ModelService.get_user_name(userID)
  180. new_isExist = new_deviceInfo_qs[0]['isExist']
  181. if not new_isExist:
  182. return response.json(10011)
  183. # 查询转出设备正在使用的套餐
  184. old_using_uid_bucket = UID_Bucket.objects.filter(uid=old_uid, endTime__gte=nowTime).values('id',
  185. 'bucket_id',
  186. 'has_unused',
  187. 'bucket__content').order_by(
  188. 'addTime')
  189. if not old_using_uid_bucket.exists():
  190. return response.json(10013)
  191. bucket_content = old_using_uid_bucket[0]['bucket__content']
  192. # 免费存储桶不可转移
  193. old_vod_bucket_id = old_using_uid_bucket[0]['bucket_id']
  194. is_free = VodBucketModel.objects.get(id=old_vod_bucket_id).is_free
  195. if is_free == 1:
  196. return response.json(10012)
  197. # 查询转入设备是否存在正在使用的套餐和未使用的套餐
  198. new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime)
  199. new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=new_uid)
  200. if new_using_uid_bucket.exists() or new_unused_uid_bucket.exists():
  201. return response.json(10014)
  202. old_ai_service = AiService.objects.filter(uid=old_uid, endTime__gte=nowTime, use_status=1).values('id',
  203. 'detect_interval',
  204. 'detect_status',
  205. 'detect_group')
  206. new_ai_service = AiService.objects.filter(uid=new_uid, endTime__gte=nowTime, use_status=1)
  207. if new_ai_service.exists(): # 转入设备有开通AI功能,不能转
  208. return response.json(10014)
  209. new_uid_set = UidSetModel.objects.filter(uid=new_uid).values('is_ai')
  210. if old_ai_service.exists() and new_uid_set[0]['is_ai'] == 2: # 转出设备有开通AI,但是转入设备不支持AI,不能转
  211. return response.json(10016)
  212. with transaction.atomic():
  213. # 如果转出设备有未使用套餐,更改第一个未使用套餐为正在使用
  214. if old_using_uid_bucket[0]['has_unused'] == 1:
  215. old_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=old_uid).values('id', 'channel',
  216. 'bucket_id',
  217. 'addTime', 'expire',
  218. 'is_ai',
  219. 'order_id')
  220. count = old_unused_uid_bucket.count()
  221. unused = old_unused_uid_bucket[0]
  222. has_unused = 1 if count > 1 else 0 # 如果存在不止一个未使用套餐,has_unused=1
  223. endTime = CommonService.calcMonthLater(unused['expire'])
  224. data_dict = {
  225. 'uid': old_uid,
  226. 'channel': unused['channel'],
  227. 'bucket_id': unused['bucket_id'],
  228. 'addTime': unused['addTime'],
  229. 'endTime': endTime,
  230. 'updateTime': nowTime,
  231. 'status': 1,
  232. 'use_status': 1,
  233. 'has_unused': has_unused
  234. }
  235. UID_Bucket.objects.create(**data_dict) # 正在使用套餐表添加数据
  236. Unused_Uid_Meal.objects.filter(uid=old_uid).first().delete() # 删除未使用套餐表中的数据
  237. if unused['is_ai']: # 开通AI服务
  238. AiService.objects.create(uid=old_uid, channel=unused['channel'],
  239. detect_status=old_ai_service[0]['detect_status'],
  240. addTime=nowTime, updTime=nowTime, endTime=endTime, use_status=1,
  241. orders_id=unused['order_id'],
  242. detect_group=old_ai_service[0]['detect_group'],
  243. detect_interval=old_ai_service[0]['detect_interval'])
  244. # 更新转入设备的主用户信息
  245. Device_Info.objects.filter(UID=new_uid).update(vodPrimaryUserID=vodPrimaryUserID,
  246. vodPrimaryMaster=vodPrimaryMaster)
  247. # 更新正在使用套餐的uid,重置拥有未使用套餐
  248. old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
  249. UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid, has_unused=0)
  250. StsCrdModel.objects.filter(uid=old_uid).delete() # 删除转出设备stscrd表关联数据
  251. # 转移AI服务
  252. if old_ai_service.exists() and new_uid_set[0]['is_ai'] != 2:
  253. AiService.objects.filter(id=old_ai_service[0]['id']).update(uid=new_uid, detect_status=0,
  254. detect_group='', detect_interval=60)
  255. msg = {'commandType': 'AIDisable'}
  256. thing_name = CommonService.query_serial_with_uid(old_uid) # 存在序列号则为使用序列号作为物品名
  257. topic_name = 'ansjer/generic/{}'.format(thing_name)
  258. req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
  259. if not req_success:
  260. return response.json(10044)
  261. # 记录套餐转移日志
  262. ip = CommonService.get_ip_address(request)
  263. content = json.loads(json.dumps(request_dict))
  264. log = {
  265. 'ip': ip,
  266. 'user_id': 1,
  267. 'status': 200,
  268. 'time': int(time.time()),
  269. 'url': 'cloudTransfer/mealTransfer',
  270. 'content': json.dumps(content),
  271. 'operation': '用户{}的设备{}的套餐{}转移给设备{}'.format(username, old_uid, bucket_content, new_uid),
  272. }
  273. LogModel.objects.create(**log)
  274. return response.json(0)
  275. except Exception as e:
  276. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  277. def expireMeal(self, request_dict, response):
  278. UID_Bucket_id = request_dict.get("UID_Bucket_id", None)
  279. # 修改endTime让当前设备套餐过期
  280. if UID_Bucket_id:
  281. try:
  282. UID_Bucket.objects.filter(id=UID_Bucket_id).update(use_status=2)
  283. except Exception as e:
  284. # print(e)
  285. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  286. else:
  287. return response.json(0)
  288. response.json(404)