anhuizhitong.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. from apps.common.utils import int_to_hex
  5. from apps.web.constant import DeviceCmdCode
  6. from apps.web.core.adapter.base import SmartBox, SendManager
  7. logger = logging.getLogger(__name__)
  8. class CardRechargeBox(SmartBox):
  9. def check_dev_status(self, attachParas=None):
  10. pass
  11. def remote_charge_card(self, price, rechargeRecord=None):
  12. """
  13. 充值机模式,直接充值卡
  14. :param price:
  15. :param rechargeRecord:
  16. :return:
  17. """
  18. # 能走充值的,那么卡的ID一定已经写入了系统,写入了rechargeRecord中,直接从attachParas中查询
  19. cardNo = rechargeRecord.attachParas.get("cardNo")
  20. result = self._async_card_balance(cardNo, price)
  21. data = result.get("data")
  22. res = data[20: 22]
  23. if res == "00":
  24. return
  25. else:
  26. DESC_MAP = {
  27. "01": u"余额不足",
  28. "02": u"无卡",
  29. "03": u"下发卡号和充卡机上卡号不同",
  30. "04": u"其他错误",
  31. }
  32. logger.info("card recharge error with code <{}>, card is <{}>".format(res, cardNo))
  33. rechargeRecord.desc = DESC_MAP.get(res, u"未知错误")
  34. rechargeRecord.save()
  35. def _get_card_balance(self):
  36. """
  37. 获取 卡 的余额
  38. :return:
  39. """
  40. cardNo = "00000000"
  41. cardCst = "0000"
  42. cardOpe = "02"
  43. payload = {
  44. "funCode": "22",
  45. "data": cardNo + cardCst + cardOpe
  46. }
  47. with SendManager(visitor="client") as sender:
  48. result = sender.send(
  49. device=self.device,
  50. cmd=DeviceCmdCode.OPERATE_DEV_SYNC,
  51. payload=payload,
  52. timeout=60
  53. )
  54. sender.rst = result
  55. return result
  56. def _async_card_balance(self, cardNo, balance):
  57. """
  58. 向卡内充值
  59. :return:
  60. """
  61. cardNoHex = int_to_hex(int(cardNo), lens=8)
  62. balanceHex = int_to_hex(int(float(balance) * 10), lens=4)
  63. cardOpe = "01"
  64. payload = {
  65. "funCode": "22",
  66. "data": cardNoHex + balanceHex + cardOpe
  67. }
  68. with SendManager(visitor="client") as sender:
  69. result = sender.send(
  70. device=self.device,
  71. cmd=DeviceCmdCode.OPERATE_DEV_SYNC,
  72. payload=payload,
  73. timeout=60
  74. )
  75. sender.rst = result
  76. return result
  77. def get_remote_card_balance(self):
  78. result = self._get_card_balance()
  79. data = result.get("data", "")
  80. cardNo = int(data[8:16], 16)
  81. balance = int(data[16:20], 16) / 10.0
  82. res = data[20:22]
  83. return {
  84. "cardNo": cardNo,
  85. "cardBalance": balance,
  86. "res": res
  87. }