init
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
index f8da627..f3203a1 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -1,10 +1,466 @@
 package com.supwisdom.activities.consume
 
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.view.View
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.menu.MenuActivity
+import com.supwisdom.activities.transdtl.TransdtlActivity
+import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlUnionRecord
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.utils.SoundUtil
+import java.util.*
 
 /**
  ** create by zzq on 2019/7/24
  ** @desc
  **/
+@Suppress("DEPRECATION")
+@SuppressLint("NewApi")
 class ConsumeActivity : BaseActivity(), IConsumeView {
+    private lateinit var amountTxt: TextView
+    private lateinit var presenter: ConsumePresenter
+    private lateinit var vLinkstat: TextView
+    private lateinit var vShopname: TextView
+    private lateinit var vCustname: TextView
+    private lateinit var vStuempno: TextView
+    private lateinit var vCardstatus: TextView
+    private lateinit var vBalance: TextView
+    private lateinit var vTime: TextView
+    private lateinit var vLinkLogo: ImageView
+    private lateinit var vLastResult: TextView
+    private lateinit var vLastPayamt: TextView
+    private lateinit var vLastPayway: TextView
+    private lateinit var vLastPayday: TextView
+    private lateinit var vLastPaytime: TextView
+    private lateinit var vLastPayFailreason: TextView
+    private lateinit var vLastPayFailll: LinearLayout
+    private lateinit var vLastPayamtll: LinearLayout
+    @Volatile
+    private var isBackRuning = false
+    private var addAmount: Int = 0
+    private var counter: LastPayShowTimer? = null
+    private var lastPayInfo: CardUserInfoBean? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_consume)
+
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = ConsumePresenter(this)
+        presenter.start()
+    }
+
+    private fun initView() {
+        vShopname = findViewById<TextView>(R.id.consume_shopname)
+        vLinkLogo = findViewById<ImageView>(R.id.consume_linklogo)
+        vLinkstat = findViewById<TextView>(R.id.consume_linkstat)
+        amountTxt = findViewById<TextView>(R.id.consume_amt)
+        vCustname = findViewById<TextView>(R.id.consume_custname)
+        vStuempno = findViewById<TextView>(R.id.consume_stuempno)
+        vCardstatus = findViewById<TextView>(R.id.consume_cardstatus)
+        vBalance = findViewById<TextView>(R.id.consume_balance)
+        vTime = findViewById<TextView>(R.id.consume_time)
+        vLastResult = findViewById<TextView>(R.id.consume_last_result)
+        vLastPayamt = findViewById<TextView>(R.id.consume_last_payamt)
+        vLastPayway = findViewById<TextView>(R.id.consume_last_payway)
+        vLastPayday = findViewById<TextView>(R.id.consume_last_payday)
+        vLastPaytime = findViewById<TextView>(R.id.consume_last_paytime)
+        vLastPayFailreason = findViewById<TextView>(R.id.consume_last_failreason)
+        vLastPayFailll = findViewById<LinearLayout>(R.id.ll_consume_last_failreason)
+        vLastPayamtll = findViewById<LinearLayout>(R.id.ll_consume_last_payamt)
+    }
+
+    private fun delValueToEdit() {
+        presenter.clickNoPay()
+        val str = amountTxt.text.toString()
+        val len = str.length
+        when {
+            len == 0 ||
+                    len == 1 -> {
+                refresh()
+            }
+            len > 1 -> {
+                amountTxt.text = str.substring(0, len - 1)
+                showScreenAmount()
+            }
+        }
+    }
+
+    private fun checkAmtToPay() {
+        val amt = getCurAmount() + addAmount
+        if (amt > 0) {
+            amountTxt.text = String.format("%.02f", amt / 100.0f)
+            jumpToPay(amt)
+        } else {
+            AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
+        }
+    }
+
+    private fun getCurAmount(): Int {
+        return try {
+            CommonUtil.YuanToFen(java.lang.Double.parseDouble(amountTxt.text.toString().trim { it <= ' ' }))
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            0
+        }
+    }
+
+    private fun jumpToPay(amount: Int) {
+//        val intent = Intent()
+//        intent.putExtra("datetime", CommonUtil.getSystemMills())
+//        intent.putExtra("amount", amount.toString())
+//        intent.putExtra("consumeType", PublicDef.CONSUME_TYPE_PAY)
+//        intent.setClass(this@WaitActivity, PayActivity::class.java)
+//        startActivity(intent)
+    }
+
+    private fun jumpToFixpay(amount: Int) {
+//        val intent = Intent()
+//        intent.putExtra("datetime", CommonUtil.getSystemMills())
+//        intent.putExtra("amount", amount.toString())
+//        intent.putExtra("consumeType", PublicDef.CONSUME_TYPE_FIXPAY)
+//        intent.setClass(this@WaitActivity, PayActivity::class.java)
+//        startActivity(intent)
+    }
+
+    private fun addValueToEdit(value: Int) {
+        var str = amountTxt.text.toString()
+        if ("0" == str) {
+            str = ""
+        }
+        //如果已经有小数点,则小数点后面不能超过两位
+        if (str.indexOf(".") > 0) {
+            if (str.length - str.indexOf(".") <= 2) {
+                amountTxt.text = "$str$value"
+            }
+        } else {
+            //限制消费金额<1000
+            if (str.length < 3) {
+                amountTxt.text = "$str$value"
+            }
+        }
+        showScreenAmount()
+    }
+
+    override fun showUserInfo(info: CardUserInfoBean) {
+        CommonUtil.acquireWakeLock(this)
+        vCustname.text = info.username
+        if (info.retcode == PublicDef.SUCCESS) {
+            vCardstatus.text = "暂未实现"//PublicDef.CARD_STAT_MAP[info.cardstat]
+            if (info.cardstatus != 0) {
+                vCardstatus.setTextColor(Color.RED)
+            } else {
+                vCardstatus.setTextColor(resources.getColor(R.color.blue))
+            }
+            if (info.balance == null) {
+                vBalance.text = null
+            } else {
+                vBalance.text = String.format("%.02f 元", info.balance!! / 100.0f)
+            }
+        } else {
+            vCardstatus.text = info.retmsg
+            vCardstatus.setTextColor(Color.RED)
+            vBalance.text = null
+        }
+    }
+
+    private var lastshowtime: String? = null
+    override fun clearUserInfo(datetime: String) {
+        if (!isBackRuning) {
+            vCustname.text = null
+            vStuempno.text = null
+            vCardstatus.text = null
+            vBalance.text = null
+            val tmptime = datetime.substring(0, 16)
+            if (lastshowtime != tmptime) {
+                lastshowtime = tmptime
+                vTime.text = tmptime
+                AuxScreenController.getInstance().refreshBottom(tmptime)
+            }
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        isBackRuning = false
+        refresh()
+        refreshRecentDtl()
+    }
+
+    override fun onNewIntent(intent: Intent) {
+    }
+
+    private fun refresh() {
+        addAmount = 0
+        amountTxt.text = "0"
+        var shopname = SPApplication.getInstance().getPos().getConfigPara()!!.shopname
+        if (shopname == null || shopname.length < 9) {
+            vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_normal)
+        } else {
+            vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_middle)
+            if (shopname.length > 10) {
+                val len = shopname.length / 2
+                shopname = shopname.substring(0, len) + "\n" + shopname.substring(len)
+            }
+        }
+        vShopname.text = shopname
+
+        refreshLinkStatus(SPApplication.getInstance().isOnline())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDate().substring(0, 16))
+        AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
+
+        val record = SPApplication.getInstance().getPos().getControlPara(PublicDef.CONTROL_FIXAMT)
+        if (record != null && PublicDef.CONTROL_NO_FIXPAY_FLAG != record.paraval) {
+            try {
+                val amount = Integer.parseInt(record.paraval)
+                amountTxt.text = String.format("%.02f", amount / 100.0f)
+                jumpToFixpay(amount)
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+            }
+        }
+    }
+
+    override fun refreshLinkStatus(isOnline: Boolean) {
+        if (isOnline) {
+            vLinkLogo.setImageDrawable(getDrawable(R.drawable.wireless_on))
+            vLinkstat.text = "联机"
+            vLinkstat.setTextColor(resources.getColor(R.color.blue))
+            AuxScreenController.getInstance().refreshTitle("联机         F4查看上笔记录")
+        } else {
+            vLinkLogo.setImageDrawable(getDrawable(R.drawable.wireless_off))
+            vLinkstat.text = "脱机"
+            vLinkstat.setTextColor(Color.RED)
+            AuxScreenController.getInstance().refreshTitle("脱机         F4查看上笔记录")
+        }
+    }
+
+    override fun showConsumeSuc(info: CardUserInfoBean) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun showConsumeHint(hint: String) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun showConsumeFail(info: CardUserInfoBean) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun showReverseSuc(info: CardUserInfoBean) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun showReverseFail(info: CardUserInfoBean) {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    private var lastShowRecentDatetime: String? = null
+    private fun refreshRecentDtl() {
+        val info = lastPayInfo
+        if (info != null) {
+            //已显示过不在显示
+            if (lastShowRecentDatetime == info.datetime) {
+                return
+            }
+            lastShowRecentDatetime = info.datetime
+
+            if (info.status == PayStatus.SUC) {
+                when {
+                    info.reversalFlag == ReversalFlag.AUTO -> vLastResult.text = "自动冲正"
+                    info.reversalFlag == ReversalFlag.MANUAL -> vLastResult.text = "手动撤销"
+                    else -> vLastResult.text = "消费成功"
+                }
+                vLastPayFailll.visibility = View.GONE
+                vLastPayamtll.visibility = View.VISIBLE
+                vLastPayamt.text = String.format("%.02f元", info.payamt / 100.0f)
+            } else {
+                if (info.reversalFlag == ReversalFlag.AUTO ||
+                    info.reversalFlag == ReversalFlag.MANUAL
+                ) {
+                    vLastResult.text = "冲正失败"
+                } else {
+                    vLastResult.text = "消费失败"
+                }
+                vLastPayFailll.visibility = View.VISIBLE
+                vLastPayamtll.visibility = View.GONE
+                vLastPayFailreason.text = info.retmsg
+            }
+
+            vLastPayway.text = if (info.payway == "code") {
+                "二维码"
+            } else {
+                "市民卡"
+            }
+            val sb = StringBuilder()
+            sb.append(info.datetime!!.substring(0, 4)).append("/")
+                .append(info.datetime!!.substring(4, 6)).append("/")
+                .append(info.datetime!!.substring(6, 8))
+            vLastPayday.text = sb.toString()
+            sb.setLength(0)
+            sb.append(info.datetime!!.substring(8, 10)).append(":")
+                .append(info.datetime!!.substring(10, 12)).append(":").append(info.datetime!!.substring(12))
+            vLastPaytime.text = sb.toString()
+            resetPayShowCounter(10 * 1000)
+        }
+    }
+
+    private fun clearLastPayResult() {
+        vLastResult.text = null
+        vLastPayamt.text = null
+        vLastPayway.text = null
+        vLastPayday.text = null
+        vLastPaytime.text = null
+        vLastPayFailreason.text = null
+    }
+
+    override fun onStop() {
+        super.onStop()
+        isBackRuning = true
+    }
+
+    override fun onDestroy() {
+        SoundUtil.releaseMusic()
+        presenter.stop()
+        super.onDestroy()
+    }
+
+    @SuppressLint("SetTextI18n")
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            val keyCode = event.keyCode
+            when (keyCode) {
+                KeyEvent.KEYCODE_BACK -> {
+                    amountTxt.text = "0"
+                    presenter.clickNoPay()
+                }
+                KeyEvent.KEYCODE_0,
+                KeyEvent.KEYCODE_1,
+                KeyEvent.KEYCODE_2,
+                KeyEvent.KEYCODE_3,
+                KeyEvent.KEYCODE_4,
+                KeyEvent.KEYCODE_5,
+                KeyEvent.KEYCODE_6,
+                KeyEvent.KEYCODE_7,
+                KeyEvent.KEYCODE_8,
+                KeyEvent.KEYCODE_9 -> {
+                    presenter.clickNoPay()
+                    addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
+                }
+                KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
+                    presenter.clickNoPay()
+                    val str = amountTxt.text.toString()
+                    if (str.length < 8 && str.indexOf('.') < 0) {
+                        amountTxt.text = "$str."
+                        showScreenAmount()
+                    }
+                }
+                KeyEvent.KEYCODE_NUMPAD_ADD -> {
+                    //'+'
+                    addAmount += getCurAmount()
+                    amountTxt.text = ""
+                    showScreenAmount()
+                }
+                KeyEvent.KEYCODE_DPAD_LEFT -> {
+                    //'F1'
+                    isBackRuning = true
+                    jumpActivity(MenuActivity::class.java)
+                }
+//                KeyEvent.KEYCODE_DPAD_UP ->
+                //'F2'
+//                KeyEvent.KEYCODE_DPAD_DOWN ->
+                //'F3'
+                KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                    //'F4'
+                    jumpActivity(TransdtlActivity::class.java)
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    presenter.clickNoPay()
+                    delValueToEdit()
+                }
+                KeyEvent.KEYCODE_ENTER -> {
+                    checkAmtToPay()
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun showScreenAmount() {
+        if (addAmount > 0) {
+            AuxScreenController.getInstance().refreshContent(
+                Arrays.asList(
+                    "输入金额: +" + String.format("%.02f", addAmount / 100.0f),
+                    amountTxt.text.toString()
+                )
+            )
+        } else {
+            AuxScreenController.getInstance().refreshContent(Arrays.asList("输入金额:", amountTxt.text.toString()))
+        }
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    override fun isBackRuning(): Boolean {
+        return isBackRuning
+    }
+
+    fun showFixConsume(fixamt: Int) {
+        amountTxt.text = String.format("%.02f", fixamt / 100.0f)
+    }
+
+    override fun showRecentDtl(record: TransdtlUnionRecord?) {
+        if (record != null) {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "")
+            info.datetime = record.transdate + record.transtime
+            info.username = record.username
+            info.payamt = record.payamt
+            info.status = record.status
+            info.payway = record.payway
+            info.reversalFlag = record.reversalflag
+            refreshRecentDtl()
+        }
+    }
+
+    private fun resetPayShowCounter(timems: Long) {
+        counter?.cancel()
+        counter = LastPayShowTimer(timems, 500)
+        counter?.start()
+    }
+
+    private inner class LastPayShowTimer(millisInFuture: Long, countDownInterval: Long) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            clearLastPayResult()
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
index d42ccfc..216dfcd 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
@@ -1,8 +1,71 @@
 package com.supwisdom.activities.consume
 
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.consume.mode.CardPayService
+import com.supwisdom.utils.LogUtil
+import com.supwisdom.utils.PublicDef
+
 /**
  ** create by zzq on 2019/7/25
  ** @desc
  **/
-class ConsumePresenter constructor(iConsumeView: IConsumeView){
+class ConsumePresenter constructor(iConsumeView: IConsumeView) {
+    private val TAG = "ConsumePresenter"
+    private val iConsumeView = iConsumeView
+    private lateinit var handler: Handler
+    private var cardPayService: CardPayService
+
+    init {
+        createHandler()
+        cardPayService = CardPayService(iConsumeView, handler)
+    }
+
+    private fun createHandler() {
+        handler = object : android.os.Handler(Looper.getMainLooper()) {
+            override fun handleMessage(msg: Message) {
+                when (msg.what) {
+                    PublicDef.MSG_CARD_PAY_SUC -> iConsumeView.showConsumeSuc(msg.obj as CardUserInfoBean)
+                    PublicDef.MSG_CARD_PAYING,
+                    PublicDef.MSG_CARD_READ_AGAIN -> iConsumeView.showConsumeHint(msg.obj as String)
+                    PublicDef.MSG_CARD_PAY_FAIL -> {
+                        val ret = msg.obj as CardUserInfoBean
+                        LogUtil.d(TAG, "pay fail,reason=${ret.retmsg}")
+                        iConsumeView.showConsumeFail(ret)
+                    }
+                    PublicDef.MSG_CARD_REVERSE_FAIL -> {
+                        val ret = msg.obj as CardUserInfoBean
+                        LogUtil.d(TAG, "reverse fail,reason=${ret.retmsg}")
+                        iConsumeView.showReverseFail(msg.obj as CardUserInfoBean)
+                    }
+                    PublicDef.MSG_CARD_REVERSE_SUC -> iConsumeView.showReverseSuc(msg.obj as CardUserInfoBean)
+                    PublicDef.MSG_USER_INFO_SHOW -> iConsumeView.showUserInfo(msg.obj as CardUserInfoBean)
+                    PublicDef.MSG_USER_INFO_CLEAR -> iConsumeView.clearUserInfo(msg.obj as String)
+                    PublicDef.MSG_LINK_STATUS -> iConsumeView.refreshLinkStatus(msg.obj as Boolean)
+                }
+            }
+        }
+    }
+
+    fun start() {
+        cardPayService.start()
+    }
+
+    fun stop() {
+        cardPayService.stop()
+    }
+
+    fun clickNoPay() {
+        cardPayService.clickNoPay()
+    }
+
+    fun clickToPay(amount: Int) {
+        cardPayService.clickToPay(amount)
+    }
+
+    fun clickToReverse(amount: Int) {
+        cardPayService.clickToReverse(amount)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
index bca0fb1..d6c53bb 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -1,8 +1,33 @@
 package com.supwisdom.activities.consume
 
+import android.app.Activity
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.entity.TransdtlUnionRecord
+
 /**
  ** create by zzq on 2019/7/24
  ** @desc
  **/
 interface IConsumeView {
+    fun getActivity(): Activity
+
+    fun isBackRuning(): Boolean
+
+    fun showConsumeSuc(info: CardUserInfoBean)
+
+    fun showConsumeHint(hint: String)
+
+    fun showConsumeFail(info: CardUserInfoBean)
+
+    fun showReverseSuc(info: CardUserInfoBean)
+
+    fun showReverseFail(info: CardUserInfoBean)
+
+    fun showUserInfo(info: CardUserInfoBean)
+
+    fun clearUserInfo(datetime: String)
+
+    fun refreshLinkStatus(isOnline: Boolean)
+
+    fun showRecentDtl(record: TransdtlUnionRecord?)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardAccountRetBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardAccountRetBean.kt
new file mode 100644
index 0000000..461c16d
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardAccountRetBean.kt
@@ -0,0 +1,14 @@
+package com.supwisdom.activities.consume.bean
+
+import com.supwisdom.bean.BaseResp
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class CardAccountRetBean : BaseResp() {
+    var username: String? = null
+    var userid: Int = 0
+    var balance: Int = 0
+    var status: String? = null
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardBean.kt
index 162ff9b..f68486f 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardBean.kt
@@ -13,4 +13,6 @@
     var amount: Int = 0
     var username: String? = null
     var userid: Int = 0
+    var balance: Int? = null
+    var cardstatus: Int = 0
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
index 1fd28f2..10acf25 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
@@ -1,6 +1,8 @@
 package com.supwisdom.activities.consume.bean
 
 import com.supwisdom.bean.BaseResp
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
 
 /**
  ** create by zzq on 2019/7/25
@@ -9,4 +11,11 @@
 class CardUserInfoBean constructor(retcode: Int, retmsg: String) : BaseResp(retcode, retmsg) {
     var username: String? = null
     var showtime: Int = 3
+    var balance: Int? = null
+    var cardstatus: Int = 0
+    var payamt: Int = 0
+    var status: PayStatus? = null
+    var reversalFlag: ReversalFlag? = null
+    var datetime: String? = null
+    var payway: String? = null //card,code
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index c11c4d8..71f7899 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
@@ -4,10 +4,9 @@
 import android.os.Message
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.consume.IConsumeView
-import com.supwisdom.activities.consume.bean.CardBean
-import com.supwisdom.activities.consume.bean.CardPayConfirmRetBean
-import com.supwisdom.activities.consume.bean.CardPayInitRetBean
-import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.consume.bean.*
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlOfflineRecord
 import com.supwisdom.entity.TransdtlOnlineRecord
 import com.supwisdom.epaycard.Cardlib
@@ -54,14 +53,44 @@
         thread = null
     }
 
+    fun clickNoPay() {
+        clickStat = ClickStat.INIT
+        amount = 0
+    }
+
+    fun clickToPay(amount: Int) {
+        clickStat = ClickStat.PAY
+        this.amount = amount
+    }
+
+    fun clickToReverse(amount: Int) {
+        clickStat = ClickStat.REVERSE
+        this.amount = amount
+    }
+
     private inner class CardPayRunnable : Runnable {
         private lateinit var onlRecord: TransdtlOnlineRecord
         private lateinit var offRecord: TransdtlOfflineRecord
+        private var oldcardphyid: String? = null
+        private var onlineBalance = false
+        private var curLinkStatus = false
+        private var lastShowTime: Long = 0
+        private var lastUserInfoTime: Long = 0
+        private var curLinkRefreshTime: Long = 0
         override fun run() {
             while (!isExist) {
+                if (iConsumeView.isBackRuning()) {
+                    CommonUtil.doSleep(1000)
+                    continue
+                }
                 CommonUtil.doSleep(100)
                 try {
-                    readCard()
+                    val cardphyid = Cardlib.instance.requestCard()
+                    if (oldcardphyid != cardphyid) {
+                        readCard()
+                        cardBean.cardphyid = cardphyid
+                        oldcardphyid = cardphyid
+                    }
                     when (clickStat) {
                         ClickStat.PAY -> {
                             try {
@@ -75,32 +104,68 @@
                             try {
                                 doReverse()
                             } catch (ex: CardPayCancelFailError) {
-                                sendMsg(PublicDef.MSG_CARD_PAYCANCEL_FAIL, getErrorInfo(ex.message))
+                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getErrorInfo(ex.message))
                                 clickStat = ClickStat.INIT
                             }
                         }
                         ClickStat.INIT -> {
-
+                            if (SPApplication.getInstance().isOnline() && !onlineBalance) {
+                                onlineBalance = true
+                                getAccountInfoByCard()
+                            }
+                            val curtime = System.currentTimeMillis()
+                            if (curtime < lastUserInfoTime ||
+                                curtime - lastUserInfoTime > 1000
+                            ) {
+                                lastUserInfoTime = curtime
+                                showCardUserInfo()
+                            }
                         }
                     }
                 } catch (ex: CardNotFoundError) {
                     ex.printStackTrace()
-                    continue
+                    doClear()
                 }
-
             }
         }
 
+        private fun getAccountInfoByCard() {
+            val resp = consumeApi.accQuery(
+                pos.getConfigPara()!!.devphyid!!,
+                cardBean.cardphyid!!,
+                cardBean.cardNo!!
+            )
+            if (resp != null && resp.retcode == HttpStatus.SC_OK) {
+                val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardAccountRetBean::class.java)
+                if (retBean.retcode == PublicDef.SUCCESS) {
+                    cardBean.username = retBean.username
+                    cardBean.userid = retBean.userid
+                    cardBean.balance = retBean.balance
+                    cardBean.cardstatus = 1 //TODO
+                }
+            }
+        }
+
+        private fun showCardUserInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
+            info.username = cardBean.username
+            info.balance = cardBean.balance
+            info.cardstatus = cardBean.cardstatus
+            sendMsg(PublicDef.MSG_USER_INFO_SHOW, info)
+        }
+
         private fun readCard() {
-            val cardphyid = Cardlib.instance.requestCard()
             val cardinfo = Cardlib.instance.readCard()
             cardBean = CardBean()
-            cardBean.cardphyid = cardphyid
             cardBean.cardNo = cardinfo.cardNo
             cardBean.idCard = cardinfo.idCard
             cardBean.expireDate = cardinfo.expireDate
             cardBean.amount = amount
             cardBean.datetime = DateUtil.getNowDateTimeFormat()
+            /**
+             * 用户名默认用卡号代替,在线查询更新为用户名
+             */
+            cardBean.username = cardBean.cardNo
         }
 
         private fun doConsume() {
@@ -145,7 +210,7 @@
             }
             onlRecord.billno = retBean.billno
             onlRecord.username = retBean.username
-            onlRecord.userid = retBean.userid
+//            onlRecord.userid = retBean.userid
             return true
         }
 
@@ -180,9 +245,10 @@
             onlRecord.cardno = cardBean.cardNo
             onlRecord.cardphyid = cardBean.cardphyid
             onlRecord.payamt = cardBean.amount
+            onlRecord.reversalflag = ReversalFlag.NONE
             onlRecord.extraamt = 0
             onlRecord.transtype = "card"
-            onlRecord.status = "init"
+            onlRecord.status = PayStatus.INIT
             onlRecord.upflag = 1
             if (!pos.saveTransdtlOnline(onlRecord)) {
                 throw CardPayFailError("保存流水失败")
@@ -191,9 +257,9 @@
 
         private fun updateTransdtlOnline(issuccess: Boolean) {
             if (issuccess) {
-                onlRecord.status = "suc"
+                onlRecord.status = PayStatus.SUC
             } else {
-                onlRecord.status = "fail"
+                onlRecord.status = PayStatus.FAIL
             }
             onlRecord.upflag = 0
             if (!pos.updateTransdtlOnline(onlRecord)) {
@@ -212,10 +278,13 @@
             if (!sysRecord!!.offlineEnable) {
                 throw CardPayFailError("禁止离线交易")
             }
-            val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
-            val validdate = pos.getDynamicPara()!!.lastauthtime?.substring(0, 8) ?: "00000000"
-            if (offdate > validdate) {
-                throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
+            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
+            if (ctlRecord == null || ctlRecord.paraval != "1") {
+                val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
+                val validdate = pos.getDynamicPara()!!.lastauthtime?.substring(0, 8) ?: "00000000"
+                if (offdate > validdate) {
+                    throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
+                }
             }
 
             val whiteRecord =
@@ -241,9 +310,10 @@
             offRecord.cardno = cardBean.cardNo
             offRecord.cardphyid = cardBean.cardphyid
             offRecord.payamt = cardBean.amount
+            offRecord.reversalflag = ReversalFlag.NONE
             offRecord.extraamt = 0
             offRecord.managefeetype = "none"
-            offRecord.status = "init"
+            offRecord.status = PayStatus.INIT
             offRecord.upflag = 1
             if (!pos.saveTransdtlOffline(offRecord)) {
                 throw CardPayFailError("保存流水失败")
@@ -252,9 +322,9 @@
 
         private fun updateTransdtlOffline(issuccess: Boolean) {
             if (issuccess) {
-                offRecord.status = "suc"
+                offRecord.status = PayStatus.SUC
             } else {
-                offRecord.status = "fail"
+                offRecord.status = PayStatus.FAIL
             }
             offRecord.upflag = 0
             if (!pos.updateTransdtlOffline(offRecord)) {
@@ -262,6 +332,44 @@
             }
         }
 
+        private fun doClear() {
+            oldcardphyid = null
+            onlineBalance = false
+            val curtime = System.currentTimeMillis()
+            if (curtime < lastShowTime ||
+                curtime - lastShowTime > 1000
+            ) {
+                lastShowTime = curtime
+                sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDate())
+                showLinkStatus()
+            }
+        }
+
+        private fun showLinkStatus() {
+            if (SPApplication.getInstance().isOnline()) {
+                if (!curLinkStatus) {
+                    curLinkRefreshTime = System.currentTimeMillis()
+                    curLinkStatus = true
+                    sendMsg(PublicDef.MSG_LINK_STATUS, true)
+                    return
+                }
+            } else {
+                if (curLinkStatus) {
+                    curLinkStatus = false
+                    curLinkRefreshTime = System.currentTimeMillis()
+                    sendMsg(PublicDef.MSG_LINK_STATUS, false)
+                    return
+                }
+            }
+            val t = System.currentTimeMillis()
+            if (t < curLinkRefreshTime ||
+                t - curLinkRefreshTime > 30000
+            ) {
+                curLinkRefreshTime = t
+                sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
+            }
+        }
+
         private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
             val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
             info.showtime = pos.getSysPara()!!.consumeFailShowtime
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/ConsumeApi.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/ConsumeApi.kt
index 54627af..e6c49b1 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/ConsumeApi.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/ConsumeApi.kt
@@ -49,4 +49,13 @@
 
         return YktSession.getInstance().sendYktRequestPost("/api/pos/payquery", "", params)
     }
+
+    fun accQuery(devphyid: String, cardphyid: String, cardno: String): TransResp? {
+        val params = WebParams()
+        params.setParameter("devphyid", devphyid)
+            .setParameter("cardphyid", cardphyid)
+            .setParameter("cardno", cardno)
+
+        return YktSession.getInstance().sendYktRequestPost("/api/pos/accquery", "", params)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
new file mode 100644
index 0000000..b047f21
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.activities.transdtl
+
+import com.supwisdom.activities.BaseActivity
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class TransdtlActivity : BaseActivity() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index aaac8dc..347db4a 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -58,6 +58,8 @@
         transtype,
         payamt,
         extraamt,
+        managefeetype,
+        username,
         billno,
         reversalflag,
         reversalbillno,
@@ -90,6 +92,7 @@
     }
 
     enum class TransdtlUnion {
+        username,
         transdate,
         transtime,
         devseqno,
diff --git a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
index 6fd57b1..a814f3a 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -62,6 +62,8 @@
             + BeanPropEnum.TransdtlOnline.transtype + " varchar(8),"
             + BeanPropEnum.TransdtlOnline.payamt + " integer,"
             + BeanPropEnum.TransdtlOnline.extraamt + " integer,"
+            + BeanPropEnum.TransdtlOnline.managefeetype + " varchar(10),"
+            + BeanPropEnum.TransdtlOnline.username + " varchar(32),"
             + BeanPropEnum.TransdtlOnline.billno + " varchar(32),"
             + BeanPropEnum.TransdtlOnline.reversalflag + " varchar(8),"
             + BeanPropEnum.TransdtlOnline.reversalbillno + " varchar(32),"
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index f40b672..9d3d760 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -128,6 +128,9 @@
         record.qrcode = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.qrcode.toString()))
         record.transtype = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transtype.toString()))
         record.billno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.billno.toString()))
+        record.managefeetype =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.managefeetype.toString()))
+        record.username = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.username.toString()))
         record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.payamt.toString()))
         record.extraamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.extraamt.toString()))
         var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
@@ -163,6 +166,8 @@
         values.put(BeanPropEnum.TransdtlOnline.payamt.toString(), record.payamt)
         values.put(BeanPropEnum.TransdtlOnline.extraamt.toString(), record.extraamt)
         values.put(BeanPropEnum.TransdtlOnline.billno.toString(), record.billno)
+        values.put(BeanPropEnum.TransdtlOnline.managefeetype.toString(), record.managefeetype)
+        values.put(BeanPropEnum.TransdtlOnline.username.toString(), record.username)
         values.put(BeanPropEnum.TransdtlOnline.reversalflag.toString(), record.reversalflag.toString())
         values.put(BeanPropEnum.TransdtlOnline.reversalbillno.toString(), record.reversalbillno)
         values.put(BeanPropEnum.TransdtlOnline.status.toString(), record.status.toString())
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
index 62bd5d6..99b2107 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -24,6 +24,8 @@
             .append(BeanPropEnum.TransdtlOffline.reversalflag).append(",")
             .append(BeanPropEnum.TransdtlOffline.payamt).append(",")
             .append(BeanPropEnum.TransdtlOffline.status).append(",")
+            .append(BeanPropEnum.TransdtlOffline.cardno).append(" as ").append(BeanPropEnum.TransdtlUnion.username)
+            .append(",")
             .append(BeanPropEnum.TransdtlOffline.upflag)
             .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE)
             .append(" UNION ALL select ")
@@ -33,9 +35,10 @@
             .append(BeanPropEnum.TransdtlOnline.transtype).append(" as ").append(BeanPropEnum.TransdtlUnion.payway)
             .append(",")
             .append(BeanPropEnum.TransdtlOnline.reversalflag).append(",")
-            .append(BeanPropEnum.TransdtlOffline.payamt).append(",")
-            .append(BeanPropEnum.TransdtlOffline.status).append(",")
-            .append(BeanPropEnum.TransdtlOffline.upflag)
+            .append(BeanPropEnum.TransdtlOnline.payamt).append(",")
+            .append(BeanPropEnum.TransdtlOnline.status).append(",")
+            .append(BeanPropEnum.TransdtlOnline.username).append(",")
+            .append(BeanPropEnum.TransdtlOnline.upflag)
             .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_ONLINE)
     }
 
@@ -96,6 +99,7 @@
         record.transtime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transtime.toString()))
         record.devseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.devseqno.toString()))
         record.payway = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payway.toString()))
+        record.username = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.username.toString()))
         var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.reversalflag.toString()))
         when (flag) {
             ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
index 8114a10..b2b0d6e 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -17,7 +17,7 @@
     var extraamt: Int = 0
     var managefeetype: String? = null // none,discount,mealer
     var username: String? = null
-    var userid: Int = 0
+    //    var userid: Int = 0
     var billno: String? = null
     var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
     var reversalbillno: String? = null //被冲正交易参考号
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
index 184265c..bc78c6f 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
@@ -5,6 +5,7 @@
  ** @desc
  **/
 class TransdtlUnionRecord {
+    var username: String? = null
     var transdate: String? = null
     var transtime: String? = null
     var devseqno: Int = 0
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index d0cf3de..d5fac32 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -22,11 +22,15 @@
     /**************************************************************/
     /*************************handler 状态码***********************/
     const val MSG_CARD_PAYING = 10
-    const val MSG_CARD_PAY_FAIL = 11
-    const val MSG_CARD_PAY_SUC = 12
-    const val MSG_CARD_PAY_QUERY = 13
-    const val MSG_CARD_PAYCANCEL_FAIL = 14
-    const val MSG_CARD_PAYCANCEL_SUC = 15
+    const val MSG_CARD_READ_AGAIN = 11
+    const val MSG_CARD_PAY_FAIL = 12
+    const val MSG_CARD_PAY_SUC = 13
+    const val MSG_CARD_PAY_QUERY = 14
+    const val MSG_CARD_REVERSE_FAIL = 15
+    const val MSG_CARD_REVERSE_SUC = 16
+    const val MSG_USER_INFO_SHOW = 17
+    const val MSG_USER_INFO_CLEAR = 18
+    const val MSG_LINK_STATUS = 19
     /*************************不能重复*****************************/
     /**
      * 卡消费标志(1 byte)
@@ -74,6 +78,10 @@
     const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
     const val CONTROL_DEBUG_ENABLE = "debugenable"
     /**
+     * 非定额消费标识
+     */
+    const val CONTROL_NO_FIXPAY_FLAG = "none"
+    /**
      * 消费冲正时限
      */
     const val REVERSE_MS_GAP = 600000
diff --git a/app/src/main/java/com/supwisdom/utils/SoundUtil.kt b/app/src/main/java/com/supwisdom/utils/SoundUtil.kt
new file mode 100644
index 0000000..2c80655
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/SoundUtil.kt
@@ -0,0 +1,70 @@
+package com.supwisdom.utils
+
+import android.content.Context
+import android.media.AudioManager
+import android.media.SoundPool
+import com.supwisdom.R
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+object SoundUtil {
+    private var soundId: Int = 0
+    private var soundPool: SoundPool? = null
+    private val soundMap = hashMapOf<Int, Int>()
+    private var keyEnable = false
+
+    fun playMusic(context: Context, mid: Int) {
+        if (!keyEnable && isKeyPlay(mid)) {
+            return
+        }
+        if (soundPool == null) {
+            soundPool = SoundPool(30, AudioManager.STREAM_MUSIC, 0) //分别对应声音池数量,AudioManager.STREAM_MUSIC 和 0
+        }
+        if (soundMap.containsKey(mid)) {
+            soundPool!!.play(soundMap[mid]!!, 1.0f, 1.0f, 1, 0, 1.0f)
+        } else {
+            soundId = soundPool!!.load(context, mid, 1)
+            soundPool!!.setOnLoadCompleteListener { pool, sampleId, status ->
+                soundMap[mid] = soundId
+                //  加载完成
+                pool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f)
+            }
+        }
+    }
+
+    fun releaseMusic() {
+        if (soundPool != null) {
+            soundPool!!.release()
+            soundPool = null
+        }
+        soundMap.clear()
+    }
+
+    fun setKeyPlay(enable: Boolean) {
+        keyEnable = enable
+    }
+
+    private fun isKeyPlay(mid: Int): Boolean {
+        return mid == R.raw.key_one ||
+                mid == R.raw.key_two ||
+                mid == R.raw.key_three ||
+                mid == R.raw.key_four ||
+                mid == R.raw.key_five ||
+                mid == R.raw.key_six ||
+                mid == R.raw.key_seven ||
+                mid == R.raw.key_eight ||
+                mid == R.raw.key_nine ||
+                mid == R.raw.key_zero ||
+                mid == R.raw.key_dot ||
+                mid == R.raw.key_add ||
+                mid == R.raw.key_clear ||
+                mid == R.raw.key_enter ||
+                mid == R.raw.key_fone ||
+                mid == R.raw.key_ftwo ||
+                mid == R.raw.key_fthree ||
+                mid == R.raw.key_ffour
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_consume.xml b/app/src/main/res/layout/activity_consume.xml
new file mode 100644
index 0000000..b4565e0
--- /dev/null
+++ b/app/src/main/res/layout/activity_consume.xml
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/light_blue2"
+    android:focusable="true"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="20dp"
+        android:layout_marginTop="20dp"
+        android:layout_marginRight="20dp"
+        android:background="@drawable/corner_bg_white"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="304dp"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="130dp"
+                android:orientation="horizontal"
+                android:padding="@dimen/consume_text_pad_size"
+                android:weightSum="3">
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="2"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:layout_width="60dp"
+                        android:layout_height="60dp"
+                        android:layout_gravity="center"
+                        android:scaleType="fitXY"
+                        android:src="@mipmap/shop_logo" />
+
+                    <LinearLayout
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_gravity="center"
+                        android:layout_marginLeft="10dp"
+                        android:layout_marginTop="8dp"
+                        android:orientation="vertical"
+                        android:padding="1dp">
+
+                        <TextView
+                            android:id="@+id/consume_shopname"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:maxLines="2"
+                            android:text=""
+                            android:textColor="@color/blue"
+                            android:textSize="28sp" />
+
+                        <TextView
+                            android:id="@+id/consume_time"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:gravity="start"
+                            android:maxLines="1"
+                            android:text=""
+                            android:textColor="@color/blue"
+                            android:textSize="22sp" />
+                    </LinearLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center"
+                    android:layout_weight="1"
+                    android:gravity="right"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:id="@+id/consume_linklogo"
+                        android:layout_width="30dp"
+                        android:layout_height="30dp"
+                        android:scaleType="fitXY"
+                        android:src="@drawable/wireless_on" />
+
+                    <TextView
+                        android:id="@+id/consume_linkstat"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:maxLines="1"
+                        android:text="已联网"
+                        android:textColor="@color/blue"
+                        android:textSize="22sp" />
+                </LinearLayout>
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginLeft="10dp"
+                android:layout_marginRight="10dp"
+                android:background="@color/black" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="horizontal"
+                android:padding="@dimen/consume_text_pad_size">
+
+                <TextView
+                    android:id="@+id/tv_consume_hint"
+                    android:layout_width="300dp"
+                    android:layout_height="match_parent"
+                    android:gravity="start|center"
+                    android:text="消费金额"
+                    android:textColor="@color/blue"
+                    android:textSize="50sp"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/consume_amt"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:gravity="center"
+                    android:maxLines="1"
+                    android:text="0"
+                    android:textColor="@color/orange1"
+                    android:textSize="65sp"
+                    android:textStyle="bold" />
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="20dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginRight="20dp"
+        android:background="@drawable/corner_bg_ordinary_consume_green"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <ImageView
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:scaleType="fitXY"
+                android:src="@mipmap/show_card_info" />
+
+            <TextView
+                android:id="@+id/tv_card_info"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="校园卡信息"
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginLeft="10dp"
+            android:layout_marginTop="5dp"
+            android:layout_marginRight="10dp"
+            android:layout_marginBottom="5dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="10dp"
+            android:layout_marginTop="5dp"
+            android:orientation="vertical">
+
+            <ImageView
+                android:layout_width="80dp"
+                android:layout_height="80dp"
+                android:layout_gravity="center"
+                android:scaleType="fitXY"
+                android:src="@mipmap/default_photo"
+                android:visibility="gone" />
+
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:padding="@dimen/consume_text_pad_size1"
+                android:text="如需查询余额,请刷卡!"
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                    style="@style/consume_wait_account_paraname_style"
+                    android:text="姓    名:  " />
+
+                <TextView
+                    android:id="@+id/consume_custname"
+                    style="@style/consume_wait_account_paraval_style" />
+            </LinearLayout>
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                    style="@style/consume_wait_account_paraname_style"
+                    android:text="学工号:  " />
+
+                <TextView
+                    android:id="@+id/consume_stuempno"
+                    style="@style/consume_wait_account_paraval_style" />
+            </LinearLayout>
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                    style="@style/consume_wait_account_paraname_style"
+                    android:text="余    额:  " />
+
+                <TextView
+                    android:id="@+id/consume_balance"
+                    style="@style/consume_wait_account_paraval_style" />
+            </LinearLayout>
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                    style="@style/consume_wait_account_paraname_style"
+                    android:text="卡状态:  " />
+
+                <TextView
+                    android:id="@+id/consume_cardstatus"
+                    style="@style/consume_wait_account_paraval_style" />
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="20dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginRight="20dp"
+        android:layout_marginBottom="20dp"
+        android:background="@drawable/corner_bg_ordinary_consume_green"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:padding="@dimen/consume_text_pad_size1">
+
+            <ImageView
+                android:layout_width="40dp"
+                android:layout_height="40dp"
+                android:scaleType="fitXY"
+                android:src="@mipmap/bill_lastdtl" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="最近一笔"
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginLeft="10dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginRight="10dp"
+            android:layout_marginBottom="5dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="10dp"
+            android:paddingTop="10dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="支付结果:  "
+                android:textColor="@color/black"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <TextView
+                android:id="@+id/consume_last_result"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:maxLines="1"
+                android:text=""
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/ll_consume_last_failreason"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="10dp"
+            android:paddingTop="5dp"
+            android:visibility="gone">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="失败提示:  "
+                android:textColor="@color/cl_red"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <TextView
+                android:id="@+id/consume_last_failreason"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:maxLines="1"
+                android:text=""
+                android:textColor="@color/cl_red"
+                android:textSize="@dimen/consume_text_size2"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/ll_consume_last_payamt"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="10dp"
+            android:paddingTop="5dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="支付金额:  "
+                android:textColor="@color/black"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <TextView
+                android:id="@+id/consume_last_payamt"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:maxLines="1"
+                android:text=""
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="10dp"
+            android:paddingTop="5dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="支付方式:  "
+                android:textColor="@color/black"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <TextView
+                android:id="@+id/consume_last_payway"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:maxLines="1"
+                android:text=""
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="10dp"
+            android:paddingTop="5dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="支付日期:  "
+                android:textColor="@color/black"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <TextView
+                android:id="@+id/consume_last_payday"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:maxLines="1"
+                android:text=""
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingLeft="10dp"
+            android:paddingTop="5dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:text="支付时间:  "
+                android:textColor="@color/black"
+                android:textSize="@dimen/consume_text_size2" />
+
+            <TextView
+                android:id="@+id/consume_last_paytime"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:maxLines="1"
+                android:text=""
+                android:textColor="@color/blue"
+                android:textSize="@dimen/consume_text_size2"
+                android:textStyle="bold" />
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file