CloudTransfer.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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 time
  9. from django.db import transaction
  10. from django.db.models import Q
  11. from django.views.generic.base import View
  12. from Model.models import Device_User, Device_Info, Order_Model, UID_Bucket, StsCrdModel, VodHlsModel, Unused_Uid_Meal, \
  13. VodBucketModel, UnicomDeviceInfo
  14. from Object.ResponseObject import ResponseObject
  15. from Object.TokenObject import TokenObject
  16. from Service.CommonService import CommonService
  17. from Service.ModelService import ModelService
  18. class cloudTestView(View):
  19. def get(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.GET, request, operation)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.POST, request, operation)
  27. def validation(self, request_dict, request, operation):
  28. lang = request_dict.get('lang', None)
  29. response = ResponseObject(lang) if lang else ResponseObject()
  30. if operation is None:
  31. return response.json(444, 'error path')
  32. else:
  33. token = request_dict.get('token', None)
  34. # 设备主键uid
  35. tko = TokenObject(token)
  36. if tko.code != 0:
  37. return response.json(tko.code)
  38. userID = tko.userID
  39. if operation == 'deviceTransfer':
  40. return self.deviceTransfer(request_dict, response)
  41. elif operation == 'mealTransfer':
  42. return self.mealTransfer(request_dict, response, userID)
  43. elif operation == 'expireMeal':
  44. return self.expireMeal(request_dict, response)
  45. def deviceTransfer(self, request_dict, response):
  46. # 设备转移,一个用户下的设备转移到另一个用户
  47. oldUserID = request_dict.get("oldUserID", None)
  48. username = request_dict.get("username", None)
  49. uid = request_dict.get('uid', None)
  50. now_time = CommonService.timestamp_to_str(int(time.time()))
  51. # print('now_time: ', now_time)
  52. try:
  53. # 查询该userID下是否存在此设备
  54. old_deviceInfo_qs = Device_Info.objects.filter(userID_id=oldUserID, UID=uid, isExist=1) \
  55. .values('isShare', 'vodPrimaryUserID', 'serial_number')
  56. if not old_deviceInfo_qs.exists():
  57. return response.json(10008)
  58. newUserID = ModelService.get_userID_byname(username) # 根据username获取userID
  59. if newUserID is None: # 没有此用户
  60. return response.json(104)
  61. if newUserID == oldUserID: # 新用户的userID跟旧用户的一样
  62. return response.json(10009)
  63. # 分享的设备不能转移
  64. isShare = old_deviceInfo_qs[0]['isShare']
  65. if isShare:
  66. return response.json(10015)
  67. # 旧用户是设备主用户才能转移
  68. vodPrimaryUserID = old_deviceInfo_qs[0]['vodPrimaryUserID']
  69. if vodPrimaryUserID != '' and vodPrimaryUserID != oldUserID:
  70. return response.json(10037)
  71. # uid_mian = UIDMainUser.objects.filter(UID=uid).values('UID', 'user_id')
  72. # if uid_mian.exists():
  73. # vodPrimaryUserID = uid_mian[0]['user_id']
  74. # if vodPrimaryUserID != '' and vodPrimaryUserID != oldUserID:
  75. # return response.json(10037)
  76. # 判断新用户是否已有此设备
  77. new_deviceInfo_qs = Device_Info.objects.filter(userID_id=newUserID, UID=uid, isExist=1)
  78. if new_deviceInfo_qs:
  79. return response.json(10009)
  80. # 旧用户如果开启云存自动续费,不可转移
  81. hasCycle = Order_Model.objects.filter(userID=oldUserID, UID=uid)
  82. hasCycle = hasCycle.filter(~Q(agreement_id=''))
  83. if hasCycle.exists():
  84. return response.json(10056)
  85. # 获取新设备的username
  86. newUserName = Device_User.objects.get(userID=newUserID).username
  87. vodPrimaryUserID = newUserID
  88. vodPrimaryMaster = newUserName
  89. with transaction.atomic():
  90. serial_number = old_deviceInfo_qs[0]['serial_number']
  91. # 更新旧设备的userID,设备添加时间,关闭推送消息提醒
  92. old_deviceInfo_qs.update(userID=newUserID, data_joined=now_time, NotificationMode=0)
  93. # 更新设备的主用户信息
  94. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID,
  95. vodPrimaryMaster=vodPrimaryMaster)
  96. VodHlsModel.objects.filter(uid=uid).delete()
  97. if not serial_number:
  98. serial_number = CommonService.query_serial_with_uid(uid)
  99. u_dev_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
  100. if u_dev_info_qs.exists():
  101. now_time = int(time.time())
  102. u_dev_info_qs.update(user_id=newUserID, updated_time=now_time)
  103. # UIDMainUser.objects.filter(UID=uid).delete()
  104. # uid_main_dict = {
  105. # 'UID': uid,
  106. # 'user_id': newUserID
  107. # }
  108. # UIDMainUser.objects.create(**uid_main_dict)
  109. except Exception as e:
  110. # print(e)
  111. return response.json(500, repr(e))
  112. else:
  113. return response.json(0)
  114. def mealTransfer(self, request_dict, response, userID):
  115. # 云存套餐转移,同一用户下不同设备间的云存套餐转移
  116. old_uid = request_dict.get("old_uid", None)
  117. new_uid = request_dict.get("new_uid", None)
  118. nowTime = int(time.time())
  119. try:
  120. # 查询两个UID是否在同一账号下
  121. old_deviceInfo_qs = Device_Info.objects.filter(userID_id=userID, UID=old_uid).values('isExist',
  122. 'vodPrimaryUserID')
  123. new_deviceInfo_qs = Device_Info.objects.filter(userID_id=userID, UID=new_uid).values('isExist')
  124. if not (old_deviceInfo_qs.exists() and new_deviceInfo_qs.exists()):
  125. return response.json(10010)
  126. # 不是主用户无法转移
  127. vodPrimaryUserID = old_deviceInfo_qs[0]['vodPrimaryUserID']
  128. if vodPrimaryUserID != '' and vodPrimaryUserID != userID:
  129. return response.json(10038)
  130. vodPrimaryUserID = userID
  131. vodPrimaryMaster = ModelService.get_user_name(userID)
  132. new_isExist = new_deviceInfo_qs[0]['isExist']
  133. if not new_isExist:
  134. return response.json(10011)
  135. # 查询转出设备正在使用的套餐
  136. old_using_uid_bucket = UID_Bucket.objects.filter(uid=old_uid, endTime__gte=nowTime).values('id',
  137. 'bucket_id',
  138. 'has_unused').order_by(
  139. 'addTime')
  140. if not old_using_uid_bucket.exists():
  141. return response.json(10013)
  142. # 免费存储桶不可转移
  143. old_vod_bucket_id = old_using_uid_bucket[0]['bucket_id']
  144. is_free = VodBucketModel.objects.get(id=old_vod_bucket_id).is_free
  145. if is_free == 1:
  146. return response.json(10012)
  147. # 查询转入设备是否存在正在使用的套餐和未使用的套餐
  148. new_using_uid_bucket = UID_Bucket.objects.filter(uid=new_uid, endTime__gte=nowTime)
  149. new_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=new_uid)
  150. if new_using_uid_bucket.exists() or new_unused_uid_bucket.exists():
  151. return response.json(10014)
  152. # 如果转出设备有未使用套餐,更改第一个未使用套餐为正在使用
  153. if old_using_uid_bucket[0]['has_unused'] == 1:
  154. old_unused_uid_bucket = Unused_Uid_Meal.objects.filter(uid=old_uid).values('id', 'channel', 'bucket_id',
  155. 'addTime', 'expire', 'num')
  156. count = old_unused_uid_bucket.count()
  157. unused = old_unused_uid_bucket[0]
  158. has_unused = 1 if count > 1 else 0 # 如果存在不止一个未使用套餐,has_unused=1
  159. endTime = CommonService.calcMonthLater(unused['expire'] * unused['num'])
  160. data_dict = {
  161. 'uid': old_uid,
  162. 'channel': unused['channel'],
  163. 'bucket_id': unused['bucket_id'],
  164. 'addTime': unused['addTime'],
  165. 'endTime': endTime,
  166. 'updateTime': nowTime,
  167. 'status': 1,
  168. 'use_status': 1,
  169. 'has_unused': has_unused
  170. }
  171. UID_Bucket.objects.create(**data_dict) # 正在使用套餐表添加数据
  172. Unused_Uid_Meal.objects.filter(uid=old_uid).first().delete() # 删除未使用套餐表中的数据
  173. with transaction.atomic():
  174. # 更新转入设备的主用户信息
  175. Device_Info.objects.filter(UID=new_uid).update(vodPrimaryUserID=vodPrimaryUserID,
  176. vodPrimaryMaster=vodPrimaryMaster)
  177. # 更新正在使用套餐的uid,重置拥有未使用套餐
  178. old_using_uid_bucket_id = old_using_uid_bucket[0]['id']
  179. UID_Bucket.objects.filter(id=old_using_uid_bucket_id).update(uid=new_uid, has_unused=0)
  180. StsCrdModel.objects.filter(uid=old_uid).delete() # 删除转出设备stscrd表关联数据
  181. except Exception as e:
  182. # print(e)
  183. return response.json(500, repr(e))
  184. else:
  185. return response.json(0)
  186. def expireMeal(self, request_dict, response):
  187. UID_Bucket_id = request_dict.get("UID_Bucket_id", None)
  188. # 修改endTime让当前设备套餐过期
  189. if UID_Bucket_id:
  190. try:
  191. UID_Bucket.objects.filter(id=UID_Bucket_id).update(use_status=2)
  192. except Exception as e:
  193. # print(e)
  194. return response.json(500, repr(e))
  195. else:
  196. return response.json(0)
  197. response.json(404)