OrderContrller.py 12 KB

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