IcloudMeal.py 26 KB

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