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 aeb5ef4..8aa0cd7 100644
--- a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
@@ -80,7 +80,7 @@
 
     private fun refresh() {
         AuxScreenController.getInstance().refreshTitle("卡库初始化")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(listOf("加载硬件驱动", "请稍等..."))
     }
 
@@ -96,7 +96,7 @@
             vResult.text = msg
             vResult.visibility = View.VISIBLE
             AuxScreenController.getInstance().refreshTitle("卡库初始化")
-            AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+            AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
             AuxScreenController.getInstance().refreshContent(listOf("请联系管理员", "加载驱动失败", "原因:", msg))
         }
         isLoading = false
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 a000250..39de86e 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -338,11 +338,10 @@
         vCitizenName.text = null
         vCitizenCardno.text = null
         vCardstatus.text = null
-        val tmptime = datetime.substring(0, 16)
-        if (lastshowtime != tmptime) {
-            lastshowtime = tmptime
-            vTime.text = tmptime
-            AuxScreenController.getInstance().refreshBottom(tmptime)
+        if (lastshowtime != datetime) {
+            lastshowtime = datetime
+            vTime.text = datetime
+            AuxScreenController.getInstance().refreshBottom(datetime)
             if (periodFixPayEnable) {
                 parsePeriodFixPay()
             }
@@ -404,7 +403,7 @@
         }
 
         refreshLinkStatus(SPApplication.getInstance().isOnline())
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime().substring(0, 16))
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
 
         periodFixPayEnable = false
@@ -491,7 +490,7 @@
     override fun showConsumeSuc(info: CardUserInfoBean) {
         dialogPurchase!!.showPaySuccess(info)
         val auxList = ArrayList<String>()
-        auxList.add(info.retmsg!!)
+        auxList.add(info.getErrorMsg())
         auxList.add(CommonUtil.showFormatAmount("金额", info.payamt))
         when {
             info.amount > info.payamt -> {
@@ -530,7 +529,7 @@
     override fun showConsumeFail(info: CardUserInfoBean) {
         dialogPurchase!!.showPayFail(info)
         AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("消费失败", "原因:", info.retmsg))
+            .refreshContent(Arrays.asList<String>("消费失败", "原因:", info.getErrorMsg()))
         SoundUtil.playMusic(applicationContext, R.raw.consume_fail)
         refreshRecentDtl(info)
     }
@@ -540,7 +539,7 @@
         AuxScreenController.getInstance()
             .refreshContent(
                 Arrays.asList<String>(
-                    info.retmsg,
+                    info.getErrorMsg(),
                     CommonUtil.showFormatAmount("金额", info.payamt)
                 )
             )
@@ -551,7 +550,7 @@
     override fun showReverseFail(info: CardUserInfoBean) {
         dialogPurchase!!.showReverseFail(info)
         AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.retmsg))
+            .refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.getErrorMsg()))
         SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
         refreshRecentDtl(info)
     }
@@ -595,7 +594,7 @@
                 }
                 vLastPayFailll.visibility = View.VISIBLE
                 vLastPayamtll.visibility = View.GONE
-                vLastPayFailreason.text = info.retmsg
+                vLastPayFailreason.text = info.getErrorMsg()
             }
             vLastCardno.text = info.cardno
             vLastPayway.text = if (info.payway == "code") {
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 11f8580..6ebab3c 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
@@ -1,748 +1,748 @@
-package com.supwisdom.activities.consume.mode
-
-import android.os.Handler
-import android.os.Message
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.IConsumeView
-import com.supwisdom.activities.consume.bean.*
-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.service.EpayApiImpl
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc 刷卡消费
- **/
-class CardPayService constructor(private val iConsumeView: IConsumeView, private val handler: Handler) {
-    private val TAG = "CardPayService"
-    private val pos = SPApplication.getInstance().getPos()
-    private val runnable = CardPayRunnable()
-    private val consumeApi = ConsumeApi()
-    @Volatile
-    private var isExist = false
-    @Volatile
-    private var clickStat = ClickStat.INIT
-    @Volatile
-    private var amount: Int = 0
-    @Volatile
-    private var payQueryConfirm = false
-    var isFixMode = false
-    private var thread: Thread? = null
-    private var cardBean: CardBean? = null
-    /**
-     * 防止定额连续消费
-     */
-    private val lastPayBean = LastPayBean()
-    @Volatile
-    private var operation = false
-    private val screenSaverBean = ScreenSaverBean()
-
-    init {
-        screenSaverBean.operationTime = System.currentTimeMillis()
-    }
-
-    fun start() {
-        isExist = false
-        if (thread == null) {
-            thread = Thread(runnable)
-            thread!!.start()
-        }
-    }
-
-    fun stop() {
-        isExist = true
-        thread?.interrupt()
-        thread = null
-    }
-
-    fun clickNoPay() {
-        clickStat = ClickStat.INIT
-        amount = 0
-    }
-
-    fun clickToPay(amount: Int) {
-        clickStat = ClickStat.PAY
-        this.amount = amount
-    }
-
-    fun clickToReverse(amount: Int) {
-        clickStat = ClickStat.REVERSE
-        this.amount = amount
-    }
-
-    fun clickToInterrupt() {
-        clickStat = ClickStat.INIT
-        payQueryConfirm = false
-    }
-
-    fun resetOperationTime() {
-        operation = true
-    }
-
-    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
-        private var lastShowTime: Long = 0
-        private var lastUserInfoTime: Long = 0
-        private var curLinkRefreshTime: Long = 0
-        override fun run() {
-            while (!isExist) {
-                iConsumeView.cardPayingStatus(false)
-                checkShowScreen()
-                if (iConsumeView.isBackRunning()) {
-                    CommonUtil.doSleep(1000)
-                    continue
-                }
-                CommonUtil.doSleep(100)
-                try {
-                    val cardphyid = Cardlib.instance.requestCard()
-                    iConsumeView.cardPayingStatus(true)
-                    if (oldcardphyid != cardphyid) {
-                        readCard()
-                        cardBean!!.cardphyid = cardphyid
-                        oldcardphyid = cardphyid
-                        operation = true
-                    }
-                    when (clickStat) {
-                        ClickStat.PAY -> {
-                            try {
-                                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
-                        }
-                        ClickStat.REVERSE -> {
-                            try {
-                                doReverse()
-                            } catch (ex: CardPayCancelFailError) {
-                                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
-                        }
-                        ClickStat.INIT -> {
-                            if (SPApplication.getInstance().isOnline() && !onlineBalance) {
-                                onlineBalance = true
-                                getAccountInfoByCard()
-                            }
-                            val curtime = System.currentTimeMillis()
-                            if (curtime < lastUserInfoTime ||
-                                curtime - lastUserInfoTime > 1000
-                            ) {
-                                lastUserInfoTime = curtime
-                                showCardUserInfo()
-                            }
-                        }
-                    }
-                } catch (ex: CardNotFoundError) {
-                    ex.printStackTrace()
-                    doClear()
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                    doClear()
-                }
-            }
-        }
-
-        private fun getAccountInfoByCard() {
-            val resp = consumeApi.accQuery(
-                pos.getConfigPara()!!.devphyid!!,
-                cardBean!!.cardphyid!!,
-                cardBean!!.cardNo!!
-            )
-            if (resp != null && resp.retcode == HttpStatus.SC_OK) {
-                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 checkShowScreen() {
-            val tt = System.currentTimeMillis()
-            if (operation) {
-                operation = false
-                screenSaverBean.operationTime = tt
-                screenSaverBean.operationFlag = true
-            }
-            if (tt > screenSaverBean.operationTime &&
-                tt - screenSaverBean.operationTime > PublicDef.SCREEN_SAVER_GAP
-            ) {
-                /**
-                 * 连续半小时无操作屏保
-                 */
-                screenSaverBean.operationTime = tt
-                screenSaverBean.flag = true
-                screenSaverBean.operationFlag = false
-                sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
-            } else {
-                if (screenSaverBean.operationFlag && screenSaverBean.flag) {
-                    screenSaverBean.flag = false
-                    sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
-                }
-            }
-        }
-
-        private fun showCardUserInfo() {
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
-            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!!.username = cardBean!!.cardNo
-        }
-
-        private fun doConsume() {
-            if (isFixMode) {
-                if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
-                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
-                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
-                        throw CardPayFailError("${gap}s内不能连续消费")
-                    }
-                }
-            }
-            sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
-            if (SPApplication.getInstance().isOnline()) {
-                if (!doOnlineConsume()) {
-                    /**
-                     * 由于不写卡，联机消费失败直接转离线
-                     */
-                    doOfflineConsume()
-                }
-            } else {
-                doOfflineConsume()
-            }
-        }
-
-        private fun doReverse() {
-            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 {
-            initTransdtlOnline()
-            var resp = consumeApi.payInit(onlRecord)
-            var result = parseInitResult(resp)
-            if (!result) {
-                return result
-            }
-            resp = consumeApi.payConfirm(onlRecord)
-            result = parseConfirmResult(resp)
-            payQueryConfirm = false
-            if (!result) {
-                payQueryConfirm = true
-                result = doOnlineConsumeQuery()
-            }
-            updateTransdtlOnline(result)
-            if (result) {
-                showOnlSucInfo()
-            }
-            return result
-        }
-
-        private fun doOnlineConsumeQuery(): Boolean {
-            var queryCnt = 1
-            LogUtil.e(
-                TAG,
-                "pay timeout and query result,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
-            )
-            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 = 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.getErrorMsg())
-            }
-            onlRecord.billno = retBean.billno
-            onlRecord.username = retBean.username
-            return true
-        }
-
-        private fun parseConfirmResult(resp: TransResp?): Boolean {
-            if (resp == null || resp.retcode != HttpStatus.SC_OK) {
-                return false
-            }
-            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.getErrorMsg())
-            }
-            if (retBean.require_query) {
-                return false
-            }
-            onlRecord.payamt = retBean.amount
-            onlRecord.extraamt = retBean.extraamt
-            return true
-        }
-
-        private fun initTransdtlOnline() {
-            onlRecord = TransdtlOnlineRecord()
-            var seqno = pos.getTransdtlOnlineMaxSeqno()
-            if (seqno == 0) {
-                seqno = pos.getDynamicPara()?.onlineseqno ?: 0
-            }
-            onlRecord.devphyid = pos.getConfigPara()!!.devphyid
-            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.reversalflag = ReversalFlag.NONE
-            onlRecord.extraamt = 0
-            onlRecord.transtype = "card"
-            onlRecord.status = PayStatus.INIT
-            onlRecord.upflag = 1
-            if (!pos.saveTransdtlOnline(onlRecord)) {
-                throw CardPayFailError("保存流水失败")
-            }
-        }
-
-        private fun updateTransdtlOnline(issuccess: Boolean) {
-            if (issuccess) {
-                onlRecord.status = PayStatus.SUC
-            } else {
-                onlRecord.status = PayStatus.FAIL
-            }
-            onlRecord.upflag = 1
-            pos.updateTransdtlOnline(onlRecord)
-        }
-
-        private fun doOfflineConsume() {
-            initTransdtlOffline()
-            checkCardValid()
-            updateTransdtlOffline(true)
-            showOffSucInfo()
-        }
-
-        private fun checkCardValid() {
-            val sysRecord = pos.getSysPara()
-            if (!sysRecord!!.offlineEnable) {
-                throw CardPayFailError("禁止离线交易")
-            }
-            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
-            if (ctlRecord == null || ctlRecord.paraval != "1") {
-                val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
-                val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
-                if (offdate > validdate) {
-                    throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
-                }
-            }
-
-            val whiteRecord =
-                pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: 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}")
-            }
-
-            val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
-            if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
-                throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
-            }
-        }
-
-        private fun initTransdtlOffline() {
-            offRecord = TransdtlOfflineRecord()
-            var seqno = pos.getTransdtlOfflineMaxSeqno()
-            if (seqno == 0) {
-                seqno = pos.getDynamicPara()?.offlineseqno ?: 0
-            }
-            offRecord.devphyid = pos.getConfigPara()!!.devphyid
-            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.reversalflag = ReversalFlag.NONE
-            offRecord.extraamt = 0
-            offRecord.managefeetype = "none"
-            offRecord.status = PayStatus.INIT
-            offRecord.upflag = 1
-            if (!pos.saveTransdtlOffline(offRecord)) {
-                throw CardPayFailError("保存流水失败")
-            }
-        }
-
-        private fun updateTransdtlOffline(issuccess: Boolean) {
-            if (issuccess) {
-                offRecord.status = PayStatus.SUC
-            } else {
-                offRecord.status = PayStatus.FAIL
-            }
-            offRecord.upflag = 0
-            if (!pos.updateTransdtlOffline(offRecord)) {
-                throw CardPayFailError("更新流水失败")
-            }
-            asyncUpload(offRecord)
-        }
-
-        private fun showOnlSucInfo() {
-            lastPayBean.cardphyid = cardBean!!.cardphyid
-            lastPayBean.suctime = System.currentTimeMillis()
-            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() {
-            lastPayBean.cardphyid = cardBean!!.cardphyid
-            lastPayBean.suctime = System.currentTimeMillis()
-            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() {
-            oldcardphyid = null
-            onlineBalance = false
-            val curtime = System.currentTimeMillis()
-            if (curtime < lastShowTime ||
-                curtime - lastShowTime > 1000
-            ) {
-                lastShowTime = curtime
-                sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDateTime())
-                showLinkStatus()
-            }
-        }
-
-        private fun showLinkStatus() {
-            if (SPApplication.getInstance().isOnline()) {
-                if (!curLinkStatus) {
-                    curLinkRefreshTime = System.currentTimeMillis()
-                    curLinkStatus = true
-                    sendMsg(PublicDef.MSG_LINK_STATUS, true)
-                    return
-                }
-            } else {
-                if (curLinkStatus) {
-                    curLinkStatus = false
-                    curLinkRefreshTime = System.currentTimeMillis()
-                    sendMsg(PublicDef.MSG_LINK_STATUS, false)
-                    return
-                }
-            }
-            val t = System.currentTimeMillis()
-            if (t < curLinkRefreshTime ||
-                t - curLinkRefreshTime > 30000
-            ) {
-                curLinkRefreshTime = t
-                sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
-            }
-        }
-
-        private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
-            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
-            info.showtime = pos.getSysPara()!!.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
-        }
-
-        private fun sendMsg(code: Int, obj: Any) {
-            val msg = Message()
-            msg.what = code
-            msg.obj = obj
-            handler.sendMessage(msg)
-        }
-    }
-}
-
-enum class ClickStat {
-    INIT,
-    PAY,
-    REVERSE
+package com.supwisdom.activities.consume.mode
+
+import android.os.Handler
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.IConsumeView
+import com.supwisdom.activities.consume.bean.*
+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.service.EpayApiImpl
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc 刷卡消费
+ **/
+class CardPayService constructor(private val iConsumeView: IConsumeView, private val handler: Handler) {
+    private val TAG = "CardPayService"
+    private val pos = SPApplication.getInstance().getPos()
+    private val runnable = CardPayRunnable()
+    private val consumeApi = ConsumeApi()
+    @Volatile
+    private var isExist = false
+    @Volatile
+    private var clickStat = ClickStat.INIT
+    @Volatile
+    private var amount: Int = 0
+    @Volatile
+    private var payQueryConfirm = false
+    var isFixMode = false
+    private var thread: Thread? = null
+    private var cardBean: CardBean? = null
+    /**
+     * 防止定额连续消费
+     */
+    private val lastPayBean = LastPayBean()
+    @Volatile
+    private var operation = false
+    private val screenSaverBean = ScreenSaverBean()
+
+    init {
+        screenSaverBean.operationTime = System.currentTimeMillis()
+    }
+
+    fun start() {
+        isExist = false
+        if (thread == null) {
+            thread = Thread(runnable)
+            thread!!.start()
+        }
+    }
+
+    fun stop() {
+        isExist = true
+        thread?.interrupt()
+        thread = null
+    }
+
+    fun clickNoPay() {
+        clickStat = ClickStat.INIT
+        amount = 0
+    }
+
+    fun clickToPay(amount: Int) {
+        clickStat = ClickStat.PAY
+        this.amount = amount
+    }
+
+    fun clickToReverse(amount: Int) {
+        clickStat = ClickStat.REVERSE
+        this.amount = amount
+    }
+
+    fun clickToInterrupt() {
+        clickStat = ClickStat.INIT
+        payQueryConfirm = false
+    }
+
+    fun resetOperationTime() {
+        operation = true
+    }
+
+    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
+        private var lastShowTime: Long = 0
+        private var lastUserInfoTime: Long = 0
+        private var curLinkRefreshTime: Long = 0
+        override fun run() {
+            while (!isExist) {
+                iConsumeView.cardPayingStatus(false)
+                checkShowScreen()
+                if (iConsumeView.isBackRunning()) {
+                    CommonUtil.doSleep(1000)
+                    continue
+                }
+                CommonUtil.doSleep(100)
+                try {
+                    val cardphyid = Cardlib.instance.requestCard()
+                    iConsumeView.cardPayingStatus(true)
+                    if (oldcardphyid != cardphyid) {
+                        readCard()
+                        cardBean!!.cardphyid = cardphyid
+                        oldcardphyid = cardphyid
+                        operation = true
+                    }
+                    when (clickStat) {
+                        ClickStat.PAY -> {
+                            try {
+                                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
+                        }
+                        ClickStat.REVERSE -> {
+                            try {
+                                doReverse()
+                            } catch (ex: CardPayCancelFailError) {
+                                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
+                        }
+                        ClickStat.INIT -> {
+                            if (SPApplication.getInstance().isOnline() && !onlineBalance) {
+                                onlineBalance = true
+                                getAccountInfoByCard()
+                            }
+                            val curtime = System.currentTimeMillis()
+                            if (curtime < lastUserInfoTime ||
+                                curtime - lastUserInfoTime > 1000
+                            ) {
+                                lastUserInfoTime = curtime
+                                showCardUserInfo()
+                            }
+                        }
+                    }
+                } catch (ex: CardNotFoundError) {
+                    ex.printStackTrace()
+                    doClear()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    doClear()
+                }
+            }
+        }
+
+        private fun getAccountInfoByCard() {
+            val resp = consumeApi.accQuery(
+                pos.getConfigPara()!!.devphyid!!,
+                cardBean!!.cardphyid!!,
+                cardBean!!.cardNo!!
+            )
+            if (resp != null && resp.retcode == HttpStatus.SC_OK) {
+                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 checkShowScreen() {
+            val tt = System.currentTimeMillis()
+            if (operation) {
+                operation = false
+                screenSaverBean.operationTime = tt
+                screenSaverBean.operationFlag = true
+            }
+            if (tt > screenSaverBean.operationTime &&
+                tt - screenSaverBean.operationTime > PublicDef.SCREEN_SAVER_GAP
+            ) {
+                /**
+                 * 连续半小时无操作屏保
+                 */
+                screenSaverBean.operationTime = tt
+                screenSaverBean.flag = true
+                screenSaverBean.operationFlag = false
+                sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
+            } else {
+                if (screenSaverBean.operationFlag && screenSaverBean.flag) {
+                    screenSaverBean.flag = false
+                    sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
+                }
+            }
+        }
+
+        private fun showCardUserInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
+            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!!.username = cardBean!!.cardNo
+        }
+
+        private fun doConsume() {
+            if (isFixMode) {
+                if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
+                    }
+                }
+            }
+            sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
+            if (SPApplication.getInstance().isOnline()) {
+                if (!doOnlineConsume()) {
+                    /**
+                     * 由于不写卡，联机消费失败直接转离线
+                     */
+                    doOfflineConsume()
+                }
+            } else {
+                doOfflineConsume()
+            }
+        }
+
+        private fun doReverse() {
+            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 {
+            initTransdtlOnline()
+            var resp = consumeApi.payInit(onlRecord)
+            var result = parseInitResult(resp)
+            if (!result) {
+                return result
+            }
+            resp = consumeApi.payConfirm(onlRecord)
+            result = parseConfirmResult(resp)
+            payQueryConfirm = false
+            if (!result) {
+                payQueryConfirm = true
+                result = doOnlineConsumeQuery()
+            }
+            updateTransdtlOnline(result)
+            if (result) {
+                showOnlSucInfo()
+            }
+            return result
+        }
+
+        private fun doOnlineConsumeQuery(): Boolean {
+            var queryCnt = 1
+            LogUtil.e(
+                TAG,
+                "pay timeout and query result,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
+            )
+            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 = 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.getErrorMsg())
+            }
+            onlRecord.billno = retBean.billno
+            onlRecord.username = retBean.username
+            return true
+        }
+
+        private fun parseConfirmResult(resp: TransResp?): Boolean {
+            if (resp == null || resp.retcode != HttpStatus.SC_OK) {
+                return false
+            }
+            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.getErrorMsg())
+            }
+            if (retBean.require_query) {
+                return false
+            }
+            onlRecord.payamt = retBean.amount
+            onlRecord.extraamt = retBean.extraamt
+            return true
+        }
+
+        private fun initTransdtlOnline() {
+            onlRecord = TransdtlOnlineRecord()
+            var seqno = pos.getTransdtlOnlineMaxSeqno()
+            if (seqno == 0) {
+                seqno = pos.getDynamicPara()?.onlineseqno ?: 0
+            }
+            onlRecord.devphyid = pos.getConfigPara()!!.devphyid
+            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.reversalflag = ReversalFlag.NONE
+            onlRecord.extraamt = 0
+            onlRecord.transtype = "card"
+            onlRecord.status = PayStatus.INIT
+            onlRecord.upflag = 1
+            if (!pos.saveTransdtlOnline(onlRecord)) {
+                throw CardPayFailError("保存流水失败")
+            }
+        }
+
+        private fun updateTransdtlOnline(issuccess: Boolean) {
+            if (issuccess) {
+                onlRecord.status = PayStatus.SUC
+            } else {
+                onlRecord.status = PayStatus.FAIL
+            }
+            onlRecord.upflag = 1
+            pos.updateTransdtlOnline(onlRecord)
+        }
+
+        private fun doOfflineConsume() {
+            initTransdtlOffline()
+            checkCardValid()
+            updateTransdtlOffline(true)
+            showOffSucInfo()
+        }
+
+        private fun checkCardValid() {
+            val sysRecord = pos.getSysPara()
+            if (!sysRecord!!.offlineEnable) {
+                throw CardPayFailError("禁止离线交易")
+            }
+            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
+            if (ctlRecord == null || ctlRecord.paraval != "1") {
+                val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
+                val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
+                if (offdate > validdate) {
+                    throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
+                }
+            }
+
+            val whiteRecord =
+                pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: 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}")
+            }
+
+            val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
+            if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
+                throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
+            }
+        }
+
+        private fun initTransdtlOffline() {
+            offRecord = TransdtlOfflineRecord()
+            var seqno = pos.getTransdtlOfflineMaxSeqno()
+            if (seqno == 0) {
+                seqno = pos.getDynamicPara()?.offlineseqno ?: 0
+            }
+            offRecord.devphyid = pos.getConfigPara()!!.devphyid
+            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.reversalflag = ReversalFlag.NONE
+            offRecord.extraamt = 0
+            offRecord.managefeetype = "none"
+            offRecord.status = PayStatus.INIT
+            offRecord.upflag = 1
+            if (!pos.saveTransdtlOffline(offRecord)) {
+                throw CardPayFailError("保存流水失败")
+            }
+        }
+
+        private fun updateTransdtlOffline(issuccess: Boolean) {
+            if (issuccess) {
+                offRecord.status = PayStatus.SUC
+            } else {
+                offRecord.status = PayStatus.FAIL
+            }
+            offRecord.upflag = 0
+            if (!pos.updateTransdtlOffline(offRecord)) {
+                throw CardPayFailError("更新流水失败")
+            }
+            asyncUpload(offRecord)
+        }
+
+        private fun showOnlSucInfo() {
+            lastPayBean.cardphyid = cardBean!!.cardphyid
+            lastPayBean.suctime = System.currentTimeMillis()
+            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() {
+            lastPayBean.cardphyid = cardBean!!.cardphyid
+            lastPayBean.suctime = System.currentTimeMillis()
+            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() {
+            oldcardphyid = null
+            onlineBalance = false
+            val curtime = System.currentTimeMillis()
+            if (curtime < lastShowTime ||
+                curtime - lastShowTime > 1000
+            ) {
+                lastShowTime = curtime
+                sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDateTime1())
+                showLinkStatus()
+            }
+        }
+
+        private fun showLinkStatus() {
+            if (SPApplication.getInstance().isOnline()) {
+                if (!curLinkStatus) {
+                    curLinkRefreshTime = System.currentTimeMillis()
+                    curLinkStatus = true
+                    sendMsg(PublicDef.MSG_LINK_STATUS, true)
+                    return
+                }
+            } else {
+                if (curLinkStatus) {
+                    curLinkStatus = false
+                    curLinkRefreshTime = System.currentTimeMillis()
+                    sendMsg(PublicDef.MSG_LINK_STATUS, false)
+                    return
+                }
+            }
+            val t = System.currentTimeMillis()
+            if (t < curLinkRefreshTime ||
+                t - curLinkRefreshTime > 30000
+            ) {
+                curLinkRefreshTime = t
+                sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
+            }
+        }
+
+        private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
+            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+            info.showtime = pos.getSysPara()!!.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
+        }
+
+        private fun sendMsg(code: Int, obj: Any) {
+            val msg = Message()
+            msg.what = code
+            msg.obj = obj
+            handler.sendMessage(msg)
+        }
+    }
+}
+
+enum class ClickStat {
+    INIT,
+    PAY,
+    REVERSE
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
index 79e632a..3accf97 100644
--- a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
@@ -422,7 +422,7 @@
 
     private fun refreshToCheckPasswd() {
         AuxScreenController.getInstance().refreshTitle("消费模式设置")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请输入商户密码:", " "))
     }
 
@@ -509,7 +509,7 @@
 
     private fun screenShowAmt() {
         AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-特殊模式")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(
             Arrays.asList<String>(
                 PayMode.NORMAL.desc + "-普通消费",
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
index ea5626d..79845f9 100644
--- a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
@@ -138,7 +138,7 @@
 
     private fun refresh() {
         AuxScreenController.getInstance().refreshTitle("通讯参数设置")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance()
             .refreshContent(Arrays.asList("设备第一次使用", "请联系管理员", "在大屏配置参数"))
     }
@@ -148,7 +148,7 @@
             try {
                 val ret = NsdClientApi(nsdServiceIp!!, nsdServicePort).getNsdServerConfigList()
                 runOnUiThread {
-                    vNsdResult.text = ret.retmsg
+                    vNsdResult.text = ret.getErrorMsg()
                     if (ret.retcode == PublicDef.SUCCESS) {
                         if (ret.list!!.isEmpty()) {
                             vNsdResult.text = "未找到配置项"
@@ -198,7 +198,7 @@
                     NsdClientApi(nsdServiceIp!!, nsdServicePort).getEcardConfigParam(configName)
                 NtpClient().startCalibrateTime(ret.systime)
                 runOnUiThread {
-                    vNsdResult.text = ret.retmsg
+                    vNsdResult.text = ret.getErrorMsg()
                     if (ret.retcode == PublicDef.SUCCESS) {
                         vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
                         if (ret.mode == 0) {
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
index 33a11b5..f3c6bb3 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
@@ -42,7 +42,7 @@
         procontent.setLength(0)
         auxList.clear()
         AuxScreenController.getInstance().refreshTitle("设备参数加载")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(auxList)
     }
 
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
index 95f6739..1ce8330 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
@@ -62,10 +62,10 @@
                 AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
             }
             if (bean.retcode != PublicDef.SUCCESS) {
-                sendMessage(LOAD_DONE, bean.retmsg!!)
+                sendMessage(LOAD_DONE, bean.getErrorMsg())
                 loading = false
                 if (!hasInit) {
-                    sendMessage(JUMP_TO_UNREGISTER, "签到失败:${bean.retmsg}")
+                    sendMessage(JUMP_TO_UNREGISTER, "签到失败:${bean.getErrorMsg()}")
                     return@Runnable
                 }
             } else {
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
index c2021bf..d07836b 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
@@ -4,6 +4,9 @@
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.view.KeyEvent
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
 import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
 import com.supwisdom.activities.SPApplication
@@ -15,6 +18,7 @@
 import com.supwisdom.utils.AppExitUtil
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
 import java.util.*
 
 /**
@@ -22,12 +26,14 @@
  ** @desc
  **/
 class ManageActivity : BaseActivity(), IManageView {
-    private var presenter: ManagePresenter? = null
+    private lateinit var presenter: ManagePresenter
     private var flag: Boolean = false
     private var isRunning: Boolean = false
     private val pos = SPApplication.getInstance().getPos()
-
-    @Volatile
+    private lateinit var vOperateHint: TextView
+    private lateinit var vOperateResult: TextView
+    private lateinit var llOperate: LinearLayout
+    private lateinit var llMenu: LinearLayout
     private var keyActive = true
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -38,7 +44,10 @@
     }
 
     private fun initView() {
-
+        llOperate = findViewById<View>(R.id.ll_operate) as LinearLayout
+        llMenu = findViewById<View>(R.id.ll_menu) as LinearLayout
+        vOperateHint = findViewById<View>(R.id.tv_operate_hint) as TextView
+        vOperateResult = findViewById<View>(R.id.tv_operate_result) as TextView
     }
 
     private fun initData() {
@@ -63,37 +72,30 @@
             }
             when (keyCode) {
                 KeyEvent.KEYCODE_1 -> {
-                    flag = true
-                    showShopPassword()
+                    showOperHint(
+                        "商户密码:",
+                        pos.getConfigPara()!!.shopPwd ?: PublicDef.PASSWD_SHOP_DEFAULT
+                    )
                 }
                 KeyEvent.KEYCODE_2 -> jumpActivity(CommunicateActivity::class.java)
                 KeyEvent.KEYCODE_3 -> {
                     //查询流水
-                    flag = true
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("流水查询:", "暂不支持"))
+                    showOperHint("流水查询:", "暂不支持")
                 }
                 KeyEvent.KEYCODE_4 -> {
-                    flag = true
-                    presenter!!.doSynoActive()
+                    presenter.doSynoActive()
                 }
                 KeyEvent.KEYCODE_5 -> jumpActivity(UpgradeActivity::class.java)
                 KeyEvent.KEYCODE_6 -> {
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("应用程序已退出", "请到大屏操作"))
+                    showOperHint("应用程序已退出", "请到大屏操作")
                     AppExitUtil.exit()
                 }
                 KeyEvent.KEYCODE_7 -> {
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("应用程序已退出", "请到大屏操作"))
+                    showOperHint("应用程序已退出", "请到大屏操作")
                     CommonUtil.startNetSetting(this)
                 }
                 KeyEvent.KEYCODE_8 -> {
-                    flag = true
-                    isRunning = true
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("正在清空白名单", "请稍等..."))
-                    presenter!!.clearAndUpdateWhitelist()
+                    presenter.clearAndUpdateWhitelist()
                 }
                 KeyEvent.KEYCODE_9 -> jumpActivity(ControlActivity::class.java)
                 KeyEvent.KEYCODE_DEL ->
@@ -105,12 +107,18 @@
     }
 
     override fun showOperHint(hint: String, result: String) {
+        flag = true
+        isRunning = false
+        llOperate.visibility = View.VISIBLE
+        llMenu.visibility = View.GONE
+        vOperateHint.text = hint
+        vOperateResult.text = result
         AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
     }
 
     override fun showOperResult(hint: String, result: String) {
-        flag = true
-        isRunning = false
+        vOperateHint.text = hint
+        vOperateResult.text = result
         AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
     }
 
@@ -123,8 +131,10 @@
     private fun refresh() {
         flag = false
         isRunning = false
+        llMenu.visibility = View.VISIBLE
+        llOperate.visibility = View.GONE
         AuxScreenController.getInstance().refreshTitle("设备管理界面")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(
             Arrays.asList(
                 getString(R.string.consume_menu_shop_passwd),
@@ -140,11 +150,6 @@
         )
     }
 
-    private fun showShopPassword() {
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("商户密码:", pos.getConfigPara()!!.shopPwd))
-    }
-
     override fun getActivity(): Activity {
         return this
     }
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
index bab3996..9e3be40 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
@@ -52,6 +52,7 @@
             iManageView.showOperHint("重置黑名单失败", "网络未联通")
             return
         }
+        iManageView.showOperHint("正在清空白名单", "请稍等...")
         ClearWhiteList().execute()
     }
 
@@ -72,9 +73,9 @@
     private inner class ReloadTransdtl : AsyncTask<Void, Int, BaseResp>() {
         override fun onPostExecute(resp: BaseResp) {
             if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("补采流水成功", resp.retmsg!!)
+                iManageView.showOperResult("补采流水成功", resp.getErrorMsg())
             } else {
-                iManageView.showOperResult("补采流水失败", resp.retmsg!!)
+                iManageView.showOperResult("补采流水失败", resp.getErrorMsg())
             }
         }
 
@@ -88,7 +89,7 @@
             if (resp.retcode == PublicDef.SUCCESS) {
                 iManageView.showOperResult("白名单更新成功", "")
             } else {
-                iManageView.showOperResult("白名单更新失败", resp.retmsg!!)
+                iManageView.showOperResult("白名单更新失败", resp.getErrorMsg())
             }
         }
 
@@ -124,9 +125,9 @@
 
         override fun onPostExecute(resp: BaseResp) {
             if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("导出流水成功", resp.retmsg!!)
+                iManageView.showOperResult("导出流水成功", resp.getErrorMsg())
             } else {
-                iManageView.showOperResult("导出流水失败", resp.retmsg!!)
+                iManageView.showOperResult("导出流水失败", resp.getErrorMsg())
             }
         }
     }
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
index 63ef0ed..43f1bc9 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
@@ -6,6 +6,7 @@
 import android.os.CountDownTimer
 import android.view.KeyEvent
 import android.view.View
+import android.widget.LinearLayout
 import android.widget.TextView
 import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
@@ -30,6 +31,10 @@
     private var isRunning: Boolean = false
     private var flag: Boolean = false
     private lateinit var vReverse: TextView
+    private lateinit var vOperateHint: TextView
+    private lateinit var vOperateResult: TextView
+    private lateinit var llOperate: LinearLayout
+    private lateinit var llMenu: LinearLayout
     private var keyActive = true
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -44,7 +49,11 @@
     }
 
     private fun initView() {
+        llOperate = findViewById<View>(R.id.ll_operate) as LinearLayout
+        llMenu = findViewById<View>(R.id.ll_menu) as LinearLayout
         vReverse = this.findViewById<View>(R.id.tv_reverse) as TextView
+        vOperateHint = findViewById<View>(R.id.tv_operate_hint) as TextView
+        vOperateResult = findViewById<View>(R.id.tv_operate_result) as TextView
     }
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@@ -105,14 +114,20 @@
         refresh()
     }
 
-    override fun showOperHint(title: String, result: String) {
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(title, result))
-    }
-
-    override fun showOperResult(title: String, result: String) {
+    override fun showOperHint(hint: String, result: String) {
         flag = true
         isRunning = false
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(title, result))
+        llOperate.visibility = View.VISIBLE
+        llMenu.visibility = View.GONE
+        vOperateHint.text = hint
+        vOperateResult.text = result
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
+    }
+
+    override fun showOperResult(hint: String, result: String) {
+        vOperateHint.text = hint
+        vOperateResult.text = result
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
     }
 
     override fun getActivity(): Activity {
@@ -122,6 +137,8 @@
     private fun refresh() {
         isRunning = false
         flag = false
+        llMenu.visibility = View.VISIBLE
+        llOperate.visibility = View.GONE
         val secList = ArrayList<String>()
         secList.add(getString(R.string.consume_menu_revenue))
         secList.add(getString(R.string.consume_menu_transdtl_upload))
@@ -138,7 +155,7 @@
             vReverse.visibility = View.GONE
         }
         AuxScreenController.getInstance().refreshTitle("设备管理界面")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(secList)
     }
 
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 8f49136..0171852 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -1,151 +1,154 @@
-package com.supwisdom.activities.menu
-
-import android.content.Intent
-import android.os.AsyncTask
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.bean.AuthRetBean
-import com.supwisdom.bean.BaseResp
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.exception.AuthEpayError
-import com.supwisdom.exception.HeartBeatError
-import com.supwisdom.exception.TransdtlUploadError
-import com.supwisdom.service.AuthEpay
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class MenuPresenter constructor(iMenuView: IMenuView) {
-    private val iMenuView = iMenuView
-    private val pos = SPApplication.getInstance().getPos()
-    fun manualAuth() {
-        iMenuView.showOperHint("正在签到", "请稍等...")
-        AsyncAuth().execute()
-    }
-
-    fun linkCheck() {
-        iMenuView.showOperHint("正在链路检测", "请稍等...")
-        AsyncLink().execute()
-    }
-
-    private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
-        override fun doInBackground(vararg voids: Void): AuthRetBean {
-            val retBean = try {
-                AuthEpay().login()
-            } catch (ex: AuthEpayError) {
-                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
-            }
-            if (retBean.retcode == PublicDef.SUCCESS) {
-                val record = pos.getDynamicPara()
-                record!!.deviceid = retBean.deviceid
-                record.merchaccno = retBean.merchaccno
-                record.shopname = retBean.shopname
-                record.paragroupid = retBean.paragroupid
-                pos.replaceDynamicPara(record)
-
-                SPApplication.getInstance().setEpayLinking(true)
-            } else {
-                SPApplication.getInstance().setEpayLinking(false)
-            }
-            return retBean
-        }
-
-        override fun onPostExecute(retBean: AuthRetBean?) {
-            when {
-                retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
-                retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult("签到失败", retBean.retmsg ?: "null")
-                else -> iMenuView.showOperResult("签到成功", " ")
-            }
-        }
-    }
-
-    private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
-        override fun doInBackground(vararg voids: Void): BaseResp {
-            return try {
-                EpayApiImpl().linkCheck()
-                BaseResp(PublicDef.SUCCESS, "连接成功")
-            } catch (ex: HeartBeatError) {
-                BaseResp(PublicDef.ERROR, ex.message)
-            }
-        }
-
-        override fun onPostExecute(baseResp: BaseResp) {
-            SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
-            iMenuView.showOperResult("检测结果", baseResp.retmsg!!)
-        }
-    }
-
-    fun doReverse() {
-        val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
-        if (list.isEmpty()) {
-            iMenuView.showOperResult("冲正失败", "未找到消费记录")
-            return
-        }
-        val record = list[0]
-        if (record.reversalflag == ReversalFlag.AUTO ||
-            record.reversalflag == ReversalFlag.MANUAL
-        ) {
-            iMenuView.showOperResult("冲正失败", "已冲正")
-            return
-        }
-        if (record.status != PayStatus.SUC) {
-            iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
-            return
-        }
-        val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
-        val t2 = System.currentTimeMillis()
-        if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
-            iMenuView.showOperResult("冲正失败", "消费已过期")
-            return
-        }
-        val intent = Intent()
-        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)
-    }
-
-    fun uploadTransdtl() {
-        iMenuView.showOperHint("正在上传流水", "请稍等...")
-        UploadTransdtl().execute()
-    }
-
-    private inner class UploadTransdtl : AsyncTask<Void, Void, BaseResp>() {
-        override fun doInBackground(vararg voids: Void): BaseResp {
-            val apiInterface = EpayApiImpl()
-            var num = 0
-            try {
-                pos.getTransdtlOfflineUnconfirm().forEach {
-                    apiInterface.uploadTransdtl(it)
-                    it.upflag = 1
-                    pos.updateTransdtlOffline(it)
-                    num += 1
-                }
-                pos.getTransdtlOnlineUnconfirm().forEach {
-                    apiInterface.uploadTransdtl(it)
-                    it.upflag = 1
-                    pos.updateTransdtlOnline(it)
-                    num += 1
-                }
-                return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
-            } catch (ex: TransdtlUploadError) {
-                return BaseResp(PublicDef.ERROR, ex.message)
-            }
-        }
-
-        override fun onPostExecute(resp: BaseResp) {
-            if (resp.retcode == PublicDef.SUCCESS) {
-                iMenuView.showOperResult("上传流水成功", resp.retmsg!!)
-            } else {
-                iMenuView.showOperResult("上传流水失败", resp.retmsg!!)
-            }
-        }
-    }
+package com.supwisdom.activities.menu
+
+import android.content.Intent
+import android.os.AsyncTask
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.bean.AuthRetBean
+import com.supwisdom.bean.BaseResp
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.exception.AuthEpayError
+import com.supwisdom.exception.HeartBeatError
+import com.supwisdom.exception.TransdtlUploadError
+import com.supwisdom.service.AuthEpay
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class MenuPresenter constructor(iMenuView: IMenuView) {
+    private val iMenuView = iMenuView
+    private val pos = SPApplication.getInstance().getPos()
+    fun manualAuth() {
+        iMenuView.showOperHint("正在签到", "请稍等...")
+        AsyncAuth().execute()
+    }
+
+    fun linkCheck() {
+        iMenuView.showOperHint("正在链路检测", "请稍等...")
+        AsyncLink().execute()
+    }
+
+    private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
+        override fun doInBackground(vararg voids: Void): AuthRetBean {
+            val retBean = try {
+                AuthEpay().login()
+            } catch (ex: AuthEpayError) {
+                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
+            }
+            if (retBean.retcode == PublicDef.SUCCESS) {
+                val record = pos.getDynamicPara()
+                record!!.deviceid = retBean.deviceid
+                record.merchaccno = retBean.merchaccno
+                record.shopname = retBean.shopname
+                record.paragroupid = retBean.paragroupid
+                pos.replaceDynamicPara(record)
+
+                SPApplication.getInstance().setEpayLinking(true)
+            } else {
+                SPApplication.getInstance().setEpayLinking(false)
+            }
+            return retBean
+        }
+
+        override fun onPostExecute(retBean: AuthRetBean?) {
+            when {
+                retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
+                retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult(
+                    "签到失败",
+                    retBean.getErrorMsg()
+                )
+                else -> iMenuView.showOperResult("签到成功", " ")
+            }
+        }
+    }
+
+    private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
+        override fun doInBackground(vararg voids: Void): BaseResp {
+            return try {
+                EpayApiImpl().linkCheck()
+                BaseResp(PublicDef.SUCCESS, "连接成功")
+            } catch (ex: HeartBeatError) {
+                BaseResp(PublicDef.ERROR, ex.message)
+            }
+        }
+
+        override fun onPostExecute(baseResp: BaseResp) {
+            SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
+            iMenuView.showOperResult("检测结果", baseResp.getErrorMsg())
+        }
+    }
+
+    fun doReverse() {
+        val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+        if (list.isEmpty()) {
+            iMenuView.showOperResult("冲正失败", "未找到消费记录")
+            return
+        }
+        val record = list[0]
+        if (record.reversalflag == ReversalFlag.AUTO ||
+            record.reversalflag == ReversalFlag.MANUAL
+        ) {
+            iMenuView.showOperResult("冲正失败", "已冲正")
+            return
+        }
+        if (record.status != PayStatus.SUC) {
+            iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
+            return
+        }
+        val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+        val t2 = System.currentTimeMillis()
+        if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+            iMenuView.showOperResult("冲正失败", "消费已过期")
+            return
+        }
+        val intent = Intent()
+        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)
+    }
+
+    fun uploadTransdtl() {
+        iMenuView.showOperHint("正在上传流水", "请稍等...")
+        UploadTransdtl().execute()
+    }
+
+    private inner class UploadTransdtl : AsyncTask<Void, Void, BaseResp>() {
+        override fun doInBackground(vararg voids: Void): BaseResp {
+            val apiInterface = EpayApiImpl()
+            var num = 0
+            try {
+                pos.getTransdtlOfflineUnconfirm().forEach {
+                    apiInterface.uploadTransdtl(it)
+                    it.upflag = 1
+                    pos.updateTransdtlOffline(it)
+                    num += 1
+                }
+                pos.getTransdtlOnlineUnconfirm().forEach {
+                    apiInterface.uploadTransdtl(it)
+                    it.upflag = 1
+                    pos.updateTransdtlOnline(it)
+                    num += 1
+                }
+                return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
+            } catch (ex: TransdtlUploadError) {
+                return BaseResp(PublicDef.ERROR, ex.message)
+            }
+        }
+
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iMenuView.showOperResult("上传流水成功", resp.getErrorMsg())
+            } else {
+                iMenuView.showOperResult("上传流水失败", resp.getErrorMsg())
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt b/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
index 88d8b56..4fd3122 100644
--- a/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
@@ -155,7 +155,7 @@
         tmpPwd = ""
         passwdHint = "输入原密码"
         AuxScreenController.getInstance().refreshTitle("商户密码修改")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(passwdHint, " "))
     }
 
diff --git a/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt b/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
index b4710ba..1446525 100644
--- a/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
@@ -39,7 +39,7 @@
 
     private fun refresh() {
         AuxScreenController.getInstance().refreshTitle("新开普智能设备")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(listOf<String>("欢迎使用智能设备"))
     }
 
diff --git a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
index 8eff856..ecbf57a 100644
--- a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
@@ -49,7 +49,7 @@
 
     private fun refresh(errmsg: String) {
         AuxScreenController.getInstance().refreshTitle("设备注册状态")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(listOf("设备未注册", errmsg))
     }
 
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
index e271bdb..5449f29 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
@@ -91,7 +91,7 @@
     private fun refresh() {
         isUpgrading = false
         AuxScreenController.getInstance().refreshTitle("应用在线升级")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
         AuxScreenController.getInstance().refreshContent(
             Arrays.asList(
                 "当前版本>>", CommonUtil.getVersionName(applicationContext),
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 110f204..d593610 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
@@ -1,178 +1,185 @@
-package com.supwisdom.activities.upgrade.mode
-
-import android.text.TextUtils
-import com.supwisdom.activities.YktSession
-import com.supwisdom.bean.UpgradeInfoRetBean
-import com.supwisdom.okhttp.WebParams
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-import java.io.File
-import java.io.FileInputStream
-import java.io.FileOutputStream
-import java.net.HttpURLConnection
-import java.net.URL
-import java.util.*
-
-/**
- * @author zzq
- * @date 2019/4/9
- * @desc 在线升级
- */
-class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
-    private val TIMEOUT = 5 * 1000// 超时
-    private val POSID = "posa711dali"
-
-    fun upgrade(devphyid: String, version: String) {
-        val resp = getAppVersion(devphyid, version)
-        if (resp.retcode != PublicDef.SUCCESS) {
-            callback.failed(resp.retmsg!!)
-            return
-        }
-        val updateFile = FileUtil.getUpdateFile("$POSID.zip")
-        if (updateFile == null) {
-            callback.failed("创建本地文件失败")
-            return
-        }
-        if (!downloadUpdateFile(resp.upgrade_url!!, updateFile, resp.upgrade_version!!)) {
-            return
-        }
-        parseDownloadFile(updateFile.absolutePath, resp.upgrade_version!!)
-    }
-
-    private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
-        var downStep = 0// 提示step
-        val totalSize: Int// 文件总大小
-        var downloadCount = 0// 已经下载好的大小
-        try {
-            val url = URL(downUrl)
-            val urlConnection = url.openConnection() as HttpURLConnection
-            urlConnection.connectTimeout = TIMEOUT
-            urlConnection.readTimeout = TIMEOUT
-            urlConnection.doOutput = true
-            urlConnection.doInput = true
-            urlConnection.useCaches = false
-            // setting serialized
-            urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
-            //default is GET
-            urlConnection.requestMethod = "POST"
-            urlConnection.setRequestProperty("Charsert", "UTF-8")
-            urlConnection.setRequestProperty("connection", "Keep-Alive")
-            urlConnection.addRequestProperty("version", versionName)
-
-            urlConnection.addRequestProperty("username", "supwisdom")
-            urlConnection.addRequestProperty("password", "supwisdom")
-            urlConnection.addRequestProperty("filename", "$POSID.apk")
-
-            //connect to server (tcp)
-            urlConnection.connect()
-            // 获取下载文件的size
-            totalSize = urlConnection.contentLength
-            if (urlConnection.responseCode != HttpStatus.SC_OK) {
-                urlConnection.disconnect()
-                callback.failed("下载文件失败:错误码=${urlConnection.responseCode}")
-                return false
-            }
-            val inputStream = urlConnection.inputStream
-            val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
-            val buffer = ByteArray(1024)
-            while (true) {
-                val readSize = inputStream.read(buffer)
-                if (readSize < 0) {
-                    break
-                }
-                outputStream.write(buffer, 0, readSize)
-                downloadCount += readSize// 实时获取下载到的大小
-
-                val progress = downloadCount * 1.0 / totalSize
-                val pro = Math.round(progress * 100).toInt()
-                if (pro - downStep >= 1) {
-                    downStep++
-                    CommonUtil.doSleep(100)
-                    callback.progresss(pro)
-                }
-            }
-            urlConnection.disconnect()
-            inputStream.close()
-            outputStream.close()
-            return true
-        } catch (e: Exception) {
-            e.printStackTrace()
-            callback.failed("下载文件异常:${e.message}")
-            return false
-        }
-    }
-
-    private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
-        try {
-            val index = zipFilePath.lastIndexOf("/")
-            val unZipFilePath = zipFilePath.substring(0, index)
-            ZipUtil.unzip(zipFilePath, unZipFilePath, false)
-            val apkFile = File("$unZipFilePath/$POSID.apk")
-            if (!apkFile.exists()) {
-                callback.failed("未找到文件$POSID.apk")
-                return false
-            }
-
-            val fileHash256 = CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
-            if (fileHash256 == null) {
-                callback.failed("计算文件校验数据错误")
-                return false
-            }
-            val signFile = FileInputStream("$unZipFilePath/hash256.sign")
-            val buffer = ByteArray(1024)
-            val length = signFile.read(buffer, 0, buffer.size)
-            if (length < 0) {
-                callback.failed("读取校验文件失败")
-                return false
-            }
-            signFile.close()
-            val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
-            if (!fileHash256.equals(signHash256, ignoreCase = true)) {
-                callback.failed("文件校验错误")
-                return false
-            }
-            callback.success("$unZipFilePath/$POSID.apk")
-            return true
-        } catch (e: Exception) {
-            e.printStackTrace()
-            callback.failed("文件校验异常:${e.message}")
-            return false
-        }
-    }
-
-    private fun getAppVersion(devphyid: String, version: String): UpgradeInfoRetBean {
-        val params = WebParams()
-        params.setParameter("upgrade_url", POSID)
-            .setParameter("upgrade_version", version)
-            .setParameter("devphyid", devphyid)
-            .setParameter("sourcetype", "pos")
-
-        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/globalparam", "", params)
-            ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本超时")
-        if (resp.retcode != HttpStatus.SC_OK) {
-            return UpgradeInfoRetBean(resp.retcode, "获取版本错误码=${resp.retcode}")
-        }
-        return try {
-            val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
-            if (bean.retcode != PublicDef.SUCCESS) {
-                return UpgradeInfoRetBean(resp.retcode, "获取版本错误=" + bean.retmsg)
-            }
-            when {
-                TextUtils.isEmpty(bean.upgrade_version) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取版本为空")
-                TextUtils.isEmpty(bean.upgrade_url) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取升级地址为空")
-                else -> bean
-            }
-        } catch (e: Exception) {
-            e.printStackTrace()
-            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本JSON异常:${e.message}")
-        }
-    }
-
-    interface CallbackInterface {
-        fun progresss(pro: Int)
-
-        fun success(filepath: String)
-
-        fun failed(errmsg: String)
-    }
+package com.supwisdom.activities.upgrade.mode
+
+import android.text.TextUtils
+import com.supwisdom.activities.YktSession
+import com.supwisdom.bean.UpgradeInfoRetBean
+import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.net.HttpURLConnection
+import java.net.URL
+import java.util.*
+
+/**
+ * @author zzq
+ * @date 2019/4/9
+ * @desc 在线升级
+ */
+class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
+    private val TIMEOUT = 5 * 1000// 超时
+    private val POSID = "posa711dali"
+
+    fun upgrade(devphyid: String, version: String) {
+        val resp = getAppVersion(devphyid, version)
+        if (resp.retcode != PublicDef.SUCCESS) {
+            callback.failed(resp.getErrorMsg())
+            return
+        }
+        val updateFile = FileUtil.getUpdateFile("$POSID.zip")
+        if (updateFile == null) {
+            callback.failed("创建本地文件失败")
+            return
+        }
+        if (!downloadUpdateFile(resp.upgrade_url!!, updateFile, resp.upgrade_version!!)) {
+            return
+        }
+        parseDownloadFile(updateFile.absolutePath, resp.upgrade_version!!)
+    }
+
+    private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
+        var downStep = 0// 提示step
+        val totalSize: Int// 文件总大小
+        var downloadCount = 0// 已经下载好的大小
+        try {
+            val url = URL(downUrl)
+            val urlConnection = url.openConnection() as HttpURLConnection
+            urlConnection.connectTimeout = TIMEOUT
+            urlConnection.readTimeout = TIMEOUT
+            urlConnection.doOutput = true
+            urlConnection.doInput = true
+            urlConnection.useCaches = false
+            // setting serialized
+            urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
+            //default is GET
+            urlConnection.requestMethod = "POST"
+            urlConnection.setRequestProperty("Charsert", "UTF-8")
+            urlConnection.setRequestProperty("connection", "Keep-Alive")
+            urlConnection.addRequestProperty("version", versionName)
+
+            urlConnection.addRequestProperty("username", "supwisdom")
+            urlConnection.addRequestProperty("password", "supwisdom")
+            urlConnection.addRequestProperty("filename", "$POSID.apk")
+
+            //connect to server (tcp)
+            urlConnection.connect()
+            // 获取下载文件的size
+            totalSize = urlConnection.contentLength
+            if (urlConnection.responseCode != HttpStatus.SC_OK) {
+                urlConnection.disconnect()
+                callback.failed("下载文件失败:错误码=${urlConnection.responseCode}")
+                return false
+            }
+            val inputStream = urlConnection.inputStream
+            val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
+            val buffer = ByteArray(1024)
+            while (true) {
+                val readSize = inputStream.read(buffer)
+                if (readSize < 0) {
+                    break
+                }
+                outputStream.write(buffer, 0, readSize)
+                downloadCount += readSize// 实时获取下载到的大小
+
+                val progress = downloadCount * 1.0 / totalSize
+                val pro = Math.round(progress * 100).toInt()
+                if (pro - downStep >= 1) {
+                    downStep++
+                    CommonUtil.doSleep(100)
+                    callback.progresss(pro)
+                }
+            }
+            urlConnection.disconnect()
+            inputStream.close()
+            outputStream.close()
+            return true
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callback.failed("下载文件异常:${e.message}")
+            return false
+        }
+    }
+
+    private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
+        try {
+            val index = zipFilePath.lastIndexOf("/")
+            val unZipFilePath = zipFilePath.substring(0, index)
+            ZipUtil.unzip(zipFilePath, unZipFilePath, false)
+            val apkFile = File("$unZipFilePath/$POSID.apk")
+            if (!apkFile.exists()) {
+                callback.failed("未找到文件$POSID.apk")
+                return false
+            }
+
+            val fileHash256 =
+                CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
+            if (fileHash256 == null) {
+                callback.failed("计算文件校验数据错误")
+                return false
+            }
+            val signFile = FileInputStream("$unZipFilePath/hash256.sign")
+            val buffer = ByteArray(1024)
+            val length = signFile.read(buffer, 0, buffer.size)
+            if (length < 0) {
+                callback.failed("读取校验文件失败")
+                return false
+            }
+            signFile.close()
+            val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
+            if (!fileHash256.equals(signHash256, ignoreCase = true)) {
+                callback.failed("文件校验错误")
+                return false
+            }
+            callback.success("$unZipFilePath/$POSID.apk")
+            return true
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callback.failed("文件校验异常:${e.message}")
+            return false
+        }
+    }
+
+    private fun getAppVersion(devphyid: String, version: String): UpgradeInfoRetBean {
+        val params = WebParams()
+        params.setParameter("upgrade_url", POSID)
+            .setParameter("upgrade_version", version)
+            .setParameter("devphyid", devphyid)
+            .setParameter("sourcetype", "pos")
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/globalparam", "", params)
+            ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本超时")
+        if (resp.retcode != HttpStatus.SC_OK) {
+            return UpgradeInfoRetBean(resp.retcode, "获取版本错误码=${resp.retcode}")
+        }
+        return try {
+            val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
+            if (bean.retcode != PublicDef.SUCCESS) {
+                return UpgradeInfoRetBean(resp.retcode, "获取版本错误=" + bean.getErrorMsg())
+            }
+            when {
+                TextUtils.isEmpty(bean.upgrade_version) -> UpgradeInfoRetBean(
+                    PublicDef.ERROR,
+                    "获取版本为空"
+                )
+                TextUtils.isEmpty(bean.upgrade_url) -> UpgradeInfoRetBean(
+                    PublicDef.ERROR,
+                    "获取升级地址为空"
+                )
+                else -> bean
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本JSON异常:${e.message}")
+        }
+    }
+
+    interface CallbackInterface {
+        fun progresss(pro: Int)
+
+        fun success(filepath: String)
+
+        fun failed(errmsg: String)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index a65a9ce..0430400 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -1,335 +1,352 @@
-package com.supwisdom.utils
-
-import java.text.ParseException
-import java.text.SimpleDateFormat
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/23
- ** @desc
- **/
-object DateUtil {
-    private val FORMAT_yyyyMMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
-    private val FORMAT_yyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
-    private val FORMAT_yyMMddHHmmss2 = org.apache.commons.lang3.time.FastDateFormat.getInstance("yy-MM-dd HH:mm:ss")
-    private val FORMAT_HHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmss")
-    private val FORMAT_MMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMdd")
-    private val FORMAT_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MM-dd")
-    private val FORMAT_yyyyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
-    private val FORMAT_yyyyMMddHHmm = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
-    private val FORMAT_MMddHHmmyy = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
-    private val FORMAT_yyyy_MM_dd_HH_mm_ss =
-        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
-    private val FORMAT_yyyy_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
-    private val FORMAT_HH_mm_ss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getNow(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
-    }
-
-    fun getNowDateSpecFormat(): String {
-        return FORMAT_yyyy_MM_dd.format(Date())
-    }
-
-    fun utcToLocal(utctime: String): String {
-        val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
-        sdf.timeZone = TimeZone.getTimeZone("UTC")
-        return try {
-            val utcDate = sdf.parse(utctime)
-            sdf.timeZone = TimeZone.getDefault()
-            val localTime = sdf.format(utcDate.time)
-            val localDate = sdf.parse(localTime)
-            FORMAT_yyyyMMddHHmmss.format(localDate.time)
-        } catch (ex: ParseException) {
-            ex.printStackTrace()
-            ""
-        }
-    }
-
-    /**
-     * @param date yyyyMMdd
-     * @return yyyy-MM-dd
-     */
-    fun getNowDateFromNoFormat(date: String): String {
-        try {
-            return date.substring(0, 4) + "-" +
-                    date.substring(4, 6) + "-" +
-                    date.substring(6, 8)
-        } catch (ex: Exception) {
-        }
-        return ""
-    }
-
-    /**
-     * @return HH:mm:ss
-     */
-    fun getNowTimeWithArg(date: Date): String? {
-        return try {
-            FORMAT_HH_mm_ss.format(date)
-        } catch (e: Exception) {
-            null
-        }
-    }
-
-    /**
-     * @param time HHmm
-     * @return HH:mm
-     */
-    fun formatTime(time: String): String? {
-        return try {
-            val sb = StringBuilder()
-            sb.append(time.substring(0, 2)).append(":")
-                .append(time.substring(2, 4))
-            sb.toString()
-        } catch (e: Exception) {
-            null
-        }
-    }
-
-    /**
-     * @return MMdd
-     */
-    fun getDateMMdd(): String? {
-        return try {
-            FORMAT_MMdd.format(Date())
-        } catch (e: Exception) {
-            e.printStackTrace()
-            null
-        }
-    }
-
-    /**
-     * @return MM-dd
-     */
-    fun getDate_MMdd(): String? {
-        try {
-            return FORMAT_MM_dd.format(Date())
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getNowDateTime(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
-    }
-
-    /**
-     * @return yyyy-MM-dd
-     */
-    fun getNowDate(): String {
-        return FORMAT_yyyy_MM_dd.format(Date())
-    }
-
-    /**
-     * @param dateStr yyyy-MM-dd
-     * @return
-     */
-    fun getNowDateTime(dateStr: String): Date? {
-        try {
-            return FORMAT_yyyy_MM_dd.parse(dateStr)
-        } catch (e: ParseException) {
-            e.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return HH:mm:ss
-     */
-    fun getNowTime(): String {
-        return FORMAT_HH_mm_ss.format(Date())
-    }
-
-    /**
-     * @return format
-     */
-    fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
-        val cal = Calendar.getInstance()
-        // n为推迟的周数，1本周，-1向前推迟一周，2下周，依次类推
-        val retday: String
-        cal.add(Calendar.DATE, offsetWeek * 7)
-        cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
-        retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
-        return retday
-    }
-
-    /**
-     * 计算超时时间，精确到毫秒
-     *
-     * @param milliSeconds
-     * @return L
-     */
-    fun getExpireTime(milliSeconds: Long): Long {
-        return Date().time + milliSeconds
-    }
-
-    /**
-     * @return yyyyMMddHHmmss
-     */
-    fun getNowDateTimeNoFormat(): String {
-        return FORMAT_yyyyMMddHHmmss.format(Date())
-    }
-
-    /**
-     * @return yyyyMMdd
-     */
-    fun getNowDateNoFormat(): String {
-        return FORMAT_yyyyMMdd.format(Date())
-    }
-
-    /**
-     * @param date
-     * @return yyyyMMdd
-     */
-    fun getNowDateNoFormat(date: Date): String? {
-        try {
-            return FORMAT_yyyyMMdd.format(date)
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return HHmmss
-     */
-    fun getNowTimeNoFormat(): String {
-        return FORMAT_HHmmss.format(Date())
-    }
-
-    /**
-     * @param datetime yyyyMMddHHmmss
-     * @return ms
-     * @desc 将日期格式的字符串转换为长整型
-     */
-    fun dateFormatConvertToLong(datetime: String): Long {
-        return try {
-            FORMAT_yyyyMMddHHmmss.parse(datetime).time
-        } catch (ex: ParseException) {
-            0L
-        }
-    }
-
-    /**
-     * @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 将长整型数字转换为日期格式的字符串
-     */
-    fun dateLongConvertToFormat(time: Long): String {
-        return if (time > 0L) {
-            FORMAT_yyyyMMddHHmmss.format(Date(time))
-        } else ""
-    }
-
-    /**
-     * @param time ms
-     * @return MMddHHmmyy
-     * @desc 将长整型数字转换为日期格式的字符串
-     */
-    fun dateLongConvertToFormat2(time: Long): String {
-        return if (time > 0L) {
-            FORMAT_MMddHHmmyy.format(Date(time))
-        } else ""
-    }
-
-    /**
-     * @param datetime yyyy-MM-dd HH:mm:ss
-     * @return
-     * @desc 将日期格式的字符串转换为长整型
-     */
-    fun dateFormatConvertToDate(datetime: String): Date? {
-        return try {
-            FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
-        } catch (ex: ParseException) {
-            null
-        }
-    }
-
-    /**
-     * @param daynum 天数
-     * @return 返回当前日期的第 daynum 天前的日期  yyyyMMdd
-     */
-    fun getDayDateNoFormatBefore(daynum: Int): String {
-        val calendar = Calendar.getInstance()
-        calendar.add(Calendar.DATE, -daynum)
-        return FORMAT_yyyyMMdd.format(calendar.time)
-    }
-
-    /**
-     * 获得指定日期的前一天
-     *
-     * @param specifiedDay yyyyMMdd
-     * @return yyyyMMdd
-     */
-    fun getSpecifiedDayBefore(specifiedDay: String): String {
-        return try {
-            val c = Calendar.getInstance()
-            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
-            c.time = date
-            val day = c.get(Calendar.DATE)
-            c.set(Calendar.DATE, day - 1)
-            FORMAT_yyyyMMdd.format(c.time)
-        } catch (e: ParseException) {
-            ""
-        }
-    }
-
-    /**
-     * 获得指定日期的前一天
-     *
-     * @param dayBefore 往前推迟的天数
-     * @return Date
-     */
-    fun getSomeDayBefore(dayBefore: Int): Date {
-        val c = Calendar.getInstance()
-        c.add(Calendar.DAY_OF_MONTH, -dayBefore)
-        return c.time
-    }
-
-    /**
-     * 获得指定日期的后一天
-     *
-     * @param specifiedDay yyyyMMdd
-     * @return yyyyMMdd
-     */
-    fun getSpecifiedDayAfter(specifiedDay: String): String {
-        return try {
-            val c = Calendar.getInstance()
-            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
-            c.time = date
-            val day = c.get(Calendar.DATE)
-            c.set(Calendar.DATE, day + 1)
-            FORMAT_yyyyMMdd.format(c.time)
-        } catch (e: ParseException) {
-            ""
-        }
-    }
-
-    /**
-     * @return yyyyMMddHHmmss
-     */
-    fun getNowDateTimeFormat(): String {
-        return FORMAT_yyyyMMddHHmmss.format(Date())
-    }
-
+package com.supwisdom.utils
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object DateUtil {
+    private val FORMAT_yyyyMMdd =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
+    private val FORMAT_yyMMddHHmmss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
+    private val FORMAT_yyMMddHHmmss2 =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yy-MM-dd HH:mm:ss")
+    private val FORMAT_HHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmss")
+    private val FORMAT_MMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMdd")
+    private val FORMAT_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MM-dd")
+    private val FORMAT_yyyyMMddHHmmss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
+    private val FORMAT_yyyyMMddHHmm =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
+    private val FORMAT_MMddHHmmyy =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
+    private val FORMAT_yyyy_MM_dd_HH_mm_ss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
+    private val FORMAT_yyyy_MM_dd_HH_mm =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm")
+    private val FORMAT_yyyy_MM_dd =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
+    private val FORMAT_HH_mm_ss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
+
+    /**
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    fun getNow(): String {
+        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+    }
+
+    fun getNowDateSpecFormat(): String {
+        return FORMAT_yyyy_MM_dd.format(Date())
+    }
+
+    fun utcToLocal(utctime: String): String {
+        val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+        sdf.timeZone = TimeZone.getTimeZone("UTC")
+        return try {
+            val utcDate = sdf.parse(utctime)
+            sdf.timeZone = TimeZone.getDefault()
+            val localTime = sdf.format(utcDate.time)
+            val localDate = sdf.parse(localTime)
+            FORMAT_yyyyMMddHHmmss.format(localDate.time)
+        } catch (ex: ParseException) {
+            ex.printStackTrace()
+            ""
+        }
+    }
+
+    /**
+     * @param date yyyyMMdd
+     * @return yyyy-MM-dd
+     */
+    fun getNowDateFromNoFormat(date: String): String {
+        try {
+            return date.substring(0, 4) + "-" +
+                    date.substring(4, 6) + "-" +
+                    date.substring(6, 8)
+        } catch (ex: Exception) {
+        }
+        return ""
+    }
+
+    /**
+     * @return HH:mm:ss
+     */
+    fun getNowTimeWithArg(date: Date): String? {
+        return try {
+            FORMAT_HH_mm_ss.format(date)
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    /**
+     * @param time HHmm
+     * @return HH:mm
+     */
+    fun formatTime(time: String): String? {
+        return try {
+            val sb = StringBuilder()
+            sb.append(time.substring(0, 2)).append(":")
+                .append(time.substring(2, 4))
+            sb.toString()
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    /**
+     * @return MMdd
+     */
+    fun getDateMMdd(): String? {
+        return try {
+            FORMAT_MMdd.format(Date())
+        } catch (e: Exception) {
+            e.printStackTrace()
+            null
+        }
+    }
+
+    /**
+     * @return MM-dd
+     */
+    fun getDate_MMdd(): String? {
+        try {
+            return FORMAT_MM_dd.format(Date())
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    /**
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    fun getNowDateTime(): String {
+        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+    }
+
+    /**
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    fun getNowDateTime1(): String {
+        return FORMAT_yyyy_MM_dd_HH_mm.format(Date())
+    }
+
+    /**
+     * @return yyyy-MM-dd
+     */
+    fun getNowDate(): String {
+        return FORMAT_yyyy_MM_dd.format(Date())
+    }
+
+    /**
+     * @param dateStr yyyy-MM-dd
+     * @return
+     */
+    fun getNowDateTime(dateStr: String): Date? {
+        try {
+            return FORMAT_yyyy_MM_dd.parse(dateStr)
+        } catch (e: ParseException) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    /**
+     * @return HH:mm:ss
+     */
+    fun getNowTime(): String {
+        return FORMAT_HH_mm_ss.format(Date())
+    }
+
+    /**
+     * @return format
+     */
+    fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
+        val cal = Calendar.getInstance()
+        // n为推迟的周数，1本周，-1向前推迟一周，2下周，依次类推
+        val retday: String
+        cal.add(Calendar.DATE, offsetWeek * 7)
+        cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
+        retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
+        return retday
+    }
+
+    /**
+     * 计算超时时间，精确到毫秒
+     *
+     * @param milliSeconds
+     * @return L
+     */
+    fun getExpireTime(milliSeconds: Long): Long {
+        return Date().time + milliSeconds
+    }
+
+    /**
+     * @return yyyyMMddHHmmss
+     */
+    fun getNowDateTimeNoFormat(): String {
+        return FORMAT_yyyyMMddHHmmss.format(Date())
+    }
+
+    /**
+     * @return yyyyMMdd
+     */
+    fun getNowDateNoFormat(): String {
+        return FORMAT_yyyyMMdd.format(Date())
+    }
+
+    /**
+     * @param date
+     * @return yyyyMMdd
+     */
+    fun getNowDateNoFormat(date: Date): String? {
+        try {
+            return FORMAT_yyyyMMdd.format(date)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    /**
+     * @return HHmmss
+     */
+    fun getNowTimeNoFormat(): String {
+        return FORMAT_HHmmss.format(Date())
+    }
+
+    /**
+     * @param datetime yyyyMMddHHmmss
+     * @return ms
+     * @desc 将日期格式的字符串转换为长整型
+     */
+    fun dateFormatConvertToLong(datetime: String): Long {
+        return try {
+            FORMAT_yyyyMMddHHmmss.parse(datetime).time
+        } catch (ex: ParseException) {
+            0L
+        }
+    }
+
+    /**
+     * @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 将长整型数字转换为日期格式的字符串
+     */
+    fun dateLongConvertToFormat(time: Long): String {
+        return if (time > 0L) {
+            FORMAT_yyyyMMddHHmmss.format(Date(time))
+        } else ""
+    }
+
+    /**
+     * @param time ms
+     * @return MMddHHmmyy
+     * @desc 将长整型数字转换为日期格式的字符串
+     */
+    fun dateLongConvertToFormat2(time: Long): String {
+        return if (time > 0L) {
+            FORMAT_MMddHHmmyy.format(Date(time))
+        } else ""
+    }
+
+    /**
+     * @param datetime yyyy-MM-dd HH:mm:ss
+     * @return
+     * @desc 将日期格式的字符串转换为长整型
+     */
+    fun dateFormatConvertToDate(datetime: String): Date? {
+        return try {
+            FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
+        } catch (ex: ParseException) {
+            null
+        }
+    }
+
+    /**
+     * @param daynum 天数
+     * @return 返回当前日期的第 daynum 天前的日期  yyyyMMdd
+     */
+    fun getDayDateNoFormatBefore(daynum: Int): String {
+        val calendar = Calendar.getInstance()
+        calendar.add(Calendar.DATE, -daynum)
+        return FORMAT_yyyyMMdd.format(calendar.time)
+    }
+
+    /**
+     * 获得指定日期的前一天
+     *
+     * @param specifiedDay yyyyMMdd
+     * @return yyyyMMdd
+     */
+    fun getSpecifiedDayBefore(specifiedDay: String): String {
+        return try {
+            val c = Calendar.getInstance()
+            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+            c.time = date
+            val day = c.get(Calendar.DATE)
+            c.set(Calendar.DATE, day - 1)
+            FORMAT_yyyyMMdd.format(c.time)
+        } catch (e: ParseException) {
+            ""
+        }
+    }
+
+    /**
+     * 获得指定日期的前一天
+     *
+     * @param dayBefore 往前推迟的天数
+     * @return Date
+     */
+    fun getSomeDayBefore(dayBefore: Int): Date {
+        val c = Calendar.getInstance()
+        c.add(Calendar.DAY_OF_MONTH, -dayBefore)
+        return c.time
+    }
+
+    /**
+     * 获得指定日期的后一天
+     *
+     * @param specifiedDay yyyyMMdd
+     * @return yyyyMMdd
+     */
+    fun getSpecifiedDayAfter(specifiedDay: String): String {
+        return try {
+            val c = Calendar.getInstance()
+            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+            c.time = date
+            val day = c.get(Calendar.DATE)
+            c.set(Calendar.DATE, day + 1)
+            FORMAT_yyyyMMdd.format(c.time)
+        } catch (e: ParseException) {
+            ""
+        }
+    }
+
+    /**
+     * @return yyyyMMddHHmmss
+     */
+    fun getNowDateTimeFormat(): String {
+        return FORMAT_yyyyMMddHHmmss.format(Date())
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index e167606..4566945 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -222,7 +222,7 @@
 
     fun showPaySuccess(info: CardUserInfoBean) {
         payQueryConfirm = false
-        vPayhint.text = info.retmsg
+        vPayhint.text = info.getErrorMsg()
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.payamt)
         vPayamt.visibility = View.VISIBLE
@@ -247,7 +247,7 @@
         payQueryConfirm = false
         vPayhint.text = "消费失败"
         vPayhint.setTextColor(Color.RED)
-        vPayamt.text = info.retmsg
+        vPayamt.text = info.getErrorMsg()
         vPayamt.visibility = View.VISIBLE
         vUsername.visibility = View.GONE
         show()
@@ -256,7 +256,7 @@
 
     fun showReverseSuccess(info: CardUserInfoBean) {
         payQueryConfirm = false
-        vPayhint.text = info.retmsg
+        vPayhint.text = info.getErrorMsg()
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.amount)
         vPayamt.visibility = View.VISIBLE
@@ -269,7 +269,7 @@
         payQueryConfirm = false
         vPayhint.text = "冲正失败"
         vPayhint.setTextColor(Color.RED)
-        vPayamt.text = info.retmsg
+        vPayamt.text = info.getErrorMsg()
         vPayamt.visibility = View.VISIBLE
         vUsername.visibility = View.GONE
         show()
diff --git a/app/src/main/res/layout/activity_manage.xml b/app/src/main/res/layout/activity_manage.xml
index 6b979d6..4fb3a1f 100644
--- a/app/src/main/res/layout/activity_manage.xml
+++ b/app/src/main/res/layout/activity_manage.xml
@@ -1,13 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              style="@style/head_title_out_style">
+        style="@style/head_title_out_style">
 
     <LinearLayout style="@style/head_title_inner_style">
+
         <TextView
                 style="@style/head_title_text_style"
-                android:text="维护管理界面"/>
+                android:text="维护管理界面" />
 
         <LinearLayout
+                android:id="@+id/ll_operate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp"
+                android:visibility="gone">
+
+            <TextView
+                    android:id="@+id/tv_operate_hint"
+                    style="@style/menu_item_text_style" />
+
+            <TextView
+                    android:id="@+id/tv_operate_result"
+                    style="@style/menu_item_text_style" />
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/ll_menu"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:layout_marginLeft="10dp"
@@ -16,39 +36,39 @@
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_shop_passwd"/>
+                    android:text="@string/consume_menu_shop_passwd" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_comm_set"/>
+                    android:text="@string/consume_menu_comm_set" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_unconfirm_transdtl"/>
+                    android:text="@string/consume_menu_unconfirm_transdtl" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_syno_active"/>
+                    android:text="@string/consume_menu_syno_active" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_upgrade"/>
+                    android:text="@string/consume_menu_upgrade" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_app_exit"/>
+                    android:text="@string/consume_menu_app_exit" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_setting"/>
+                    android:text="@string/consume_menu_setting" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_clear_blklist"/>
+                    android:text="@string/consume_menu_clear_blklist" />
 
             <TextView
                     style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_control_set"/>
+                    android:text="@string/consume_menu_control_set" />
         </LinearLayout>
     </LinearLayout>
 </LinearLayout>
diff --git a/app/src/main/res/layout/activity_menu.xml b/app/src/main/res/layout/activity_menu.xml
index e938845..3c0950a 100644
--- a/app/src/main/res/layout/activity_menu.xml
+++ b/app/src/main/res/layout/activity_menu.xml
@@ -1,69 +1,88 @@
-<?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:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_margin="20dp"
-        android:background="@drawable/corner_bg_white"
-        android:orientation="vertical">
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="10dp"
-            android:gravity="center"
-            android:text="管理界面"
-            android:textColor="@color/light_blue2"
-            android:textSize="45sp" />
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_marginLeft="10dp"
-            android:orientation="vertical"
-            android:padding="10dp">
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_revenue" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_transdtl_upload" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_link_check" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_auth" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_syspara_query" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_manage" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_shop_password_set" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_consume_mode" />
-
-            <TextView
-                android:id="@+id/tv_reverse"
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_reverse" />
-        </LinearLayout>
-    </LinearLayout>
+<?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:orientation="vertical">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="20dp"
+            android:background="@drawable/corner_bg_white"
+            android:orientation="vertical">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:gravity="center"
+                android:text="管理界面"
+                android:textColor="@color/light_blue2"
+                android:textSize="45sp" />
+
+        <LinearLayout
+                android:id="@+id/ll_operate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp"
+                android:visibility="gone">
+
+            <TextView
+                    android:id="@+id/tv_operate_hint"
+                    style="@style/menu_item_text_style" />
+
+            <TextView
+                    android:id="@+id/tv_operate_result"
+                    style="@style/menu_item_text_style" />
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/ll_menu"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp">
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_revenue" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_transdtl_upload" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_link_check" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_auth" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_syspara_query" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_manage" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_shop_password_set" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_consume_mode" />
+
+            <TextView
+                    android:id="@+id/tv_reverse"
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_reverse" />
+        </LinearLayout>
+    </LinearLayout>
 </LinearLayout>
\ No newline at end of file
