OrderContrller.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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
  25. from Service.CommonService import CommonService
  26. from Service.ModelService import ModelService
  27. '''
  28. # 获取所有设备下单信息
  29. http://192.168.136.40:8077/order/querylist?token=local&page=1&line=10
  30. '''
  31. # 设备信息添加
  32. class OrderView(View):
  33. @method_decorator(csrf_exempt)
  34. def dispatch(self, *args, **kwargs):
  35. return super(OrderView, self).dispatch(*args, **kwargs)
  36. def get(self, request, *args, **kwargs):
  37. request.encoding = 'utf-8'
  38. operation = kwargs.get('operation')
  39. return self.validation(request.GET, request, operation)
  40. def post(self, request, *args, **kwargs):
  41. request.encoding = 'utf-8'
  42. operation = kwargs.get('operation')
  43. return self.validation(request.POST, request, operation)
  44. def validation(self, request_dict, request, operation):
  45. response = ResponseObject()
  46. if operation is None:
  47. return response.json(444, 'error path')
  48. token = request_dict.get('token', None)
  49. # 设备主键uid
  50. tko = TokenObject(token)
  51. response.lang = request_dict.get('language', 'en')
  52. if tko.code != 0:
  53. return response.json(tko.code)
  54. userID = tko.userID
  55. if operation == 'querylist':
  56. return self.do_querylist(request_dict, userID, response)
  57. elif operation == 'adminDelete':
  58. return self.do_admin_delete(request_dict, userID, response)
  59. elif operation == 'adminQuery':
  60. return self.do_admin_query(request_dict, userID, response)
  61. elif operation == 'detail':
  62. return self.do_detail(request_dict, userID, response)
  63. elif operation == 'queryByStatus':
  64. return self.do_query_order_by_status(request_dict, userID, response)
  65. elif operation == 'orderDetail':
  66. return self.do_query_order_detail(request_dict, userID, response)
  67. elif operation == 'cancel':
  68. return self.do_cancel_order(request_dict, userID, response)
  69. elif operation == 'delete':
  70. return self.do_delete_order(request_dict, userID, response)
  71. else:
  72. return response.json(444, 'error path')
  73. def do_detail(self, request_dict, userID, response):
  74. orderID = request_dict.get('orderID', None)
  75. om_qs = Order_Model.objects.filter(userID_id=userID, orderID=orderID).values('status')
  76. if om_qs.exists():
  77. return response.json(0, {'status': om_qs[0]['status']})
  78. else:
  79. return response.json(173)
  80. def do_querylist(self, request_dict, userID, response):
  81. page = request_dict.get('page', None)
  82. line = request_dict.get('line', None)
  83. uid = request_dict.get('uid', None)
  84. lang = request_dict.get('lang', 'en')
  85. if not page or not line:
  86. return response.json(444, 'page,line')
  87. page = int(page)
  88. line = int(line)
  89. omqs = Order_Model.objects.filter(userID_id=userID, status=1, rank__lang__lang=lang)
  90. # 筛选指定设备id的订单
  91. if uid:
  92. omqs.filter(UID=uid)
  93. if not omqs.exists():
  94. return response.json(173)
  95. # return response.json(10, '订单不存在')
  96. count = omqs.count()
  97. omqs = omqs.annotate(rank__title=F('rank__lang__title'), rank__content=F('rank__lang__content'))
  98. order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "channel", "desc", "price", "currency",
  99. "addTime",
  100. "updTime", "paypal", "rank__day", "payType",
  101. "rank__price", "status",
  102. "rank__lang__content", "rank__title", "rank__currency",
  103. "rank_id", "rank__expire", 'store_meal_name', 'order_type')
  104. order_list = list(order_ql)
  105. data = []
  106. nowTime = int(time.time())
  107. # 这里需要进行优化
  108. uid_list = []
  109. for od in order_list:
  110. uid_list.append(od['UID'])
  111. didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list).values('id', 'UID', 'Type', 'serial_number')
  112. for d in order_list:
  113. if d['status'] == 0:
  114. if d['addTime'] + 3600 < nowTime:
  115. d['status'] = 3
  116. for did in didqs:
  117. if d['UID'] == did['UID']:
  118. d['did'] = did['id']
  119. d['Type'] = did['Type']
  120. # 如果存在序列号返回完整序列号
  121. if did['serial_number']:
  122. d['serial_number'] = CommonService.get_full_serial_number(d['UID'], did['serial_number'], did['Type'])
  123. data.append(d)
  124. d['rank__content'] = d['rank__lang__content']
  125. if d['order_type'] > 1:
  126. d['rank__title'] = d['store_meal_name']
  127. else:
  128. d['rank__title'] = d['rank__title'] + '-' +d['rank__lang__content']
  129. del d['rank__lang__content']
  130. # d['rank__lang__content'] = '月' if lang == 'cn' else 'month'
  131. return response.json(0, {'data': data, 'count': count})
  132. # admins ^^^^^^^^^^^^
  133. def do_admin_delete(self, request_dict, userID, response):
  134. own_perm = ModelService.check_perm(userID, 20)
  135. if own_perm is True:
  136. orderID = request_dict.get('orderID')
  137. Order_Model.objects.filter(orderID=orderID).delete()
  138. return response.json(0)
  139. else:
  140. return response.json(404)
  141. def do_admin_query(self, request_dict, userID, response):
  142. own_perm = ModelService.check_perm(userID, 20)
  143. if own_perm is True:
  144. page = request_dict.get('page', None)
  145. line = request_dict.get('line', None)
  146. uid = request_dict.get('uid', None)
  147. channel = request_dict.get('channel', None)
  148. orderID = request_dict.get('orderID', None)
  149. userID__username = request_dict.get('userID__username', None)
  150. currency = request_dict.get('currency', None)
  151. page = int(page)
  152. line = int(line)
  153. omqs = Order_Model.objects.all()
  154. # 筛选指定设备id的订单
  155. if uid:
  156. omqs = omqs.filter(UID=uid)
  157. if channel:
  158. omqs = omqs.filter(channel=channel)
  159. if orderID:
  160. omqs = omqs.filter(orderID=orderID)
  161. if userID__username:
  162. omqs = omqs.filter(userID__username=userID__username)
  163. if currency:
  164. omqs = omqs.filter(currency=currency)
  165. if not omqs.exists():
  166. return response.json(0, [])
  167. count = omqs.count()
  168. order_ql = omqs[(page - 1) * line:page * line].values("orderID", "UID", "userID__username", "channel", "desc", "price",
  169. "currency", "addTime", "updTime", "paypal",
  170. "payType",
  171. "rank__day",
  172. "rank__price", "status")
  173. order_list = list(order_ql)
  174. return response.json(0, {'data': order_list, 'count': count})
  175. else:
  176. return response.json(404)
  177. def do_query_order_by_status(self, request_dict, userID, response):
  178. status = request_dict.get('status', None)
  179. page = request_dict.get('page', None)
  180. line = request_dict.get('line', None)
  181. lang = request_dict.get('lang', 'en')
  182. if status and page and line:
  183. order_qs = None
  184. status = int(status)
  185. if status == -1: # 获取所有订单
  186. order_qs = Order_Model.objects.filter(userID__userID=userID,rank__lang__lang=lang)
  187. elif status == 0: # 获取【代付款】订单
  188. order_qs = Order_Model.objects.filter(userID__userID=userID, status=0,rank__lang__lang=lang)
  189. elif status == 1:
  190. order_qs = Order_Model.objects.filter(userID__userID=userID, status=1,rank__lang__lang=lang)
  191. if order_qs is None or not order_qs.exists():
  192. return response.json(0, {'data': [], 'count': 0})
  193. page = int(page)
  194. line = int(line)
  195. start = (page - 1) * line
  196. end = status + line
  197. count = order_qs.count()
  198. order_qs = order_qs.annotate(rank__title=F('rank__lang__title'))
  199. order_qs = order_qs[start:end].values("orderID", "UID", "channel", "desc", "price",
  200. "currency", "addTime", "payType", "rank__day", "rank__price",
  201. "status", 'channel', "rank__title", "currency")
  202. return response.json(0, {'data': list(order_qs), 'count': count})
  203. else:
  204. return response.json(444)
  205. def do_query_order_detail(self, request_dict, userID, response):
  206. orderID = request_dict.get('orderID', None)
  207. lang = request_dict.get('lang', 'en')
  208. if orderID:
  209. order_qs = Order_Model.objects.filter(orderID=orderID, userID__userID=userID, rank__lang__lang=lang)
  210. if order_qs.exists():
  211. print(order_qs)
  212. order_qs = order_qs.annotate(rank__title=F('rank__lang__title'))
  213. order = order_qs.values("orderID", "UID", "channel", "desc", "price",
  214. "currency", "addTime", "endTime", "payType",
  215. "rank__day", "rank__price", "status", 'channel', "rank__title", "currency")[0]
  216. return response.json(0, {'data': order})
  217. else:
  218. return response.json(173)
  219. else:
  220. return response.json(444)
  221. def do_cancel_order(self, request_dict, userID, response):
  222. orderID = request_dict.get('orderID', None)
  223. lang = request_dict.get('lang', 'en')
  224. if orderID is None:
  225. return response.json(444)
  226. order_qs = Order_Model.objects.filter(orderID=orderID,rank__lang__lang=lang)
  227. if not order_qs.exists():
  228. return response.json(800)
  229. order = order_qs[0]
  230. if order.status != 0:
  231. return response.json(802)
  232. if order.payType == 1: # 支付宝支付的订单
  233. return self.do_cancel_alipay_order(order, response)
  234. else:
  235. return self.do_cancel_paypal_order(order, response)
  236. def do_delete_order(self, request_dict, userID, response):
  237. orderID = request_dict.get('orderID', None)
  238. if orderID:
  239. Order_Model.objects.filter(orderID=orderID, userID__userID=userID).delete()
  240. return response.json(0)
  241. else:
  242. return response.json(444)
  243. def do_cancel_alipay_order(self, order, response):
  244. # 交易状态:
  245. # WAIT_BUYER_PAY(交易创建,等待买家付款)
  246. # TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
  247. # TRADE_SUCCESS(交易支付成功)
  248. # TRADE_FINISHED(交易结束,不可退款)
  249. try:
  250. aliPayObj = AliPayObject()
  251. alipay = aliPayObj.conf()
  252. result = alipay.api_alipay_trade_query(out_trade_no=order.orderID)
  253. print(result)
  254. if result['code'] == '100000':
  255. trade_status = result['trade_status']
  256. if trade_status == 'TRADE_CLOSED' or trade_status == 'WAIT_BUYER_PAY':
  257. order.status = 2
  258. order.updTime = int(time.time())
  259. order.save()
  260. return response.json(0)
  261. elif trade_status == 'TRADE_SUCCESS':
  262. order.status = 1
  263. order.updTime = int(time.time())
  264. order.save()
  265. return response.json(802)
  266. elif result['code'] == '40004':
  267. order.status = 2
  268. order.updTime = int(time.time())
  269. order.save()
  270. return response.json(0)
  271. else:
  272. return response.json(10, result['sub_msg'])
  273. except Exception as e:
  274. print(repr(e))
  275. return response.json(10, repr(e))
  276. def do_cancel_paypal_order(self, order, response):
  277. paypalrestsdk.configure(PAYPAL_CRD)
  278. payment = paypalrestsdk.Payment.find(order.trade_no)
  279. transactions = payment['transactions']
  280. transaction = transactions[0]
  281. related_resources = transaction['related_resources']
  282. if len(related_resources) > 0:
  283. related_resource = related_resources[0]
  284. sale = related_resource['sale']
  285. if sale['state'] == 'completed':
  286. order.status = 1
  287. elif sale['state'] == 'refunded':
  288. order.status = 3
  289. order.updTime = int(time.time())
  290. order.save()
  291. return response.json(802)
  292. order.status = 2
  293. order.updTime = int(time.time())
  294. order.save()
  295. return response.json(0)