PageRenderTime 29ms CodeModel.GetById 32ms RepoModel.GetById 1ms app.codeStats 0ms

/Model/OrderModel.py

https://gitlab.com/CloudPrintTech/CloudPrintBackend
Python | 900 lines | 817 code | 53 blank | 30 comment | 165 complexity | adea0f39b3fe1a04241f20ba9770c4af MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. __author__ = 'raytlty'
  3. from sqlalchemy.sql.expression import and_, or_, desc
  4. from sqlalchemy.sql.functions import max
  5. from Model.BaseModel import BaseModel
  6. from Model.ORM import *
  7. import os
  8. import zipfile
  9. import time
  10. import tornado.web
  11. import tornado.gen
  12. import random
  13. from SDK.PingppSDK import PingPlusPlusSDK as Pingpp
  14. from mywechat_sdk.basic import WechatBasic
  15. from SDK.PingppSDK import PingPlusPlusSDK as Pingpp
  16. import qrcode, base64
  17. from cStringIO import StringIO
  18. class OrderState(object):
  19. created = 0 #已创建
  20. purchased = 1 #已支付
  21. printed = 2 #已打印/已复印
  22. deliverd = 3 #已配送
  23. canceled = 4 #已取消
  24. class OrderModel(BaseModel):
  25. def createOrder(self,taskIds,student_id,note):
  26. try:
  27. printOrder = PrintOrder(student_id=student_id,note=note,)
  28. session = self.session
  29. # for taskid in taskIds:
  30. except Exception, e:
  31. return self.err(e)
  32. pass
  33. def getOrder(self, **kwargs):
  34. session = self.session
  35. redisconn = self.redisconn
  36. try:
  37. token = kwargs['token']
  38. managerid = kwargs['managerid']
  39. delivered = kwargs.get('delivered', None)
  40. lastid = kwargs.get('lastid', 0)
  41. firstid = kwargs.get('firstid', 0)
  42. def getNickName(username, student_id): #username == cellphone
  43. item = session.query(Student).filter(and_(Student.username == username,
  44. Student.student_id == student_id)).first()
  45. return item.nickname
  46. def GetShopInfo(shopid):
  47. item = session.query(Shop).filter(Shop.id == shopid).first()
  48. return dict(shop_id=item.id, shop_name=item.name, shop_location=item.location, shop_tel=item.tel)
  49. def GetBuildingName(student_id):
  50. item = session.query(Building).join(Student, Student.building_id == Building.id).filter(Student.student_id == student_id).first()
  51. return item.name
  52. def innerFunc(managerid, delivered=None, lastid=0, firstid=0):
  53. res = []
  54. if delivered == None:
  55. items = session.query(PrintOrder).order_by(PrintOrder.order_id.desc())
  56. if lastid != 0:
  57. items = items.filter(and_(PrintOrder.manager_id == managerid,
  58. or_(PrintOrder.order_state == OrderState.printed),
  59. PrintOrder.order_id < lastid)).limit(20).all()
  60. else :
  61. if firstid == 0:
  62. items = items.filter(and_(PrintOrder.manager_id == managerid,
  63. or_(PrintOrder.order_state == OrderState.printed))).limit(20).all()
  64. else:
  65. items = items.filter(and_(PrintOrder.manager_id == managerid,
  66. or_(PrintOrder.order_state == OrderState.printed),
  67. PrintOrder.order_id > firstid)).all()
  68. for item in items:
  69. data = {
  70. 'ID':item.order_id,
  71. 'order_state':item.order_state,
  72. 'student_room': GetBuildingName(item.student_id) + item.student_room,
  73. 'student_phone':item.student_phone,
  74. 'nickname': getNickName(item.student_phone, item.student_id),
  75. 'paid_at':int(time.mktime(time.strptime(item.paid_at.strftime('%Y-%m-%d %H:%M:%S'),'%Y-%m-%d %H:%M:%S'))),
  76. 'demand_time':item.demand_time,
  77. 'order_type':item.order_type,
  78. 'shop':GetShopInfo(item.shop_id),
  79. 'trade_no':item.trade_no
  80. }
  81. res.append(data)
  82. else :
  83. items = session.query(PrintOrder).order_by(PrintOrder.order_id.desc())
  84. if lastid != 0:
  85. items = items.filter(and_(PrintOrder.manager_id == managerid,
  86. PrintOrder.order_state == 3,
  87. PrintOrder.order_id < lastid)).limit(20).all()
  88. else :
  89. if firstid == 0:
  90. items = items.filter(and_(PrintOrder.manager_id == managerid,
  91. PrintOrder.order_state == 3)).limit(20).all()
  92. else:
  93. items = items.filter(and_(PrintOrder.manager_id == managerid,
  94. PrintOrder.order_state == 3,
  95. PrintOrder.order_id > firstid)).all()
  96. for item in items:
  97. data = {
  98. 'ID':item.order_id,
  99. 'student_room':GetBuildingName(item.student_id) + item.student_room,
  100. 'student_phone':item.student_phone,
  101. 'nickname':getNickName(item.student_phone, item.student_id),
  102. 'paid_at':int(time.mktime(time.strptime(item.paid_at.strftime('%Y-%m-%d %H:%M:%S'),'%Y-%m-%d %H:%M:%S'))),
  103. 'rate':item.rate,
  104. 'demand_time':item.demand_time,
  105. 'print_fee':item.print_fee / 100.0,
  106. 'delivery_fee':item.delivery_fee / 100.0,
  107. 'shop':GetShopInfo(item.shop_id),
  108. 'order_type':item.order_type,
  109. 'trade_no':item.trade_no
  110. }
  111. res.append(data)
  112. return res
  113. item = session.query(ShopManager).filter(ShopManager.manager_id == managerid).first()
  114. if item is None:
  115. return self.err(msg='请重新登录')
  116. if item.state == -1:
  117. return self.err(msg='请审核后再获取订单')
  118. if item.state == 3:
  119. return self.err(msg='你已辞职无法获取订单')
  120. results = innerFunc(managerid, delivered, lastid, firstid)
  121. if not results:
  122. return self.success(msg='订单为空')
  123. else:
  124. return self.success(results)
  125. except KeyError:
  126. raise tornado.web.HTTPError(400)
  127. except Exception as emsg:
  128. return self.err(msg=emsg)
  129. def getDetail(self, **kwargs):
  130. session = self.session
  131. redisconn = self.redisconn
  132. try:
  133. managerid = kwargs['managerid']
  134. token = kwargs['token']
  135. order_id = kwargs['order_id']
  136. def getAds(managerid, order_id):
  137. ads = []
  138. advertise = session.query(PrintOrder).filter(and_(PrintOrder.manager_id == managerid, PrintOrder.order_id == order_id)).first()
  139. item = session.query(Advertise).filter(Advertise.ads_id == advertise.ads_id).first()
  140. if item is None:
  141. return ads
  142. ads.append({'bothside':item.bothside, 'colorful':item.colorful})
  143. return ads
  144. def getTask(order_id):
  145. tasks = []
  146. items = session.query(PrintTask).filter(order_id == PrintTask.order_id).all()
  147. if items is None:
  148. return tasks
  149. for item in items:
  150. tasks.append({'file_name':item.file_name, 'pages':item.pages, 'bothside':item.bothside,'colorful':item.colorful,
  151. 'copies':item.copies, 'task_id':item.task_id})
  152. return tasks
  153. def getStudentinfo(student_id):
  154. item = session.query(Student).filter(Student.student_id == student_id).first()
  155. return {'nickname':item.nickname, 'username':item.username}
  156. # ads = getAds(managerid, order_id)
  157. tasks = getTask(order_id)
  158. item = session.query(PrintOrder).filter(PrintOrder.order_id == order_id).first()
  159. results = []
  160. results.append(
  161. {'fee':item.print_fee / 100.0, 'delivery_fee':item.delivery_fee / 100.0,'note':item.note, 'rate':item.rate,
  162. 'comment':item.comment, 'tasks':tasks, 'trade_no':item.trade_no},
  163. )
  164. return self.success(results=results)
  165. except KeyError:
  166. raise tornado.web.HTTPError(400)
  167. except Exception as emsg:
  168. return self.err(msg=emsg)
  169. # 确认送达
  170. def comfirmOrder(self, **kwargs):
  171. session = self.session
  172. redisconn = self.redisconn
  173. try:
  174. token = kwargs['token']
  175. order_id = kwargs['order_id']
  176. managerid = kwargs['managerid']
  177. nowtime = time.strftime("%Y-%m-%d %H:%M:%S")
  178. order_state = 3 #已送达
  179. order = session.query(PrintOrder).filter(order_id == PrintOrder.order_id).first()
  180. session.query(PrintOrder).filter(and_(
  181. order_id == PrintOrder.order_id,
  182. managerid == PrintOrder.manager_id
  183. )).update(dict(delivered_at=nowtime, order_state=order_state),synchronize_session=False)
  184. session.commit()
  185. except KeyError:
  186. raise tornado.web.HTTPError(400)
  187. except Exception as emsg:
  188. return self.err(msg=emsg)
  189. else :
  190. student = session.query(Student).filter(Student.student_id==order.student_id).first()
  191. if not student.openid:
  192. return self.success([{
  193. "wechat_response": {
  194. "errcode": -1,
  195. "errmsg": "该用户未绑定微信"
  196. }
  197. }],msg='确认成功')
  198. access_token = redisconn.get('access_token')
  199. ttl = redisconn.ttl('access_token')
  200. if not ttl:
  201. ttl = 0
  202. expireAt = int(time.time())+ttl
  203. wechat = WechatBasic(appid='wxc324197495b35b29',appsecret='e77411c170a2a569196ddbe78030987a',access_token=access_token,access_token_expires_at=expireAt,token="weixin",checkssl=False)
  204. if not access_token:
  205. redisconn.setex('access_token',wechat.access_token,7200)
  206. data = {
  207. "first": {
  208. "value": "已送达",
  209. "color": "#173177"
  210. },
  211. "OrderSn":{
  212. "value": order.trade_no,
  213. "color": "#173177"
  214. },
  215. "OrderStatus":{
  216. "value": "订单已送达宿舍楼下",
  217. "color": "#173177"
  218. },
  219. "remark":{
  220. "value": "如有问题请及时反馈",
  221. "color": "#173177"
  222. }
  223. }
  224. try:
  225. response = wechat.send_template_message(user_id=student.openid,
  226. template_id="VgZH4JCfQ3IYybI8yOyJ0jtS_ET-toENbfXXF4RzcRg",data=data)
  227. return self.success([{'wechat_response':response}])
  228. except Exception,e:
  229. return self.success([{
  230. "wechat_response": {
  231. "errcode": -1,
  232. "errmsg": str(e)
  233. }
  234. }],msg='确认成功')
  235. def getPrinted(self, **kwargs):
  236. session = self.session
  237. redisconn = self.redisconn
  238. try:
  239. token = kwargs['token']
  240. managerid = kwargs['managerid']
  241. order_id = kwargs['order_id']
  242. ads_id = kwargs['ads_id']
  243. def getTask(order_id):
  244. items = session.query(PrintTask).filter(PrintTask.order_id == order_id).all()
  245. return { item.file_url:item.file_name for item in items} if items else {}
  246. def getAds(ads_id):
  247. item = session.query(Advertise).filter(Advertise.ads_id == ads_id).first()
  248. return (item.ads_url, item.ads_id) if item else (None, None)
  249. aurl, aname = getAds(ads_id)
  250. tasks = getTask(order_id)
  251. zipfile_url= os.path.join(os.path.dirname('__file__'), 'files') + os.sep + str(managerid) \
  252. + os.sep + 'order_' + time.strftime("%Y%m%d%H%M%S") + '.zip'
  253. zfile = zipfile.ZipFile(zipfile_url, 'w', zipfile.ZIP_DEFLATED)
  254. try:
  255. for turl, tname in tasks.items():
  256. zfile.write(turl, tname)
  257. zfile.write(aurl, aname)
  258. except Exception as emsg:
  259. return self.err(msg=emsg)
  260. else:
  261. session.query(PrintOrder).filter(order_id == PrintOrder.order_id).update(dict(file_url=zipfile_url),synchronize_session=False)
  262. session.commit()
  263. return self.success(results=[{'file_url':zipfile_url}])
  264. finally:
  265. zfile.close()
  266. except KeyError:
  267. raise tornado.web.HTTPError(400)
  268. except Exception as emsg:
  269. return self.err(msg=emsg)
  270. def getStudentOrder(self, **kwargs):
  271. session = self.session
  272. try:
  273. token = kwargs['token']
  274. studentid = kwargs['studentid']
  275. items = session.query(PrintOrder).filter(PrintOrder.student_id == studentid).all()
  276. completedOrder = []
  277. unfinishedOrder = []
  278. if items is None:
  279. return self.err(msg='获取学生订单失败,请重新刷新')
  280. for item in items:
  281. order_state = item.order_state
  282. if order_state % 4 and order_state !=4:
  283. completedOrder.append(dict(
  284. orderId = item.order_id,
  285. orderPrice = (item.print_fee + item.delivery_fee),
  286. orderPiece = item.total_pages,
  287. createTime = item.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  288. orderRate = item.rate,
  289. orderComment = item.comment,
  290. trade_no = item.trade_no,
  291. ))
  292. else:
  293. if order_state != 4:
  294. unfinishedOrder.append(dict(
  295. orderId = item.order_id,
  296. orderPrice = (item.print_fee + item.delivery_fee),
  297. orderPiece = item.total_pages,
  298. createTime = item.created_at.strftime('%Y-%m-%d %H:%M:%S'),
  299. trade_no = item.trade_no,
  300. ))
  301. results = [dict(
  302. token = token,
  303. order = dict(
  304. completedOrder = sorted(completedOrder, key=lambda x: x['createTime'], reverse=False),
  305. unfinishedOrder = sorted(unfinishedOrder, key=lambda x: x['createTime'], reverse=False),
  306. )
  307. )]
  308. return self.success(results=results)
  309. except KeyError:
  310. raise tornado.web.HTTPError(400)
  311. except Exception as emsg:
  312. return self.err(msg=emsg)
  313. def cancelStudentOrder(self, **kwargs):
  314. session = self.session
  315. try:
  316. token = kwargs['token']
  317. studentid = kwargs['studentid']
  318. order_id = kwargs['order_id']
  319. canceled_at = time.strftime("%Y-%m-%d %H:%M:%S")
  320. items = session.query(PrintOrder).filter(and_(PrintOrder.order_id == order_id,
  321. PrintOrder.student_id == studentid)).first()
  322. if items.order_state == 2:
  323. return self.err("此订单已打印,无法取消")
  324. if items.order_state == 3:
  325. return self.err("此订单已送达,无法取消")
  326. if items.order_state == 4:
  327. return self.err("此订单已取消成功")
  328. if items.order_state == 1:
  329. charge_id = items.charge_id
  330. amount = items.print_fee
  331. flag = Pingpp.Refund(charge_id, amount, description=u'正在退款')
  332. if flag is True:
  333. item = session.query(PrintOrder).filter(PrintOrder.order_id == order_id).first()
  334. if item.order_state == 4:
  335. return self.success(results=[dict(
  336. token = token,
  337. orderId = order_id,
  338. )],msg=u"取消成功")
  339. else:
  340. return self.err("退款失败")
  341. if items.order_state == 0:
  342. try:
  343. session.query(PrintOrder).filter(and_(PrintOrder.order_id == order_id,PrintOrder.student_id == studentid)).\
  344. update(dict(canceled_at=canceled_at,order_state=4))
  345. session.commit()
  346. return self.success([],"取消成功")
  347. except Exception,e:
  348. return self.err(str(e))
  349. except KeyError:
  350. raise tornado.web.HTTPError(400)
  351. except Exception as emsg:
  352. return self.err(str(emsg))
  353. def rateStudentOrder(self, **kwargs):
  354. session = self.session
  355. try:
  356. token = kwargs['token']
  357. studentid = kwargs['studentid']
  358. order_id = kwargs['order_id']
  359. rate = kwargs['rate']
  360. session.query(PrintOrder).filter(and_(PrintOrder.student_id == studentid,
  361. PrintOrder.order_id == order_id)).update(dict(rate=rate))
  362. session.commit()
  363. return self.success(results=[dict(
  364. token = token,
  365. orderId = order_id,
  366. )], msg="评分成功")
  367. except KeyError:
  368. raise tornado.web.HTTPError(400)
  369. except Exception as emsg:
  370. return self.err(msg="评分失败")
  371. def noteStudentOrder(self, **kwargs):
  372. session = self.session
  373. try:
  374. token = kwargs['token']
  375. studentid = kwargs['studentid']
  376. order_id = kwargs['order_id']
  377. note = kwargs['note']
  378. notetime = time.strftime("%Y-%m-%d %H:%M:%S")
  379. session.query(PrintOrder).filter(and_(PrintOrder.student_id == studentid,
  380. PrintOrder.order_id == order_id)).update(dict(note=note, note_at=notetime),synchronize_session=False)
  381. session.commit()
  382. return self.success(results=[dict(
  383. token = token,
  384. orderId = order_id
  385. )])
  386. except KeyError:
  387. raise tornado.web.HTTPError(400)
  388. except Exception as emsg:
  389. return self.err(msg=emsg)
  390. def complaintStudent(self, **kwargs):
  391. session = self.session
  392. try:
  393. token = kwargs['token']
  394. studentid = kwargs['studentid']
  395. complain = kwargs['complain']
  396. order_id = kwargs['order_id']
  397. complaintime = time.strftime("%Y-%m-%d %H:%M:%S")
  398. session.query(PrintOrder).filter(and_(PrintOrder.student_id == studentid,
  399. PrintOrder.order_id == order_id)).update(dict(complain=complain, complain_at=complaintime),synchronize_session=False)
  400. session.commit()
  401. return self.success()
  402. except KeyError:
  403. raise tornado.web.HTTPError(400)
  404. except Exception as emsg:
  405. return self.err(msg=emsg)
  406. def commentStudentOrder(self, **kwargs):
  407. session = self.session
  408. try:
  409. token = kwargs['token']
  410. studentid = kwargs['studentid']
  411. order_id = kwargs['order_id']
  412. rate = kwargs['rate']
  413. comment = kwargs['comment']
  414. nowtime = time.strftime("%Y-%m-%d %H:%M:%S")
  415. session.query(PrintOrder).filter(and_(PrintOrder.student_id == studentid,
  416. PrintOrder.order_id == order_id)).update(dict(rate=rate, comment=comment,comment_at=nowtime),synchronize_session=False)
  417. session.commit()
  418. return self.success()
  419. except KeyError:
  420. raise tornado.web.HTTPError(400)
  421. except Exception as emsg:
  422. return self.err(msg=emsg)
  423. #############################################
  424. # 与打印店相关
  425. def GetUnprintOrder(self, **kwargs):
  426. session = self.session
  427. redisconn = self.redisconn
  428. try:
  429. token = kwargs['token']
  430. shopid = kwargs['shopid']
  431. lastid = kwargs.get('lastid', 0)
  432. def GetBuildingName(building_id):
  433. item = session.query(Building).filter(Building.id == building_id).first()
  434. return item.name
  435. def GetStudentNickname(student_id):
  436. item = session.query(Student).filter(Student.student_id == student_id).first()
  437. return item.nickname
  438. def GetLastUploadTime(order_id):
  439. item = session.query(max(PrintTask.uploaded_at)).filter(PrintTask.order_id == order_id).first()
  440. return item[0]
  441. def innerFunc(shopid, lastid=0):
  442. res = []
  443. print shopid
  444. items = session.query(PrintOrder).order_by(PrintOrder.order_id.desc())
  445. if lastid != 0:
  446. items = items.filter(and_(PrintOrder.shop_id == shopid,
  447. PrintOrder.order_type == 0,
  448. PrintOrder.order_state == 1,
  449. PrintOrder.order_id < lastid)).limit(20).all()
  450. else :
  451. items = items.filter(and_(PrintOrder.shop_id == shopid,
  452. PrintOrder.order_type == 0,
  453. PrintOrder.order_state == 1)).limit(20).all()
  454. print items
  455. if items is None:
  456. return None
  457. for item in items:
  458. uploaded_time = GetLastUploadTime(item.order_id)
  459. data = {
  460. 'order_id':item.order_id,
  461. 'order_state':item.order_state,
  462. 'student_room':item.student_room,
  463. 'student_phone':item.student_phone,
  464. 'demand_time':item.demand_time,
  465. 'uploaded_at':uploaded_time.strftime("%Y-%m-%d %H:%M:%S") if uploaded_time else time.strftime("%Y-%m-%d %H:%M:%S"),
  466. 'student_name':GetStudentNickname(item.student_id),
  467. 'printed_at':item.printed_at.strftime("%Y-%m-%d %H:%M:%S") if item.printed_at else time.strftime("%Y-%m-%d %H:%M:%S"),
  468. 'building_name':GetBuildingName(item.building_id),
  469. 'trade_no':item.trade_no,
  470. 'student_id':item.student_id,
  471. }
  472. res.append(data)
  473. return res
  474. results = innerFunc(shopid,lastid)
  475. if not results:
  476. return self.success(msg='打印订单为空')
  477. else:
  478. return self.success(results)
  479. except KeyError:
  480. raise tornado.web.HTTPError(400)
  481. except Exception as emsg:
  482. return self.err(msg=emsg)
  483. def GetUnCopyOrder(self, **kwargs):
  484. session = self.session
  485. redisconn = self.redisconn
  486. try:
  487. token = kwargs['token']
  488. shopid = kwargs['shopid']
  489. lastid = kwargs.get('lastid', 0)
  490. def GetBuildingName(building_id):
  491. item = session.query(Building).filter(Building.id == building_id).first()
  492. return item.name
  493. def GetStudentNickname(student_id):
  494. item = session.query(Student).filter(Student.student_id == student_id).first()
  495. return item.nickname
  496. def GetLastUploadTime(order_id):
  497. item = session.query(max(PrintTask.uploaded_at)).filter(PrintTask.order_id == order_id).first()
  498. return item[0]
  499. def innerFunc(shopid, lastid=0):
  500. res = []
  501. items = session.query(PrintOrder).order_by(PrintOrder.order_id.desc())
  502. if lastid != 0:
  503. items = items.filter(and_(PrintOrder.shop_id == shopid,
  504. PrintOrder.order_type == 1,
  505. PrintOrder.order_state == 1,
  506. PrintOrder.order_id < lastid)).limit(20).all()
  507. else :
  508. items = items.filter(and_(PrintOrder.shop_id == shopid,
  509. PrintOrder.order_type == 1,
  510. PrintOrder.order_state == 1)).limit(20).all()
  511. if items is None:
  512. return None
  513. for item in items:
  514. uploaded_time = GetLastUploadTime(item.order_id)
  515. data = {
  516. 'order_id':item.order_id,
  517. 'order_state':item.order_state,
  518. 'student_room':item.student_room,
  519. 'student_phone':item.student_phone,
  520. 'demand_time':item.demand_time,
  521. 'uploaded_at': uploaded_time.strftime("%Y-%m-%d %H:%M:%S") if uploaded_time else time.strftime("%Y-%m-%d %H:%M:%S"),
  522. 'printed_at':item.printed_at.strftime("%Y-%m-%d %H:%M:%S") if item.printed_at else time.strftime("%Y-%m-%d %H:%M:%S"),
  523. 'building_name':GetBuildingName(item.building_id),
  524. 'student_name':GetStudentNickname(item.student_id),
  525. 'trade_no':item.trade_no,
  526. 'student_id':item.student_id,
  527. }
  528. res.append(data)
  529. return res
  530. results = innerFunc(shopid,lastid)
  531. if not results:
  532. return self.success(msg='复印订单为空')
  533. else:
  534. return self.success(results=results)
  535. except KeyError:
  536. raise tornado.web.HTTPError(400)
  537. except Exception as emsg:
  538. return self.err(msg=emsg)
  539. #下载订单文件
  540. def download_url(self, **kwargs):
  541. session = self.session
  542. try:
  543. def getTask(order_id):
  544. items = session.query(PrintTask).filter(PrintTask.order_id == order_id).all()
  545. return { item.file_url.encode('utf-8'):item.file_name.encode('utf-8') for item in items} if items else {}
  546. def getAds(ads_id):
  547. item = session.query(Advertise).filter(Advertise.ads_id == ads_id).first()
  548. return (item.ads_url, item.ads_id) if item else (None, None)
  549. student_id = kwargs.get('student_id')
  550. order_id = kwargs.get('order_id')
  551. # aurl, aname = getAds(ads_id)
  552. tasks = getTask(order_id)
  553. item = session.query(PrintOrder).filter(PrintOrder.order_id == order_id).first()
  554. zipfile_path= '/root/uprintf/files' + os.sep + 'order_zips' + os.sep + str(student_id)
  555. if not os.path.exists(zipfile_path):
  556. os.makedirs(zipfile_path)
  557. zipfile_name = 'order_' + item.trade_no + '.zip'
  558. zipfile_url = zipfile_path + os.sep + zipfile_name
  559. with zipfile.ZipFile(zipfile_url, 'w', zipfile.ZIP_DEFLATED) as zfile:
  560. for turl, tname in tasks.items():
  561. zfile.write(turl, tname)
  562. # zfile.write(aurl, aname)
  563. session.query(PrintOrder).filter(order_id == PrintOrder.order_id).update(dict(file_url=zipfile_url),synchronize_session=False)
  564. session.commit()
  565. return zipfile_name, zipfile_url
  566. except KeyError:
  567. raise tornado.web.HTTPError(400)
  568. except Exception as emsg:
  569. raise tornado.web.HTTPError(500,reason=emsg)
  570. def ConfirmedShopOrder(self, **kwargs):
  571. session = self.session
  572. redisconn = self.redisconn
  573. try:
  574. token = kwargs['token']
  575. shop_id = kwargs['shopid']
  576. order_id = kwargs['order_id']
  577. nowtime = time.strftime("%Y-%m-%d %H:%M:%S")
  578. session.query(PrintOrder).filter(and_(PrintOrder.order_id == order_id,
  579. PrintOrder.shop_id == shop_id)).update(dict(order_state=2, printed_at=nowtime),synchronize_session=False)
  580. session.commit()
  581. return self.success(results=[{'printed_at':nowtime}])
  582. except KeyError:
  583. raise tornado.web.HTTPError(400)
  584. except Exception as emsg:
  585. return self.err(msg=emsg)
  586. def UnfinishDetails(self, **kwargs):
  587. session = self.session
  588. redisconn = self.redisconn
  589. try:
  590. token = kwargs['token']
  591. shopid = kwargs['shopid']
  592. order_id = kwargs['order_id']
  593. taskinfo = []
  594. results = []
  595. items = session.query(PrintTask).filter(PrintTask.order_id == order_id).all()
  596. for item in items:
  597. taskinfo.append(dict(
  598. file_name = item.file_name,
  599. pages = item.pages,
  600. bothside = item.bothside,
  601. colorful = item.colorful,
  602. handouts = item.handouts,
  603. copies = item.copies
  604. ))
  605. orderitem = session.query(PrintOrder).filter(PrintOrder.order_id == order_id).first()
  606. results.append(dict(
  607. taskinfo = taskinfo,
  608. orderinfo = dict(
  609. demand_time = orderitem.demand_time,
  610. rate = orderitem.rate,
  611. note = orderitem.note,
  612. comment = orderitem.comment
  613. )
  614. ))
  615. return self.success(results=results)
  616. except KeyError:
  617. raise tornado.web.HTTPError(400)
  618. except Exception as emsg:
  619. return self.err(msg=emsg)
  620. # 订单相关
  621. def submitStudentOrder(self, **kwargs):
  622. session = self.session
  623. redisconn = self.redisconn
  624. try:
  625. studentid = kwargs['studentid']
  626. taskList = kwargs['taskList']
  627. orderInfo = kwargs['orderInfo']
  628. shop_id = kwargs['shop_id']
  629. shopinfo = session.query(Shop).filter(shop_id == Shop.id).first()
  630. total_pages = 0
  631. total_fee = 0
  632. flag = session.query(PrintOrder).filter(and_(
  633. PrintOrder.order_state == 0,
  634. PrintOrder.student_id == studentid
  635. )).first()
  636. if flag:
  637. return self.err('请先完成未支付订单')
  638. studentinfo = session.query(Student).filter(Student.student_id == studentid).first()
  639. buildinginfo = session.query(Building).filter(Building.id == studentinfo.building_id).first()
  640. times = time.time()
  641. nowtime = time.strftime("%Y-%m-%d %H:%M:%S")
  642. trade_no = str(int(times)) + str(random.randint(1000,10000))[:15]
  643. task_callback = []
  644. for task in taskList:
  645. task_id = task.get('task_id')
  646. pages = int(task.get('pages', 1))
  647. copies = task.get('copies', 1)
  648. is_colorful = task.get('colorful', 0)
  649. is_bothside = task.get('bothside', 0)
  650. handouts = task.get('handouts', 1)
  651. print_fee = 0
  652. print_pages = 0
  653. if is_bothside:
  654. print_pages += pages/(handouts*2)
  655. if pages%(handouts*2)>0:
  656. print_pages +=1
  657. if is_colorful:
  658. print_fee = print_pages * shopinfo.colorful2_price
  659. # print_fee += pages/(handouts*2)*shopinfo.colorful2_price
  660. # if pages%(handouts*2) > handouts:
  661. # print_fee += shopinfo.colorful2_price
  662. # print_pages += 1
  663. # elif pages%(handouts*2)>0:
  664. # print_fee += shopinfo.colorful1_price
  665. # print_pages += 1
  666. else:
  667. print_fee += print_pages*shopinfo.black2_price
  668. # print_fee += pages/(handouts*2)*shopinfo.black2_price
  669. # if pages%(handouts*2) > handouts:
  670. # print_fee += shopinfo.black2_price
  671. # elif pages%(handouts*2)>0:
  672. # print_fee += shopinfo.black1_price
  673. else:
  674. print_pages += pages/handouts
  675. if pages%handouts > 0:
  676. print_pages +=1
  677. if is_colorful:
  678. print_fee += print_pages * shopinfo.colorful1_price
  679. # print_fee += pages / handouts * shopinfo.colorful1_price
  680. # if pages % handouts > 0:
  681. # print_fee += shopinfo.colorful1_price
  682. else:
  683. print_fee += print_pages * shopinfo.black1_price
  684. # print_fee += pages / handouts * shopinfo.black1_price
  685. # if pages % handouts > 0:
  686. # print_fee += shopinfo.black1_price
  687. total_fee += print_fee * copies
  688. total_pages += print_pages
  689. task_callback.append(dict(
  690. task_id = task_id,
  691. copies = copies,
  692. colorful = is_colorful,
  693. bothside = is_bothside,
  694. handouts = handouts,
  695. updated_at = nowtime,
  696. print_fee = print_fee,
  697. print_pages = print_pages,
  698. task_state = 1
  699. ))
  700. printorder = PrintOrder(student_id = studentid,
  701. total_pages = total_pages,
  702. building_id = buildinginfo.id ,
  703. shop_id = shop_id,
  704. manager_id = buildinginfo.deliver_id,
  705. print_fee = total_fee,
  706. student_room = kwargs['student_room'],
  707. student_phone = orderInfo['username'],
  708. note = orderInfo['note'],
  709. note_at = nowtime,
  710. created_at = nowtime,
  711. demand_time = orderInfo['demand_time'],
  712. order_type = orderInfo['order_type'],
  713. trade_no = trade_no)
  714. session.add(printorder)
  715. session.commit()
  716. order_id = printorder.order_id
  717. for task in task_callback:
  718. task_id = task.get('task_id')
  719. data = dict(task, **dict(order_id=order_id, task_state=1))
  720. session.query(PrintTask).filter(PrintTask.task_id == task_id).update(values=data)
  721. session.flush()
  722. session.commit()
  723. return self.success([{'order_id':printorder.order_id, 'total_price':total_fee / 100.0, 'trade_no':printorder.trade_no}])
  724. except KeyError:
  725. raise tornado.web.HTTPError(400)
  726. except Exception, e:
  727. return self.err(str(e))
  728. def payOrder(self,**kwargs):
  729. try:
  730. session = self.session
  731. redisconn = self.redisconn
  732. order = session.query(PrintOrder).filter(PrintOrder.order_id==kwargs.get('order_id', 0)).first()
  733. trade_no = order.trade_no
  734. expire = 24*60
  735. redisconn.setex(trade_no, False, expire)
  736. if order is None:
  737. return self.err('请先确认下单')
  738. kwargs['extra']['product_id'] = order.trade_no
  739. charge, sign = Pingpp.Pay(client_ip=kwargs['client_ip'], amount=order.print_fee,
  740. order_no=trade_no, channel=kwargs['channel'], extra=kwargs['extra'])
  741. if sign == False:
  742. print charge
  743. return self.err("支付失败")
  744. else:
  745. session.query(PrintOrder).filter(PrintOrder.order_id == kwargs['order_id']).update({'order_state':0,'charge_id':charge['id']})
  746. session.commit()
  747. if kwargs['channel'] == 'wx_pub_qr':
  748. url = charge['credential']['wx_pub_qr']
  749. qr = qrcode.QRCode(
  750. version=2,
  751. error_correction=qrcode.constants.ERROR_CORRECT_H,
  752. box_size=3,
  753. border=3,
  754. )
  755. qr.add_data(url)
  756. img_io = StringIO()
  757. qr.make_image().save(img_io, 'PNG')
  758. img_io.seek(0)
  759. return self.success([{'charge':charge, 'qrcode':base64.b64encode(img_io.getvalue())}], "支付成功")
  760. return self.success([{'charge':charge}],"支付成功")
  761. except Exception,e:
  762. return self.err(e)
  763. def ComfirmPayment(self, trade_no):
  764. session = self.session
  765. redisconn = self.redisconn
  766. try:
  767. nowtime = time.strftime("%Y-%m-%d %H:%M:%S")
  768. session.query(PrintOrder).filter(PrintOrder.trade_no == trade_no).update(dict(order_state=1, paid_at=nowtime),synchronize_session=False)
  769. session.commit()
  770. expire = 24*60
  771. redisconn.setex(trade_no, True, expire)
  772. # msg = status.notifycallback()
  773. # print msg
  774. except Exception, e:
  775. raise Exception(e)
  776. def PayCallback_Check(self, trade_no):
  777. redisconn = self.redisconn
  778. sign = redisconn.get(trade_no)
  779. return self.success([{'status':sign}])
  780. def CancelPayment(self, trade_no, charge_id):
  781. session = self.session
  782. try:
  783. nowtime = time.strftime("%Y-%m-%d %H:%M:%S")
  784. session.query(PrintOrder).filter(and_(PrintOrder.trade_no == trade_no,
  785. PrintOrder.charge_id == charge_id)).update(dict(canceled_at=nowtime,
  786. order_state=4))
  787. session.commit()
  788. except Exception,e:
  789. raise Exception(e)
  790. def HistoryOrder(self, **kwargs):
  791. session = self.session
  792. redisconn = self.redisconn
  793. try:
  794. token = kwargs['token']
  795. shopid = kwargs['shopid']
  796. lastid = kwargs.get('lastid', 0)
  797. def GetBuildingName(building_id):
  798. item = session.query(Building).filter(Building.id == building_id).first()
  799. return item.name
  800. def GetStudentNickname(student_id):
  801. item = session.query(Student).filter(Student.student_id == student_id).first()
  802. return item.nickname
  803. def GetLastUploadTime(order_id):
  804. item = session.query(max(PrintTask.uploaded_at)).filter(PrintTask.order_id == order_id).first()
  805. return item[0]
  806. def innerFunc(shopid, lastid=0):
  807. res = []
  808. print shopid
  809. query = session.query(PrintOrder).order_by(PrintOrder.order_id.desc())
  810. items = query.filter().all()
  811. if lastid != 0:
  812. items = items.filter(and_(PrintOrder.shop_id == shopid,
  813. or_(PrintOrder.order_state == 2, PrintOrder.order_state == 3),
  814. PrintOrder.order_id < lastid)).limit(20).all()
  815. else :
  816. items = items.filter(and_(PrintOrder.shop_id == shopid,
  817. or_(PrintOrder.order_state == 2, PrintOrder.order_state == 3),
  818. PrintOrder.order_state == 1)).limit(20).all()
  819. print items
  820. if items is None:
  821. return None
  822. for item in items:
  823. uploaded_time = GetLastUploadTime(item.order_id)
  824. data = {
  825. 'order_id':item.order_id,
  826. 'order_state':item.order_state,
  827. 'student_room':item.student_room,
  828. 'student_phone':item.student_phone,
  829. 'demand_time':item.demand_time,
  830. 'uploaded_at':uploaded_time.strftime("%Y-%m-%d %H:%M:%S") if uploaded_time else time.strftime("%Y-%m-%d %H:%M:%S"),
  831. 'student_name':GetStudentNickname(item.student_id),
  832. 'printed_at':item.printed_at.strftime("%Y-%m-%d %H:%M:%S") if item.printed_at else time.strftime("%Y-%m-%d %H:%M:%S"),
  833. 'building_name':GetBuildingName(item.building_id),
  834. 'trade_no':item.trade_no,
  835. 'student_id':item.student_id,
  836. }
  837. res.append(data)
  838. return res
  839. results = innerFunc(shopid,lastid)
  840. if not results:
  841. return self.success(msg='历史订单为空')
  842. else:
  843. return self.success(results)
  844. except KeyError:
  845. raise tornado.web.HTTPError(400)
  846. except Exception as emsg:
  847. return self.err(msg=emsg)