views (1).py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. import json
  2. from django.core.serializers import serialize
  3. from django.http import JsonResponse
  4. from django.shortcuts import render, redirect
  5. from alipay import AliPay
  6. import datetime
  7. from django.views.decorators.http import require_http_methods
  8. from index.models import UserInfo
  9. from Sellers.models import Tickets, Order, Flight, Message
  10. from django.db.models import Count, Q
  11. def hello(request, user_id):
  12. user = UserInfo.objects.filter(id=user_id).first()
  13. name = user.name
  14. sex = user.sex
  15. if sex == '1':
  16. sexx = '先生'
  17. else:
  18. sexx = '女士'
  19. context = {
  20. 'user_id': user_id,
  21. 'name': name,
  22. 'sex': sexx,
  23. }
  24. return render(request, 'hello.html', context)
  25. def my_info(request, user_id):
  26. my_data = UserInfo.objects.filter(id=user_id).first()
  27. if my_data.licence == '1':
  28. lic = '中国居民身份证'
  29. elif my_data.licence == '2':
  30. lic = '港澳台居民居住证'
  31. elif my_data.licence == '3':
  32. lic = '港澳居民来往内地通行证'
  33. elif my_data.licence == '4':
  34. lic = '台湾居民来往内地通行证'
  35. elif my_data.licence == '5':
  36. lic = '护照'
  37. elif my_data.licence == '6':
  38. lic = '外国人永久居留身份证'
  39. if my_data.sex == '1':
  40. sexx = '男'
  41. else:
  42. sexx = '女'
  43. if my_data.grand == '1':
  44. gra = '成人'
  45. elif my_data.grand == '2':
  46. gra = '儿童'
  47. elif my_data.grand == '3':
  48. gra = '学生'
  49. elif my_data.grand == '4':
  50. gra = '残疾军人、伤残人民警察'
  51. context = {
  52. 'username': my_data.username,
  53. 'password': my_data.password,
  54. 'name': my_data.name,
  55. 'lic_typ': lic,
  56. 'lic_num': my_data.lic_num,
  57. 'sex': sexx,
  58. 'gra': gra,
  59. 'pho': my_data.phone,
  60. 'ema': my_data.mail,
  61. 'user_id': my_data.id,
  62. }
  63. return render(request, 'my_info.html', context)
  64. def update_info(request, user_id):
  65. if request.method != 'POST':
  66. my_data = UserInfo.objects.filter(id=user_id).first()
  67. if my_data.licence == '1':
  68. lic = '中国居民身份证'
  69. elif my_data.licence == '2':
  70. lic = '港澳台居民居住证'
  71. elif my_data.licence == '3':
  72. lic = '港澳居民来往内地通行证'
  73. elif my_data.licence == '4':
  74. lic = '台湾居民来往内地通行证'
  75. elif my_data.licence == '5':
  76. lic = '护照'
  77. elif my_data.licence == '6':
  78. lic = '外国人永久居留身份证'
  79. if my_data.sex == '1':
  80. sexx = '男'
  81. else:
  82. sexx = '女'
  83. if my_data.grand == '1':
  84. gra = '成人'
  85. elif my_data.grand == '2':
  86. gra = '儿童'
  87. elif my_data.grand == '3':
  88. gra = '学生'
  89. elif my_data.grand == '4':
  90. gra = '残疾军人、伤残人民警察'
  91. context = {
  92. 'user': my_data.username,
  93. 'password': my_data.password,
  94. 'name': my_data.name,
  95. 'lic_typ': lic,
  96. 'lic_num': my_data.lic_num,
  97. 'sex': sexx,
  98. 'gra': gra,
  99. 'pho': my_data.phone,
  100. 'ema': my_data.mail,
  101. 'user_id': my_data.id,
  102. }
  103. return render(request, 'update_info.html', context)
  104. else:
  105. user_name = request.POST.get('user')
  106. pwd = request.POST.get('pwd')
  107. apwd = request.POST.get('apwd')
  108. lic = request.POST.get('lic')
  109. lic_num = request.POST.get('lic_num')
  110. gra = request.POST.get('grand')
  111. pho = request.POST.get('phone')
  112. ema = request.POST.get('mail')
  113. if user_name == '':
  114. return redirect('Users:up_non_user', user_id)
  115. elif pwd == '':
  116. return redirect('Users:up_non_pwd', user_id)
  117. elif apwd == '':
  118. return redirect('Users:up_non_apwd', user_id)
  119. elif pwd != apwd:
  120. return redirect('Users:up_not_equ', user_id)
  121. elif lic == '0':
  122. return redirect('Users:up_non_lic', user_id)
  123. elif lic_num == '':
  124. return redirect('Users:up_non_licnum', user_id)
  125. elif gra == '0':
  126. return redirect('Users:up_non_gra', user_id)
  127. elif pho == '':
  128. return redirect('Users:up_non_pho', user_id)
  129. elif ema == '':
  130. return redirect('Users:up_non_ema', user_id)
  131. else:
  132. UserInfo.objects.filter(id=user_id).update(username=user_name, password=pwd, licence=lic, lic_num=lic_num,
  133. grand=gra, phone=pho, mail=ema)
  134. return redirect('Users:my_info', user_id)
  135. def up_nonuser(request, user_id):
  136. context = {'user_id': user_id}
  137. return render(request, 'up_non_user.html', context)
  138. def up_nonpwd(request, user_id):
  139. context = {'user_id': user_id}
  140. return render(request, 'up_non_pwd.html', context)
  141. def up_nonapwd(request, user_id):
  142. context = {'user_id': user_id}
  143. return render(request, 'up_non_apwd.html', context)
  144. def up_notequ(request, user_id):
  145. context = {'user_id': user_id}
  146. return render(request, 'up_not_equ.html', context)
  147. def up_nonlic(request, user_id):
  148. context = {'user_id': user_id}
  149. return render(request, 'up_non_lic.html', context)
  150. def up_nonlicnum(request, user_id):
  151. context = {'user_id': user_id}
  152. return render(request, 'up_non_licnum.html', context)
  153. def up_nongra(request, user_id):
  154. context = {'user_id': user_id}
  155. return render(request, 'up_non_gra.html', context)
  156. def up_nonpho(request, user_id):
  157. context = {'user_id': user_id}
  158. return render(request, 'up_non_pho.html', context)
  159. def up_nonema(request, user_id):
  160. context = {'user_id': user_id}
  161. return render(request, 'up_non_ema.html', context)
  162. def search(request, user_id):
  163. if request.method != 'POST':
  164. context = {
  165. 'user_id': user_id
  166. }
  167. return render(request, 'search.html', context)
  168. else:
  169. tickets = Tickets.objects.all()
  170. eff_tickets = []
  171. now = str(datetime.datetime.now())
  172. for ticket in tickets:
  173. if now < str(ticket.starting_time):
  174. eff_tickets.append(ticket)
  175. sta = request.POST.get('sta_point')
  176. sta = sta.strip()
  177. fin = request.POST.get('fin_point')
  178. fin = fin.strip()
  179. tim = request.POST.get('dat')
  180. time = str(tim)
  181. tics = []
  182. # print(203, sta,fin,time)
  183. flight_result = Flight.objects.filter(sta_point__icontains=sta,fin_point__icontains=fin,status='未起飞')
  184. print(flight_result)
  185. for ticket in eff_tickets:
  186. if str(ticket.starting_time.date()) == time and ticket.start_point == sta and ticket.final_point == fin:
  187. tics.append(ticket)
  188. F_real_prices = []
  189. C_real_prices = []
  190. Y_real_prices = []
  191. for tic in tics:
  192. F_real_prices.append(tic.F_price * tic.F_discount / 10)
  193. C_real_prices.append(tic.C_price * tic.C_discount / 10)
  194. Y_real_prices.append(tic.Y_price * tic.Y_discount / 10)
  195. context = {
  196. 'tickets': flight_result,
  197. 'user_id': user_id,
  198. 'F_prices': F_real_prices,
  199. 'C_prices': C_real_prices,
  200. 'Y_prices': Y_real_prices,
  201. }
  202. print(227, flight_result)
  203. return render(request, 'search_result.html', context)
  204. def check_ticket(request, user_id, ticket_id):
  205. ticket = Tickets.objects.filter(id=ticket_id).first()
  206. context = {
  207. 'user_id': user_id,
  208. 'ticket': ticket,
  209. }
  210. return render(request, 'check_ticket.html', context)
  211. def order(request, user_id, ticket_id):
  212. orders = Order.objects.filter(user_id=user_id)
  213. flag = 0
  214. for order in orders:
  215. if order.ticket_id == ticket_id and order.status == '已支付':
  216. flag = 1
  217. break
  218. elif order.ticket_id == ticket_id and order.status == '等待支付':
  219. flag = 2
  220. break
  221. elif order.ticket_id == ticket_id and order.status == '退款审核中':
  222. flag = 3
  223. break
  224. elif order.ticket_id == ticket_id and order.status == '改签审核中':
  225. flag = 4
  226. break
  227. if flag == 0:
  228. ticket = Tickets.objects.filter(id=ticket_id).first()
  229. user = UserInfo.objects.filter(id=user_id).first()
  230. context = {
  231. 'ticket': ticket,
  232. 'user': user,
  233. }
  234. return render(request, 'order.html', context)
  235. elif flag == 1:
  236. context = {'user_id': user_id}
  237. return render(request, 'cant_two.html', context)
  238. elif flag == 2:
  239. context = {'user_id': user_id}
  240. return render(request, 'waiting_for_payment.html', context)
  241. elif flag == 3:
  242. context = {'user_id': user_id}
  243. return render(request, 'refunding.html', context)
  244. elif flag == 4:
  245. context = {'user_id': user_id}
  246. return render(request, 'changing.html', context)
  247. def dingdan(request, user_id, ticket_id):
  248. user = UserInfo.objects.filter(id=user_id).first()
  249. ticket = Tickets.objects.filter(id=ticket_id).first()
  250. berth = request.POST.get('berth')
  251. if berth == '1':
  252. ber = '头等舱'
  253. be_price = ticket.F_price
  254. if user.grand == '1':
  255. price = ticket.F_real_price
  256. discount = ticket.F_discount
  257. if user.grand == '2':
  258. price = ticket.F_price * 0.5
  259. discount = 5
  260. if user.grand == '3':
  261. price = ticket.F_price * 0.5
  262. discount = 5
  263. if user.grand == '4':
  264. price = ticket.F_price * 0.5
  265. discount = 5
  266. if berth == '2':
  267. ber = '商务舱'
  268. be_price = ticket.C_price
  269. if user.grand == '1':
  270. price = ticket.C_real_price
  271. discount = ticket.C_discount
  272. if user.grand == '2':
  273. price = ticket.C_price * 0.5
  274. discount = 5
  275. if user.grand == '3':
  276. price = ticket.C_price * 0.5
  277. discount = 5
  278. if user.grand == '4':
  279. price = ticket.C_price * 0.5
  280. discount = 5
  281. if berth == '3':
  282. be_price = ticket.Y_price
  283. ber = '经济舱'
  284. if user.grand == '1':
  285. price = ticket.Y_real_price
  286. discount = ticket.Y_discount
  287. if user.grand == '2':
  288. price = ticket.Y_price * 0.5
  289. discount = 5
  290. if user.grand == '3':
  291. price = ticket.Y_price * 0.5
  292. discount = 5
  293. if user.grand == '4':
  294. price = ticket.Y_price * 0.5
  295. discount = 5
  296. status='等待支付'
  297. order = Order.objects.create(flight=ticket.flight, start_point=ticket.start_point, final_point=ticket.final_point,
  298. tye=ticket.tye, stopover_hour=ticket.stopover_hour,
  299. stopover_minute=ticket.stopover_minute,
  300. stopover_point=ticket.stopover_point, starting_time=ticket.starting_time,
  301. final_time=ticket.final_time, be_price=ticket.be_price, discount=discount, true_price=price,
  302. Type=ticket.Type, berth=ber, status=status, ticket_id=ticket.id, user_id=user.id)
  303. if user.balance - order.true_price > 0:
  304. # 这里走余额
  305. UserInfo.objects.filter(id=user_id).update(balance=user.balance - price)
  306. Order.objects.filter(id=order.id).update(status='已支付')
  307. return redirect('Users:my_orders', user_id)
  308. # User / my_orders / 2 /
  309. sub = f'{ticket.flight} {ticket.start_point}至{ticket.final_point} {str(ticket.starting_time)}'
  310. app_private_key_string = open(r"Users/rsakey/private2048.txt").read()
  311. alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read()
  312. # 实例化AliPay
  313. alipay = AliPay(
  314. appid="2021000122675132",
  315. app_notify_url=None, # 支付宝会向这个地址发送post请求
  316. app_private_key_string=app_private_key_string, # 应用私钥
  317. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  318. sign_type="RSA2",
  319. debug=True, # 默认是False
  320. )
  321. # 定义请求地址传入的参数
  322. res = alipay.api_alipay_trade_page_pay(
  323. out_trade_no=str(order.id), # 订单号
  324. total_amount=str(order.true_price), # 交易金额(单位是元,保留两位小数)
  325. subject=sub, # 商品描述
  326. return_url='http://127.0.0.1:8000/User/show/' # 支付后像这个界面发送GET请求
  327. )
  328. # 生成跳转到支付宝支付页面的url
  329. url = 'https://openapi.alipaydev.com/gateway.do?' + res
  330. return redirect(url)
  331. def pay_order(request, order_id):
  332. order = Order.objects.filter(id=order_id).first()
  333. ticket_id = order.ticket_id
  334. ticket = Tickets.objects.filter(id=ticket_id).first()
  335. sub = f'{ticket.flight} {ticket.start_point}至{ticket.final_point} {str(ticket.starting_time)}'
  336. app_private_key_string = open(r"Users/rsakey/private2048.txt").read()
  337. alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read()
  338. # 实例化AliPay
  339. alipay = AliPay(
  340. appid="2021000122675132",
  341. app_notify_url=None, # 支付宝会向这个地址发送post请求
  342. app_private_key_string=app_private_key_string, # 应用私钥
  343. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  344. sign_type="RSA2", # 支付宝会向这个地址发送get请求
  345. debug=True, # 默认是False
  346. )
  347. # 定义请求地址传入的参数
  348. res = alipay.api_alipay_trade_page_pay(
  349. out_trade_no=str(order.id), # 订单号
  350. total_amount=str(order.true_price), # 交易金额(单位是元,保留两位小数)
  351. subject=sub, # 商品描述
  352. return_url='http://127.0.0.1:8000/User/show/'
  353. )
  354. # 生成跳转到支付宝支付页面的url
  355. url = 'https://openapi.alipaydev.com/gateway.do?' + res
  356. return redirect(url)
  357. def show(request):
  358. if request.method == 'GET':
  359. app_private_key_string = open(r"Users/rsakey/private2048.txt").read()
  360. alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read()
  361. alipay = AliPay(
  362. appid="2021000122675132",
  363. app_notify_url=None, # 支付宝会向这个地址发送post请求
  364. app_private_key_string=app_private_key_string, # 应用私钥
  365. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  366. sign_type="RSA2", # 支付宝会向这个地址发送get请求
  367. debug=True, # 默认是False
  368. )
  369. param = request.GET.dict() # 获取请求携带的参数并转换成字典类型
  370. print(param)
  371. sign = param.pop('sign', None) # 获取sign的值,并将字典中以'sign'为键的键值对删除
  372. # 对sign参数进行验证
  373. statu = alipay.verify(param, sign)
  374. if statu:
  375. numstr = param.pop('out_trade_no')
  376. Num = int(numstr)
  377. order = Order.objects.filter(id=Num).first()
  378. tiid = order.ticket_id
  379. uid = order.user_id
  380. flinum = order.flight
  381. ticket = Tickets.objects.filter(id=tiid).first()
  382. flight = Flight.objects.filter(number=flinum).first()
  383. if order.berth == '头等舱':
  384. num = ticket.F_quantity - 1
  385. Tickets.objects.filter(id=tiid).update(F_quantity=num)
  386. if order.berth == '商务舱':
  387. num = ticket.C_quantity - 1
  388. Tickets.objects.filter(id=tiid).update(C_quantity=num)
  389. if order.berth == '经济舱':
  390. num = ticket.Y_quantity - 1
  391. Tickets.objects.filter(id=tiid).update(Y_quantity=num)
  392. new_inc = flight.income + order.true_price
  393. Flight.objects.filter(number=flinum).update(income=new_inc)
  394. Order.objects.filter(id=Num).update(status='已支付')
  395. context = {'user_id': uid}
  396. return render(request, 'showsuc.html', context)
  397. else:
  398. numstr = param.pop('out_trade_no')
  399. num = int(numstr)
  400. order = Order.objects.filter(id=num).first()
  401. uid = order.user_id
  402. context = {'user_id': uid}
  403. return render(request, 'showfal.html', context)
  404. else:
  405. return render(request, 'showwro.html')
  406. def my_orders(request, user_id):
  407. orders = Order.objects.filter(user_id=user_id)
  408. now = str(datetime.datetime.now())
  409. eff_orders = []
  410. for order in orders:
  411. if order.status != '退款审核中' and order.status != '改签审核中' and order.status != '退款成功' \
  412. and order.status != '退款驳回' and order.status != '改签成功' and order.status != '改签驳回':
  413. eff_orders.append(order)
  414. for order in eff_orders:
  415. if order.status == '已支付' and now > str(order.starting_time) and now < str(order.final_time):
  416. Order.objects.filter(id=order.id).update(status='使用中')
  417. elif order.status == '已支付' and now > str(order.final_time):
  418. Order.objects.filter(id=order.id).update(status='已结束')
  419. elif order.status == '等待支付' and now > str(order.starting_time):
  420. Order.objects.filter(id=order.id).update(status='已取消')
  421. orders = Order.objects.filter(user_id=user_id)
  422. eff_orders = []
  423. for order in orders:
  424. if order.status != '退款审核中' and order.status != '改签审核中' and order.status != '退款成功' \
  425. and order.status != '退款驳回' and order.status != '改签成功' and order.status != '改签驳回':
  426. eff_orders.append(order)
  427. context = {
  428. 'orders': eff_orders,
  429. 'user_id': user_id,
  430. }
  431. return render(request, 'my_orders.html', context)
  432. def ask_for_refund(request, user_id, order_id):
  433. orders = Order.objects.filter(user_id=user_id)
  434. re_order = Order.objects.filter(id=order_id).first()
  435. if re_order.discount < 4:
  436. return redirect('cant_refund.html')
  437. eff_orders = []
  438. for order in orders:
  439. if order.status != '退款审核中' and order.status != '改签审核中' and order.status != '退款成功' \
  440. and order.status != '退款驳回' and order.status != '改签成功' and order.status != '改签驳回':
  441. eff_orders.append(order)
  442. context = {
  443. 'orders': eff_orders,
  444. 'user_id': user_id,
  445. 're_order': re_order,
  446. }
  447. return render(request, 'ask_for_refund.html', context)
  448. def assure_refund(request, user_id, order_id):
  449. Order.objects.filter(id=order_id).update(status='退款审核中')
  450. order = Order.objects.filter(id=order_id)
  451. now = datetime.datetime.now()
  452. sta_time = order.starting_time
  453. dur = sta_time - now
  454. hours = dur.seconds / 3600
  455. if hours < 2:
  456. Order.objects.filter(id=order_id).update(refund_percent=30)
  457. elif hours < 24:
  458. Order.objects.filter(id=order_id).update(refund_percent=20)
  459. else:
  460. Order.objects.filter(id=order_id).update(refund_percent=10)
  461. if now > sta_time:
  462. Order.objects.filter(id=order_id).update(refund_percent=50)
  463. order = Order.objects.filter(id=order_id).first()
  464. context = {
  465. 'order': order,
  466. 'user_id': user_id,
  467. }
  468. return render(request, 'assure_refund.html', context)
  469. def choose_change(request, user_id, order_id):
  470. order = Order.objects.filter(id=order_id).first()
  471. if order.discount < 4:
  472. return render(request, 'cant_change_dis.html')
  473. if request.method != 'POST':
  474. context = {
  475. 'user_id': user_id,
  476. 'order_id': order_id,
  477. }
  478. return render(request, 'search_choose_change.html', context)
  479. else:
  480. tickets = Tickets.objects.all()
  481. eff_tickets = []
  482. now = str(datetime.datetime.now())
  483. for ticket in tickets:
  484. if now < str(ticket.starting_time):
  485. eff_tickets.append(ticket)
  486. sta = request.POST.get('sta_point')
  487. fin = request.POST.get('fin_point')
  488. tim = request.POST.get('dat')
  489. tics = []
  490. time = str(tim)
  491. for ticket in eff_tickets:
  492. if ticket.start_point == sta and ticket.final_point == fin and str(ticket.starting_time.date()) == time:
  493. tics.append(ticket)
  494. context = {
  495. 'tickets': tics,
  496. 'user_id': user_id,
  497. 'order_id': order_id,
  498. }
  499. return render(request, 'choose_change.html', context)
  500. def check_change(request, user_id, order_id, ticket_id):
  501. ticket = Tickets.objects.filter(id=ticket_id).first()
  502. context = {
  503. 'ticket': ticket,
  504. 'user_id': user_id,
  505. 'order_id': order_id,
  506. }
  507. return render(request, 'check_change.html', context)
  508. def ask_for_change(request, user_id, order_id, ticket_id):
  509. new_ticket = Tickets.objects.filter(id=ticket_id).first()
  510. orders = Order.objects.all()
  511. user_orders = []
  512. for order in orders:
  513. if order.user_id == user_id:
  514. user_orders.append(order)
  515. for order in user_orders:
  516. if order.ticket_id == new_ticket.id and order.status == '已支付':
  517. ticket = Tickets.objects.filter(id=ticket_id).first()
  518. order = Order.objects.filter(id=order_id).first()
  519. context = {
  520. 'user_id': user_id,
  521. 'order': order,
  522. 'ticket': ticket,
  523. }
  524. return render(request, 'cant_change_sam.html', context)
  525. elif order.ticket_id == new_ticket.id and order.status == '等待支付':
  526. ticket = Tickets.objects.filter(id=ticket_id).first()
  527. order = Order.objects.filter(id=order_id).first()
  528. context = {
  529. 'user_id': user_id,
  530. 'order': order,
  531. 'ticket': ticket,
  532. }
  533. return render(request, 'have_wait.html', context)
  534. elif order.ticket_id == new_ticket.id and order.status == '改签审核中':
  535. ticket = Tickets.objects.filter(id=ticket_id).first()
  536. order = Order.objects.filter(id=order_id).first()
  537. context = {
  538. 'user_id': user_id,
  539. 'order': order,
  540. 'ticket': ticket,
  541. }
  542. return render(request, 'have_changing.html', context)
  543. elif order.ticket_id == new_ticket.id and order.status == '退款审核中':
  544. ticket = Tickets.objects.filter(id=ticket_id).first()
  545. order = Order.objects.filter(id=order_id).first()
  546. context = {
  547. 'user_id': user_id,
  548. 'order': order,
  549. 'ticket': ticket,
  550. }
  551. return render(request, 'have_refunding.html', context)
  552. order = Order.objects.filter(id=order_id).first()
  553. ticket = Tickets.objects.filter(id=ticket_id).first()
  554. berth = request.POST.get('berth')
  555. Berth = int(berth)
  556. context = {
  557. 'user_id': user_id,
  558. 'order': order,
  559. 'ticket': ticket,
  560. 'berth': Berth,
  561. }
  562. return render(request, 'ask_for_change.html', context)
  563. def assure_change(request, user_id, order_id, ticket_id, berth):
  564. if berth == 1:
  565. ber = '头等舱'
  566. elif berth == 2:
  567. ber = '公务舱'
  568. elif berth == 3:
  569. ber = '经济舱'
  570. Order.objects.filter(id=order_id).update(status='改签审核中', new_ticket_id=ticket_id, new_berth=ber)
  571. ticket = Tickets.objects.filter(id=ticket_id).first()
  572. order = Order.objects.filter(id=order_id).first()
  573. now = datetime.datetime.now()
  574. sta_tim = ticket.starting_time
  575. duration = sta_tim - now
  576. hours = duration.seconds / 3600
  577. if hours < 2:
  578. Order.objects.filter(id=order_id).update(change_percent=20)
  579. elif hours < 24:
  580. Order.objects.filter(id=order_id).update(change_percent=10)
  581. else:
  582. Order.objects.filter(id=order_id).update(change_percent=5)
  583. order = Order.objects.filter(id=order_id).first()
  584. value = order.true_price * (1 - order.change_percent * 0.01)
  585. if berth == 1:
  586. nee_val = ticket.F_real_price
  587. elif berth == 2:
  588. nee_val = ticket.C_real_price
  589. elif berth == 3:
  590. nee_val = ticket.Y_real_price
  591. if value < nee_val:
  592. sub = '改签补差'
  593. app_private_key_string = open(r"Users/rsakey/private2048.txt").read()
  594. alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read()
  595. # 实例化AliPay
  596. alipay = AliPay(
  597. appid="2021000122675132",
  598. app_notify_url=None, # 支付宝会向这个地址发送post请求
  599. app_private_key_string=app_private_key_string, # 应用私钥
  600. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  601. sign_type="RSA2", # 支付宝会向这个地址发送get请求
  602. debug=True, # 默认是False
  603. )
  604. # 定义请求地址传入的参数
  605. res = alipay.api_alipay_trade_page_pay(
  606. out_trade_no=str(100000 - int(order.id)), # 订单号
  607. total_amount=str(nee_val - value), # 交易金额(单位是元,保留两位小数)
  608. subject=sub, # 商品描述
  609. return_url='http://127.0.0.1:8000/User/add_price_assure/'
  610. )
  611. # 生成跳转到支付宝支付页面的url
  612. url = 'https://openapi.alipaydev.com/gateway.do?' + res
  613. return redirect(url)
  614. else:
  615. context = {
  616. 'user_id': user_id,
  617. 'ticket': ticket,
  618. 'order': order,
  619. }
  620. return render(request, 'assure_change.html', context)
  621. def add_price_assure(request):
  622. if request.method == 'GET':
  623. app_private_key_string = open(r"Users/rsakey/private2048.txt").read()
  624. alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read()
  625. alipay = AliPay(
  626. appid="2021000122675132",
  627. app_notify_url=None, # 支付宝会向这个地址发送post请求
  628. app_private_key_string=app_private_key_string, # 应用私钥
  629. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  630. sign_type="RSA2", # 支付宝会向这个地址发送get请求
  631. debug=True, # 默认是False
  632. )
  633. param = request.GET.dict() # 获取请求携带的参数并转换成字典类型
  634. sign = param.pop('sign', None) # 获取sign的值,并将字典中以'sign'为键的键值对删除
  635. # 对sign参数进行验证
  636. statu = alipay.verify(param, sign)
  637. if statu:
  638. numstr = param.pop('out_trade_no')
  639. num = int(numstr)
  640. rel_num = 100000 - num
  641. order = Order.objects.filter(id=rel_num).first()
  642. uid = order.user_id
  643. ticket = Tickets.objects.filter(id=order.new_ticket_id).first()
  644. context = {
  645. 'user_id': uid,
  646. 'order': order,
  647. 'ticket': ticket,
  648. }
  649. return render(request, 'wait_change.html', context)
  650. else:
  651. numstr = param.pop('out_trade_no')
  652. num = int(numstr)
  653. order = Order.objects.filter(id=num).first()
  654. uid = order.user_id
  655. context = {'user_id': uid}
  656. return render(request, 'showfal.html', context)
  657. else:
  658. return render(request, 'showwro.html')
  659. def my_change(request, user_id):
  660. orders = Order.objects.filter(user_id=user_id)
  661. change_orders = []
  662. change_new_tickets = []
  663. for order in orders:
  664. if order.status == '改签审核中' or order.status == '改签成功' or order.status == '改签驳回':
  665. ticket = Tickets.objects.filter(id=order.new_ticket_id).first()
  666. change_orders.append(order)
  667. change_new_tickets.append(ticket)
  668. context = {
  669. 'user_id': user_id,
  670. 'orders': change_orders,
  671. 'tickets': change_new_tickets,
  672. }
  673. print(change_new_tickets)
  674. return render(request, 'my_change.html', context)
  675. def my_refund(request, user_id):
  676. orders = Order.objects.filter(user_id=user_id)
  677. refund_orders = []
  678. for order in orders:
  679. if order.status == '退款审核中' or order.status == '退款成功' or order.status == '退款驳回':
  680. refund_orders.append(order)
  681. context = {
  682. 'user_id': user_id,
  683. 'orders': refund_orders,
  684. }
  685. return render(request, 'my_refund.html', context)
  686. def cancel_order(request, user_id, order_id):
  687. Order.objects.filter(id=order_id).update(status='已取消')
  688. return redirect('Users:my_orders', user_id)
  689. def consult(request, user_id):
  690. if request.method != 'POST':
  691. messages = Message.objects.all()
  692. fro_mess = []
  693. to_mess = []
  694. mess = []
  695. for message in messages:
  696. if message.from_id == user_id or message.to_id == user_id:
  697. mess.append(message)
  698. context = {
  699. 'user_id': user_id,
  700. 'mess': mess,
  701. }
  702. return render(request, 'consult.html', context)
  703. else:
  704. new_mess = request.POST.get('new_mess')
  705. Message.objects.create(content=new_mess, from_id=user_id, to_id=1, status=0)
  706. return redirect('Users:consult', user_id)
  707. # Create your views here.
  708. @require_http_methods(["POST","GET"])
  709. def search_recommend(request, user_id):
  710. # 统计历史订单中最多记录的机票信息,以终点为目标进行统计
  711. duplicate_orders = Order.objects.values('final_point').annotate(count=Count('final_point')).filter(count__gt=1, user_id=user_id).order_by('-count')[:3]
  712. final_point_list = []
  713. for order in duplicate_orders:
  714. final_point_list.append(order['final_point'])
  715. # print(order['final_point'], order['count'])
  716. # 查询航班信息
  717. final_list=Flight.objects.filter(fin_point__in=final_point_list,status = '未起飞')
  718. final_list_data = []
  719. for item in json.loads(serialize('json', final_list)):
  720. params = {**item['fields']}
  721. params.setdefault('id', item['pk'])
  722. final_list_data.append(params)
  723. return JsonResponse({
  724. 'data': final_list_data
  725. })