IcloudMeal.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author : peng
  4. @Time : 2023-6-7 18:26:35
  5. @File :IcloudMeal.py
  6. """
  7. from Ansjer.config import LOGGER
  8. import time
  9. from urllib.parse import quote, parse_qs, unquote
  10. import paypalrestsdk
  11. from django.db import transaction, connection
  12. from django.db.models import Q, Sum
  13. from django.http import HttpResponse, HttpResponseRedirect
  14. from django.views import View
  15. from Model.models import Device_User, ICloudStoreMeal, Order_Model, IcloudUseDetails, IcloudService, Pay_Type
  16. from Object.AliPayObject import AliPayObject
  17. from Object.RedisObject import RedisObject
  18. from Object.ResponseObject import ResponseObject
  19. from Object.TokenObject import TokenObject
  20. from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN, PAYPAL_CRD, SERVER_DOMAIN_SSL
  21. from Object.WechatPayObject import WechatPayObject
  22. from Service.CommonService import CommonService
  23. from Controller.AiController import AiView
  24. class IcloudMeal(View):
  25. def get(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.GET, operation, request)
  29. def post(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation')
  32. return self.validation(request.POST, operation, request)
  33. def validation(self, request_dict, operation, request):
  34. response = ResponseObject()
  35. if operation == 'doPayPalCallBack': # paypal支付回调
  36. return self.do_paypal_callback(request_dict, response)
  37. elif operation == 'doAlipayCallBack': # 支付宝支付回调
  38. return self.do_alipay_callback(request_dict, response)
  39. elif operation == 'doWechatCallBack': # 微信支付回调
  40. return self.do_wechat_callback(request, response)
  41. else:
  42. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  43. if tko.code != 0:
  44. return response.json(tko.code)
  45. response.lang = tko.lang
  46. user_id = tko.userID
  47. if operation == 'getMeal': # 获取套餐
  48. return self.get_meal(request_dict, response)
  49. elif operation == 'createPayOrder': # 购买订单
  50. return self.create_pay_order(request_dict, request, user_id, response)
  51. elif operation == 'getCloudDriveInit': # 获取套餐明细
  52. return self.get_cloud_drive_init(request_dict, response, user_id)
  53. elif operation == 'getCapacity': # 获取容量
  54. return self.get_capacity(response, user_id)
  55. elif operation == 'activateCloudDrive': # 激活云盘
  56. return self.activate_cloud_drive(request_dict, response, user_id)
  57. else:
  58. return response.json(414)
  59. @staticmethod
  60. def get_meal(request_dict, response):
  61. """
  62. 获取套餐
  63. @param request_dict: 请求参数
  64. @request_dict lang: 语言
  65. @param response: 响应对象
  66. @return: response
  67. """
  68. lang = request_dict.get('lang', 'en')
  69. # 隐藏的、删除的套餐不查
  70. cloud_drive_qs = ICloudStoreMeal.objects.filter(Q(lang__lang=lang), Q(is_show=1), Q(is_delete=0)).values(
  71. 'id', 'currency', 'symbol', 'price', 'expire',
  72. 'pay_type',
  73. 'size', 'bucket_id', 'lang__title',
  74. 'lang__content', 'sort').order_by(
  75. 'sort')
  76. try:
  77. store_list = list(cloud_drive_qs)
  78. for cloud_drive in store_list:
  79. cloud_drive['title'] = cloud_drive.pop('lang__title')
  80. cloud_drive['content'] = cloud_drive.pop('lang__content')
  81. pay_type_qs = Pay_Type.objects.filter(id=cloud_drive['pay_type']).values("id", "payment")
  82. cloud_drive['pay_type'] = list(pay_type_qs)
  83. return response.json(0, store_list)
  84. except Exception as e:
  85. print(e)
  86. return response.json(500)
  87. @classmethod
  88. def create_pay_order(cls, request_dict, request, user_id, response):
  89. """
  90. 购买订单
  91. @param request_dict: 请求参数
  92. @param user_id: 用户id
  93. @param request: 请求对象
  94. @request_dict serial_number: 序列号
  95. @param response: 响应对象
  96. @return: response
  97. """
  98. pay_type = request_dict.get('pay_type', None)
  99. rank = request_dict.get('rank', None)
  100. lang = request_dict.get('lang', 'en')
  101. if not all([pay_type, rank]):
  102. return response.json(444, {'error param': 'rank, pay_type'})
  103. user_qs = Device_User.objects.filter(userID=user_id)
  104. if not user_qs.exists():
  105. return response.json(173)
  106. meal_qs = ICloudStoreMeal.objects.filter(id=rank, is_show=1, is_delete=0, lang__lang=lang,
  107. pay_type=pay_type).values('lang__title', 'lang__content', 'currency',
  108. 'price', 'bucket_id')
  109. if not meal_qs.exists():
  110. return response.json(173)
  111. # 查询中文套餐名
  112. icloud_meal_qs = ICloudStoreMeal.objects.filter(id=rank, is_show=1, is_delete=0, lang__lang='cn').values(
  113. 'lang__title',
  114. 'lang__content')
  115. if icloud_meal_qs.exists():
  116. store_meal_name = icloud_meal_qs[0]['lang__title'] + '-' + icloud_meal_qs[0]['lang__content']
  117. else:
  118. store_meal_name = '未知套餐'
  119. pay_type = int(pay_type)
  120. title = meal_qs[0]['lang__title']
  121. content = meal_qs[0]['lang__content']
  122. currency = meal_qs[0]['currency']
  123. price = meal_qs[0]['price']
  124. bucket_id = meal_qs[0]['bucket_id']
  125. now_time = int(time.time())
  126. order_id = CommonService.createOrderID()
  127. price = round(float(price), 2)
  128. order_dict = {
  129. 'orderID': order_id,
  130. 'UID': '',
  131. 'userID_id': user_id,
  132. 'desc': content,
  133. 'payType': pay_type,
  134. 'payTime': now_time,
  135. 'price': price,
  136. 'currency': currency,
  137. 'addTime': now_time,
  138. 'updTime': now_time,
  139. 'ai_rank_id': 1,
  140. 'rank_id': 1,
  141. 'order_type': 4,
  142. 'store_meal_name': store_meal_name,
  143. 'unify_combo_id': rank,
  144. 'uid_bucket_id': bucket_id
  145. }
  146. try:
  147. # 创建订单数据和返回支付回调链接
  148. if pay_type == 1: # PayPal支付
  149. res_dict = cls.create_paypal_payment(lang, order_id, price, currency, content)
  150. if not res_dict:
  151. return response.json(10, 'create icloud order failed')
  152. order_dict['paymentID'], order_dict['pay_url'] = res_dict['payment_id'], res_dict['pay_url']
  153. res_data = {'orderID': order_id, 'redirectUrl': order_dict['pay_url']}
  154. elif pay_type == 2: # 支付宝支付
  155. res_dict = cls.create_alipay_payment(lang, order_id, price, title, content)
  156. if not res_dict:
  157. return response.json(10, 'create icloud order failed')
  158. order_dict['pay_url'] = res_dict['pay_url']
  159. res_data = {'orderID': order_id, 'redirectUrl': order_dict['pay_url']}
  160. elif pay_type == 3: # 微信支付
  161. ip = CommonService.get_ip_address(request)
  162. res_dict = cls.create_wechat_payment(lang, order_id, price, ip, content)
  163. if not res_dict:
  164. return response.json(10, 'create icloud order failed')
  165. order_dict['pay_url'], sign_params = res_dict['pay_url'], res_dict['sign_params']
  166. res_data = {'orderID': order_id, 'redirectUrl': order_dict['pay_url'], 'result': sign_params}
  167. else:
  168. return response.json(444, {'param': 'pay_type'})
  169. Order_Model.objects.create(**order_dict)
  170. return response.json(0, res_data)
  171. except Exception as e:
  172. LOGGER.info('云盘生成订单异常:{}'.format(repr(e)))
  173. return response.json(500)
  174. @classmethod
  175. def do_paypal_callback(cls, request_dict, response):
  176. """
  177. paypal支付回调
  178. @param request_dict: 请求数据
  179. @request_dict paymentId: 支付id
  180. @request_dict PayerID: 支付账号id
  181. @request_dict orderID: 订单id
  182. @request_dict lang: 语言
  183. @param response: 响应
  184. @return: response
  185. """
  186. LOGGER.info('云盘订单---paypal支付回调')
  187. payment_id = request_dict.get('paymentId', None)
  188. payer_id = request_dict.get('PayerID', None)
  189. order_id = request_dict.get('orderID', None)
  190. lang = request_dict.get('lang', 'en')
  191. if not order_id:
  192. pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
  193. return HttpResponseRedirect(pay_failed_url)
  194. # redis加锁,防止订单重复
  195. redis_obj = RedisObject()
  196. is_lock = redis_obj.CONN.setnx(order_id + 'creating_icloud_order', 1)
  197. redis_obj.CONN.expire(order_id + 'creating_icloud_order', 60)
  198. if not is_lock:
  199. return response.json(5)
  200. order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
  201. if not order_qs.exists():
  202. return response.json(173)
  203. try:
  204. paypalrestsdk.configure(PAYPAL_CRD)
  205. payment = paypalrestsdk.Payment.find(payment_id)
  206. payer = payment.execute({'payer_id': payer_id})
  207. if not payer:
  208. pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
  209. redis_obj.del_data(key=order_id + 'creating_icloud_order')
  210. return HttpResponseRedirect(pay_failed_url)
  211. return cls.payment_success(order_id, lang, order_qs, redis_obj)
  212. except Exception as e:
  213. LOGGER.info('云盘订单paypal支付回调异常:{}'.format(repr(e)))
  214. order_qs.update(status=10)
  215. pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
  216. redis_obj.del_data(key=order_id + 'creating_icloud_order')
  217. return HttpResponseRedirect(pay_failed_url)
  218. @classmethod
  219. def do_alipay_callback(cls, request_dict, response):
  220. """
  221. 支付宝支付回调
  222. @param request_dict: 请求数据
  223. @param response: 响应
  224. @return: response
  225. """
  226. LOGGER.info('云盘订单---支付宝支付回调')
  227. data = request_dict.dict()
  228. passback_params = data['passback_params']
  229. params = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
  230. lang = params['lang']
  231. signature = data['sign']
  232. data.pop('sign')
  233. order_id = data['out_trade_no']
  234. # redis加锁,防止订单重复
  235. redis_obj = RedisObject()
  236. is_lock = redis_obj.CONN.setnx(order_id + 'creating_icloud_order', 1)
  237. redis_obj.CONN.expire(order_id + 'creating_icloud_order', 60)
  238. if not is_lock:
  239. return response.json(5)
  240. order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
  241. if not order_qs.exists():
  242. return response.json(173)
  243. try:
  244. alipay_obj = AliPayObject()
  245. alipay = alipay_obj.conf()
  246. success = alipay.verify(data, signature)
  247. if not success or data['trade_status'] not in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
  248. return response.json(0, signature)
  249. return cls.payment_success(order_id, lang, order_qs, redis_obj)
  250. except Exception as e:
  251. LOGGER.info('AI订单支付宝支付回调异常:{}'.format(repr(e)))
  252. order_qs.update(status=10)
  253. redis_obj.del_data(key=order_id + 'creating_icloud_order')
  254. pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
  255. redis_obj.del_data(key=order_id + 'creating_icloud_order')
  256. return HttpResponseRedirect(pay_failed_url)
  257. @classmethod
  258. def do_wechat_callback(cls, request, response):
  259. """
  260. 微信支付回调
  261. @param request: 请求体
  262. @param response: 响应
  263. @return: response
  264. """
  265. LOGGER.info('云盘订单---微信支付回调')
  266. pay = WechatPayObject()
  267. data = pay.weixinpay_call_back(request.body)
  268. attach = data["attach"]
  269. params = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
  270. lang = params['lang']
  271. trade_status = data['result_code'] # 业务结果 SUCCESS/FAIL
  272. order_id = data['out_trade_no'] # 商户订单号
  273. # redis加锁,防止订单重复
  274. redis_obj = RedisObject()
  275. is_lock = redis_obj.CONN.setnx(order_id + 'creating_icloud_order', 1)
  276. redis_obj.CONN.expire(order_id + 'creating_icloud_order', 60)
  277. if not is_lock:
  278. return response.json(5)
  279. order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
  280. if not order_qs.exists():
  281. return response.json(173)
  282. try:
  283. if trade_status != 'SUCCESS':
  284. order_qs.update(status=10)
  285. return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL'}))
  286. check_sign = pay.get_notifypay(data)
  287. if not check_sign:
  288. return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '签名失败'}))
  289. return cls.payment_success(order_id, lang, order_qs, redis_obj, True)
  290. except Exception as e:
  291. order_qs.update(status=10)
  292. redis_obj.del_data(key=order_id + 'creating_icloud_order')
  293. return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
  294. @staticmethod
  295. def payment_success(order_id, lang, order_qs, redis_obj, is_wechat_pay=False):
  296. """
  297. 支付成功
  298. @param order_id: 订单id
  299. @param lang: 语言
  300. @param order_qs: 订单QuerySet对象
  301. @param redis_obj: redis对象
  302. @param is_wechat_pay: 是否为微信支付
  303. @return: HttpResponse or HttpResponseRedirect
  304. """
  305. now_time = int(time.time())
  306. order_list = order_qs.values('unify_combo_id', 'userID__userID', 'userID__username')
  307. user_id = order_list[0]['userID__userID']
  308. rank_id = order_list[0]['unify_combo_id']
  309. icloud_meal_qs = ICloudStoreMeal.objects.filter(rank=rank_id).values('size', 'bucket_id', 'expire')
  310. size = icloud_meal_qs[0]['size']
  311. bucket_id = icloud_meal_qs[0]['bucket_id']
  312. expire = icloud_meal_qs[0]['expire']
  313. end_time = CommonService.calcMonthLater(expire)
  314. icloud_service_dict = {'orders_id': order_id,
  315. 'add_time': now_time,
  316. 'upd_time': now_time,
  317. 'type': 2,
  318. 'size': size,
  319. 'end_time': end_time
  320. }
  321. icloud_use_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id')
  322. if not icloud_use_qs.exists():
  323. icloud_use_qs = IcloudUseDetails.objects.create(add_time=now_time, upd_time=now_time, detect_status=1,
  324. user_id=user_id,
  325. bucket_id=bucket_id)
  326. icloud_service_dict['use_details_id'] = icloud_use_qs.id
  327. else:
  328. icloud_service_dict['use_details_id'] = icloud_use_qs[0]['id']
  329. with transaction.atomic():
  330. # 更新订单数据,返回支付成功url
  331. order_qs.update(status=1, updTime=now_time)
  332. # 创建AiService数据
  333. IcloudService.objects.create(**icloud_service_dict)
  334. pay_success_url = CommonService.get_payment_status_url(lang, 'success')
  335. redis_obj.del_data(key=order_id + 'creating_icloud_order')
  336. if is_wechat_pay:
  337. return HttpResponse("<xml>\
  338. <return_code><![CDATA[SUCCESS]]></return_code>\
  339. <return_msg><![CDATA[OK]]></return_msg>\
  340. </xml>")
  341. else:
  342. return HttpResponseRedirect(pay_success_url)
  343. @staticmethod
  344. def create_paypal_payment(lang, order_id, price, currency, content):
  345. """
  346. 创建PayPal支付
  347. @param lang: 语言
  348. @param order_id: 订单id
  349. @param price: 价格
  350. @param currency: 货币
  351. @param content: 内容
  352. @return: pay_dict
  353. """
  354. cancel_url = CommonService.get_payment_status_url(lang, 'fail')
  355. call_sub_url = "{}icloud/meal/doPayPalCallBack?orderID={}&lang={}".format(SERVER_DOMAIN_SSL, order_id, lang)
  356. try:
  357. paypalrestsdk.configure(PAYPAL_CRD)
  358. payment = paypalrestsdk.Payment({
  359. "intent": "sale",
  360. "payer": {"payment_method": "paypal"},
  361. "redirect_urls": {"return_url": call_sub_url, "cancel_url": cancel_url},
  362. "transactions": [{
  363. "item_list": {"items": [
  364. {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
  365. "amount": {"total": price, "currency": currency},
  366. "description": content}]})
  367. pay_dict = {}
  368. if not payment.create(): # 创建失败
  369. return pay_dict
  370. payment_id = payment['id'] # 获取payment id
  371. for link in payment.links:
  372. if link.rel == "approval_url":
  373. pay_url = str(link.href)
  374. pay_dict['payment_id'] = payment_id
  375. pay_dict['pay_url'] = pay_url
  376. return pay_dict
  377. return pay_dict
  378. except Exception as e:
  379. print(e)
  380. return {}
  381. @staticmethod
  382. def create_alipay_payment(lang, order_id, price, title, content):
  383. """
  384. 创建支付宝支付
  385. @param lang: 语言
  386. @param order_id: 订单id
  387. @param price: 价格
  388. @param title: 标题
  389. @param content: 内容
  390. @return: pay_dict
  391. """
  392. try:
  393. aliPayObj = AliPayObject()
  394. alipay = aliPayObj.conf()
  395. subject = title + content
  396. order_string = alipay.api_alipay_trade_wap_pay(
  397. out_trade_no=order_id,
  398. total_amount=price,
  399. subject=subject,
  400. return_url="{}web/paid2/success.html".format(SERVER_DOMAIN_SSL),
  401. notify_url="{}icloud/meal/doAlipayCallBack".format(SERVER_DOMAIN_SSL),
  402. quit_url="{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL),
  403. passback_params=quote("lang=" + lang)
  404. )
  405. if not order_string:
  406. return {}
  407. return {'pay_url': aliPayObj.alipay_prefix + order_string}
  408. except Exception as e:
  409. print(e)
  410. return {}
  411. @staticmethod
  412. def create_wechat_payment(lang, order_id, price, ip, content):
  413. """
  414. 创建微信支付
  415. @param lang: 语言
  416. @param order_id: 订单id
  417. @param price: 价格
  418. @param ip: ip
  419. @param content: 内容
  420. @return: pay_dict
  421. """
  422. pay_url = "{}icloud/meal/doWechatCallBack".format(SERVER_DOMAIN_SSL)
  423. try:
  424. pay = WechatPayObject()
  425. content = CommonService.Package_Type(4, content) # 云盘套餐
  426. pay.get_parameter(order_id, content, float(price) * 100, ip, pay_url, quote("lang=" + lang))
  427. sign_params = pay.re_finall(orderid=order_id)
  428. if not sign_params:
  429. return {}
  430. return {'pay_url': pay_url, 'sign_params': sign_params}
  431. except Exception as e:
  432. print(e)
  433. return {}
  434. @staticmethod
  435. def get_cloud_drive_init(request_dict, response, user_id):
  436. """
  437. 获取套餐明细
  438. @param request_dict: 请求数据
  439. @request_dict page: 页
  440. @request_dict line: 大小
  441. @request_dict lang: 语言
  442. @param user_id: 用户id
  443. @param response: 响应
  444. @return: response
  445. """
  446. lang = request_dict.get('lang', 'en')
  447. page = request_dict.get('page', None)
  448. line = request_dict.get('line', None)
  449. if not all([page, line]):
  450. return response.json(444)
  451. page = int(page)
  452. line = int(line)
  453. cloud_use_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id')
  454. if not cloud_use_qs.exists():
  455. return response.json(0)
  456. use_list = [obj['id'] for obj in cloud_use_qs]
  457. cloud_service_qs = IcloudService.objects.filter(use_details_id__in=use_list)
  458. if not cloud_use_qs.exists():
  459. return response.json(0)
  460. try:
  461. data = {}
  462. cloud_service_list = []
  463. count = cloud_service_qs.count()
  464. cloud_service_qs = cloud_service_qs.values('use_status', 'type', 'order_id', 'add_time',
  465. 'end_time').order_by(
  466. '-add_time')[(page - 1) * line:page * line]
  467. # 获取套餐明细
  468. for service in cloud_service_qs:
  469. data['use_status'] = service['use_status']
  470. data['type'] = service['type']
  471. data['order_id'] = service['order_id']
  472. data['add_time'] = service['add_time']
  473. data['end_time'] = service['end_time']
  474. if service['type'] == 0:
  475. if lang == 'cn':
  476. data['title'] = '1G永久套餐'
  477. data['note'] = '赠送'
  478. if lang == 'en':
  479. data['title'] = '1G Permanent Package'
  480. data['note'] = 'Gift'
  481. if service['type'] == 1:
  482. orders_qs = Order_Model.objects.filter(orderID=service['order_id'], order_type=0). \
  483. values('desc', 'unify_combo_id')
  484. data['note'] = orders_qs[0]['desc']
  485. cloud_store_qs = ICloudStoreMeal.objects.filter(id=orders_qs[0]['unify_combo_id'],
  486. lang__lang=lang).values(
  487. 'lang__title')
  488. data['title'] = cloud_store_qs[0]['lang__title']
  489. if service['type'] == 2:
  490. orders_qs = Order_Model.objects.filter(orderID=service['order_id']).values('desc', 'price',
  491. 'currency')
  492. data['title'] = orders_qs[0]['desc']
  493. data['note'] = orders_qs[0]['price'] + orders_qs[0]['currency']
  494. cloud_service_list.append(data)
  495. return response.json(0, {'data': cloud_service_list, 'count': count})
  496. except Exception as e:
  497. LOGGER.info('异常错误,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  498. return response.json(500, e)
  499. @staticmethod
  500. def get_capacity(response, user_id):
  501. """
  502. 获取云盘容量
  503. @param user_id: 用户id
  504. @param response: 响应
  505. @return: response
  506. """
  507. nowTime = int(time.time())
  508. try:
  509. cloud_use_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id').aggregate(
  510. total_used_size=Sum('use_size'),
  511. id=Sum('id'))
  512. cloud_service_qs = IcloudService.objects.filter(Q(use_details_id=cloud_use_qs['id']), Q(use_status=0),
  513. Q(end_time__gt=nowTime) | Q(end_time=0)).aggregate(
  514. total_size=Sum('size'))
  515. data = {
  516. 'M_size': round(cloud_use_qs['total_used_size'], 2),
  517. 'G_size': round(cloud_service_qs['total_size'], 0)
  518. }
  519. return response.json(0, data)
  520. except Exception as e:
  521. LOGGER.info('异常错误,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  522. return response.json(500, e)
  523. @staticmethod
  524. def activate_cloud_drive(request_dict, response, user_id):
  525. """
  526. 激活云盘
  527. @param request_dict: 请求数据
  528. @param user_id: 用户id
  529. @param response: 响应
  530. @return: response
  531. """
  532. lang = request_dict.get('lang', 'en')
  533. now_time = int(time.time())
  534. try:
  535. icloud_meal_qs = ICloudStoreMeal.objects.filter(price=0, expire=0, is_show=0, size=1, pay_type=10,
  536. lang__lang=lang).values('bucket_id')
  537. if not icloud_meal_qs.exists():
  538. return response.json(173)
  539. cloud_use_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id')
  540. if not cloud_use_qs.exists():
  541. # 云盘使用
  542. cloud_use_data = {
  543. 'use_size': 0,
  544. 'add_time': now_time,
  545. 'upd_time': now_time,
  546. 'detect_status': 1,
  547. 'user_id': user_id,
  548. 'bucket_id': icloud_meal_qs[0]['bucket_id']
  549. }
  550. cloud_use_qs = IcloudUseDetails.objects.create(**cloud_use_data)
  551. use_details_id = cloud_use_qs.id
  552. else:
  553. use_details_id = cloud_use_qs[0]['id']
  554. icloud_service_qs = IcloudService.objects.filter(use_details_id=use_details_id, size=1, end_time=0, type=0)
  555. if not icloud_service_qs.exists():
  556. # 云盘服务
  557. cloud_service_data = {
  558. 'size': 1,
  559. 'end_time': 0,
  560. 'add_time': now_time,
  561. 'upd_time': now_time,
  562. 'use_status': 0,
  563. 'use_details_id': use_details_id,
  564. 'type': 0,
  565. 'order_id': 0
  566. }
  567. IcloudService.objects.create(**cloud_service_data)
  568. return response.json(0)
  569. except Exception as e:
  570. LOGGER.info('异常错误,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  571. return response.json(500, e)