Merge tag '1.0.1' into develop

tag 1.0.1
diff --git a/app/build.gradle b/app/build.gradle
index e9986f9..96711f5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,7 +8,7 @@
 android {
     compileSdkVersion 28
     defaultConfig {
-        applicationId "com.supwisdom.posa711"
+        applicationId "com.supwisdom.posa711dali"
         minSdkVersion 22
         targetSdkVersion 28
         versionCode 1
diff --git a/app/src/main/java/com/supwisdom/activities/CrashHandler.kt b/app/src/main/java/com/supwisdom/activities/CrashHandler.kt
index 48caaf3..6c60829 100644
--- a/app/src/main/java/com/supwisdom/activities/CrashHandler.kt
+++ b/app/src/main/java/com/supwisdom/activities/CrashHandler.kt
@@ -15,6 +15,7 @@
  ** create by zzq on 2019/7/23
  ** @desc
  **/
+@Suppress("DEPRECATION")
 class CrashHandler : Thread.UncaughtExceptionHandler {
     private var context: Context? = null
     private var mDefaultHandler: Thread.UncaughtExceptionHandler? = null
diff --git a/app/src/main/java/com/supwisdom/activities/SPApplication.kt b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
index 61e704d..781fd44 100644
--- a/app/src/main/java/com/supwisdom/activities/SPApplication.kt
+++ b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
@@ -5,7 +5,6 @@
 import android.support.multidex.MultiDex
 import android.support.multidex.MultiDexApplication
 import com.supwisdom.db.Pos
-import com.supwisdom.service.BackgroundTaskService
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.PublicDef
 
@@ -60,11 +59,11 @@
 
     private fun startService() {
         if (!CommonUtil.isServiceWork(this, PublicDef.BG_SERVICE_NAME)) {
-            startService(Intent(this, BackgroundTaskService::class.java))
+            startService(Intent(this, ServiceDemo::class.java))
         }
     }
 
     fun stopService() {
-        stopService(Intent(this, BackgroundTaskService::class.java))
+        stopService(Intent(this, ServiceDemo::class.java))
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt b/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
index c0bc6b1..90d1564 100644
--- a/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
+++ b/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
@@ -2,14 +2,81 @@
 
 import android.app.Service
 import android.content.Intent
+import android.os.Binder
 import android.os.IBinder
+import com.supwisdom.service.BackgroundTaskService
+import com.supwisdom.utils.CommonUtil
 
 /**
  ** create by zzq on 2019/7/23
  ** @desc
  **/
 class ServiceDemo : Service() {
+    private var guardThread: Thread? = null
+    private var bind: ServiceBind? = null
+    private var bgTask: BackgroundTaskService? = null
+    private val pos = SPApplication.getInstance().getPos()
+    @Volatile
+    private var isExist = false
+
+    override fun onCreate() {
+        super.onCreate()
+    }
+
+    override fun onDestroy() {
+        closeThread()
+        super.onDestroy()
+    }
+
     override fun onBind(intent: Intent): IBinder? {
-        return null
+        if (bind == null) {
+            bind = ServiceBind()
+        }
+        return bind
+    }
+
+    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
+        createThread()
+        return super.onStartCommand(intent, flags, startId)
+    }
+
+    private fun createThread() {
+        isExist = false
+        if (bgTask == null) {
+            bgTask = BackgroundTaskService()
+        }
+        if (guardThread == null) {
+            guardThread = GuardThread()
+            guardThread!!.start()
+        }
+    }
+
+    private fun closeThread() {
+        bgTask?.interrupt()
+        bgTask = null
+        isExist = true
+        guardThread?.interrupt()
+        guardThread = null
+    }
+
+    private inner class GuardThread : Thread() {
+        override fun run() {
+            CommonUtil.doSleep(60 * 1000)
+            while (!isExist) {
+                val hasInit = pos.getConfigPara()?.initOK ?: false
+                if (hasInit) {
+                    break
+                }
+                CommonUtil.doSleep(1000)
+            }
+            if (!isExist) {
+                bgTask!!.start()
+            }
+        }
+    }
+
+    inner class ServiceBind : Binder() {
+        val serviceDemo: ServiceDemo
+            get() = this@ServiceDemo
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
index f64c8cb..1417fe2 100644
--- a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
@@ -23,7 +23,7 @@
 @Suppress("DEPRECATION")
 class CardlibActivity : BaseActivity(), ICardlibView {
     private val pos = SPApplication.getInstance().getPos()
-    private var vResult: TextView? = null
+    private lateinit var vResult: TextView
     private var vProgressBar: ProgressBar? = null
     private var presenter: CardlibPresenter? = null
     @Volatile
@@ -86,14 +86,14 @@
     override fun showInitCardlibResult(issuccess: Boolean, msg: String) {
         if (issuccess) {
             val record = pos.getConfigPara()
-            if (record != null && record.initOK) {
+            if (record != null && record.initOK && pos.getDynamicPara() != null) {
                 jumpActivity(LoadActivity::class.java)
             } else {
                 jumpActivity(InitActivity::class.java)
             }
         } else {
-            vResult!!.text = msg
-            vResult!!.visibility = View.VISIBLE
+            vResult.text = msg
+            vResult.visibility = View.VISIBLE
             AuxScreenController.getInstance().refreshTitle("卡库初始化")
             AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
             AuxScreenController.getInstance().refreshContent(listOf("请联系管理员", "加载驱动失败", "原因:", msg))
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 6308775..5a07853 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -14,6 +14,7 @@
 import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
 import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.bean.CardStatus
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
 import com.supwisdom.activities.menu.MenuActivity
 import com.supwisdom.activities.transdtl.TransdtlActivity
@@ -40,16 +41,15 @@
     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 vCitizenName: TextView
+    private lateinit var vCitizenCardno: 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 vLastCardno: 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
@@ -83,9 +83,14 @@
         presenter.start()
         beepManager = BeepManager(this)
         dialogPurchase = DialogPurchase(this, object : DialogPurchase.ICallBack {
-            override fun callback(isManualCancel: Boolean) {
-                presenter.clickNoPay()
-                amountTxt.text = ""
+            override fun callback(isManualCancel: Boolean, isPaying: Boolean) {
+                if (isPaying) {
+                    presenter.clickToInterrupt()
+                } else {
+                    presenter.clickNoPay()
+                    amountTxt.text = ""
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
+                }
             }
 
             override fun callback(code: String) {
@@ -116,24 +121,24 @@
                 }
             }
         })
+        presenter.loadLastTransdtl()
     }
 
     private fun initView() {
-        vShopname = this.findViewById<TextView>(R.id.consume_shopname)
-        vLinkLogo = this.findViewById<ImageView>(R.id.consume_linklogo)
-        vLinkstat = this.findViewById<TextView>(R.id.consume_linkstat)
-        amountTxt = this.findViewById<TextView>(R.id.consume_amt)
-        vCustname = this.findViewById<TextView>(R.id.consume_custname)
-        vStuempno = this.findViewById<TextView>(R.id.consume_stuempno)
-        vCardstatus = this.findViewById<TextView>(R.id.consume_cardstatus)
-        vBalance = this.findViewById<TextView>(R.id.consume_balance)
-        vTime = this.findViewById<TextView>(R.id.consume_time)
-        vLastResult = this.findViewById<TextView>(R.id.consume_last_result)
-        vLastPayamt = this.findViewById<TextView>(R.id.consume_last_payamt)
-        vLastPayway = this.findViewById<TextView>(R.id.consume_last_payway)
-        vLastPayday = this.findViewById<TextView>(R.id.consume_last_payday)
-        vLastPaytime = this.findViewById<TextView>(R.id.consume_last_paytime)
-        vLastPayFailreason = this.findViewById<TextView>(R.id.consume_last_failreason)
+        vShopname = this.findViewById<TextView>(R.id.tv_shopname)
+        vLinkLogo = this.findViewById<ImageView>(R.id.tv_linklogo)
+        vLinkstat = this.findViewById<TextView>(R.id.tv_linkstat)
+        amountTxt = this.findViewById<TextView>(R.id.tv_input_amt)
+        vCitizenName = this.findViewById<TextView>(R.id.tv_citizen_name)
+        vCitizenCardno = this.findViewById<TextView>(R.id.tv_citizen_cardno)
+        vCardstatus = this.findViewById<TextView>(R.id.tv_cardstatus)
+        vTime = this.findViewById<TextView>(R.id.tv_nowtime)
+        vLastResult = this.findViewById<TextView>(R.id.tv_last_pay_result)
+        vLastCardno = this.findViewById<TextView>(R.id.tv_last_cardno)
+        vLastPayamt = this.findViewById<TextView>(R.id.tv_last_payamt)
+        vLastPayway = this.findViewById<TextView>(R.id.tv_last_payway)
+        vLastPaytime = this.findViewById<TextView>(R.id.tv_last_paytime)
+        vLastPayFailreason = this.findViewById<TextView>(R.id.tv_last_failreason)
         vLastPayFailll = this.findViewById<LinearLayout>(R.id.ll_consume_last_failreason)
         vLastPayamtll = this.findViewById<LinearLayout>(R.id.ll_consume_last_payamt)
     }
@@ -214,33 +219,22 @@
 
     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
+        vCitizenName.text = info.username
+        vCitizenCardno.text = info.cardno
+        vCardstatus.text = info.cardstatus?.toString()
+        if (info.cardstatus != CardStatus.NORMAL) {
             vCardstatus.setTextColor(Color.RED)
-            vBalance.text = null
+        } else {
+            vCardstatus.setTextColor(resources.getColor(R.color.blue))
         }
     }
 
     private var lastshowtime: String? = null
     override fun clearUserInfo(datetime: String) {
         if (!isBackRuning) {
-            vCustname.text = null
-            vStuempno.text = null
+            vCitizenName.text = null
+            vCitizenCardno.text = null
             vCardstatus.text = null
-            vBalance.text = null
             val tmptime = datetime.substring(0, 16)
             if (lastshowtime != tmptime) {
                 lastshowtime = tmptime
@@ -266,15 +260,22 @@
     }
 
     private fun dealIntent() {
-        amount = this.intent.getIntExtra("amount", 0)
+        amount = this.intent.getStringExtra("amount")?.toInt() ?: 0
         payWay = this.intent.getStringExtra("payway")
+        val operation = this.intent.getStringExtra("operation")
+        if (operation == "reverse") {
+            presenter.clickToReverse(amount)
+            dialogPurchase!!.show("等待冲正", CommonUtil.showFormatAmount("金额", amount))
+        }
         this.intent.putExtra("amount", "0")
         this.intent.putExtra("payway", "")
+        this.intent.putExtra("operation", "")
     }
 
     override fun onNewIntent(intent: Intent) {
         this.intent.putExtra("amount", intent.getStringExtra("amount"))
         this.intent.putExtra("payway", intent.getStringExtra("payway"))
+        this.intent.putExtra("operation", intent.getStringExtra("operation"))
     }
 
     private fun refresh() {
@@ -301,6 +302,7 @@
             try {
                 amount = Integer.parseInt(record.paraval)
                 amountTxt.text = String.format("%.02f", amount / 100.0f)
+                payStatusEnable = true
                 presenter.clickToPay(amount)
                 showDialogPay()
             } catch (ex: Exception) {
@@ -341,6 +343,7 @@
         }
         AuxScreenController.getInstance().refreshContent(auxList)
         SoundUtil.playMusic(applicationContext, R.raw.consume_suc)
+        refreshRecentDtl(info)
     }
 
     override fun showConsumeHint(hint: String) {
@@ -349,10 +352,23 @@
         AuxScreenController.getInstance().refreshContent(Arrays.asList(hint, amountStr))
     }
 
+    override fun showConsumeQuery(hint: String) {
+        dialogPurchase!!.showQueryProcess(hint, "请耐心等待")
+        AuxScreenController.getInstance().refreshContent(Arrays.asList(hint, "请耐心等待"))
+    }
+
+    override fun showConsumeInterrupt(info: CardUserInfoBean) {
+        showPayInterrupt(info.cardno)
+        dialogPurchase!!.showPayInterrupt()
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("交易取消", "以银行交易为准"))
+        SoundUtil.playMusic(applicationContext, R.raw.pay_cancel)
+    }
+
     override fun showConsumeFail(info: CardUserInfoBean) {
         dialogPurchase!!.showPayFail(info)
-        SoundUtil.playMusic(applicationContext, R.raw.consume_fail)
         AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("消费失败", "原因:", info.retmsg))
+        SoundUtil.playMusic(applicationContext, R.raw.consume_fail)
+        refreshRecentDtl(info)
     }
 
     override fun showReverseSuc(info: CardUserInfoBean) {
@@ -360,23 +376,35 @@
         AuxScreenController.getInstance()
             .refreshContent(Arrays.asList<String>(info.retmsg, CommonUtil.showFormatAmount("金额", info.payamt)))
         SoundUtil.playMusic(applicationContext, R.raw.reversal_suc)
+        refreshRecentDtl(info)
     }
 
     override fun showReverseFail(info: CardUserInfoBean) {
         dialogPurchase!!.showReverseFail(info)
-        SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
         AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.retmsg))
+        SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
+        refreshRecentDtl(info)
     }
 
-    private var lastShowRecentDatetime: String? = null
+    private var lastShowRecentTime: String? = null
     private fun refreshRecentDtl(info: CardUserInfoBean?) {
         if (info != null) {
+            val showtime: Long = 30 * 1000
             lastPayInfo = info
+            if (lastShowRecentTime == null) {
+                if (info.transtime != null) {
+                    val paytime = DateUtil.timeFormatConvertToLong(info.transtime!!)
+                    val nowtime = DateUtil.timeFormatConvertToLong(DateUtil.getNowTimeNoFormat())
+                    if (nowtime - paytime > showtime) {
+                        return
+                    }
+                }
+            }
             //已显示过不在显示
-            if (lastShowRecentDatetime == info.datetime) {
+            if (lastShowRecentTime == info.transtime) {
                 return
             }
-            lastShowRecentDatetime = info.datetime
+            lastShowRecentTime = info.transtime
 
             if (info.status == PayStatus.SUC) {
                 when {
@@ -399,25 +427,32 @@
                 vLastPayamtll.visibility = View.GONE
                 vLastPayFailreason.text = info.retmsg
             }
-
+            vLastCardno.text = info.cardno
             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))
+            sb.append(info.transtime?.substring(0, 2)).append(":")
+                .append(info.transtime?.substring(2, 4)).append(":")
+                .append(info.transtime?.substring(4))
             vLastPaytime.text = sb.toString()
-            resetPayShowCounter(10 * 1000)
+            resetPayShowCounter(showtime)
         }
     }
 
+    private fun showPayInterrupt(cardno: String?) {
+        vLastResult.text = "交易取消"
+        vLastPayFailll.visibility = View.VISIBLE
+        vLastPayamtll.visibility = View.GONE
+        vLastPayFailreason.text = "以银行交易为准"
+        vLastCardno.text = cardno
+        vLastPayway.text = "card"
+        vLastPaytime.text = DateUtil.getNowTime()
+        resetPayShowCounter(30 * 1000)
+    }
+
     private fun delValueToEdit() {
         presenter.clickNoPay()
         val str = amountTxt.text.toString()
@@ -437,7 +472,10 @@
     private fun checkAmtToPay() {
         amount = getCurAmount() + addAmount
         if (amount > 0) {
+            AuxScreenController.getInstance()
+                .refreshContent(Arrays.asList("等待付款", CommonUtil.showFormatAmount("金额", amount)))
             amountTxt.text = String.format("%.02f", amount / 100.0f)
+            payStatusEnable = true
             presenter.clickToPay(amount)
             showDialogPay()
         } else {
@@ -472,8 +510,8 @@
                 amountTxt.text = "$str$value"
             }
         } else {
-            //限制消费金额<1000
-            if (str.length < 3) {
+            //限制消费金额<10000
+            if (str.length < 4) {
                 amountTxt.text = "$str$value"
             }
         }
@@ -482,9 +520,9 @@
 
     private fun clearLastPayResult() {
         vLastResult.text = null
+        vLastCardno.text = null
         vLastPayamt.text = null
         vLastPayway.text = null
-        vLastPayday.text = null
         vLastPaytime.text = null
         vLastPayFailreason.text = null
     }
@@ -513,8 +551,10 @@
     override fun showRecentDtl(record: TransdtlUnionRecord?) {
         if (record != null) {
             val info = CardUserInfoBean(PublicDef.SUCCESS, "")
-            info.datetime = record.transdate + record.transtime
+            info.transdate = record.transdate
+            info.transtime = record.transtime
             info.username = record.username
+            info.cardno = record.cardno
             info.payamt = record.payamt
             info.status = record.status
             info.payway = record.payway
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 268a67f..b5aeb03 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
@@ -3,9 +3,11 @@
 import android.os.Handler
 import android.os.Looper
 import android.os.Message
+import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
 import com.supwisdom.activities.consume.mode.CardPayService
 import com.supwisdom.activities.consume.mode.CodePayService
+import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.LogUtil
 import com.supwisdom.utils.PublicDef
 import com.supwisdom.utils.ThreadPool
@@ -16,6 +18,7 @@
  **/
 class ConsumePresenter constructor(iConsumeView: IConsumeView) {
     private val TAG = "ConsumePresenter"
+    private val pos = SPApplication.getInstance().getPos()
     private val iConsumeView = iConsumeView
     private val codePayRunnable = CodePayRunnable()
     private lateinit var handler: Handler
@@ -39,11 +42,17 @@
                     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_QUERY -> iConsumeView.showConsumeQuery(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_PAYING_INTERRUPT -> {
+                        val ret = msg.obj as CardUserInfoBean
+                        LogUtil.d(TAG, "pay interrupt,reason=${ret.retmsg}")
+                        iConsumeView.showConsumeInterrupt(ret)
+                    }
                     PublicDef.MSG_CARD_REVERSE_FAIL -> {
                         val ret = msg.obj as CardUserInfoBean
                         LogUtil.d(TAG, "reverse fail,reason=${ret.retmsg}")
@@ -78,6 +87,10 @@
         cardPayService.clickToReverse(amount)
     }
 
+    fun clickToInterrupt() {
+        cardPayService.clickToInterrupt()
+    }
+
     fun codeToPay(code: String, amount: Int) {
         this.code = code
         this.amount = amount
@@ -94,6 +107,17 @@
         codePayService.interruptPay()
     }
 
+    fun loadLastTransdtl() {
+        ThreadPool.getShortPool().execute(Runnable {
+            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+            if (list.isNotEmpty()) {
+                iConsumeView.getActivity().runOnUiThread {
+                    iConsumeView.showRecentDtl(list[0])
+                }
+            }
+        })
+    }
+
     private inner class CodePayRunnable : Runnable {
         override fun run() {
             codePayService.pay(code!!, amount)
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 b633d51..608ff3f 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -17,6 +17,10 @@
 
     fun showConsumeHint(hint: String)
 
+    fun showConsumeQuery(hint: String)
+
+    fun showConsumeInterrupt(info: CardUserInfoBean)
+
     fun showConsumeFail(info: CardUserInfoBean)
 
     fun showReverseSuc(info: CardUserInfoBean)
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
index 461c16d..1cc78c1 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardAccountRetBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardAccountRetBean.kt
@@ -8,7 +8,7 @@
  **/
 class CardAccountRetBean : BaseResp() {
     var username: String? = null
-    var userid: Int = 0
-    var balance: Int = 0
+    var userid: String? = null
+    var balance: Int? = null
     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 f68486f..e27206f 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
@@ -12,7 +12,7 @@
     var datetime: String? = null
     var amount: Int = 0
     var username: String? = null
-    var userid: Int = 0
+    var userid: String? = null
     var balance: Int? = null
-    var cardstatus: Int = 0
+    var cardstatus: CardStatus? = null
 }
\ 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 ebaf647..047d57b 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
@@ -10,13 +10,28 @@
  **/
 class CardUserInfoBean constructor(retcode: Int, retmsg: String) : BaseResp(retcode, retmsg) {
     var username: String? = null
+    var cardno: String? = null
     var showtime: Int = 3
     var balance: Int? = null
-    var cardstatus: Int = 0
+    var cardstatus: CardStatus? = null
     var amount: Int = 0
     var payamt: Int = 0
     var status: PayStatus? = null
     var reversalFlag: ReversalFlag? = null
-    var datetime: String? = null
+    var transdate: String? = null
+    var transtime: String? = null
     var payway: String? = null //card,code
+}
+
+enum class CardStatus(val desc: String) {
+    NORMAL("正常"),
+    LOCK("已锁定"),
+    FROZEN("已冻结"),
+    LOST("已挂失"),
+    EXPIRE("已过期"),
+    LOGOUT("已注销");
+
+    override fun toString(): String {
+        return this.desc
+    }
 }
\ 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 3972fe6..cde67f4 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
@@ -5,19 +5,15 @@
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.consume.IConsumeView
 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.entity.*
 import com.supwisdom.epaycard.Cardlib
 import com.supwisdom.exception.CardNotFoundError
 import com.supwisdom.exception.CardPayCancelFailError
 import com.supwisdom.exception.CardPayFailError
+import com.supwisdom.exception.CardPayInterruptError
 import com.supwisdom.okhttp.TransResp
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.GsonUtil
-import com.supwisdom.utils.PublicDef
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.*
 import org.apache.http.HttpStatus
 
 /**
@@ -37,8 +33,10 @@
     private var clickStat = ClickStat.INIT
     @Volatile
     private var amount: Int = 0
+    @Volatile
+    private var payQueryConfirm = false
     private var thread: Thread? = null
-    private lateinit var cardBean: CardBean
+    private var cardBean: CardBean? = null
 
     fun start() {
         isExist = false
@@ -69,9 +67,16 @@
         this.amount = amount
     }
 
+    fun clickToInterrupt() {
+        clickStat = ClickStat.INIT
+        payQueryConfirm = false
+    }
+
     private inner class CardPayRunnable : Runnable {
         private lateinit var onlRecord: TransdtlOnlineRecord
+        private lateinit var onlRvsRecord: TransdtlOnlineRecord
         private lateinit var offRecord: TransdtlOfflineRecord
+        private lateinit var offRvsRecord: TransdtlOfflineRecord
         private var oldcardphyid: String? = null
         private var onlineBalance = false
         private var curLinkStatus = false
@@ -92,7 +97,7 @@
                     iConsumeView.codeScannerEnable(false)
                     if (oldcardphyid != cardphyid) {
                         readCard()
-                        cardBean.cardphyid = cardphyid
+                        cardBean!!.cardphyid = cardphyid
                         oldcardphyid = cardphyid
                     }
                     when (clickStat) {
@@ -101,6 +106,15 @@
                                 doConsume()
                             } catch (ex: CardPayFailError) {
                                 sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
+                            } catch (ex: CardPayInterruptError) {
+                                sendMsg(PublicDef.MSG_PAYING_INTERRUPT, getErrorInfo(ex.message))
+                            } catch (ex: Exception) {
+                                ex.printStackTrace()
+                                LogUtil.d(
+                                    TAG, "card pay exception: cardphyid=$cardphyid"
+                                            + "exception=${CommonUtil.getExceptionStack(ex)}"
+                                )
+                                sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo("程序异常"))
                             }
                             clickStat = ClickStat.INIT
                         }
@@ -108,7 +122,14 @@
                             try {
                                 doReverse()
                             } catch (ex: CardPayCancelFailError) {
-                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getErrorInfo(ex.message))
+                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo(ex.message))
+                            } catch (ex: Exception) {
+                                ex.printStackTrace()
+                                LogUtil.d(
+                                    TAG, "card pay cancel exception: cardphyid=$cardphyid"
+                                            + "exception=${CommonUtil.getExceptionStack(ex)}"
+                                )
+                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo("程序异常"))
                             }
                             clickStat = ClickStat.INIT
                         }
@@ -139,40 +160,53 @@
         private fun getAccountInfoByCard() {
             val resp = consumeApi.accQuery(
                 pos.getConfigPara()!!.devphyid!!,
-                cardBean.cardphyid!!,
-                cardBean.cardNo!!
+                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
+                try {
+                    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
+                        when {
+                            "normal" == retBean.status -> cardBean!!.cardstatus = CardStatus.NORMAL
+                            "expire" == retBean.status -> cardBean!!.cardstatus = CardStatus.EXPIRE
+                            "lost" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOCK
+                            "logout" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOGOUT
+                            "frozen" == retBean.status -> cardBean!!.cardstatus = CardStatus.FROZEN
+                            "lock" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOST
+                        }
+                    }
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
                 }
             }
         }
 
         private fun showCardUserInfo() {
             val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
-            info.username = cardBean.username
-            info.balance = cardBean.balance
-            info.cardstatus = cardBean.cardstatus
+            if (cardBean!!.username != cardBean!!.cardNo) {
+                info.username = cardBean!!.username
+            }
+            info.cardno = cardBean!!.cardNo
+            info.cardstatus = cardBean!!.cardstatus
             sendMsg(PublicDef.MSG_USER_INFO_SHOW, info)
         }
 
         private fun readCard() {
             val cardinfo = Cardlib.instance.readCard()
             cardBean = CardBean()
-            cardBean.cardNo = cardinfo.cardNo
-            cardBean.idCard = cardinfo.idCard
-            cardBean.expireDate = cardinfo.expireDate
-            cardBean.amount = amount
-            cardBean.datetime = DateUtil.getNowDateTimeFormat()
+            cardBean!!.cardNo = cardinfo.cardNo
+            cardBean!!.idCard = cardinfo.idCard
+            cardBean!!.expireDate = cardinfo.expireDate
+            cardBean!!.amount = amount
+            cardBean!!.datetime = DateUtil.getNowDateTimeFormat()
             /**
              * 用户名默认用卡号代替,在线查询更新为用户名
              */
-            cardBean.username = cardBean.cardNo
+            cardBean!!.username = cardBean!!.cardNo
         }
 
         private fun doConsume() {
@@ -190,7 +224,109 @@
         }
 
         private fun doReverse() {
-            throw CardPayCancelFailError("暂不支持")
+            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+            if (list.isEmpty()) {
+                throw CardPayCancelFailError("未找到消费记录")
+            }
+            if (list[0].payway == "offcard") {
+                doOfflineReverse(list[0])
+            } else {
+                doOnlineReverse(list[0])
+            }
+        }
+
+        private fun doOnlineReverse(unionRecord: TransdtlUnionRecord) {
+            val record = pos.getTransdtlOnlineLast() ?: throw CardPayCancelFailError("未找到联机记录")
+            checkOnlineReverseVaild(unionRecord, record)
+            saveTransdtlOnlineReverse(record)
+            showRvsOnlSucInfo()
+            asyncUpload(onlRvsRecord)
+        }
+
+        private fun doOfflineReverse(unionRecord: TransdtlUnionRecord) {
+            val record = pos.getTransdtlOfflineLast() ?: throw CardPayCancelFailError("未找到离线记录")
+            checkOfflineReverseVaild(unionRecord, record)
+            saveTransdtlOfflineReverse(record)
+            showRvsOffSucInfo()
+            asyncUpload(offRvsRecord)
+        }
+
+        private fun saveTransdtlOfflineReverse(record: TransdtlOfflineRecord) {
+            offRvsRecord = record.clone()
+            offRvsRecord.devseqno += 1
+            offRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+            offRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+            offRvsRecord.reversalflag = ReversalFlag.MANUAL
+            offRvsRecord.reversalseqno = record.devseqno
+            offRvsRecord.reversaltransdate = record.transdate
+            offRvsRecord.reversaltranstime = record.transtime
+            offRvsRecord.upflag = 0
+            if (!pos.saveTransdtlOffline(offRvsRecord)) {
+                throw CardPayCancelFailError("保存流水失败")
+            }
+        }
+
+        private fun saveTransdtlOnlineReverse(record: TransdtlOnlineRecord) {
+            onlRvsRecord = record.clone()
+            onlRvsRecord.devseqno += 1
+            onlRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+            onlRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+            onlRvsRecord.reversalflag = ReversalFlag.MANUAL
+            onlRvsRecord.reversalbillno = record.billno
+            onlRvsRecord.upflag = 0
+            if (!pos.saveTransdtlOnline(onlRvsRecord)) {
+                throw CardPayCancelFailError("保存流水失败")
+            }
+        }
+
+        private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
+            if (record.cardphyid != cardBean!!.cardphyid) {
+                throw CardPayCancelFailError("该卡不是最后消费")
+            }
+            if (unionRecord.transdate != record.transdate ||
+                unionRecord.transtime != record.transtime
+            ) {
+                throw CardPayCancelFailError("联机记录时间异常")
+            }
+            if (record.reversalflag == ReversalFlag.AUTO
+            ) {
+                throw CardPayCancelFailError("已撤销")
+            }
+            if (record.reversalflag == ReversalFlag.MANUAL) {
+                throw CardPayCancelFailError("已冲正")
+            }
+            if (record.status != PayStatus.SUC) {
+                throw CardPayCancelFailError("消费失败不能冲正")
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                throw CardPayCancelFailError("消费已过期")
+            }
+        }
+
+        private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
+            if (record.cardphyid != cardBean!!.cardphyid) {
+                throw CardPayCancelFailError("该卡不是最后消费")
+            }
+            if (unionRecord.transdate != record.transdate ||
+                unionRecord.transtime != record.transtime
+            ) {
+                throw CardPayCancelFailError("离线记录时间异常")
+            }
+            if (record.reversalflag == ReversalFlag.MANUAL ||
+                record.reversalflag == ReversalFlag.AUTO
+            ) {
+                throw CardPayCancelFailError("已冲正")
+            }
+            if (record.status != PayStatus.SUC) {
+                throw CardPayCancelFailError("消费失败不能冲正")
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                throw CardPayCancelFailError("消费已过期")
+            }
         }
 
         private fun doOnlineConsume(): Boolean {
@@ -202,25 +338,64 @@
             }
             resp = consumeApi.payConfirm(onlRecord)
             result = parseConfirmResult(resp)
-            if (result) {
-                showSucInfo()
+            payQueryConfirm = false
+            if (!result) {
+                payQueryConfirm = true
+                result = doOnlineConsumeQuery()
             }
             updateTransdtlOnline(result)
+            if (result) {
+                showOnlSucInfo()
+            }
             return result
         }
 
+        private fun doOnlineConsumeQuery(): Boolean {
+            var queryCnt = 1
+            sleepWithCancel(1000)
+            while (payQueryConfirm) {
+                sendMsg(PublicDef.MSG_CARD_PAY_QUERY, "消费确认中[$queryCnt]")
+                val resp = consumeApi.payQuery(onlRecord)
+                val result = parseConfirmResult(resp)
+                if (result) {
+                    return result
+                }
+                queryCnt += 1
+                sleepWithCancel(3000)
+            }
+            /**
+             * 手动取消交易
+             */
+            LogUtil.e(TAG, "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]")
+            throw CardPayInterruptError("交易取消")
+        }
+
+        private fun sleepWithCancel(ms: Long) {
+            var time = 0
+            while (payQueryConfirm) {
+                CommonUtil.doSleep(20)
+                time += 20
+                if (time > ms) {
+                    return
+                }
+            }
+        }
+
         private fun parseInitResult(resp: TransResp?): Boolean {
             if (resp == null || resp.retcode != HttpStatus.SC_OK) {
                 SPApplication.getInstance().setEpayLinking(false)
                 return false
             }
-            val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+            val retBean = try {
+                GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+            } catch (ex: java.lang.Exception) {
+                throw CardPayFailError("json异常:${ex.message}")
+            }
             if (retBean.retcode != PublicDef.SUCCESS) {
-                throw CardPayFailError(retBean.retmsg!!)
+                throw CardPayFailError(retBean.getErrorMsg())
             }
             onlRecord.billno = retBean.billno
             onlRecord.username = retBean.username
-//            onlRecord.userid = retBean.userid
             return true
         }
 
@@ -229,17 +404,19 @@
                 SPApplication.getInstance().setEpayLinking(false)
                 return false
             }
-            val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+            val retBean = try {
+                GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+            } catch (ex: Exception) {
+                throw CardPayFailError("json异常:${ex.message}")
+            }
             if (retBean.retcode != PublicDef.SUCCESS) {
-                throw CardPayFailError(retBean.retmsg!!)
+                throw CardPayFailError(retBean.getErrorMsg())
             }
             if (retBean.require_query) {
-                //TODO
-                throw CardPayFailError("查询未实现")
+                return false
             }
             onlRecord.payamt = retBean.amount
             onlRecord.extraamt = retBean.extraamt
-            onlRecord.balance = retBean.balance
             return true
         }
 
@@ -250,12 +427,12 @@
                 seqno = pos.getDynamicPara()?.onlineseqno ?: 0
             }
             onlRecord.devphyid = pos.getConfigPara()!!.devphyid
-            onlRecord.transdate = cardBean.datetime!!.substring(0, 8)
-            onlRecord.transtime = cardBean.datetime!!.substring(8)
+            onlRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
+            onlRecord.transtime = cardBean!!.datetime!!.substring(8)
             onlRecord.devseqno = seqno + 1
-            onlRecord.cardno = cardBean.cardNo
-            onlRecord.cardphyid = cardBean.cardphyid
-            onlRecord.payamt = cardBean.amount
+            onlRecord.cardno = cardBean!!.cardNo
+            onlRecord.cardphyid = cardBean!!.cardphyid
+            onlRecord.payamt = cardBean!!.amount
             onlRecord.reversalflag = ReversalFlag.NONE
             onlRecord.extraamt = 0
             onlRecord.transtype = "card"
@@ -280,6 +457,7 @@
             initTransdtlOffline()
             checkCardValid()
             updateTransdtlOffline(true)
+            showOffSucInfo()
         }
 
         private fun checkCardValid() {
@@ -298,11 +476,16 @@
 
             val whiteRecord =
                 pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: throw CardPayFailError("卡无权限")
-            if (whiteRecord.flag == 1) {
-                throw CardPayFailError("卡已锁定")
-            }
-            if (whiteRecord.balance < offRecord.payamt) {
-                throw CardPayFailError("请到联机设备使用")
+            when (whiteRecord.status) {
+                "normal" -> {
+
+                }
+                "expire" -> throw CardPayFailError("卡已过期")
+                "lost" -> throw CardPayFailError("卡已挂失")
+                "logout" -> throw CardPayFailError("卡已注销")
+                "frozen" -> throw CardPayFailError("卡已冻结")
+                "lock" -> throw CardPayFailError("卡已锁定")
+                else -> throw CardPayFailError("卡状态:${whiteRecord.status}")
             }
         }
 
@@ -313,12 +496,12 @@
                 seqno = pos.getDynamicPara()?.offlineseqno ?: 0
             }
             offRecord.devphyid = pos.getConfigPara()!!.devphyid
-            offRecord.transdate = cardBean.datetime!!.substring(0, 8)
-            offRecord.transtime = cardBean.datetime!!.substring(8)
+            offRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
+            offRecord.transtime = cardBean!!.datetime!!.substring(8)
             offRecord.devseqno = seqno + 1
-            offRecord.cardno = cardBean.cardNo
-            offRecord.cardphyid = cardBean.cardphyid
-            offRecord.payamt = cardBean.amount
+            offRecord.cardno = cardBean!!.cardNo
+            offRecord.cardphyid = cardBean!!.cardphyid
+            offRecord.payamt = cardBean!!.amount
             offRecord.reversalflag = ReversalFlag.NONE
             offRecord.extraamt = 0
             offRecord.managefeetype = "none"
@@ -339,6 +522,89 @@
             if (!pos.updateTransdtlOffline(offRecord)) {
                 throw CardPayFailError("更新流水失败")
             }
+            asyncUpload(offRecord)
+        }
+
+        private fun showOnlSucInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = onlRecord.payamt
+            info.payamt = onlRecord.payamt
+            info.username = onlRecord.username
+            info.cardno = onlRecord.cardno
+            info.transdate = onlRecord.transdate
+            info.transtime = onlRecord.transtime
+            info.payway = onlRecord.transtype
+            info.status = onlRecord.status
+            info.reversalFlag = onlRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+        }
+
+        private fun showOffSucInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = offRecord.payamt
+            info.payamt = offRecord.payamt
+            info.cardno = offRecord.cardno
+            info.transdate = offRecord.transdate
+            info.transtime = offRecord.transtime
+            info.payway = "card"
+            info.status = offRecord.status
+            info.reversalFlag = offRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+        }
+
+        private fun showRvsOnlSucInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = onlRvsRecord.payamt
+            info.payamt = onlRvsRecord.payamt
+            info.username = onlRvsRecord.username
+            info.cardno = onlRvsRecord.cardno
+            info.transdate = onlRvsRecord.transdate
+            info.transtime = onlRvsRecord.transtime
+            info.payway = onlRvsRecord.transtype
+            info.status = onlRvsRecord.status
+            info.reversalFlag = onlRvsRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+        }
+
+        private fun showRvsOffSucInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = offRvsRecord.payamt
+            info.payamt = offRvsRecord.payamt
+            info.cardno = offRvsRecord.cardno
+            info.transdate = offRvsRecord.transdate
+            info.transtime = offRvsRecord.transtime
+            info.payway = "card"
+            info.status = offRvsRecord.status
+            info.reversalFlag = offRvsRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+        }
+
+        private fun asyncUpload(dtl: TransdtlOfflineRecord) {
+            ThreadPool.getShortPool().execute(Runnable {
+                try {
+                    EpayApiImpl().uploadTransdtl(dtl)
+                    dtl.upflag = 1
+                    pos.updateTransdtlOffline(dtl)
+                } catch (ex: java.lang.Exception) {
+                    ex.printStackTrace()
+                }
+            })
+        }
+
+        private fun asyncUpload(dtl: TransdtlOnlineRecord) {
+            ThreadPool.getShortPool().execute(Runnable {
+                try {
+                    EpayApiImpl().uploadTransdtl(dtl)
+                    dtl.upflag = 1
+                    pos.updateTransdtlOnline(dtl)
+                } catch (ex: java.lang.Exception) {
+                    ex.printStackTrace()
+                }
+            })
         }
 
         private fun doClear() {
@@ -379,23 +645,30 @@
             }
         }
 
-        private fun showSucInfo() {
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
-            info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = onlRecord.payamt
-            info.payamt = onlRecord.payamt
-            info.username = onlRecord.username
-            info.datetime = onlRecord.transdate + onlRecord.transtime
-            info.payway = onlRecord.transtype
-            info.status = PayStatus.SUC
-            info.balance = onlRecord.balance
-            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
-        }
-
         private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
             val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
             info.showtime = pos.getSysPara()!!.failShowtime
             info.status = PayStatus.FAIL
+            info.amount = amount
+            info.payamt = amount
+            info.payway = "card"
+            info.cardno = cardBean?.cardNo
+            info.transdate = DateUtil.getNowDateNoFormat()
+            info.transtime = DateUtil.getNowTimeNoFormat()
+            return info
+        }
+
+        private fun getRvsErrorInfo(errmsg: String?): CardUserInfoBean {
+            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+            info.showtime = pos.getSysPara()!!.failShowtime
+            info.status = PayStatus.FAIL
+            info.amount = amount
+            info.payamt = amount
+            info.cardno = cardBean?.cardNo
+            info.payway = "card"
+            info.transdate = DateUtil.getNowDateNoFormat()
+            info.transtime = DateUtil.getNowTimeNoFormat()
+            info.reversalFlag = ReversalFlag.MANUAL
             return info
         }
 
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
index f69e698..08b68c1 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
@@ -14,6 +14,7 @@
 import com.supwisdom.okhttp.TransResp
 import com.supwisdom.utils.*
 import org.apache.http.HttpStatus
+import java.lang.Exception
 
 /**
  ** create by zzq on 2019/7/30
@@ -32,12 +33,15 @@
      */
     @Volatile
     private var interruptedPay: Boolean = false
+    @Volatile
+    private var amount = 0
 
     fun interruptPay() {
         interruptedPay = true
     }
 
     fun pay(code: String, amount: Int) {
+        this.amount = amount
         interruptedPay = false
         try {
             initTransdtlOnline(code, amount)
@@ -58,7 +62,7 @@
     }
 
     private fun payResultQuery(): Boolean {
-        sendMsg(PublicDef.MSG_CODE_PAYING_CANCEL, "谨慎操作查询取消")
+        sendMsg(PublicDef.MSG_PAYING_QUERY, "谨慎操作查询取消")
         LogUtil.d(TAG, "扫码消费确认超时,进行查询操作:billno=${codeRecord.billno}")
         sleepWithCancel(1500)
         var searchCnt = 1
@@ -92,9 +96,13 @@
         if (resp.retcode != HttpStatus.SC_OK) {
             throw CardPayFailError("错误码=${resp.retcode}")
         }
-        val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+        val retBean = try {
+            GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+        } catch (ex: Exception) {
+            throw CardPayFailError("json异常:${ex.message}")
+        }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw CardPayFailError(retBean.retmsg!!)
+            throw CardPayFailError(retBean.getErrorMsg())
         }
         if (retBean.require_query) {
             // 等待查询
@@ -102,7 +110,6 @@
         }
         codeRecord.payamt = retBean.amount
         codeRecord.extraamt = retBean.extraamt
-        codeRecord.balance = retBean.balance
         return true
     }
 
@@ -114,9 +121,13 @@
         if (resp.retcode != HttpStatus.SC_OK) {
             throw CardPayFailError("错误码=${resp.retcode}")
         }
-        val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+        val retBean = try {
+            GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+        } catch (ex: Exception) {
+            throw CardPayFailError("json异常:${ex.message}")
+        }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw CardPayFailError(retBean.retmsg!!)
+            throw CardPayFailError(retBean.getErrorMsg())
         }
         codeRecord.billno = retBean.billno
         codeRecord.username = retBean.username
@@ -172,10 +183,12 @@
         info.amount = codeRecord.payamt
         info.payamt = codeRecord.payamt
         info.username = codeRecord.username
-        info.datetime = codeRecord.transdate + codeRecord.transtime
+        info.cardno = codeRecord.cardno
+        info.transdate = codeRecord.transdate
+        info.transtime = codeRecord.transtime
         info.payway = codeRecord.transtype
-        info.status = PayStatus.SUC
-        info.balance = codeRecord.balance
+        info.status = codeRecord.status
+        info.reversalFlag = codeRecord.reversalflag
         sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
     }
 
@@ -183,6 +196,11 @@
         val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
         info.showtime = pos.getSysPara()!!.failShowtime
         info.status = PayStatus.FAIL
+        info.amount = amount
+        info.payamt = amount
+        info.payway = "code"
+        info.transdate = DateUtil.getNowDateNoFormat()
+        info.transtime = DateUtil.getNowTimeNoFormat()
         return info
     }
 
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
index cbfac25..8f49136 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -13,7 +13,6 @@
 import com.supwisdom.exception.TransdtlUploadError
 import com.supwisdom.service.AuthEpay
 import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.PublicDef
 
@@ -108,6 +107,7 @@
         intent.putExtra("datetime", DateUtil.getNowDateNoFormat())
         intent.putExtra("amount", record.payamt.toString())
         intent.putExtra("payway", record.payway)
+        intent.putExtra("operation", "reverse")
         intent.setClass(iMenuView.getActivity(), ConsumeActivity::class.java)
         iMenuView.getActivity().startActivity(intent)
     }
diff --git a/app/src/main/java/com/supwisdom/activities/revenue/RevenuePresenter.kt b/app/src/main/java/com/supwisdom/activities/revenue/RevenuePresenter.kt
index 4ee5bd2..cbf95db 100644
--- a/app/src/main/java/com/supwisdom/activities/revenue/RevenuePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/revenue/RevenuePresenter.kt
@@ -23,7 +23,7 @@
     private inner class AsyncRevenue : AsyncTask<String, Void, RevenueAmtRetBean>() {
         override fun onPostExecute(retBean: RevenueAmtRetBean) {
             if (retBean.retcode != PublicDef.SUCCESS) {
-                iRevenueView.showRevenueFail(retBean.retmsg!!)
+                iRevenueView.showRevenueFail(retBean.getErrorMsg())
             } else {
                 iRevenueView.showRevenueSuc(retBean)
             }
@@ -36,7 +36,11 @@
             if (resp.retcode != HttpStatus.SC_OK) {
                 return RevenueAmtRetBean(resp.retcode, "错误码=" + resp.retcode)
             }
-            return GsonUtil.GsonToBean(resp.retjson!!, RevenueAmtRetBean::class.java)
+            return try {
+                GsonUtil.GsonToBean(resp.retjson!!, RevenueAmtRetBean::class.java)
+            } catch (ex: Exception) {
+                RevenueAmtRetBean(PublicDef.ERROR, "json异常:${ex.message}")
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
index f2dba5f..160dfe3 100644
--- a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
@@ -45,9 +45,9 @@
         kvMap[index++] = ControlParaRecord("服务器标识>>", cfgRecord.epayUri!!)
         kvMap[index++] = ControlParaRecord("服务器端口>>", "" + cfgRecord.epayPort)
         kvMap[index++] =
-            ControlParaRecord("参数版本号>>", "no:" + dyRecord!!.paraverno + ",id:" + dyRecord.paragroupid)
+            ControlParaRecord("参数版本号>>", "no:${dyRecord!!.paraverno},id:${dyRecord.paragroupid}")
         kvMap[index++] = ControlParaRecord("白名单版本>>", dyRecord.cardverno!!)
-        kvMap[index++] = ControlParaRecord("通讯超时>>", String.format("%ds", CommonUtil.getCommunicateTime()))
+        kvMap[index++] = ControlParaRecord("通讯超时>>", "${CommonUtil.getCommunicateTime()}s")
         if (sysRecord!!.returnFlag and 0x1 == 1) {
             kvMap[index++] = ControlParaRecord("冲正使能>>", "启用")
         } else {
@@ -63,17 +63,12 @@
         } else {
             kvMap[index++] = ControlParaRecord("网络状态>>", "脱机")
         }
-        kvMap[index++] = ControlParaRecord("成功显时间>>", String.format("%ds", sysRecord!!.sucShowtime))
-        kvMap[index++] = ControlParaRecord("失败显时间>>", String.format("%ds", sysRecord.failShowtime))
-        kvMap[index++] = ControlParaRecord("联机流水号>>", String.format("%d", pos.getTransdtlOnlineMaxSeqno()))
-        kvMap[index++] = ControlParaRecord("离线流水号>>", String.format("%d", pos.getTransdtlOfflineMaxSeqno()))
-        kvMap[index++] = ControlParaRecord(
-            "未上传流水>>", String.format(
-                "%d", pos.getTransdtlOnlineUnconfirm()
-                        + pos.getTransdtlOfflineUnconfirm()
-            )
-        )
-        kvMap[index++] = ControlParaRecord("定额间隔时间(s)>>", "" + sysRecord.fixpayGap)
+        kvMap[index++] = ControlParaRecord("成功显时间>>", "${sysRecord.sucShowtime}s")
+        kvMap[index++] = ControlParaRecord("失败显时间>>", "${sysRecord.failShowtime}s")
+        kvMap[index++] = ControlParaRecord("联机流水号>>", pos.getTransdtlOnlineMaxSeqno().toString())
+        kvMap[index++] = ControlParaRecord("离线流水号>>", pos.getTransdtlOfflineMaxSeqno().toString())
+        kvMap[index++] = ControlParaRecord("未上传流水>>", pos.getTransdtlUnconfirmNum().toString())
+        kvMap[index++] = ControlParaRecord("定额间隔时间(s)>>", "${sysRecord.fixpayGap}s")
         kvMap[index++] = ControlParaRecord("心跳间隔>>", "${sysRecord.heatBeat}s")
     }
 
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
index 1545002..336efac 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
@@ -21,7 +21,7 @@
 class EpayUpgradeApi constructor(callbackInterface: CallbackInterface) {
     private val TIMEOUT = 5 * 1000// 超时
     private val callbackInterface = callbackInterface
-    private val POSID = "chargepos"
+    private val POSID = "posa711dali"
 
     fun upgrade(versionName: String) {
         val resp = getAppVersion()
@@ -41,11 +41,9 @@
     }
 
     private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
-//            val downStep = 1// 提示step
         var downStep = 0// 提示step
         val totalSize: Int// 文件总大小
         var downloadCount = 0// 已经下载好的大小
-        var updateCount = 0// 已经上传的文件大小
         try {
             val url = URL(downUrl)
             val urlConnection = url.openConnection() as HttpURLConnection
@@ -163,7 +161,7 @@
             }
         } catch (e: Exception) {
             e.printStackTrace()
-            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本号JSON错误:${e.message}")
+            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本号JSON异常:${e.message}")
         }
     }
 
diff --git a/app/src/main/java/com/supwisdom/bean/BaseResp.kt b/app/src/main/java/com/supwisdom/bean/BaseResp.kt
index ac5fb29..68e95fe 100644
--- a/app/src/main/java/com/supwisdom/bean/BaseResp.kt
+++ b/app/src/main/java/com/supwisdom/bean/BaseResp.kt
@@ -14,4 +14,7 @@
 
     var retcode: Int = 0
     var retmsg: String? = null
+    fun getErrorMsg(): String {
+        return retmsg ?: "错误码:$retcode"
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/bean/WhiteListItemBean.kt b/app/src/main/java/com/supwisdom/bean/WhiteListItemBean.kt
index 398667c..f74f4a5 100644
--- a/app/src/main/java/com/supwisdom/bean/WhiteListItemBean.kt
+++ b/app/src/main/java/com/supwisdom/bean/WhiteListItemBean.kt
@@ -7,6 +7,5 @@
 class WhiteListItemBean {
     var cardphyid: String? = null
     var cardno: String? = null
-    var flag: 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/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index 8eb7e66..a89d80e 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -43,6 +43,7 @@
         paragroupid,
         cardverno,
         jwt,
+        jwtexpire,
         token
     }
 
@@ -64,7 +65,6 @@
         extraamt,
         managefeetype,
         username,
-        balance,
         billno,
         reversalflag,
         reversalbillno,
@@ -92,12 +92,12 @@
     enum class WhiteList {
         cardphyid,
         cardno,
-        flag,
-        balance
+        status
     }
 
     enum class TransdtlUnion {
         username,
+        cardno,
         transdate,
         transtime,
         devseqno,
diff --git a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
index 17c542a..3617287 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -41,8 +41,7 @@
             + TABLE_NAME_WHITELIST + " ( "
             + BeanPropEnum.WhiteList.cardphyid + " varchar(32),"
             + BeanPropEnum.WhiteList.cardno + " varchar(32),"
-            + BeanPropEnum.WhiteList.flag + " integer,"
-            + BeanPropEnum.WhiteList.balance + " integer,"
+            + BeanPropEnum.WhiteList.status + " varchar(16),"
             + "primary key ("
             + BeanPropEnum.WhiteList.cardphyid + ","
             + BeanPropEnum.WhiteList.cardno + ") )")
@@ -63,8 +62,9 @@
             + BeanPropEnum.DynamicPara.offlineseqno + " integer, "
             + BeanPropEnum.DynamicPara.paraverno + " integer, "
             + BeanPropEnum.DynamicPara.paragroupid + " integer, "
-            + BeanPropEnum.DynamicPara.cardverno + " char(14),"
+            + BeanPropEnum.DynamicPara.cardverno + " varchar(32),"
             + BeanPropEnum.DynamicPara.jwt + " varchar(254),"
+            + BeanPropEnum.DynamicPara.jwtexpire + " varchar(16),"
             + BeanPropEnum.DynamicPara.token + " varchar(32) )")
     private val DROP_TABLE_NAME_DYNAMICPARA = "DROP TABLE IF EXISTS $TABLE_NAME_DYNAMICPARA"
     private val CREATE_TABLE_NAME_SYSPARA = ("create table IF NOT EXISTS "
diff --git a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
index aadfb8d..328f06d 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -46,7 +46,6 @@
             + BeanPropEnum.TransdtlOnline.transtype + " varchar(8),"
             + BeanPropEnum.TransdtlOnline.payamt + " integer,"
             + BeanPropEnum.TransdtlOnline.extraamt + " integer,"
-            + BeanPropEnum.TransdtlOnline.balance + " integer,"
             + BeanPropEnum.TransdtlOnline.managefeetype + " varchar(10),"
             + BeanPropEnum.TransdtlOnline.username + " varchar(32),"
             + BeanPropEnum.TransdtlOnline.billno + " varchar(32),"
diff --git a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
index 20ab20d..5c6b0fb 100644
--- a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
@@ -93,6 +93,7 @@
         record.paragroupid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paragroupid.toString()))
         record.cardverno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.cardverno.toString()))
         record.jwt = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwt.toString()))
+        record.jwtExpire = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwtexpire.toString()))
         record.token = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.token.toString()))
         return record
     }
@@ -112,6 +113,7 @@
         values.put(BeanPropEnum.DynamicPara.cardverno.toString(), record.cardverno)
         values.put(BeanPropEnum.DynamicPara.jwt.toString(), record.jwt)
         values.put(BeanPropEnum.DynamicPara.token.toString(), record.token)
+        values.put(BeanPropEnum.DynamicPara.jwtexpire.toString(), record.jwtExpire)
         return values
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/Pos.kt b/app/src/main/java/com/supwisdom/db/Pos.kt
index d03277b..0f36600 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -161,6 +161,15 @@
         return onlMaxSeqno
     }
 
+    fun getTransdtlOnlineLast(): TransdtlOnlineRecord? {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getLast()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
         try {
             transdtlOnlineDao.getLock().lock()
@@ -170,10 +179,31 @@
         }
     }
 
+    fun getTransdtlUnconfirmNum(): Int {
+        var num = 0
+        try {
+            transdtlOnlineDao.getLock().lock()
+            num += transdtlOnlineDao.getUnconfirmNum()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+        try {
+            transdtlOfflineDao.getLock().lock()
+            num += transdtlOfflineDao.getUnconfirmNum()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+        return num
+    }
+
     fun saveTransdtlOnline(record: TransdtlOnlineRecord): Boolean {
         try {
             transdtlOnlineDao.getLock().lock()
-            return transdtlOnlineDao.save(record)
+            if (transdtlOnlineDao.save(record)) {
+                onlMaxSeqno = record.devseqno
+                return true
+            }
+            return false
         } finally {
             transdtlOnlineDao.getLock().unlock()
         }
@@ -218,10 +248,23 @@
         }
     }
 
+    fun getTransdtlOfflineLast(): TransdtlOfflineRecord? {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getLast()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
     fun saveTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
         try {
             transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.save(record)
+            if (transdtlOfflineDao.save(record)) {
+                offMaxSeqno = record.devseqno
+                return true
+            }
+            return false
         } finally {
             transdtlOfflineDao.getLock().unlock()
         }
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
index 20bcec1..fb9d0c0 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -87,6 +87,24 @@
         return 0
     }
 
+    fun getUnconfirmNum(): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val sql = ("select COUNT("
+                + BeanPropEnum.TransdtlOffline.devseqno
+                + ") as num from " + TABLE
+                + " where " + BeanPropEnum.TransdtlOffline.upflag + "=0")
+        try {
+            cursor = db.rawQuery(sql, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return cursor.getInt(cursor.getColumnIndex("num"))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
     fun clear(): Boolean {
         val db = dbHelper.writableDatabase
         try {
@@ -101,10 +119,25 @@
         }
     }
 
+    fun getLast(): TransdtlOfflineRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderBy = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+            return null
+        } finally {
+            cursor?.close()
+        }
+    }
+
     fun clear(date: String): Boolean {
         val db = dbHelper.writableDatabase
         val selection =
-            BeanPropEnum.TransdtlOffline.upflag.toString() + "=?" + BeanPropEnum.TransdtlOffline.transdate + "<?"
+            BeanPropEnum.TransdtlOffline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOffline.transdate + "<?"
         try {
             db.beginTransaction()
             if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index 063c6e7..78a4328 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -72,6 +72,39 @@
         }
     }
 
+    fun getLast(): TransdtlOnlineRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderBy = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+            return null
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getUnconfirmNum(): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val sql = ("select COUNT("
+                + BeanPropEnum.TransdtlOnline.devseqno
+                + ") as num from " + TABLE
+                + " where " + BeanPropEnum.TransdtlOnline.upflag + "=0")
+        try {
+            cursor = db.rawQuery(sql, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return cursor.getInt(cursor.getColumnIndex("num"))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
     fun getMaxSeqno(): Int {
         val db = dbHelper.readableDatabase
         val sql = ("select max(${BeanPropEnum.TransdtlOnline.devseqno}) as seqno from $TABLE")
@@ -104,7 +137,7 @@
     fun clear(date: String): Boolean {
         val db = dbHelper.writableDatabase
         val selection =
-            BeanPropEnum.TransdtlOnline.upflag.toString() + "=?" + BeanPropEnum.TransdtlOnline.transdate + "<?"
+            BeanPropEnum.TransdtlOnline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOnline.transdate + "<?"
         try {
             db.beginTransaction()
             if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
@@ -133,7 +166,6 @@
         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()))
-        record.balance = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.balance.toString()))
         var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
         when (flag) {
             ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
@@ -166,7 +198,6 @@
         values.put(BeanPropEnum.TransdtlOnline.transtype.toString(), record.transtype)
         values.put(BeanPropEnum.TransdtlOnline.payamt.toString(), record.payamt)
         values.put(BeanPropEnum.TransdtlOnline.extraamt.toString(), record.extraamt)
-        values.put(BeanPropEnum.TransdtlOnline.balance.toString(), record.balance)
         values.put(BeanPropEnum.TransdtlOnline.billno.toString(), record.billno)
         values.put(BeanPropEnum.TransdtlOnline.managefeetype.toString(), record.managefeetype)
         values.put(BeanPropEnum.TransdtlOnline.username.toString(), record.username)
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
index 78bae0c..e764afa 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -24,8 +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(" 'null' as ").append(BeanPropEnum.TransdtlUnion.username).append(",")
+            .append(BeanPropEnum.TransdtlOffline.cardno).append(",")
             .append(BeanPropEnum.TransdtlOffline.upflag)
             .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE)
             .append(" UNION ALL select ")
@@ -38,6 +38,7 @@
             .append(BeanPropEnum.TransdtlOnline.payamt).append(",")
             .append(BeanPropEnum.TransdtlOnline.status).append(",")
             .append(BeanPropEnum.TransdtlOnline.username).append(",")
+            .append(BeanPropEnum.TransdtlOnline.cardno).append(",")
             .append(BeanPropEnum.TransdtlOnline.upflag)
             .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_ONLINE)
     }
@@ -97,6 +98,10 @@
         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()))
+        if (record.username == "null") {
+            record.username = null
+        }
+        record.cardno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.cardno.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/db/WhiteListDao.kt b/app/src/main/java/com/supwisdom/db/WhiteListDao.kt
index a5dfcdd..2630c43 100644
--- a/app/src/main/java/com/supwisdom/db/WhiteListDao.kt
+++ b/app/src/main/java/com/supwisdom/db/WhiteListDao.kt
@@ -68,8 +68,7 @@
         val record = WhiteListRecord()
         record.cardphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.cardphyid.toString()))
         record.cardno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.cardno.toString()))
-        record.flag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.WhiteList.flag.toString()))
-        record.balance = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.WhiteList.balance.toString()))
+        record.status = cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.status.toString()))
         return record
     }
 
@@ -77,8 +76,7 @@
         val values = ContentValues()
         values.put(BeanPropEnum.WhiteList.cardphyid.toString(), record.cardphyid)
         values.put(BeanPropEnum.WhiteList.cardno.toString(), record.cardno)
-        values.put(BeanPropEnum.WhiteList.flag.toString(), record.flag)
-        values.put(BeanPropEnum.WhiteList.balance.toString(), record.balance)
+        values.put(BeanPropEnum.WhiteList.status.toString(), record.status)
         return values
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
index ea0e3b4..347d10a 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
@@ -1,10 +1,12 @@
 package com.supwisdom.entity
 
+import com.supwisdom.utils.GsonUtil
+
 /**
  ** create by zzq on 2019/7/24
  ** @desc 离线流水
  **/
-class TransdtlOfflineRecord {
+class TransdtlOfflineRecord : Cloneable {
     var devphyid: String? = null
     var transdate: String? = null
     var transtime: String? = null
@@ -20,4 +22,9 @@
     var reversaltranstime: String? = null  //被冲正流水时间
     var status: PayStatus? = null // init,fail,suc
     var upflag: Int = 0 // 1已上传
+
+    public override fun clone(): TransdtlOfflineRecord {
+        val tmp = GsonUtil.GsonString(this)
+        return GsonUtil.GsonToBean(tmp, TransdtlOfflineRecord::class.java)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
index 97cfa84..584e629 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -1,10 +1,12 @@
 package com.supwisdom.entity
 
+import com.supwisdom.utils.GsonUtil
+
 /**
  ** create by zzq on 2019/7/24
  ** @desc 联机流水
  **/
-class TransdtlOnlineRecord {
+class TransdtlOnlineRecord : Cloneable {
     var devphyid: String? = null
     var transdate: String? = null
     var transtime: String? = null
@@ -16,12 +18,15 @@
     var payamt: Int = 0
     var extraamt: Int = 0
     var managefeetype: String? = null // none,discount,mealer
-    var balance: Int? = null
     var username: String? = null
-    //    var userid: Int = 0
     var billno: String? = null
     var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
     var reversalbillno: String? = null //被冲正交易参考号
     var status: PayStatus? = null // init,fail,suc
     var upflag: Int = 0 // 1已上传
+
+    public override fun clone(): TransdtlOnlineRecord {
+        val tmp = GsonUtil.GsonString(this)
+        return GsonUtil.GsonToBean(tmp, TransdtlOnlineRecord::class.java)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
index bc78c6f..967fbd8 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
@@ -6,6 +6,7 @@
  **/
 class TransdtlUnionRecord {
     var username: String? = null
+    var cardno: String? = null
     var transdate: String? = null
     var transtime: String? = null
     var devseqno: Int = 0
diff --git a/app/src/main/java/com/supwisdom/entity/WhiteListRecord.kt b/app/src/main/java/com/supwisdom/entity/WhiteListRecord.kt
index bbda15c..a632753 100644
--- a/app/src/main/java/com/supwisdom/entity/WhiteListRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/WhiteListRecord.kt
@@ -7,6 +7,5 @@
 class WhiteListRecord {
     var cardphyid: String? = null
     var cardno: String? = null
-    var flag: Int = 0 // 0--白卡 1--黑卡
-    var balance: Int = 0
+    var status: String? = null
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/exception/CardPayInterruptError.kt b/app/src/main/java/com/supwisdom/exception/CardPayInterruptError.kt
new file mode 100644
index 0000000..b69aa91
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/exception/CardPayInterruptError.kt
@@ -0,0 +1,13 @@
+package com.supwisdom.exception
+
+/**
+ ** create by zzq on 2019/8/2
+ ** @desc 交易取消
+ **/
+class CardPayInterruptError : Exception {
+    constructor(message: String, ex: Exception) : super(message + ex.message)
+
+    constructor(message: String) : super(message)
+
+    constructor(ex: Exception) : super(ex.message)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
index bf93d9b..5e3f70c 100644
--- a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
@@ -121,6 +121,8 @@
     }
 
     private fun addExtentHeader(request: Request.Builder): Request.Builder {
+        request.addHeader("Accept", "application/json; q=0.5")
+            .addHeader("Connection", "close")
         if (!TextUtils.isEmpty(clientId)) {
             request.addHeader("X-TENANT-ID", clientId)
         }
@@ -133,16 +135,12 @@
     fun get(url: String, params: WebParams?): TransResp? {
         val request = Request.Builder()
             .url(geturl(url, params))
-            .addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
         return getTransResp(addExtentHeader(request).build())
     }
 
     fun get(url: String, params: WebParams, callback: com.supwisdom.okhttp.ICallBackok<Any?>) {
         val request = Request.Builder()
             .url(geturl(url, params))
-            .addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
         client!!.newCall(addExtentHeader(request).build()).enqueue(object : Callback {
             override fun onFailure(call: Call, e: IOException) {
                 callback.callback(null)
@@ -172,8 +170,6 @@
         }
         val request = Request.Builder()
             .url(url)
-            .addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
             .post(builder.build())
         return getTransResp(addExtentHeader(request).build())
     }
@@ -185,8 +181,6 @@
         }
         val request = Request.Builder()
             .url(url)
-            .addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
             .post(builder.build())
         return getLongTransResp(addExtentHeader(request).build())
     }
@@ -195,8 +189,6 @@
         val body = RequestBody.create(JSON, json)
         val request = Request.Builder()
             .url(url)
-            .addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
             .post(body)
         return getTransResp(addExtentHeader(request).build())
     }
@@ -205,8 +197,6 @@
         val body = RequestBody.create(JSON, json)
         val request = Request.Builder()
             .url(url)
-            .addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
             .post(body)
         client!!.newCall(addExtentHeader(request).build()).enqueue(object : Callback {
             override fun onFailure(call: Call, e: IOException) {
diff --git a/app/src/main/java/com/supwisdom/service/AuthEpay.kt b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
index fc252ae..8c28078 100644
--- a/app/src/main/java/com/supwisdom/service/AuthEpay.kt
+++ b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
@@ -35,7 +35,7 @@
         val url = StringBuilder()
         url.append(record!!.epayIP).append(":").append(record.epayPort)
             .append("/").append(record.epayUri)
-            .append("/api/auth/refresh/").append(record.devphyid).append("?")
+            .append("/api/auth/refresh")
         val resp = NetworkHandler.getInstance().get(url.toString(), null)
             ?: throw AuthEpayError("jwt刷新请求超时")
         if (resp.retcode != HttpStatus.SC_OK) {
@@ -72,7 +72,7 @@
             throw AuthEpayError("token json异常:${ex.message}")
         }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw AuthEpayError(retBean.retmsg!!)
+            throw AuthEpayError(retBean.getErrorMsg())
         }
         if (TextUtils.isEmpty(retBean.token)) {
             throw AuthEpayError("token不能为空")
@@ -126,14 +126,14 @@
             throw AuthEpayError("json异常:${ex.message}")
         }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw AuthEpayError(retBean.retmsg!!)
+            throw AuthEpayError(retBean.getErrorMsg())
         }
         return retBean
     }
 
     private fun dealSession(bean: AuthJwtRetBean) {
         if (bean.retcode != PublicDef.SUCCESS) {
-            throw AuthEpayError(bean.retmsg!!)
+            throw AuthEpayError(bean.getErrorMsg())
         }
         if (TextUtils.isEmpty(bean.jwt)) {
             throw AuthEpayError("jwt不能为空")
diff --git a/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
index 8a7c9f7..4405f38 100644
--- a/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
+++ b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
@@ -8,50 +8,42 @@
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.FileUtil
+import com.supwisdom.utils.LogUtil
 
 /**
  ** create by zzq on 2019/7/23
  ** @desc
  **/
 class BackgroundTaskService : Thread() {
+    private val TAG = "BackgroundTaskService"
     private val pos = SPApplication.getInstance().getPos()
-    private val websocketProcess = WebsocketProcess()
-    private var websocketHasRun = false
-    private var apiInterface: APIInterface? = null
+    private var apiInterface: APIInterface = EpayApiImpl()
     private var sysRecord: SysParaRecord? = null
     private var transdtlClearDate: String? = null
+    @Volatile
+    private var isExist = false
 
-    fun getWebsocketProcess(): WebsocketProcess {
-        return websocketProcess
+    override fun start() {
+        isExist = false
+        super.start()
+    }
+
+    override fun interrupt() {
+        isExist = true
+        super.interrupt()
     }
 
     override fun run() {
-        var heartgap = 0
-        CommonUtil.doSleep(60 * 1000)
-        while (true) {
-            val hasInit = pos.getConfigPara()?.initOK ?: false
-            if (hasInit) {
-                break
+        var heartgap: Int
+        while (!isExist) {
+            try {
+                heartAndTransdtl()
+                clearTransdtl()
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+                LogUtil.d(TAG, CommonUtil.getExceptionStack(ex))
             }
-            CommonUtil.doSleep(1000)
-        }
-        while (true) {
-            //做一卡通心跳和流水上传
-            heartAndTransdtl()
-            //清除流水
-            clearTransdtl()
             sysRecord = pos.getSysPara()
-//            if (sysRecord != null && sysRecord!!.getSocketSwitch() != 0) {
-//                if (!websocketHasRun) {
-//                    websocketHasRun = true
-//                    websocketProcess.start()
-//                }
-//            } else {
-//                if (websocketHasRun) {
-//                    websocketHasRun = false
-//                    websocketProcess.stop()
-//                }
-//            }
             heartgap = if (sysRecord == null || sysRecord!!.heatBeat < 10 || sysRecord!!.heatBeat > 600) {
                 60
             } else {
@@ -62,47 +54,42 @@
     }
 
     private fun heartAndTransdtl() {
-        //做一卡通的心跳以及流水上传
         try {
-            apiInterface!!.heartBeat()
-            SPApplication.getInstance().setEpayLinking(true)
-//        /*更新通讯jwt*/
+            /**更新通讯jwt*/
             refreshJwt()
+            SPApplication.getInstance().setEpayLinking(true)
+            /**做一卡通的心跳以及流水上传*/
+            apiInterface.heartBeat()
+            SPApplication.getInstance().setEpayLinking(true)
             uploadTransdtl()
         } catch (ex: HeartBeatError) {
             SPApplication.getInstance().setEpayLinking(false)
+        } catch (ex: TransdtlUploadError) {
+            ex.printStackTrace()
+        } catch (ex: AuthEpayError) {
+            SPApplication.getInstance().setEpayLinking(false)
         }
     }
 
     private fun uploadTransdtl() {
-        try {
-            pos.getTransdtlOfflineUnconfirm().forEach {
-                apiInterface!!.uploadTransdtl(it)
-                it.upflag = 1
-                pos.updateTransdtlOffline(it)
-            }
-            pos.getTransdtlOnlineUnconfirm().forEach {
-                apiInterface!!.uploadTransdtl(it)
-                it.upflag = 1
-                pos.updateTransdtlOnline(it)
-            }
-        } catch (ex: TransdtlUploadError) {
-            ex.printStackTrace()
+        pos.getTransdtlOfflineUnconfirm().forEach {
+            apiInterface.uploadTransdtl(it)
+            it.upflag = 1
+            pos.updateTransdtlOffline(it)
+        }
+        pos.getTransdtlOnlineUnconfirm().forEach {
+            apiInterface.uploadTransdtl(it)
+            it.upflag = 1
+            pos.updateTransdtlOnline(it)
         }
     }
 
     private fun refreshJwt() {
-        try {
-            val jwtExpire = pos.getDynamicPara()?.jwtExpire ?: "0"
-            if (jwtExpire < DateUtil.getNowDateTimeNoFormat()) {
-                autoAuth()
-            } else {
-                AuthEpay().refresh()
-            }
-            SPApplication.getInstance().setEpayLinking(true)
-        } catch (ex: AuthEpayError) {
-            ex.printStackTrace()
-            SPApplication.getInstance().setEpayLinking(false)
+        val jwtExpire = pos.getDynamicPara()?.jwtExpire ?: "0"
+        if (jwtExpire < DateUtil.getNowDateTimeNoFormat()) {
+            autoAuth()
+        } else {
+            AuthEpay().refresh()
         }
     }
 
diff --git a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
index 517819d..0cdffea 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -46,7 +46,7 @@
             throw HeartBeatError("json异常:${ex.message}")
         }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw HeartBeatError(retBean.retmsg!!)
+            throw HeartBeatError(retBean.getErrorMsg())
         }
         if (cardverno < retBean.cardverno!!) {
             try {
@@ -59,7 +59,7 @@
             try {
                 downloadSyspara(retBean.paragroupid, retBean.paraverno)
             } catch (ex: SysParaError) {
-                throw SysParaError(ex.message ?: "null")
+                throw HeartBeatError(ex.message ?: "null")
             }
         }
         /**
@@ -92,7 +92,7 @@
             throw SysParaError("json异常:${ex.message}")
         }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw SysParaError(retBean.retmsg!!)
+            throw SysParaError(retBean.getErrorMsg())
         }
         val record = pos.getSysPara() ?: SysParaRecord()
         retBean.syspara?.forEach {
@@ -108,6 +108,18 @@
                 it.paraname == "communicate_time" -> record.commTime = it.paraval!!.toInt()
             }
         }
+        if (record.heatBeat == 0) {
+            record.heatBeat = 60
+        }
+        if (record.sucShowtime == 0) {
+            record.sucShowtime = 2
+        }
+        if (record.failShowtime == 0) {
+            record.failShowtime = 3
+        }
+        if (record.commTime == 0) {
+            record.commTime = 3
+        }
         if (!pos.replaceSysPara(record)) {
             throw SysParaError("保存参数失败")
         }
@@ -133,7 +145,7 @@
                 throw WhiteListError("json异常:${ex.message}")
             }
             if (retBean.retcode != PublicDef.SUCCESS) {
-                throw WhiteListError(retBean.retmsg!!)
+                throw WhiteListError(retBean.getErrorMsg())
             }
             if (retBean.count != retBean.whitelist?.size) {
                 throw WhiteListError("白名单数量不对[${retBean.count},${retBean.whitelist?.size}]")
@@ -143,8 +155,7 @@
                 val record = WhiteListRecord()
                 record.cardphyid = it.cardphyid
                 record.cardno = it.cardno
-                record.flag = it.flag
-                record.balance = it.balance
+                record.status = it.status
                 list.add(record)
             }
             if (!pos.saveWhiteList(list)) {
@@ -160,28 +171,13 @@
 
     @Throws(TransdtlUploadError::class)
     override fun uploadTransdtl(record: TransdtlOnlineRecord) {
-        var reversalflag = "false"
-        if (record.reversalflag == ReversalFlag.AUTO ||
-            record.reversalflag == ReversalFlag.MANUAL
-        ) {
-            reversalflag = "true"
-        }
-
         val params = WebParams()
         params.setParameter("devphyid", record.devphyid)
             .setParameter("transdate", record.transdate)
             .setParameter("transtime", record.transtime)
             .setParameter("termseqno", record.devseqno)
-            .setParameter("cardno", record.cardno)
-            .setParameter("cardphyid", record.cardphyid)
-            .setParameter("qrcode", record.qrcode)
-            .setParameter("transtype", record.transtype)
-            .setParameter("amount", record.payamt)
-            .setParameter("extraamt", record.extraamt)
-            .setParameter("managefeetype", record.managefeetype)
-            .setParameter("managefeetype", record.managefeetype)
-            .setParameter("billno", record.billno)
-            .setParameter("reversalflag", reversalflag)
+            .setParameter("reversalbillno", record.reversalbillno)
+            .setParameter("reversalflag", record.reversalflag.toString())
             .setParameter("status", record.status.toString())
         val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/paycancel", "", params)
             ?: throw TransdtlUploadError("请求超时")
@@ -194,7 +190,7 @@
             throw TransdtlUploadError("json异常:${ex.message}")
         }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw TransdtlUploadError(retBean.retmsg!!)
+            throw TransdtlUploadError(retBean.getErrorMsg())
         }
         if (retBean.termseqno != record.devseqno) {
             throw TransdtlUploadError("返回流水号不一致")
@@ -236,7 +232,7 @@
             throw TransdtlUploadError("json异常:${ex.message}")
         }
         if (retBean.retcode != PublicDef.SUCCESS) {
-            throw TransdtlUploadError(retBean.retmsg!!)
+            throw TransdtlUploadError(retBean.getErrorMsg())
         }
         if (retBean.termseqno != record.devseqno) {
             throw TransdtlUploadError("返回流水号不一致")
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index 6ce7a41..a65a9ce 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -218,6 +218,19 @@
     }
 
     /**
+     * @param time HHmmss
+     * @return ms
+     * @desc 将时间格式的字符串转换为长整型
+     */
+    fun timeFormatConvertToLong(time: String): Long {
+        return try {
+            FORMAT_HHmmss.parse(time).time
+        } catch (ex: ParseException) {
+            0L
+        }
+    }
+
+    /**
      * @param time ms
      * @return yyyyMMddHHmmss
      * @desc 将长整型数字转换为日期格式的字符串
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index b67e05b..551a3ac 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -31,7 +31,8 @@
     const val MSG_USER_INFO_SHOW = 17
     const val MSG_USER_INFO_CLEAR = 18
     const val MSG_LINK_STATUS = 19
-    const val MSG_CODE_PAYING_CANCEL = 19
+    const val MSG_PAYING_QUERY = 20
+    const val MSG_PAYING_INTERRUPT = 21
     /*************************不能重复*****************************/
     /**
      * 卡消费标志(1 byte)
diff --git a/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt b/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt
index 9fd9825..e05a2a0 100644
--- a/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt
+++ b/app/src/main/java/com/supwisdom/view/BigProgressDialog.kt
@@ -1,3 +1,5 @@
+@file:Suppress("DEPRECATION")
+
 package com.supwisdom.view
 
 import android.app.Activity
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index 39b5806..a03f510 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -18,16 +18,18 @@
  ** create by zzq on 2019/7/26
  ** @desc 消费弹窗
  **/
+@Suppress("DEPRECATION")
 class DialogPurchase constructor(context: Context, callBack: ICallBack) : DialogBase(context), IDecoderAcquirer {
     private val TAG = "DialogPurchase"
     private val callBack = callBack
     private var vCount: TextView
     private var vPayhint: TextView
     private var vPayamt: TextView
-    private var vBalance: TextView
+    private var vUsername: TextView
     private var posDec: PosDecoder? = null
     private var lastFixpayDecoderOpenTime: Long = 0
     private val waitTime = 60
+    private var payQueryConfirm = false
     var codePayingNoCancelEnable = false
     var codePaying = false
     var isFixPay = false
@@ -38,7 +40,7 @@
         vCount = this.findViewById(R.id.tv_close_count) as TextView
         vPayhint = this.findViewById(R.id.tv_pay_hint) as TextView
         vPayamt = this.findViewById(R.id.tv_pay_amount) as TextView
-        vBalance = this.findViewById(R.id.tv_pay_balance) as TextView
+        vUsername = this.findViewById(R.id.tv_pay_username) as TextView
 
         posDec = PosDecoder(this)
     }
@@ -65,7 +67,11 @@
             }
             when (event.keyCode) {
                 KeyEvent.KEYCODE_DEL -> {
-                    finish(true)
+                    if (payQueryConfirm) {
+                        finish(isManualCancel = true, isPaying = true)
+                    } else {
+                        finish(isManualCancel = true, isPaying = false)
+                    }
                 }
             }
         }
@@ -74,23 +80,28 @@
 
     fun show(hint: String, amount: String) {
         vPayhint.text = hint
-        vPayhint.setTextColor(Color.BLACK)
+        vPayhint.setTextColor(context.resources.getColor(R.color.blue))
         vPayamt.text = amount
         vPayamt.visibility = View.VISIBLE
 
-        vBalance.visibility = View.GONE
+        vUsername.visibility = View.GONE
         show()
         asyncOpenDecoder()
         resetCounter(waitTime)
     }
 
+    fun showQueryProcess(hint: String, amount: String) {
+        payQueryConfirm = true
+        showProcess(hint, amount)
+    }
+
     fun showProcess(hint: String, amount: String) {
         vPayhint.text = hint
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = amount
         vPayamt.visibility = View.VISIBLE
 
-        vBalance.visibility = View.GONE
+        vUsername.visibility = View.GONE
         resetCounter(waitTime)
     }
 
@@ -99,22 +110,28 @@
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.payamt)
         vPayamt.visibility = View.VISIBLE
-        if (info.balance == null) {
-            vBalance.visibility = View.GONE
-        } else {
-            vBalance.text = CommonUtil.showFormatAmount("余额", info.balance!!)
-            vBalance.visibility = View.VISIBLE
-        }
+        vUsername.text = "姓名: ${info.username ?: info.cardno}"
+        vUsername.visibility = View.VISIBLE
         show()
         resetCounter(info.showtime)
     }
 
+    fun showPayInterrupt() {
+        vPayhint.text = "交易取消"
+        vPayhint.setTextColor(Color.RED)
+        vPayamt.text = "以银行交易为准"
+        vPayamt.visibility = View.VISIBLE
+        vUsername.visibility = View.GONE
+        show()
+        resetCounter(3)
+    }
+
     fun showPayFail(info: CardUserInfoBean) {
         vPayhint.text = "消费失败"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = info.retmsg
         vPayamt.visibility = View.VISIBLE
-        vBalance.visibility = View.GONE
+        vUsername.visibility = View.GONE
         show()
         resetCounter(info.showtime)
     }
@@ -124,7 +141,7 @@
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.amount)
         vPayamt.visibility = View.VISIBLE
-        vBalance.visibility = View.GONE
+        vUsername.visibility = View.GONE
         show()
         resetCounter(info.showtime)
     }
@@ -134,7 +151,7 @@
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = info.retmsg
         vPayamt.visibility = View.VISIBLE
-        vBalance.visibility = View.GONE
+        vUsername.visibility = View.GONE
         show()
         resetCounter(info.showtime)
     }
@@ -180,11 +197,12 @@
         }
     }
 
-    private fun finish(isManualCancel: Boolean) {
+    private fun finish(isManualCancel: Boolean, isPaying: Boolean) {
         codePaying = false
         codePayingNoCancelEnable = false
+        payQueryConfirm = false
         dismiss()
-        callBack.callback(isManualCancel)
+        callBack.callback(isManualCancel, isPaying)
         asyncCloseDecoder()
     }
 
@@ -211,12 +229,12 @@
         }
 
         override fun onFinish() {
-            finish(false)
+            finish(false, false)
         }
     }
 
     interface ICallBack {
-        fun callback(isManualCancel: Boolean)
+        fun callback(isManualCancel: Boolean, isPaying: Boolean)
 
         fun callback(code: String)
     }
diff --git a/app/src/main/res/layout/activity_consume.xml b/app/src/main/res/layout/activity_consume.xml
index b4565e0..a1bf974 100644
--- a/app/src/main/res/layout/activity_consume.xml
+++ b/app/src/main/res/layout/activity_consume.xml
@@ -1,437 +1,424 @@
 <?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">
+              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: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
+        <LinearLayout
                 android:layout_width="match_parent"
-                android:layout_height="130dp"
-                android:orientation="horizontal"
-                android:padding="@dimen/consume_text_pad_size"
-                android:weightSum="3">
+                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">
+                        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" />
+                            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">
+                            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" />
+                                android:id="@+id/tv_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" />
+                                android:id="@+id/tv_nowtime"
+                                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">
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_gravity="center"
+                        android:layout_weight="1"
+                        android:gravity="end"
+                        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" />
+                            android:id="@+id/tv_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" />
+                            android:id="@+id/tv_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:layout_width="260dp"
+                        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/tv_input_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:background="@color/black" />
+                android:layout_marginBottom="5dp"
+                android:background="@color/black"/>
 
-            <LinearLayout
+        <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:orientation="horizontal"
-                android:padding="@dimen/consume_text_pad_size">
+                android:layout_marginLeft="10dp"
+                android:layout_marginTop="5dp"
+                android:orientation="vertical">
 
-                <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" />
+            <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:id="@+id/consume_amt"
+
+            <TextView
                     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" />
+                    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/tv_citizen_name"
+                        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/tv_citizen_cardno"
+                        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/tv_cardstatus"
+                        style="@style/consume_wait_account_paraval_style"/>
             </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: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">
 
-            <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" />
+                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" />
+                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" />
+                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/tv_last_pay_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:id="@+id/ll_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" />
+                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/tv_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_cardno"
+                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/tv_last_cardno"
+                    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: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/tv_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: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" />
+                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/tv_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_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">
+                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" />
+                    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" />
+                    android:id="@+id/tv_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
diff --git a/app/src/main/res/layout/dialog_purchase.xml b/app/src/main/res/layout/dialog_purchase.xml
index e43ef15..bb9a98a 100644
--- a/app/src/main/res/layout/dialog_purchase.xml
+++ b/app/src/main/res/layout/dialog_purchase.xml
@@ -32,22 +32,20 @@
                     style="@style/purchase_tv_text_hint_style"
                     android:text="消费成功"
                     android:textColor="@color/light_green"/>
-
+            <TextView
+                    android:id="@+id/tv_pay_username"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="姓名:  张三"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/ordinary_consume_text_size"/>
             <TextView
                     android:id="@+id/tv_pay_amount"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="10dp"
                     android:text="金额:  10.00元"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/ordinary_consume_text_size"/>
-
-            <TextView
-                    android:id="@+id/tv_pay_balance"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="余额:  123.00元"
-                    android:textColor="@color/black"
+                    android:textColor="@color/blue"
                     android:textSize="@dimen/ordinary_consume_text_size"/>
 
         </LinearLayout>
diff --git a/app/src/main/res/raw/pay_cancel.wav b/app/src/main/res/raw/pay_cancel.wav
new file mode 100644
index 0000000..21c72d9
--- /dev/null
+++ b/app/src/main/res/raw/pay_cancel.wav
Binary files differ
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d16cba1..123c964 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -393,6 +393,7 @@
         <item name="android:layout_height">wrap_content</item>
         <item name="android:layout_width">wrap_content</item>
         <item name="android:textColor">@color/black</item>
+        <item name="android:maxLines">1</item>
         <item name="android:textSize">@dimen/consume_text_size2</item>
     </style>
 
diff --git a/upgrade.py b/upgrade.py
index 8de756f..6a2ec3c 100644
--- a/upgrade.py
+++ b/upgrade.py
@@ -28,12 +28,12 @@
 def zip_file(apk):
 	fileDir = path.dirname(apk)
 	version = subprocess.check_output(['git', 'describe', '--abbrev=4','--dirty','--always','--tags']).strip().decode('utf-8')
-	zipFile = fileDir+'/posa711'+'-'+version+'.zip'
+	zipFile = fileDir+'/posa711dali'+'-'+version+'.zip'
 	print('zipFile = '+zipFile)
 	
 	zf = zipfile.ZipFile(zipFile,'w',zipfile.ZIP_DEFLATED)
 	zf.write(fileDir+'/'+hashFileName,hashFileName)
-	zf.write(apk,'posa711.apk')
+	zf.write(apk,'posa711dali.apk')
 	zf.close()
 
 if __name__ == '__main__':