OrderContrller.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2018/12/6 10:53
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: OrderContrller.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. import time
  15. import paypalrestsdk
  16. from django.db.models import F
  17. from django.utils.decorators import method_decorator
  18. from django.views.decorators.csrf import csrf_exempt
  19. from django.views.generic.base import View
  20. from Ansjer.us_config.config_test import PAYPAL_CRD
  21. from Object.AliPayObject import AliPayObject
  22. from Object.ResponseObject import ResponseObject
  23. from Object.TokenObject import TokenObject
  24. from Model.models import Order_Model, Device_Info, UidSetModel, Store_Meal
  25. from Service.CommonService import CommonService
  26. from Service.ModelService import ModelService
  27. from Ansjer.config import CONFIG_INFO, CONFIG_CN
  28. '''
  29. # 获取所有设备下单信息
  30. http://192.168.136.40:8077/order/querylist?token=local&page=1&line=10
  31. '''
  32. # 设备信息添加
  33. class OrderView(View):
  34. @method_decorator(csrf_exempt)
  35. def dispatch(self, *args, **kwargs):
  36. return super(OrderView, self).dispatch(*args, **kwargs)
  37. def get(self, request, *args, **kwargs):
  38. request.encoding = 'utf-8'
  39. operation = kwargs.get('operation')
  40. return self.validation(request.GET, request, operation)
  41. def post(self, request, *args, **kwargs):
  42. request.encoding = 'utf-8'
  43. operation = kwargs.get('operation')
  44. return self.validation(request.POST, request, operation)
  45. def validation(self, request_dict, request, operation):
  46. response = ResponseObject()
  47. if operation is None:
  48. return response.json(444, 'error path')
  49. token = request_dict.get('token', None)
  50. # 设备主键uid
  51. tko = TokenObject(token)
  52. response.lang = request_dict.get('language', 'en')
  53. if tko.code != 0:
  54. return response.json(tko.code)
  55. userID = tko.userID
  56. if operation == 'querylist':
  57. return self.do_querylist(request_dict, userID, response)
  58. elif operation == 'adminDelete':
  59. return self.do_admin_delete(request_dict, userID, response)
  60. elif operation == 'adminQuery':
  61. return self.do_admin_query(request_dict, userID, response)
  62. elif operation == 'detail':
  63. return self.do_detail(request_dict, userID, response)
  64. elif operation == 'queryByStatus':
  65. return self.do_query_order_by_status(request_dict, userID, response)
  66. elif operation == 'orderDetail':
  67. return self.do_query_order_detail(request_dict, userID, response)
  68. elif operation == 'cancel':
  69. return self.do_cancel_order(request_dict, userID, response)
  70. elif operation == 'delete':
  71. return self.do_delete_order(request_dict, userID, response)
  72. else:
  73. return response.json(444, 'error path')
  74. def do_detail(self, request_dict, userID, response):
  75. orderID = request_dict.get('orderID', None)
  76. om_qs = Order_Model.objects.filter(userID_id=userID, orderID=orderID).values('status')
  77. if om_qs.exists():
  78. return response.json(0, {'status': om_qs[0]['status']})
  79. else:
  80. return response.json(173)
  81. def do_querylist(self, request_dict, userID, response):
  82. page = request_dict.get('page', None)
  83. line = request_dict.get('line', None)
  84. uid = request_dict.get('uid', None)
  85. lang = request_dict.get('lang', 'en')
  86. if not page or not line:
  87. return response.json(444, 'page,line')
  88. page = int(page)
  89. line = int(line)
  90. omqs = Order_Model.objects.filter(userID_id=userID, status=1, rank__lang__lang=lang, ai_rank__lang__lang=lang)
  91. # 筛选指定设备id的订单
  92. if uid:
  93. omqs.filter(UID=uid)
  94. if not omqs.exists():
  95. return response.json(173)
  96. # return response.json(10, '订单不存在')
  97. count = omqs.count()
  98. omqs = omqs.annotate(rank__title=F('rank__lang__title'), rank__content=F('rank__lang__content'))
  99. order_ql = omqs.values("orderID", "UID", "channel", "desc", "price", "currency",
  100. "addTime", "rank__lang__new_title", "rank__pixel_level", "rank__commodity_code",
  101. "updTime", "paypal", "rank__day", "payType", 'ai_rank', 'ai_rank__lang__title',
  102. "rank__price", "status", "rank__is_ai", 'ai_rank__lang__content',
  103. "rank__content", "rank__title", "rank__currency",
  104. "rank_id", "rank__expire", 'store_meal_name', 'order_type')[
  105. (page - 1) * line:page * line]
  106. order_list = list(order_ql)
  107. data = []
  108. nowTime = int(time.time())
  109. # 这里需要进行优化
  110. uid_list = []
  111. for od in order_list:
  112. uid_list.append(od['UID'])
  113. didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list).values('id', 'UID', 'Type',
  114. 'serial_number')
  115. for d in order_list:
  116. if d['status'] == 0:
  117. if d['addTime'] + 3600 < nowTime:
  118. d['status'] = 3
  119. for did in didqs:
  120. if d['UID'] == did['UID']:
  121. d['did'] = did['id']
  122. d['Type'] = did['Type']
  123. # 如果存在序列号返回完整序列号
  124. if did['serial_number']:
  125. d['serial_number'] = CommonService.get_full_serial_number(d['UID'], did['serial_number'],
  126. did['Type'])
  127. data.append(d)
  128. if d['order_type'] > 1:
  129. d['rank__title'] = d['store_meal_name']
  130. else:
  131. if CONFIG_INFO != CONFIG_CN:
  132. if d['payType'] not in [10, 11]:
  133. if d['rank__pixel_level'] == 0 and d['rank__is_ai'] == 0:
  134. if d['rank__commodity_code']:
  135. d['rank__title'] = d['rank__lang__new_title'].get('5', '')
  136. else:
  137. d['rank__title'] = d['rank__lang__new_title'].get('1', '')
  138. elif d['rank__pixel_level'] == 1 and d['rank__is_ai'] == 0:
  139. if d['rank__commodity_code']:
  140. d['rank__title'] = d['rank__lang__new_title'].get('6', '')
  141. else:
  142. d['rank__title'] = d['rank__lang__new_title'].get('2', '')
  143. elif d['rank__pixel_level'] == 0 and d['rank__is_ai'] == 1:
  144. if d['rank__commodity_code']:
  145. d['rank__title'] = d['rank__lang__new_title'].get('7', '')
  146. else:
  147. d['rank__title'] = d['rank__lang__new_title'].get('3', '')
  148. elif d['rank__pixel_level'] == 1 and d['rank__is_ai'] == 1:
  149. if d['rank__commodity_code']:
  150. d['rank__title'] = d['rank__lang__new_title'].get('8', '')
  151. else:
  152. d['rank__title'] = d['rank__lang__new_title'].get('4', '')
  153. elif d['payType'] == 10: # 免费套餐
  154. if d['order_type'] == 0:
  155. d['rank__title'] = d['rank__lang__new_title'].get('1', '')
  156. elif d['order_type'] == 1:
  157. if d['ai_rank'] != 1:
  158. d['rank__title'] = d['ai_rank__lang__title'] + '-' + d['ai_rank__lang__content']
  159. else:
  160. d['rank__title'] = d['rank__lang__new_title'].get('2', '')
  161. else: # cdk套餐
  162. store_qs = Store_Meal.objects.filter(id=d['rank_id']).values('pay_type')
  163. if store_qs[0]['pay_type'] != 11:
  164. if d['rank__pixel_level'] == 0 and d['rank__is_ai'] == 0:
  165. d['rank__title'] = d['rank__lang__new_title'].get('1', '')
  166. elif d['rank__pixel_level'] == 1 and d['rank__is_ai'] == 0:
  167. d['rank__title'] = d['rank__lang__new_title'].get('2', '')
  168. elif d['rank__pixel_level'] == 0 and d['rank__is_ai'] == 1:
  169. d['rank__title'] = d['rank__lang__new_title'].get('3', '')
  170. elif d['rank__pixel_level'] == 1 and d['rank__is_ai'] == 1:
  171. d['rank__title'] = d['rank__lang__new_title'].get('4', '')
  172. else:
  173. if d['order_type'] == 0:
  174. d['rank__title'] = d['rank__lang__new_title'].get('1', '')
  175. elif d['order_type'] == 1:
  176. d['rank__title'] = d['rank__lang__new_title'].get('2', '')
  177. d['rank__title'] += '(cdk)'
  178. else:
  179. d['rank__title'] = d['rank__title'] + '-' + d['rank__content']
  180. return response.json(0, {'data': data, 'count': count})
  181. # admins ^^^^^^^^^^^^
  182. def do_admin_delete(self, request_dict, userID, response):
  183. own_perm = ModelService.check_perm(userID, 20)
  184. if own_perm is True:
  185. orderID = request_dict.get('orderID')
  186. Order_Model.objects.filter(orderID=orderID).delete()
  187. return response.json(0)
  188. else:
  189. return response.json(404)
  190. def do_admin_query(self, request_dict, userID, response):
  191. own_perm = ModelService.check_perm(userID, 20)
  192. if own_perm is True:
  193. page = request_dict.get('page', None)
  194. line = request_dict.get('line', None)
  195. uid = request_dict.get('uid', None)
  196. channel = request_dict.get('channel', None)
  197. orderID = request_dict.get('orderID', None)
  198. userID__username = request_dict.get('userID__username', None)
  199. currency = request_dict.get('currency', None)
  200. page = int(page)
  201. line = int(line)
  202. omqs = Order_Model.objects.all()
  203. # 筛选指定设备id的订单
  204. if uid:
  205. omqs = omqs.filter(UID=uid)
  206. if channel:
  207. omqs = omqs.filter(channel=channel)
  208. if orderID:
  209. omqs = omqs.filter(orderID=orderID)
  210. if userID__username:
  211. omqs = omqs.filter(userID__username=userID__username)
  212. if currency:
  213. omqs = omqs.filter(currency=currency)
  214. if not omqs.exists():
  215. return response.json(0, [])
  216. count = omqs.count()
  217. order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "userID__username", "channel",
  218. "desc", "price",
  219. "currency", "addTime", "updTime", "paypal",
  220. "payType",
  221. "rank__day",
  222. "rank__price", "status")
  223. order_list = list(order_ql)
  224. return response.json(0, {'data': order_list, 'count': count})
  225. else:
  226. return response.json(404)
  227. def do_query_order_by_status(self, request_dict, userID, response):
  228. status = request_dict.get('status', None)
  229. page = request_dict.get('page', None)
  230. line = request_dict.get('line', None)
  231. lang = request_dict.get('lang', 'en')
  232. if status and page and line:
  233. order_qs = None
  234. status = int(status)
  235. if status == -1: # 获取所有订单
  236. order_qs = Order_Model.objects.filter(userID__userID=userID, rank__lang__lang=lang)
  237. elif status == 0: # 获取【代付款】订单
  238. order_qs = Order_Model.objects.filter(userID__userID=userID, status=0, rank__lang__lang=lang)
  239. elif status == 1:
  240. order_qs = Order_Model.objects.filter(userID__userID=userID, status=1, rank__lang__lang=lang)
  241. if order_qs is None or not order_qs.exists():
  242. return response.json(0, {'data': [], 'count': 0})
  243. page = int(page)
  244. line = int(line)
  245. start = (page - 1) * line
  246. end = status + line
  247. count = order_qs.count()
  248. order_qs = order_qs.annotate(rank__title=F('rank__lang__title'))
  249. order_qs = order_qs[start:end].values("orderID", "UID", "channel", "desc", "price",
  250. "currency", "addTime", "payType", "rank__day", "rank__price",
  251. "status", 'channel', "rank__title", "currency")
  252. return response.json(0, {'data': list(order_qs), 'count': count})
  253. else:
  254. return response.json(444)
  255. def do_query_order_detail(self, request_dict, userID, response):
  256. orderID = request_dict.get('orderID', None)
  257. lang = request_dict.get('lang', 'en')
  258. if orderID:
  259. order_qs = Order_Model.objects.filter(orderID=orderID, userID__userID=userID, rank__lang__lang=lang)
  260. if order_qs.exists():
  261. print(order_qs)
  262. order_qs = order_qs.annotate(rank__title=F('rank__lang__title'))
  263. order = order_qs.values("orderID", "UID", "channel", "desc", "price",
  264. "currency", "addTime", "endTime", "payType",
  265. "rank__day", "rank__price", "status", 'channel', "rank__title", "currency")[0]
  266. return response.json(0, {'data': order})
  267. else:
  268. return response.json(173)
  269. else:
  270. return response.json(444)
  271. def do_cancel_order(self, request_dict, userID, response):
  272. orderID = request_dict.get('orderID', None)
  273. lang = request_dict.get('lang', 'en')
  274. if orderID is None:
  275. return response.json(444)
  276. order_qs = Order_Model.objects.filter(orderID=orderID, rank__lang__lang=lang)
  277. if not order_qs.exists():
  278. return response.json(800)
  279. order = order_qs[0]
  280. if order.status != 0:
  281. return response.json(802)
  282. if order.payType == 1: # 支付宝支付的订单
  283. return self.do_cancel_alipay_order(order, response)
  284. else:
  285. return self.do_cancel_paypal_order(order, response)
  286. def do_delete_order(self, request_dict, userID, response):
  287. orderID = request_dict.get('orderID', None)
  288. if orderID:
  289. Order_Model.objects.filter(orderID=orderID, userID__userID=userID).delete()
  290. return response.json(0)
  291. else:
  292. return response.json(444)
  293. def do_cancel_alipay_order(self, order, response):
  294. # 交易状态:
  295. # WAIT_BUYER_PAY(交易创建,等待买家付款)
  296. # TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
  297. # TRADE_SUCCESS(交易支付成功)
  298. # TRADE_FINISHED(交易结束,不可退款)
  299. try:
  300. aliPayObj = AliPayObject()
  301. alipay = aliPayObj.conf()
  302. result = alipay.api_alipay_trade_query(out_trade_no=order.orderID)
  303. print(result)
  304. if result['code'] == '100000':
  305. trade_status = result['trade_status']
  306. if trade_status == 'TRADE_CLOSED' or trade_status == 'WAIT_BUYER_PAY':
  307. order.status = 2
  308. order.updTime = int(time.time())
  309. order.save()
  310. return response.json(0)
  311. elif trade_status == 'TRADE_SUCCESS':
  312. order.status = 1
  313. order.updTime = int(time.time())
  314. order.save()
  315. return response.json(802)
  316. elif result['code'] == '40004':
  317. order.status = 2
  318. order.updTime = int(time.time())
  319. order.save()
  320. return response.json(0)
  321. else:
  322. return response.json(10, result['sub_msg'])
  323. except Exception as e:
  324. print(repr(e))
  325. return response.json(10, repr(e))
  326. def do_cancel_paypal_order(self, order, response):
  327. paypalrestsdk.configure(PAYPAL_CRD)
  328. payment = paypalrestsdk.Payment.find(order.trade_no)
  329. transactions = payment['transactions']
  330. transaction = transactions[0]
  331. related_resources = transaction['related_resources']
  332. if len(related_resources) > 0:
  333. related_resource = related_resources[0]
  334. sale = related_resource['sale']
  335. if sale['state'] == 'completed':
  336. order.status = 1
  337. elif sale['state'] == 'refunded':
  338. order.status = 3
  339. order.updTime = int(time.time())
  340. order.save()
  341. return response.json(802)
  342. order.status = 2
  343. order.updTime = int(time.time())
  344. order.save()
  345. return response.json(0)