123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import logging
- from apps.common.utils import int_to_hex
- from apps.web.constant import DeviceCmdCode
- from apps.web.core.adapter.base import SmartBox, SendManager
- logger = logging.getLogger(__name__)
- class CardRechargeBox(SmartBox):
- def check_dev_status(self, attachParas=None):
- pass
- def remote_charge_card(self, price, rechargeRecord=None):
- """
- 充值机模式,直接充值卡
- :param price:
- :param rechargeRecord:
- :return:
- """
- # 能走充值的,那么卡的ID一定已经写入了系统,写入了rechargeRecord中,直接从attachParas中查询
- cardNo = rechargeRecord.attachParas.get("cardNo")
- result = self._async_card_balance(cardNo, price)
- data = result.get("data")
- res = data[20: 22]
- if res == "00":
- return
- else:
- DESC_MAP = {
- "01": u"余额不足",
- "02": u"无卡",
- "03": u"下发卡号和充卡机上卡号不同",
- "04": u"其他错误",
- }
- logger.info("card recharge error with code <{}>, card is <{}>".format(res, cardNo))
- rechargeRecord.desc = DESC_MAP.get(res, u"未知错误")
- rechargeRecord.save()
- def _get_card_balance(self):
- """
- 获取 卡 的余额
- :return:
- """
- cardNo = "00000000"
- cardCst = "0000"
- cardOpe = "02"
- payload = {
- "funCode": "22",
- "data": cardNo + cardCst + cardOpe
- }
- with SendManager(visitor="client") as sender:
- result = sender.send(
- device=self.device,
- cmd=DeviceCmdCode.OPERATE_DEV_SYNC,
- payload=payload,
- timeout=60
- )
- sender.rst = result
- return result
- def _async_card_balance(self, cardNo, balance):
- """
- 向卡内充值
- :return:
- """
- cardNoHex = int_to_hex(int(cardNo), lens=8)
- balanceHex = int_to_hex(int(float(balance) * 10), lens=4)
- cardOpe = "01"
- payload = {
- "funCode": "22",
- "data": cardNoHex + balanceHex + cardOpe
- }
- with SendManager(visitor="client") as sender:
- result = sender.send(
- device=self.device,
- cmd=DeviceCmdCode.OPERATE_DEV_SYNC,
- payload=payload,
- timeout=60
- )
- sender.rst = result
- return result
- def get_remote_card_balance(self):
- result = self._get_card_balance()
- data = result.get("data", "")
- cardNo = int(data[8:16], 16)
- balance = int(data[16:20], 16) / 10.0
- res = data[20:22]
- return {
- "cardNo": cardNo,
- "cardBalance": balance,
- "res": res
- }
|