IcloudMeal.py 24 KB

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