views.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936
  1. import json
  2. from django.core.serializers import serialize
  3. from django.db.models import Count, Sum
  4. from django.http import JsonResponse
  5. from django.shortcuts import render, redirect
  6. from django.views.decorators.http import require_http_methods
  7. from .models import Tickets, Flight, Order, Message
  8. from index.models import UserInfo
  9. from alipay import AliPay
  10. import datetime
  11. from decimal import Decimal
  12. from datetime import datetime
  13. from django.utils import timezone
  14. from dateutil.parser import parse
  15. from dateutil import parser
  16. def hello(request):
  17. return render(request, 'sell-hello.html')
  18. def report(request):
  19. return render(request, 'sell-report.html')
  20. def show_tickets(request):
  21. tickets = Tickets.objects.all()
  22. now = str(datetime.datetime.now())
  23. # str类型
  24. eff_tickets = []
  25. non_eff_tickets = []
  26. for ticket in tickets:
  27. if now < str(ticket.starting_time):
  28. eff_tickets.append(ticket)
  29. else:
  30. non_eff_tickets.append(ticket)
  31. context = {
  32. 'on_tickets': eff_tickets,
  33. 'off_tickets': non_eff_tickets,
  34. }
  35. return render(request, 'show_tickets.html', context)
  36. def choose_flight(request):
  37. flights = Flight.objects.all()
  38. context = {'flights': flights}
  39. return render(request, 'choose_flight.html', context)
  40. def add_ticket(request, flight_id):
  41. if request.method != 'POST':
  42. flight = Flight.objects.filter(id=flight_id).first()
  43. num = flight.number
  44. sta = flight.sta_point
  45. fin = flight.fin_point
  46. Typ = flight.Type
  47. f_id = flight.id
  48. typ = flight.tye
  49. stop = flight.stopover_point
  50. hour = flight.stopover_hour
  51. minute = flight.stopover_minute
  52. f_seat = flight.F_seat_num
  53. c_seat = flight.C_seat_num
  54. y_seat = flight.Y_seat_num
  55. context = {
  56. 'flight': num,
  57. 'start': sta,
  58. 'final': fin,
  59. 'Type': Typ,
  60. 'flight_id': f_id,
  61. 'type': typ,
  62. 'stop': stop,
  63. 'stop_hour': hour,
  64. 'stop_min': minute,
  65. 'f_seat': f_seat,
  66. 'c_seat': c_seat,
  67. 'y_seat': y_seat,
  68. }
  69. return render(request, 'add_ticket.html', context)
  70. else:
  71. flight = Flight.objects.filter(id=flight_id).first()
  72. tickets = Tickets.objects.filter(flight_id=flight_id)
  73. fli = flight.number
  74. f_seat = flight.F_seat_num
  75. c_seat = flight.C_seat_num
  76. y_seat = flight.Y_seat_num
  77. sta = flight.sta_point
  78. fin = flight.fin_point
  79. Typ = flight.Type
  80. f_id = flight.id
  81. typ = flight.tye
  82. stop = flight.stopover_point
  83. hour = flight.stopover_hour
  84. min = flight.stopover_minute
  85. sta_tim = request.POST.get('sta_tim')
  86. fin_tim = request.POST.get('fin_tim')
  87. f_pri = float(request.POST.get('F_pri'))
  88. f_quan = request.POST.get('F_qua')
  89. f_dis = float(request.POST.get('F_dis'))
  90. f_real = f_pri * f_dis / 10
  91. c_pri = float(request.POST.get('C_pri'))
  92. c_quan = request.POST.get('C_qua')
  93. c_dis = float(request.POST.get('C_dis'))
  94. c_real = c_pri * c_dis / 10
  95. y_pri = float(request.POST.get('Y_pri'))
  96. y_quan = request.POST.get('Y_qua')
  97. y_dis = float(request.POST.get('Y_dis'))
  98. y_real = y_dis * y_pri / 10
  99. now = str(datetime.datetime.now())
  100. not_bet = True
  101. if sta_tim != '' and fin_tim != '' and now < sta_tim < fin_tim:
  102. for ticket in tickets:
  103. if datetime.datetime.strptime(sta_tim, "%Y-%m-%dT%H:%M") < ticket.starting_time:
  104. if datetime.datetime.strptime(fin_tim, "%Y-%m-%dT%H:%M") < ticket.starting_time:
  105. continue
  106. else:
  107. not_bet = False
  108. break
  109. elif datetime.datetime.strptime(sta_tim, "%Y-%m-%dT%H:%M") == ticket.starting_time or \
  110. ticket.final_time > datetime.datetime.strptime(sta_tim, "%Y-%m-%dT%H:%M") > ticket.starting_time \
  111. or datetime.datetime.strptime(sta_tim, "%Y-%m-%dT%H:%M") == ticket.final_time:
  112. not_bet = False
  113. break
  114. else:
  115. continue
  116. if sta_tim == '':
  117. return redirect('Sellers:non_sta_tim', f_id)
  118. elif fin_tim == '':
  119. return redirect('Sellers:non_fin_tim', f_id)
  120. elif fin_tim < sta_tim or fin_tim == sta_tim or sta_tim < now or sta_tim == now:
  121. return redirect('Sellers:wro_tim', f_id)
  122. elif not_bet == False:
  123. return redirect('Sellers:tim_con', f_id)
  124. elif f_pri == '' or c_pri == '' or y_pri == '':
  125. return redirect('Sellers:non_pri', f_id)
  126. elif float(f_pri) < 0 or float(f_pri) == 0 or float(c_pri) < 0 or float(c_pri) == 0 or float(
  127. y_pri) < 0 or float(y_pri) == 0:
  128. return redirect('Sellers:wro_pri', f_id)
  129. elif f_quan == '' or c_quan == '' or y_quan == '':
  130. return redirect('Sellers:non_qua', f_id)
  131. elif int(f_quan) < 0 or int(f_quan) == 0 or int(f_quan) > f_seat or int(c_quan) < 0 or int(c_quan) == 0 or int(
  132. c_quan) > c_seat or int(y_quan) < 0 or int(y_quan) == 0 or int(y_quan) > y_seat:
  133. return redirect('Sellers:wro_qua', f_id)
  134. elif f_dis < 0 or c_dis < 0 or y_dis < 0:
  135. return redirect('Sellers:non_dis', f_id)
  136. else:
  137. f_pric = float(f_pri)
  138. c_pric = float(c_pri)
  139. y_pric = float(y_pri)
  140. f_qua = int(f_quan)
  141. c_qua = int(c_quan)
  142. y_qua = int(y_quan)
  143. Tickets.objects.create(flight=fli, start_point=sta, final_point=fin, starting_time=sta_tim,
  144. final_time=fin_tim,
  145. F_price=f_pric, F_quantity=f_qua, F_discount=f_dis, C_price=c_pric, C_quantity=c_qua,
  146. C_discount=c_dis, Y_price=y_pric, Y_quantity=y_qua, Y_discount=y_dis, Type=Typ,
  147. flight_id=f_id, stopover_hour=hour, stopover_minute=min, stopover_point=stop,
  148. tye=typ,
  149. F_real_price=f_real, C_real_price=c_real, Y_real_price=y_real)
  150. return redirect('Sellers:show_tickets')
  151. def non_qua(request, flight_id):
  152. flight = Flight.objects.filter(id=flight_id).first()
  153. fli = flight.number
  154. seat = flight.seat_num
  155. sta = flight.sta_point
  156. fin = flight.fin_point
  157. typ = flight.Type
  158. context = {
  159. 'flight': fli,
  160. 'start': sta,
  161. 'final': fin,
  162. 'Type': typ,
  163. 'max_seat': seat,
  164. 'flight_id': flight_id
  165. }
  166. return render(request, 'non_qua.html', context)
  167. def non_pri(request, flight_id):
  168. flight = Flight.objects.filter(id=flight_id).first()
  169. fli = flight.number
  170. seat = flight.seat_num
  171. sta = flight.sta_point
  172. fin = flight.fin_point
  173. typ = flight.Type
  174. context = {
  175. 'flight': fli,
  176. 'start': sta,
  177. 'final': fin,
  178. 'Type': typ,
  179. 'max_seat': seat,
  180. 'flight_id': flight_id
  181. }
  182. return render(request, 'non_pri.html', context)
  183. def tim_con(request, flight_id):
  184. flight = Flight.objects.filter(id=flight_id).first()
  185. fli = flight.number
  186. seat = flight.seat_num
  187. sta = flight.sta_point
  188. fin = flight.fin_point
  189. typ = flight.Type
  190. context = {
  191. 'flight': fli,
  192. 'start': sta,
  193. 'final': fin,
  194. 'Type': typ,
  195. 'max_seat': seat,
  196. 'flight_id': flight_id
  197. }
  198. return render(request, 'tim_con.html', context)
  199. def wro_tim(request, flight_id):
  200. flight = Flight.objects.filter(id=flight_id).first()
  201. fli = flight.number
  202. seat = flight.seat_num
  203. sta = flight.sta_point
  204. fin = flight.fin_point
  205. typ = flight.Type
  206. context = {
  207. 'flight': fli,
  208. 'start': sta,
  209. 'final': fin,
  210. 'Type': typ,
  211. 'max_seat': seat,
  212. 'flight_id': flight_id
  213. }
  214. return render(request, 'wro_tim.html', context)
  215. def non_sta_tim(request, flight_id):
  216. flight = Flight.objects.filter(id=flight_id).first()
  217. fli = flight.number
  218. seat = flight.seat_num
  219. sta = flight.sta_point
  220. fin = flight.fin_point
  221. typ = flight.Type
  222. context = {
  223. 'flight': fli,
  224. 'start': sta,
  225. 'final': fin,
  226. 'Type': typ,
  227. 'max_seat': seat,
  228. 'flight_id': flight_id
  229. }
  230. return render(request, 'non_sta_tim.html', context)
  231. def non_fin_tim(request, flight_id):
  232. flight = Flight.objects.filter(id=flight_id).first()
  233. fli = flight.number
  234. seat = flight.seat_num
  235. sta = flight.sta_point
  236. fin = flight.fin_point
  237. typ = flight.Type
  238. context = {
  239. 'flight': fli,
  240. 'start': sta,
  241. 'final': fin,
  242. 'Type': typ,
  243. 'max_seat': seat,
  244. 'flight_id': flight_id
  245. }
  246. return render(request, 'non_fin_tim.html', context)
  247. def wro_pri(request, flight_id):
  248. flight = Flight.objects.filter(id=flight_id).first()
  249. fli = flight.number
  250. seat = flight.seat_num
  251. sta = flight.sta_point
  252. fin = flight.fin_point
  253. typ = flight.Type
  254. context = {
  255. 'flight': fli,
  256. 'start': sta,
  257. 'final': fin,
  258. 'Type': typ,
  259. 'max_seat': seat,
  260. 'flight_id': flight_id
  261. }
  262. return render(request, 'wro_pri.html', context)
  263. def wro_qua(request, flight_id):
  264. print(260, flight_id)
  265. flight = Flight.objects.filter(id=flight_id).first()
  266. fli = flight.number
  267. seat = flight.F_seat_num + flight.C_seat_num + flight.Y_seat_num
  268. sta = flight.sta_point
  269. fin = flight.fin_point
  270. typ = flight.Type
  271. context = {
  272. 'flight': fli,
  273. 'start': sta,
  274. 'final': fin,
  275. 'Type': typ,
  276. 'max_seat': seat,
  277. 'flight_id': flight_id
  278. }
  279. return render(request, 'wro_qua.html', context)
  280. def non_stop(request, flight_id):
  281. flight = Flight.objects.filter(id=flight_id).first()
  282. fli = flight.number
  283. seat = flight.seat_num
  284. sta = flight.sta_point
  285. fin = flight.fin_point
  286. typ = flight.Type
  287. context = {
  288. 'flight': fli,
  289. 'start': sta,
  290. 'final': fin,
  291. 'Type': typ,
  292. 'max_seat': seat,
  293. 'flight_id': flight_id
  294. }
  295. return render(request, 'non_stop.html', context)
  296. def show_flights(request):
  297. flights = Flight.objects.all()
  298. for flight in flights:
  299. flag = 0
  300. now = str(datetime.datetime.now())
  301. tickets = Tickets.objects.filter(flight_id=flight.id)
  302. for ticket in tickets:
  303. if now > str(ticket.starting_time) and now < str(ticket.final_time):
  304. Flight.objects.filter(id=flight.id).update(status='飞行中')
  305. flag = 1
  306. break
  307. if flag == 0:
  308. Flight.objects.filter(id=flight.id).update(status='未起飞')
  309. flights = Flight.objects.all()
  310. context = {'flights': flights}
  311. return render(request, 'show_flights.html', context)
  312. def add_flight(request):
  313. if request.method != 'POST':
  314. return render(request, 'add_flight.html')
  315. else:
  316. fli_num = request.POST.get('fli_num')
  317. F_seat_num = int(request.POST.get('F_seat_num'))
  318. C_seat_num = int(request.POST.get('C_seat_num'))
  319. Y_seat_num = int(request.POST.get('Y_seat_num'))
  320. sta_point = request.POST.get('sta_point')
  321. stop_point = request.POST.get('stop_point')
  322. stop_hour = int(request.POST.get('stop_hour'))
  323. stop_minute = int(request.POST.get('stop_min'))
  324. fin_point = request.POST.get('fin_point')
  325. Type = int(request.POST.get('Type'))
  326. tye = request.POST.get('typ')
  327. income = 0
  328. status = '未起飞'
  329. if fli_num == '':
  330. return redirect('Sellers:non_flinum')
  331. elif F_seat_num < 0 or F_seat_num == 0:
  332. return redirect('Sellers:wro_seat_num')
  333. elif sta_point == '':
  334. return redirect('Sellers:non_sta')
  335. elif fin_point == '':
  336. return redirect('Sellers:non_fin')
  337. elif Type == 0:
  338. return redirect('Sellers:non_Typ')
  339. else:
  340. Flight.objects.create(number=fli_num, F_seat_num=F_seat_num, C_seat_num=C_seat_num, Y_seat_num=Y_seat_num,
  341. sta_point=sta_point, fin_point=fin_point, stopover_point=stop_point,
  342. stopover_hour=stop_hour, stopover_minute=stop_minute, Type=Type, tye=tye,
  343. income=income, status=status)
  344. return redirect('Sellers:show_flights')
  345. def non_flinum(request):
  346. return render(request, 'non_flight.html')
  347. def wro_seat_num(request):
  348. return render(request, 'wro_seat_num.html')
  349. def non_sta(request):
  350. return render(request, 'non_sta.html')
  351. def non_fin(request):
  352. return render(request, 'non_fin.html')
  353. def non_Typ(request):
  354. return render(request, 'non_Typ.html')
  355. def del_flight_ask(request, flight_id):
  356. flights = Flight.objects.all()
  357. flight = Flight.objects.filter(id=flight_id).first()
  358. context = {
  359. 'flights': flights,
  360. 'flight': flight,
  361. }
  362. return render(request, 'del_flight_ask.html', context)
  363. def del_flight(request, flight_id):
  364. tickets = Tickets.objects.all()
  365. for ticket in tickets:
  366. if ticket.flight_id == flight_id:
  367. return redirect('Sellers:have_ticket')
  368. Flight.objects.filter(id=flight_id).delete()
  369. return redirect('Sellers:show_flights')
  370. def have_ticket(request):
  371. flights = Flight.objects.all()
  372. context = {'flights': flights}
  373. return render(request, 'have_ticket.html', context)
  374. def user_man(request):
  375. users = UserInfo.objects.all()
  376. context = {
  377. 'users': users,
  378. }
  379. return render(request, 'user_man.html', context)
  380. def turn_down(request, user_id):
  381. UserInfo.objects.filter(id=user_id).update(Type=2)
  382. return redirect('Sellers:user_man')
  383. def back_to_use(request, user_id):
  384. UserInfo.objects.filter(id=user_id).update(Type=0)
  385. return redirect('Sellers:user_man')
  386. def refund_manage(request):
  387. orders = Order.objects.all()
  388. eff_orders = []
  389. now = str(datetime.datetime.now())
  390. for order in orders:
  391. if order.status == '退款审核中':
  392. eff_orders.append(order)
  393. for order in eff_orders:
  394. if now > str(order.starting_time) or now == str(order.starting_time):
  395. print(438, order.id)
  396. # turn_down_refund_fn(order.id)
  397. # return redirect('Sellers:turn_down_refund', order.id)
  398. context = {'orders': eff_orders}
  399. return render(request, 'refund_manage.html', context)
  400. def ask_turn_down_refund(request, order_id):
  401. orders = Order.objects.all()
  402. eff_orders = []
  403. for order in orders:
  404. if order.status == '退款审核中':
  405. eff_orders.append(order)
  406. context = {
  407. 'orders': eff_orders,
  408. 'order_id': order_id
  409. }
  410. return render(request, 'ask_turn_down_refund.html', context)
  411. def turn_down_refund_fn(order_id):
  412. order = Order.objects.filter(id=order_id).first()
  413. Order.objects.filter(id=order_id).update(status='已支付')
  414. # 原订单返回已支付状态
  415. Order.objects.create(flight=order.flight, start_point=order.start_point, final_point=order.final_point,
  416. stopover_point=order.stopover_point, starting_time=order.starting_time,
  417. final_time=order.final_time, true_price=order.true_price, berth=order.berth,
  418. add_time=order.add_time,
  419. be_price=order.be_price, discount=order.discount, Type=order.Type,
  420. ticket_id=order.ticket_id, user_id=order.user_id, status='退款驳回',
  421. stopover_hour=order.stopover_hour,
  422. stopover_minute=order.stopover_minute, tye=order.tye)
  423. def turn_down_refund(request, order_id):
  424. turn_down_refund_fn(order_id)
  425. # 新建订单保存退款驳回记录
  426. # return JsonResponse({"msg": '更新成功', "data": True})
  427. return redirect('Sellers:refund_manage')
  428. def ask_pass_refund(request, order_id):
  429. orders = Order.objects.all()
  430. eff_orders = []
  431. for order in orders:
  432. if order.status == '退款审核中':
  433. eff_orders.append(order)
  434. context = {
  435. 'orders': eff_orders,
  436. 'order_id': order_id,
  437. }
  438. return render(request, 'ask_pass_refund.html', context)
  439. def pass_refund(request, order_id):
  440. order = Order.objects.filter(id=order_id).first()
  441. Order.objects.filter(id=order_id).update(status='退款成功')
  442. ticket = Tickets.objects.filter(id=order.ticket_id).first()
  443. flight = Flight.objects.filter(id=ticket.flight_id).first()
  444. new_flight_income = flight.income - order.true_price # 对订单对应的航班收入进行修改
  445. Flight.objects.filter(id=ticket.flight_id).update(income=new_flight_income)
  446. order = Order.objects.filter(id=order_id).first()
  447. if order.berth == '头等舱':
  448. new_ticket_quan = ticket.F_quantity + 1
  449. Tickets.objects.filter(id=order.ticket_id).update(F_quantity=new_ticket_quan)
  450. elif order.berth == '商务舱':
  451. new_ticket_quan = ticket.C_quantity + 1
  452. Tickets.objects.filter(id=order.ticket_id).update(C_quantity=new_ticket_quan)
  453. elif order.berth == '经济舱':
  454. new_ticket_quan = ticket.Y_quantity + 1
  455. Tickets.objects.filter(id=order.ticket_id).update(Y_quantity=new_ticket_quan)
  456. refund_num = order.true_price * (1 - order.refund_precent * Decimal(str(0.01)))
  457. app_private_key_string = open(r"Users/rsakey/private2048.txt").read()
  458. alipay_public_key_string = open(r"Users/rsakey/paypublic.txt").read()
  459. alipay = AliPay(
  460. appid="2021000122675132",
  461. app_notify_url=None, # 支付宝会向这个地址发送post请求
  462. app_private_key_string=app_private_key_string, # 应用私钥
  463. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  464. sign_type="RSA2", # 加密方式
  465. debug=True, # 默认是False
  466. )
  467. result = alipay.api_alipay_fund_trans_toaccount_transfer(
  468. out_biz_no=str(order.id),
  469. payee_type="ALIPAY_LOGONID",
  470. payee_account="efaqng2626@sandbox.com",
  471. amount=str(refund_num)
  472. )
  473. print(result)
  474. return redirect("Sellers:refund_manage")
  475. def change_manage(request):
  476. orders = Order.objects.all()
  477. eff_orders = []
  478. eff_tickets = []
  479. new_orders = []
  480. now = str(datetime.datetime.now())
  481. for order in orders:
  482. if order.status == '改签审核中':
  483. eff_orders.append(order)
  484. ticket_id = order.new_ticket_id
  485. ticket = Tickets.objects.filter(id=ticket_id).first()
  486. eff_tickets.append(ticket)
  487. new_orders.append({
  488. "order": order,
  489. "ticket": ticket
  490. })
  491. # for order in eff_orders:
  492. # new_ticket = Tickets.objects.filter(id=order.new_ticket_id).first()
  493. # if now > str(order.starting_time) or now == (order.starting_time) or now > str(new_ticket.starting_time) or \
  494. # now == str(new_ticket.starting_time):
  495. # return redirect(requmy_ordersest, 'Sellers:turn_down_change', order.id)
  496. context = {
  497. # 'orders': eff_orders,
  498. # 'tickets': eff_tickets,
  499. 'neworders': new_orders,
  500. }
  501. return render(request, 'change_manage.html', context)
  502. def ask_turn_down_change(request, order_id):
  503. orders = Order.objects.all()
  504. eff_orders = []
  505. eff_tickets = []
  506. for order in orders:
  507. if order.status == '改签审核中':
  508. eff_orders.append(order)
  509. ticket_id = order.new_ticket_id
  510. ticket = Tickets.objects.filter(id=ticket_id).first()
  511. eff_tickets.append(ticket)
  512. context = {
  513. 'orders': eff_orders,
  514. 'tickets': eff_tickets,
  515. 'order_id': order_id,
  516. }
  517. return render(request, 'ask_turn_down_change.html', context)
  518. def turn_down_change(request, order_id):
  519. order = Order.objects.filter(id=order_id).first()
  520. new_ticket = Tickets.objects.filter(id=order.new_ticket_id).first()
  521. Order.objects.filter(id=order_id).update(status='改签驳回')
  522. # 原订单保存驳回记录(含有new_ticket_id)
  523. Order.objects.create(flight=order.flight, start_point=order.start_point, final_point=order.final_point,
  524. stopover_point=order.stopover_point, starting_time=order.starting_time,
  525. be_price=order.be_price,
  526. discount=order.discount, true_price=order.true_price, berth=order.berth,
  527. final_time=order.final_time,
  528. Type=order.Type, add_time=order.add_time, stopover_hour=order.stopover_hour,
  529. stopover_minute=order.stopover_minute, tye=order.tye, ticket_id=order.ticket_id,
  530. user_id=order.user_id, status='已支付')
  531. # 新建订单保存改签后信息
  532. value = order.true_price * (1 - order.change_percent * 0.01)
  533. if order.new_berth == '头等舱':
  534. nee_val = new_ticket.F_price
  535. elif order.new_berth == '商务舱':
  536. nee_val = new_ticket.C_price
  537. elif order.new_berth == '经济舱':
  538. nee_val = new_ticket.Y_price
  539. if value < nee_val:
  540. refund_num = nee_val - value
  541. app_private_key_string = open(r"C:\Users\Mr.Z\Desktop\毕业设计\Air_mis\Users\rsakey\private2048.txt").read()
  542. alipay_public_key_string = open(r"C:\Users\Mr.Z\Desktop\毕业设计\Air_mis\Users\rsakey\paypublic.txt").read()
  543. alipay = AliPay(
  544. appid="2021000122675132",
  545. app_notify_url=None, # 支付宝会向这个地址发送post请求
  546. app_private_key_string=app_private_key_string, # 应用私钥
  547. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  548. sign_type="RSA2", # 加密方式
  549. debug=True, # 默认是False
  550. )
  551. result = alipay.api_alipay_fund_trans_toaccount_transfer(
  552. out_biz_no=str(order.id),
  553. payee_type="ALIPAY_LOGONID",
  554. payee_account="efaqng2626@sandbox.com",
  555. amount=str(refund_num)
  556. )
  557. print(result)
  558. return redirect('Sellers:change_manage')
  559. def ask_pass_change(request, order_id):
  560. orders = Order.objects.all()
  561. eff_orders = []
  562. eff_tickets = []
  563. for order in orders:
  564. if order.status == '改签审核中':
  565. eff_orders.append(order)
  566. ticket_id = order.new_ticket_id
  567. ticket = Tickets.objects.filter(id=ticket_id).first()
  568. eff_tickets.append(ticket)
  569. context = {
  570. 'orders': eff_orders,
  571. 'tickets': eff_tickets,
  572. 'order_id': order_id,
  573. }
  574. return render(request, 'ask_pass_change.html', context)
  575. def pass_change(request, order_id):
  576. order = Order.objects.filter(id=order_id).first()
  577. ticket = Tickets.objects.filter(id=order.ticket_id).first()
  578. new_ticket = Tickets.objects.filter(id=order.new_ticket_id).first()
  579. flight = Flight.objects.filter(id=ticket.flight_id).first()
  580. new_flight = Flight.objects.filter(id=new_ticket.flight_id).first()
  581. if order.berth == '头等舱':
  582. ticket_quan = ticket.F_quantity + 1
  583. Tickets.objects.filter(id=order.ticket_id).update(F_quantity=ticket_quan)
  584. elif order.berth == '商务舱':
  585. ticket_quan = ticket.C_quantity + 1
  586. Tickets.objects.filter(id=order.ticket_id).update(C_quantity=ticket_quan)
  587. elif order.berth == '经济舱':
  588. ticket_quan = ticket.Y_quantity + 1
  589. Tickets.objects.filter(id=order.ticket_id).update(Y_quantity=ticket_quan)
  590. flight_inc = flight.income - order.true_price
  591. ticket = Tickets.objects.filter(id=order.ticket_id).first()
  592. Flight.objects.filter(id=ticket.flight_id).update(income=flight_inc)
  593. if order.new_berth == '头等舱':
  594. new_ticket_quan = new_ticket.F_quantity - 1
  595. Tickets.objects.filter(id=order.new_ticket_id).update(F_quantity=new_ticket_quan)
  596. new_flight_inc = new_flight.income + new_ticket.F_real_price
  597. Flight.objects.filter(id=new_ticket.flight_id).update(income=new_flight_inc)
  598. elif order.new_berth == '商务舱':
  599. new_ticket_quan = new_ticket.C_quantity - 1
  600. Tickets.objects.filter(id=order.new_ticket_id).update(C_quantity=new_ticket_quan)
  601. new_flight_inc = new_flight.income + new_ticket.C_real_price
  602. Flight.objects.filter(id=new_ticket.flight_id).update(income=new_flight_inc)
  603. elif order.new_berth == '经济舱':
  604. new_ticket_quan = new_ticket.Y_quantity - 1
  605. Tickets.objects.filter(id=order.new_ticket_id).update(Y_quantity=new_ticket_quan)
  606. new_flight_inc = new_flight.income + new_ticket.Y_real_price
  607. Flight.objects.filter(id=new_ticket.flight_id).update(income=new_flight_inc)
  608. Order.objects.filter(id=order_id).update(status='改签成功')
  609. order = Order.objects.filter(id=order_id).first()
  610. ticket = Tickets.objects.filter(id=order.ticket_id).first()
  611. new_ticket = Tickets.objects.filter(id=order.new_ticket_id).first()
  612. flight = Flight.objects.filter(id=ticket.flight_id).first()
  613. if order.new_berth == '头等舱':
  614. be_price = new_ticket.F_price
  615. discount = new_ticket.F_discount
  616. true_price = new_ticket.F_real_price
  617. elif order.new_berth == '商务舱':
  618. be_price = new_ticket.C_price
  619. discount = new_ticket.C_discount
  620. true_price = new_ticket.C_real_price
  621. elif order.new_berth == '经济舱':
  622. be_price = new_ticket.Y_price
  623. discount = new_ticket.Y_discount
  624. true_price = new_ticket.Y_real_price
  625. print(638, be_price)
  626. Order.objects.create(flight=new_ticket.flight, start_point=new_ticket.start_point,
  627. final_point=new_ticket.final_point, stopover_point=new_ticket.stopover_point,
  628. starting_time=new_ticket.starting_time, final_time=new_ticket.final_time,
  629. be_price=be_price, discount=discount, true_price=true_price, berth=order.new_berth,
  630. Type=new_ticket.Type, status='已支付', ticket_id=new_ticket.id,
  631. stopover_hour=new_ticket.stopover_hour,
  632. stopover_minute=new_ticket.stopover_minute, tye=new_ticket.tye, user_id=order.user_id)
  633. value = order.true_price * (1 - order.change_percent * 0.01)
  634. nee_val = true_price
  635. if value < nee_val or value == nee_val:
  636. return redirect("Sellers:change_manage")
  637. else:
  638. refund_num = value - nee_val
  639. app_private_key_string = open(r"C:\Users\Mr.Z\Desktop\毕业设计\Air_mis\Users\rsakey\private2048.txt").read()
  640. alipay_public_key_string = open(r"C:\Users\Mr.Z\Desktop\毕业设计\Air_mis\Users\rsakey\paypublic.txt").read()
  641. alipay = AliPay(
  642. appid="2021000122675132",
  643. app_notify_url=None, # 支付宝会向这个地址发送post请求
  644. app_private_key_string=app_private_key_string, # 应用私钥
  645. alipay_public_key_string=alipay_public_key_string, # 支付宝公钥
  646. sign_type="RSA2", # 加密方式
  647. debug=True, # 默认是False
  648. )
  649. result = alipay.api_alipay_fund_trans_toaccount_transfer(
  650. out_biz_no=str(order.id),
  651. payee_type="ALIPAY_LOGONID",
  652. payee_account="efaqng2626@sandbox.com",
  653. amount=str(refund_num)
  654. )
  655. print(result)
  656. return redirect("Sellers:change_manage")
  657. def consult_manage(request):
  658. messages = Message.objects.all()
  659. read_messages = []
  660. # 装有所有的未读且发往管理员的消息数据行
  661. users_nums = []
  662. user_nums = []
  663. # 装有去重过的具有未读消息的用户id
  664. users = []
  665. # 装有去重过的具有未读消息的用户名
  666. for message in messages:
  667. if message.status == 0 and message.to_id == 1:
  668. read_messages.append(message)
  669. for message in read_messages:
  670. users_nums.append(message.from_id)
  671. for num in set(users_nums):
  672. user_nums.append(num)
  673. for user_num in user_nums:
  674. user = UserInfo.objects.filter(id=user_num).first()
  675. users.append(user)
  676. context = {
  677. 'users': users,
  678. }
  679. return render(request, 'consults.html', context)
  680. def ans_con(request, user_id):
  681. if request.method != 'POST':
  682. user = UserInfo.objects.filter(id=user_id).first()
  683. messages = Message.objects.all()
  684. user_messages = []
  685. for message in messages:
  686. if message.from_id == user_id and message.to_id == 1:
  687. Message.objects.filter(id=message.id).update(status=1)
  688. user_messages.append(message)
  689. if message.from_id == 1 and message.to_id == user_id:
  690. user_messages.append(message)
  691. context = {
  692. 'user': user,
  693. 'messages': user_messages,
  694. }
  695. return render(request, 'ans_con.html', context)
  696. else:
  697. mess = request.POST.get('new_mess')
  698. Message.objects.create(content=mess, from_id=1, to_id=user_id, status=1)
  699. return redirect('Sellers:ans_con', user_id)
  700. # Create your views here.
  701. @require_http_methods(["POST","GET"])
  702. def get_report(request):
  703. print('user_id', request.POST)
  704. def get_time(time_str):
  705. try:
  706. new_time_str = '+'.join(time_str.split('+')[1:4])
  707. new_time_str += '+' + time_str.split('+')[4].split()[0]
  708. print('new_time_str', new_time_str)
  709. return datetime.strptime(new_time_str, '%b+%d+%Y+%H:%M:%S')
  710. except ValueError:
  711. print('时间字符串格式不正确')
  712. # start_time = get_time(request.POST['start_time'])
  713. # end_time = get_time(request.POST['end_time'])
  714. start_time = datetime.strptime(request.POST['start_time'], '%Y-%m-%d+%H:%M:%S')
  715. end_time = datetime.strptime(request.POST['end_time'], '%Y-%m-%d+%H:%M:%S')
  716. print('start_time', start_time)
  717. print('end_time', end_time)
  718. # print('end_time', datetime.strptime(end_time, '%Y+%d+%b+%H:%M:%S'))
  719. # add_time # 添加时间
  720. # status # 已支付
  721. # 查询符合条件的订单
  722. orders = Order.objects.filter(add_time__range=(start_time, end_time), status='已支付').order_by('add_time')
  723. print(817, orders)
  724. # # 统计历史订单中最多记录的机票信息,以终点为目标进行统计
  725. # duplicate_orders = Order.objects.values('final_point').annotate(count=Count('final_point')).filter(count__gt=1, user_id=user_id).order_by('-count')[:3]
  726. # final_point_list = []
  727. # for order in duplicate_orders:
  728. # final_point_list.append(order['final_point'])
  729. # # print(order['final_point'], order['count'])
  730. # # 查询航班信息
  731. # final_list=Flight.objects.filter(fin_point__in=final_point_list,status = '未起飞')
  732. # final_list_data = []
  733. # for item in json.loads(serialize('json', final_list)):
  734. # params = {**item['fields']}
  735. # params.setdefault('id', item['pk'])
  736. # final_list_data.append(params)
  737. order_list = []
  738. for item in json.loads(serialize('json', orders)):
  739. params = {**item['fields']}
  740. params.setdefault('id', item['pk'])
  741. params.setdefault('id', item['pk'])
  742. order_list.append(params)
  743. # 总票数,营业额, 折线图,饼图
  744. '''
  745. 1、从日期纬度整理经营纬度
  746. 2、营业额,票数,总金额,目的地, 座舱分类和数量
  747. '''
  748. # 按照日期进行分组,统计每日的价格总和和订单数量
  749. daily_stats = orders.values('add_time__date').annotate(total_price=Sum('true_price'), order_count=Count('id'))
  750. plt_order_list = []
  751. all_total_price=0
  752. all_order_count=0
  753. # 遍历每日统计结果(日期维度)
  754. for stats in daily_stats:
  755. date = stats['add_time__date']
  756. total_price = stats['total_price']
  757. order_count = stats['order_count']
  758. is_push=True
  759. item_index=0
  760. all_total_price = all_total_price + total_price
  761. all_order_count = all_order_count + order_count
  762. for index,item in enumerate(plt_order_list):
  763. if item['date'] == date:
  764. is_push=False
  765. item_index=index
  766. break
  767. if is_push:
  768. plt_order_list.append({
  769. "date": date,
  770. "total_price":total_price,
  771. "order_count": order_count
  772. })
  773. else:
  774. plt_order_list[item_index]['total_price'] = plt_order_list[item_index]['total_price'] + total_price
  775. plt_order_list[item_index]['order_count'] = plt_order_list[item_index]['order_count'] + order_count
  776. # 座舱维度统计
  777. berth_list = orders.values('berth').annotate(total_price=Sum('true_price'),order_count=Count('id'))
  778. plt_berth_list=[]
  779. for index, item in enumerate(berth_list):
  780. is_push = True
  781. item_index = 0
  782. total_price = item['total_price']
  783. order_count = item['order_count']
  784. for index, elm in enumerate(plt_berth_list):
  785. if elm['berth'] == item['berth']:
  786. is_push = False
  787. item_index = index
  788. break
  789. if is_push:
  790. plt_berth_list.append({
  791. "berth": item['berth'],
  792. "order_count": order_count,
  793. "total_price": total_price
  794. })
  795. else:
  796. plt_berth_list[item_index]['total_price'] = plt_berth_list[item_index]['total_price'] + total_price
  797. plt_berth_list[item_index]['order_count'] = plt_berth_list[item_index]['order_count'] + order_count
  798. # print("日期:", date)
  799. # print("价格总和:", total_price)
  800. # print("订单数量:", order_count)
  801. # print("--------------")
  802. # 航班维度统计
  803. final_point_list = orders.values('final_point').annotate(total_price=Sum('true_price'), order_count=Count('id'))
  804. plt_final_point_list = []
  805. for index, item in enumerate(final_point_list):
  806. is_push = True
  807. item_index = 0
  808. total_price = item['total_price']
  809. order_count = item['order_count']
  810. for index, elm in enumerate(plt_final_point_list):
  811. if elm['final_point'] == item['final_point']:
  812. is_push = False
  813. item_index = index
  814. break
  815. if is_push:
  816. plt_final_point_list.append({
  817. "final_point": item['final_point'],
  818. "order_count": order_count,
  819. "total_price": total_price
  820. })
  821. else:
  822. plt_final_point_list[item_index]['total_price'] = plt_final_point_list[item_index]['total_price'] + total_price
  823. plt_final_point_list[item_index]['order_count'] = plt_final_point_list[item_index]['order_count'] + order_count
  824. return JsonResponse({
  825. # 'data': order_list,
  826. 'plt_order_list': plt_order_list, # 日期维度
  827. 'plt_berth_list': plt_berth_list, # 座舱维度
  828. 'plt_final_point_list': plt_final_point_list, # 航班维度
  829. "all_total_price": all_total_price, # 营业额
  830. 'all_order_count': all_order_count # 订单总数
  831. })