# -*- 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 }