Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.44 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import copy
  3. import traceback
  4. from collections import OrderedDict
  5. from datetime import datetime
  6. from decimal import Decimal
  7. from .constants import *
  8.  
  9.  
  10. __all__ = [
  11. 'CustomOrder',
  12. 'PayReceipt',
  13. 'KitchenOrder'
  14. ]
  15.  
  16.  
  17. class Item(object):
  18.  
  19. def __init__(
  20. self,
  21. modeName,
  22. itemFee,
  23. giveNum,
  24. productName,
  25. amount,
  26. catalogId,
  27. productId,
  28. mark=u'',
  29. productRemark='',
  30. *args,
  31. **kwargs
  32. ):
  33. self.mode_name = modeName
  34. self.item_fee = itemFee
  35. self.give_num = giveNum
  36. self.product_name = productName
  37. self.amount = amount
  38. self.catalog_id = catalogId
  39. self.product_id = productId
  40. self.mark = mark
  41. self.product_remark = productRemark
  42. self.oid = u"%s.%s" % (self.product_id, self.mode_name)
  43.  
  44. @classmethod
  45. def from_rows(cls, rows):
  46. return [cls(**row) for row in rows]
  47.  
  48. @property
  49. def label(self):
  50. s = u"%s%s" % (self.mark, self.product_name)
  51. if self.mode_name != u"默认":
  52. s = u"%s(%s)" % (s, self.mode_name)
  53. return s
  54.  
  55.  
  56. class PrintFields(object):
  57.  
  58. def __init__(self, data):
  59. self.data = data
  60. #
  61. self.shop_name = data.get('shopName', '')
  62. self.is_separated_print = data.get('isSeparatedPrint', False)
  63. self.print_type = data['printType']
  64. self.is_reprint = data.get('isReprint', False)
  65. self.reprint_s = u"(补打)" if self.is_reprint else u''
  66.  
  67. self.order = data['order']
  68.  
  69. # 下单时间
  70. self.created_at = self.fmt_timestamp(self.order['createAt']['$date'])
  71. # 打印时间
  72. self.printed_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  73.  
  74. # 订单编号
  75. self.order_no = self.order.get('orderNo', '')
  76. # 订单类型
  77. self.order_type = self.order.get('orderType', '')
  78. # 订单类型(文本)
  79. self.order_type_s = ORDER_TYPE.get(self.order_type, u"")
  80. # 订单状态
  81. self.state = self.order.get('state', '')
  82. # 流水号
  83. self.today_num = self.order.get('todayNum', 0)
  84.  
  85. # 配送信息
  86. self.address = self.order.get('address', u'')
  87. self.username = self.order.get('username', u'')
  88. self.phone = self.order.get('phone', u'')
  89. self.delivery_begin_at = self.order.get('deliveryBeginAt', None)
  90. self.delivery_end_at = self.order.get('deliveryEndAt', None)
  91.  
  92. # 操作员
  93. self.operator_name = self.order.get('operatorName', '')
  94. # 用餐人数
  95. self.number = self.order.get('number', 0)
  96. # 台号
  97. self.table_id = self.order.get('tableId', '')
  98. self.table_code = self.order.get('tableCode', '')
  99.  
  100. # 总数量
  101. self.total_count = self.order.get('totalCount', 0)
  102. # 配送费
  103. self.delivery_fee = self.order.get('deliveryFee', 0)
  104. # 茶介费
  105. self.cover_charge = self.order.get('coverCharge', 0)
  106. # 打包费
  107. self.pack_fee = self.order.get('packFee', 0)
  108. # 服务费
  109. self.tip = self.order.get('tip', 0)
  110. # 折扣
  111. self.discount_fee = self.order.get('discountFee', 0)
  112. self.reduce_fee = self.order.get('reduceFee', 0)
  113. # 总额
  114. self.total_fee = self.order.get('totalFee', 0)
  115. # 实收
  116. self.real_fee = self.order.get('realFee', 0)
  117. self.independent_discount = self.order.get('independentDiscount', 0)
  118.  
  119. # 会员
  120. self.is_member = self.order.get('isMember', False)
  121. self.member_fee = self.order.get('memberFee', 0)
  122. self.member_discount = self.order.get('memberDiscount', 0)
  123. self.member_balance = self.order.get('memberBalance', 0)
  124.  
  125. # 发票
  126. self.need_invoice = self.order.get('needInvoice', False)
  127. self.invoice_title = self.order.get('invoiceTitle', '')
  128.  
  129. # 支付方式
  130. self.pay_type = self.order.get('payType', '')
  131. # 支付方式(文本)
  132. self.pay_type_s = PAY_TYPE.get(self.pay_type, u"其他")
  133. # 支付状态
  134. self.pay_state = self.order.get('payState', '')
  135. self.pay_state_s = PAY_STATE.get(self.pay_state, u"未支付")
  136. # 交易流水
  137. self.pay_serial_num = self.order.get('paySerialNum', '')
  138. # 组合支付
  139. self.combine_pay = self.order.get('combinePay', [])
  140. self.is_combine_pay = self.order.get('isCombinePay', False)
  141. # 支付时间
  142. self.pay_at = self.order.get('payAt', {}).get('$date', None)
  143.  
  144. # 备注
  145. self.remark = self.order.get('remark', '').strip()
  146. self.more_remark = self.order.get('moreRemark', '').strip()
  147.  
  148. def fmt_timestamp(self, ts, format="%Y-%m-%d %H:%M:%S"):
  149. return datetime.fromtimestamp(ts / 1000).strftime(format)
  150.  
  151. def fmt_price(self, price, free_desc=None):
  152. if (price == 0) and (free_desc is not None):
  153. return free_desc
  154. return u"%s元" % str(Decimal(price).quantize(Decimal('.01')))
  155.  
  156. @property
  157. def is_dine_in(self):
  158. return self.order_type != "TAKE_OUT"
  159.  
  160. @property
  161. def is_origin(self):
  162. return self.state == "SUBMITTED"
  163.  
  164. @property
  165. def is_modified(self):
  166. return self.state == "MODIFY_SUBMITTED"
  167.  
  168. @property
  169. def is_cancelled(self):
  170. return self.state == "CANCELLED"
  171.  
  172. def regroup_items(self):
  173. if self.is_origin or self.is_cancelled:
  174. return Item.from_rows(rows=self.order['items'])
  175.  
  176. if self.is_modified:
  177. items = Item.from_rows(rows=self.order['items'])
  178. old_items = Item.from_rows(rows=self.order['oldItems'])
  179.  
  180. fn = lambda t: t.oid
  181. m1 = OrderedDict(zip(map(fn, items), items))
  182. m2 = OrderedDict(zip(map(fn, old_items), old_items))
  183. m3 = []
  184.  
  185. for product_id, item in m1.items():
  186. item_old = m2.pop(product_id, None)
  187. if not item_old:
  188. item.mark = u"(加)"
  189. m3.append(item)
  190. else:
  191. if item.amount == item_old.amount:
  192. if self.is_reprint:
  193. m3.append(item)
  194. else:
  195. if self.is_reprint:
  196. m3.append(item_old)
  197. item.amount -= item_old.amount
  198. item.give_num -= item_old.give_num
  199. item.item_fee -= item_old.item_fee
  200. item.mark = (
  201. u"(加)" if item.amount > 0 else u"(退)")
  202. m3.append(item)
  203.  
  204. for product_id, item_old in m2.items():
  205. if self.is_reprint:
  206. m3.append(copy.deepcopy(item_old))
  207. item_old.mark = u"(退)"
  208. item_old.amount = (-item_old.amount)
  209. item_old.give_num = (-item_old.give_num)
  210. item_old.item_fee = (-item_old.item_fee)
  211. m3.append(item_old)
  212.  
  213. return m3
  214.  
  215. return []
  216.  
  217.  
  218. class CustomOrder(object):
  219.  
  220. def __init__(
  221. self,
  222. copies_dine_in=0,
  223. copies_take_out=0,
  224. is_print_by_table=False,
  225. table_ids=[],
  226. *args,
  227. **kwargs
  228. ):
  229. self.copies_dine_in = copies_dine_in
  230. self.copies_take_out = copies_take_out
  231. self.is_print_by_table = is_print_by_table
  232. self.table_ids = table_ids
  233.  
  234. def dummy_print(self, fmt, data):
  235. fmt.table_space = fmt.table_space_m
  236. fields = PrintFields(data)
  237.  
  238. if (
  239. self.is_print_by_table and
  240. (fields.table_id not in self.table_ids)
  241. ):
  242. return 0x01, None
  243.  
  244. if fields.is_dine_in:
  245. copies = self.copies_dine_in
  246. else:
  247. copies = self.copies_take_out
  248.  
  249. if fields.is_reprint:
  250. copies = 1
  251.  
  252. if copies == 0:
  253. return 0x01, None
  254.  
  255. order_items = fields.regroup_items()
  256. if len(order_items) == 0:
  257. return 0x01, None
  258.  
  259. try:
  260. for i in xrange(copies):
  261. self.print_head(fmt, fields)
  262. self.print_body(fmt, fields, order_items)
  263. self.print_foot(fmt, fields)
  264. fmt.device.hints()
  265. return 0x00, fmt.device.export
  266. except Exception as e:
  267. traceback.print_exc()
  268. return 0x09, e
  269.  
  270. def print_head(self, fmt, fields):
  271. fmt.set()
  272. fmt.print_line(u"操作员:%s" % fields.operator_name)
  273. fmt.print_line(u"【订单编号:%s】" % fields.order_no)
  274.  
  275. fmt.set(align="center", height=2)
  276. fmt.print_line(u"%s" % fields.shop_name)
  277.  
  278. fmt.set(align="center", height=1)
  279. fmt.print_line(u"%s(%s)" % (fields.order_type_s, fields.pay_state_s))
  280. fmt.print_symbol('*')
  281.  
  282. # 打印客户信息
  283. if fields.is_dine_in:
  284. fmt.set(align="center", height=2)
  285. fmt.print_line(u"流水号:%s%s" % (fields.today_num, fields.reprint_s))
  286. fmt.set(align="left", height=2)
  287. fmt.print_line(
  288. u"桌台:%s(%s位)" % (fields.table_code, fields.number))
  289. fmt.set()
  290. fmt.print_line()
  291. fmt.print_line(u"下单时间:%s" % fields.created_at)
  292. else:
  293. fmt.set(align="left", height=2)
  294. fmt.print_line(u"地址:%s" % fields.address)
  295. fmt.set()
  296. fmt.print_line()
  297. fmt.print_line(u"客户:%s" % fields.username)
  298. fmt.print_line(u"电话:%s" % fields.phone)
  299. fmt.print_line(u"下单时间:%s" % fields.created_at)
  300.  
  301. # 配送时间要求
  302. if (
  303. (fields.delivery_begin_at is not None) and
  304. (fields.delivery_end_at is not None)
  305. ):
  306. arrived_at = "%s -- %s" % (
  307. fields.delivery_begin_at,
  308. fields.delivery_end_at
  309. )
  310. elif fields.delivery_begin_at is not None:
  311. arrived_at = fields.delivery_begin_at
  312. elif fields.delivery_end_at is not None:
  313. arrived_at = fields.delivery_end_at
  314. else:
  315. arrived_at = u"未设置"
  316. fmt.print_line(u"配送时间:%s" % arrived_at)
  317.  
  318. fmt.print_line(u"打印时间:%s" % fields.printed_at)
  319. fmt.set()
  320.  
  321. def print_body(self, fmt, fields, order_items):
  322. # 1/3: 打印表头
  323. fmt.set()
  324. fmt.print_symbol('=')
  325. fmt.print_row(cells=[u"品项", u"数量", u"金额"])
  326. fmt.print_symbol('-')
  327.  
  328. # 2/3: 打印菜品、数量、价格
  329. fmt.set(height=2)
  330. for item in order_items:
  331. diff = item.amount - item.give_num
  332. if diff:
  333. fmt.print_row(cells=[
  334. item.label,
  335. u"%s份" % diff,
  336. fields.fmt_price(item.item_fee)
  337. ])
  338. if item.give_num != 0:
  339. fmt.print_row(cells=[
  340. item.label,
  341. u"%s份" % item.give_num,
  342. u"赠送"
  343. ])
  344.  
  345. # 3/3: 打印茶介费、打包费、配送费
  346. if not (fields.is_modified and not fields.is_reprint):
  347. fmt.set()
  348. fmt.print_row(cells=[
  349. u"茶介费",
  350. u"%s位" % fields.number,
  351. fields.fmt_price(fields.cover_charge, u"免")
  352. ])
  353. if fields.pack_fee:
  354. fmt.print_row(cells=[
  355. u"打包费",
  356. u"",
  357. fields.fmt_price(fields.pack_fee, u"免")
  358. ])
  359. if fields.delivery_fee:
  360. fmt.print_row(cells=[
  361. u"配送费",
  362. u"",
  363. fields.fmt_price(fields.delivery_fee, u"免")
  364. ])
  365.  
  366. fmt.set()
  367. fmt.print_line()
  368. fmt.print_symbol('-')
  369. fmt.set()
  370.  
  371. def print_foot(self, fmt, fields):
  372. if not (fields.is_modified and not fields.is_reprint):
  373. # 1/3: 打印菜单总量、发票信息
  374. fmt.set()
  375. if fields.need_invoice:
  376. fmt.print_line(u"需要发票/收据")
  377. fmt.print_line(u"抬头名称:%s" % fields.invoice_title)
  378. fmt.print_line(u"总数量:%s" % fields.total_count)
  379.  
  380. # 2/3: 打印费用
  381. fmt.set(align="right")
  382. fee_seq = [
  383. fields.total_fee,
  384. fields.discount_fee,
  385. fields.member_fee,
  386. fields.tip,
  387. fields.real_fee
  388. ]
  389. fee_seq = [fields.fmt_price(fee) for fee in fee_seq]
  390. fee_seq = fmt.adjust(fee_seq, fill="left")
  391.  
  392. fmt.print_line(u"总额:%s" % fee_seq[0])
  393. fmt.print_line(u"折扣:%s" % fee_seq[1])
  394. if fields.is_member:
  395. fmt.print_line(u"会员:%s" % fee_seq[2])
  396. if fields.tip:
  397. fmt.print_line(u"服务费:%s" % fee_seq[3])
  398.  
  399. fmt.set(align="right", height=2)
  400. fmt.print_line(u"实收:%s" % fee_seq[4])
  401. fmt.set(align="right")
  402. fmt.print_line(u"(%s)" % fields.pay_state_s)
  403.  
  404. # 3/3: 打印备注
  405. remarks = [s for s in (fields.remark, fields.more_remark) if s]
  406. if remarks:
  407. fmt.set()
  408. fmt.print_symbol('*')
  409. fmt.set(align="left", height=2)
  410. head = remarks.pop(0)
  411. fmt.print_line(u"备注:%s" % head)
  412. for s in remarks:
  413. fmt.print_line(u"%s" % s)
  414.  
  415. fmt.set(align="center")
  416. fmt.print_ending()
  417. fmt.cut()
  418. fmt.set()
  419.  
  420.  
  421. class PayReceipt(object):
  422.  
  423. def __init__(
  424. self,
  425. is_print_by_table=False,
  426. table_ids=[],
  427. *args,
  428. **kwargs
  429. ):
  430. self.is_print_by_table = is_print_by_table
  431. self.table_ids = table_ids
  432.  
  433. def dummy_print(self, fmt, data):
  434. fmt.table_space = fmt.table_space_r
  435. fields = PrintFields(data)
  436.  
  437. if (
  438. self.is_print_by_table and
  439. (fields.table_id not in self.table_ids)
  440. ):
  441. return 0x01, None
  442.  
  443. try:
  444. self.print_head(fmt, fields)
  445. self.print_body(fmt, fields)
  446. self.print_foot(fmt, fields)
  447. fmt.device.hints()
  448. return 0x00, fmt.device.export
  449. except Exception as e:
  450. traceback.print_exc()
  451. return 0x09, e
  452.  
  453. def print_head(self, fmt, fields):
  454. pass
  455.  
  456. def print_body(self, fmt, fields):
  457. fmt.set(align="center", height=2)
  458. fmt.print_line(u"付款凭证")
  459. fmt.set()
  460. fmt.print_symbol('-')
  461.  
  462. fmt.set(align="center", height=2)
  463. fmt.print_line(u"流水号:%s%s" % (fields.today_num, fields.reprint_s))
  464. fmt.print_line()
  465.  
  466. fmt.set()
  467. fmt.print_line(u"打印时间:%s" % fields.printed_at)
  468. fmt.print_line(u"操作员:%s" % fields.operator_name)
  469. fmt.print_line(u"您好,您的商品已支付成功")
  470. fmt.print_line(u"商户名称:%s" % fields.shop_name)
  471.  
  472. # 打印表格
  473. fmt.set(align="left", height=2)
  474. fmt.print_row([u"桌号:", fields.table_code])
  475. fmt.print_row([u"付款金额:", fields.fmt_price(fields.real_fee)])
  476. fmt.print_row([u"支付方式:", fields.pay_type_s])
  477.  
  478. fmt.set()
  479. if fields.is_combine_pay:
  480. for v in fields.combine_pay:
  481. fmt.print_row([
  482. u" %s:" % PAY_TYPE.get(v.get('payType', ''), u"其他"),
  483. fields.fmt_price(v.get('amount', 0))
  484. ])
  485.  
  486. fmt.print_row([u"支付时间:", fields.fmt_timestamp(fields.pay_at)])
  487. fmt.print_row([u"单号:", fields.order_no])
  488. fmt.print_row([u"交易号:", fields.pay_serial_num])
  489.  
  490. def print_foot(self, fmt, fields):
  491. fmt.set(align="center")
  492. fmt.print_ending()
  493. fmt.cut()
  494. fmt.set()
  495.  
  496.  
  497. class KitchenOrder(object):
  498.  
  499. def __init__(
  500. self,
  501. is_separated=False,
  502. is_print_by_catalog=False,
  503. catalog_ids=[],
  504. *args,
  505. **kwargs
  506. ):
  507. self.is_separated = is_separated
  508. self.is_print_by_catalog = is_print_by_catalog
  509. self.catalog_ids = catalog_ids
  510.  
  511. def dummy_print(self, fmt, data):
  512. fields = PrintFields(data)
  513. order_items = fields.regroup_items()
  514. fmt.table_space = fmt.table_space_k
  515.  
  516. if self.is_print_by_catalog:
  517. order_items = [
  518. item for item in order_items
  519. if item.catalog_id in self.catalog_ids
  520. ]
  521.  
  522. if len(order_items) == 0:
  523. return 0x01, None
  524.  
  525. try:
  526. if not self.is_separated:
  527. self.print_head(fmt, fields)
  528. self.print_body(fmt, fields, order_items)
  529. self.print_foot(fmt, fields)
  530. else:
  531. for item in order_items:
  532. self.print_head(fmt, fields)
  533. self.print_body(fmt, fields, [item])
  534. self.print_foot(fmt, fields)
  535. fmt.device.hints()
  536. return 0x00, fmt.device.export
  537. except Exception as e:
  538. traceback.print_exc()
  539. return 0x09, e
  540.  
  541. def print_head(self, fmt, fields):
  542. fmt.set()
  543.  
  544. if fields.is_cancelled:
  545. fmt.set(align="center", width=2, height=2)
  546. fmt.print_line(u"** 订单取消 **")
  547.  
  548. if fields.is_modified:
  549. fmt.set(align="center", width=2, height=2)
  550. fmt.print_line(u"** 订单变更 **")
  551.  
  552. fmt.set(align="center", height=2)
  553. fmt.print_line(u"流水号:%s" % fields.today_num)
  554.  
  555. fmt.set()
  556. fmt.print_line(u"操作员:%s" % fields.operator_name)
  557.  
  558. fmt.set(align="left", width=2, height=2)
  559. if fields.is_dine_in:
  560. fmt.print_line(u"堂食:%s%s" % (fields.table_code, fields.reprint_s))
  561. else:
  562. fmt.print_line(u"外卖订单%s" % fields.reprint_s)
  563.  
  564. fmt.set()
  565. fmt.print_line(u"下单时间:%s" % fields.created_at)
  566. fmt.print_line(u"打印时间:%s" % fields.printed_at)
  567. fmt.set()
  568.  
  569. def print_body(self, fmt, fields, order_items):
  570. # 1/2 打印表头
  571. fmt.set()
  572. fmt.print_symbol('=')
  573. fmt.print_row(cells=[u"品项", u"数量"])
  574.  
  575. # 2/2 打印表体
  576. fmt.print_symbol('-')
  577. fmt.set(align="left", width=2, height=2)
  578. for item in order_items:
  579. fmt.print_row(cells=[
  580. item.label,
  581. u"%s" % item.amount
  582. ])
  583. if item.product_remark:
  584. fmt.print_line(u"备注:%s" % item.product_remark)
  585. fmt.set()
  586. fmt.print_symbol('-')
  587. fmt.set()
  588.  
  589. def print_foot(self, fmt, fields):
  590. # 1/2 打印备注
  591. fmt.set()
  592. remarks = [s for s in (fields.remark, fields.more_remark) if s]
  593. if remarks:
  594. fmt.set()
  595. fmt.print_symbol('*')
  596. fmt.set(align="left", height=2)
  597. head = remarks.pop(0)
  598. fmt.print_line(u"备注:%s" % head)
  599. for s in remarks:
  600. fmt.print_line(u"%s" % s)
  601.  
  602. # 2/2 打印台号
  603. fmt.set(align="left", width=2, height=2)
  604. if fields.is_dine_in:
  605. fmt.print_line(u"堂食:%s%s" % (fields.table_code, fields.reprint_s))
  606. else:
  607. fmt.print_line(u"外卖订单%s" % fields.reprint_s)
  608.  
  609. fmt.set(align="center")
  610. fmt.print_ending()
  611. fmt.cut()
  612. fmt.set()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement