优化
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