diff --git a/app/src/main/java/com/supwisdom/activities/consume/BeepManager.kt b/app/src/main/java/com/supwisdom/activities/consume/BeepManager.kt
new file mode 100644
index 0000000..4973200
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/BeepManager.kt
@@ -0,0 +1,109 @@
+package com.supwisdom.activities.consume
+
+import android.app.Activity
+import android.content.Context
+import android.media.AudioManager
+import android.media.MediaPlayer
+import android.os.Vibrator
+import com.newcapec.zxinglib.PreferencesSetting
+import com.supwisdom.R
+import java.io.Closeable
+import java.io.IOException
+
+
+/**
+ * @author zzq
+ * @date 2018/4/25.
+ * @version 1.0.1
+ * @desc  滴滴声
+ */
+@Suppress("DEPRECATION")
+class BeepManager constructor(context: Context) : MediaPlayer.OnErrorListener, Closeable {
+    private val context = context
+
+    private val BEEP_VOLUME = 0.10f
+    private val VIBRATE_DURATION = 200L
+
+    private var mediaPlayer: MediaPlayer? = null
+    private var playBeep: Boolean = false
+    private var vibrate: Boolean = false
+
+    init {
+        updatePrefs()
+    }
+
+    @Synchronized
+    fun updatePrefs() {
+        //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
+        playBeep = shouldBeep(context)
+        vibrate = PreferencesSetting.PREFER_VIBRATE
+        if (playBeep && mediaPlayer == null) {
+            // The volume on STREAM_SYSTEM is not adjustable, and users found it too loud,
+            // so we now play on the music stream.
+            (context as Activity).volumeControlStream = AudioManager.STREAM_MUSIC
+            mediaPlayer = buildMediaPlayer(context)
+        }
+    }
+
+    @Synchronized
+    fun playBeepSoundAndVibrate() {
+        if (playBeep && mediaPlayer != null) {
+            mediaPlayer!!.start()
+        }
+        if (vibrate) {
+            val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
+            vibrator.vibrate(VIBRATE_DURATION)
+        }
+    }
+
+    private fun shouldBeep(activity: Context): Boolean {
+        var shouldPlayBeep = PreferencesSetting.PREFER_PLAY_BEEP
+        if (shouldPlayBeep) {
+            // See if sound settings overrides this
+            val audioService = activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+            if (audioService.ringerMode != AudioManager.RINGER_MODE_NORMAL) {
+                shouldPlayBeep = false
+            }
+        }
+        return shouldPlayBeep
+    }
+
+    private fun buildMediaPlayer(activity: Context): MediaPlayer? {
+        val mediaPlayer = MediaPlayer()
+        return try {
+            activity.resources.openRawResourceFd(R.raw.beep).use { it ->
+                mediaPlayer.setDataSource(it.fileDescriptor, it.startOffset, it.length)
+            }
+            mediaPlayer.setOnErrorListener(this)
+            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
+            mediaPlayer.isLooping = false
+            mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME)
+            mediaPlayer.prepare()
+            mediaPlayer
+        } catch (ex: IOException) {
+            mediaPlayer.release()
+            null
+        }
+    }
+
+    @Synchronized
+    override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean {
+        if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
+            // we are finished, so put up an appropriate error toast if required and finish
+            (context as Activity).finish()
+        } else {
+            // possibly media player error, so release and recreate
+            close()
+            updatePrefs()
+        }
+        return true
+    }
+
+    @Synchronized
+    override fun close() {
+        if (mediaPlayer != null) {
+            mediaPlayer!!.release()
+            mediaPlayer = null
+        }
+    }
+}
\ No newline at end of file
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 5bc4f48..8f196bc 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -27,6 +27,7 @@
 import com.supwisdom.utils.SoundUtil
 import com.supwisdom.view.DialogPurchase
 import java.util.*
+import java.util.concurrent.locks.ReentrantLock
 
 /**
  ** create by zzq on 2019/7/24
@@ -53,6 +54,12 @@
     private lateinit var vLastPayFailreason: TextView
     private lateinit var vLastPayFailll: LinearLayout
     private lateinit var vLastPayamtll: LinearLayout
+    private var beepManager: BeepManager? = null
+    private val scanLock = ReentrantLock()
+    @Volatile
+    private var codeSwitchEnable = false
+    @Volatile
+    private var payStatusEnable = false
     @Volatile
     private var isBackRuning = false
     private var addAmount: Int = 0
@@ -74,9 +81,39 @@
     private fun initData() {
         presenter = ConsumePresenter(this)
         presenter.start()
+        beepManager = BeepManager(this)
         dialogPurchase = DialogPurchase(this, object : DialogPurchase.ICallBack {
             override fun callback(isManualCancel: Boolean) {
                 presenter.clickNoPay()
+                amountTxt.text = ""
+            }
+
+            override fun callback(code: String) {
+                //扫码和寻卡消费互斥
+                if (!codeSwitchEnable) {
+                    return
+                }
+                if (!scanLock.tryLock()) {
+                    return
+                }
+                try {
+                    //正在扣款
+                    if (dialogPurchase!!.codePaying) {
+                        return
+                    }
+                    //已扣款
+                    if (!payStatusEnable) {
+                        return
+                    }
+                    beepManager!!.playBeepSoundAndVibrate()
+                    presenter.clickNoPay()
+                    dialogPurchase!!.codePaying = true
+                    dialogPurchase!!.codePayingNoCancelEnable = true
+                    payStatusEnable = false
+                    presenter.codeToPay(code, amount)
+                } finally {
+                    scanLock.unlock()
+                }
             }
         })
     }
@@ -122,12 +159,19 @@
         if (amount > 0) {
             amountTxt.text = String.format("%.02f", amount / 100.0f)
             presenter.clickToPay(amount)
-            dialogPurchase!!.showProcess("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+            showDialogPay()
         } else {
             AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
         }
     }
 
+    private fun showDialogPay() {
+        dialogPurchase!!.codePaying = false
+        dialogPurchase!!.isFixPay = false
+        dialogPurchase!!.codePayingNoCancelEnable = false
+        dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+    }
+
     private fun getCurAmount(): Int {
         return try {
             CommonUtil.YuanToFen(java.lang.Double.parseDouble(amountTxt.text.toString().trim { it <= ' ' }))
@@ -191,12 +235,19 @@
                 vTime.text = tmptime
                 AuxScreenController.getInstance().refreshBottom(tmptime)
             }
+            if (dialogPurchase!!.isShowing &&
+                !dialogPurchase!!.isFixPay &&
+                payStatusEnable
+            ) {
+                beepManager!!.playBeepSoundAndVibrate()
+            }
         }
     }
 
     override fun onResume() {
         super.onResume()
         isBackRuning = false
+        beepManager!!.updatePrefs()
         dealIntent()
         refresh()
         refreshRecentDtl(lastPayInfo)
@@ -239,7 +290,7 @@
                 amount = Integer.parseInt(record.paraval)
                 amountTxt.text = String.format("%.02f", amount / 100.0f)
                 presenter.clickToPay(amount)
-                dialogPurchase!!.showProcess("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+                showDialogPay()
             } catch (ex: Exception) {
                 ex.printStackTrace()
             }
@@ -372,6 +423,7 @@
     override fun onDestroy() {
         SoundUtil.releaseMusic()
         presenter.stop()
+        beepManager!!.close()
         super.onDestroy()
     }
 
@@ -475,6 +527,10 @@
         }
     }
 
+    override fun codeScannerEnable(enable: Boolean) {
+        codeSwitchEnable = enable
+    }
+
     private fun resetPayShowCounter(timems: Long) {
         counter?.cancel()
         counter = LastPayShowTimer(timems, 500)
diff --git a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
index d6c53bb..b633d51 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -30,4 +30,6 @@
     fun refreshLinkStatus(isOnline: Boolean)
 
     fun showRecentDtl(record: TransdtlUnionRecord?)
+
+    fun codeScannerEnable(enable: Boolean)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt
index 074e62c..2b50e3f 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardPayInitRetBean.kt
@@ -9,7 +9,7 @@
 class CardPayInitRetBean : BaseResp() {
     var billno: String? = null
     var username: String? = null
-    var userid: Int = 0
+    var userid: String? = null
     var anonymous: Boolean = false
     var sourcetype: String? = null
     var needpwdconfirm: Boolean = false
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 96e3032..f88e2b9 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
@@ -86,9 +86,11 @@
                     doClear()
                     continue
                 }
+                iConsumeView.codeScannerEnable(true)
                 CommonUtil.doSleep(100)
                 try {
                     val cardphyid = Cardlib.instance.requestCard()
+                    iConsumeView.codeScannerEnable(false)
                     if (oldcardphyid != cardphyid) {
                         readCard()
                         cardBean.cardphyid = cardphyid
@@ -201,7 +203,7 @@
             }
             resp = consumeApi.payConfirm(onlRecord)
             result = parseConfirmResult(resp)
-            if (!result) {
+            if (result) {
                 showSucInfo()
             }
             updateTransdtlOnline(result)
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
index 46c0d15..f69e698 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
@@ -48,7 +48,7 @@
             if (!result) {
                 result = payResultQuery()
             }
-            if (!result) {
+            if (result) {
                 showSucInfo()
             }
             updateTransdtlOnline(result)
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 4723966..cbfac25 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -8,6 +8,7 @@
 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
@@ -35,7 +36,11 @@
 
     private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
         override fun doInBackground(vararg voids: Void): AuthRetBean {
-            val retBean = AuthEpay().login()
+            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
@@ -52,10 +57,10 @@
         }
 
         override fun onPostExecute(retBean: AuthRetBean?) {
-            if (retBean == null) {
-                iMenuView.showOperResult("签到结果", "请求超时")
-            } else {
-                iMenuView.showOperResult("签到结果", retBean.retmsg!!)
+            when {
+                retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
+                retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult("签到失败", retBean.retmsg ?: "null")
+                else -> iMenuView.showOperResult("签到成功", " ")
             }
         }
     }
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index c93d962..6ce7a41 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -20,15 +20,8 @@
     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_ss_SSS =
-        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS")
-    private val FORMAT_HH_mm_ss_SSS = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmssSSS")
-    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")
-    private val FORMAT_HH_mm = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm")
-    private val FORMAT_UTC_yyyyMMddHHmmss =
-        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
 
     /**
      * @return yyyy-MM-dd HH:mm:ss
@@ -41,96 +34,6 @@
         return FORMAT_yyyy_MM_dd.format(Date())
     }
 
-    /**
-     * @return yyyy-MM-dd HH:mm:ss.SSS
-     */
-    fun getNow5(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss_SSS.format(Date())
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm
-     */
-    fun getNow4(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm.format(Date())
-    }
-
-    /**
-     * @return yyMMddHHmmss
-     */
-    fun getNow2(): String {
-        return FORMAT_yyMMddHHmmss.format(Date())
-    }
-
-    /**
-     * @param dateTime yyyyMMddHHmmss
-     * @return yyyyMMdd.HHmmss
-     */
-    fun getNow4(dateTime: String): String? {
-        try {
-            val str1 = dateTime.substring(0, 8)
-            val str2 = dateTime.substring(8)
-            return "$str1.$str2"
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return yy-MM-dd HH:mm:ss
-     */
-    fun getNow3(): String {
-        return FORMAT_yyMMddHHmmss2.format(Date())
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getDateTimeFormat(date: Date): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(date)
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getDateTimeFormat(timeInMillis: Long?): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(timeInMillis)
-    }
-
-    /**
-     * @param datetime yyyyMMddHHmmss
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getNowDatetimeFromNoFormat(datetime: String): String {
-        try {
-            return datetime.substring(0, 4) + "-" +
-                    datetime.substring(4, 6) + "-" +
-                    datetime.substring(6, 8) + " " +
-                    datetime.substring(8, 10) + ":" +
-                    datetime.substring(10, 12) + ":" +
-                    datetime.substring(12)
-        } catch (ex: Exception) {
-        }
-        return ""
-    }
-
-    /**
-     * @param datetime yyyyMMddHHmm
-     * @return yyyy-MM-dd HH:mm
-     */
-    fun getNowDatetimeFromNoFormat3(datetime: String): String {
-        try {
-            return datetime.substring(0, 4) + "-" +
-                    datetime.substring(4, 6) + "-" +
-                    datetime.substring(6, 8) + " " +
-                    datetime.substring(8, 10) + ":" +
-                    datetime.substring(10)
-        } catch (ex: Exception) {
-        }
-        return ""
-    }
-
     fun utcToLocal(utctime: String): String {
         val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
         sdf.timeZone = TimeZone.getTimeZone("UTC")
@@ -146,24 +49,6 @@
         }
     }
 
-
-    /**
-     * @param datetime yyyyMMddHHmmss
-     * @return yy-MM-dd HH:mm:ss
-     */
-    fun getNowDatetimeFromNoFormat2(datetime: String): String? {
-        return try {
-            datetime.substring(2, 4) + "-" +
-                    datetime.substring(4, 6) + "-" +
-                    datetime.substring(6, 8) + " " +
-                    datetime.substring(8, 10) + ":" +
-                    datetime.substring(10, 12) + ":" +
-                    datetime.substring(12)
-        } catch (ex: Exception) {
-            null
-        }
-    }
-
     /**
      * @param date yyyyMMdd
      * @return yyyy-MM-dd
@@ -179,17 +64,6 @@
     }
 
     /**
-     * @param date yyyy-MM-dd HH:mm:ss
-     * @return yyyyMMddHHmmss
-     */
-    fun getNowDateFromNoFormat2(date: String): String {
-        return date.replace("-", "")
-            .replace(" ", "")
-            .replace(":", "")
-    }
-
-
-    /**
      * @return HH:mm:ss
      */
     fun getNowTimeWithArg(date: Date): String? {
@@ -267,13 +141,6 @@
     }
 
     /**
-     * @return HHmmssSSS
-     */
-    fun getNowTime1(): String {
-        return FORMAT_HH_mm_ss_SSS.format(Date())
-    }
-
-    /**
      * @return HH:mm:ss
      */
     fun getNowTime(): String {
@@ -446,53 +313,10 @@
     }
 
     /**
-     * 获得指定日期的后一天
-     *
-     * @param specifiedDay yyyy-MM-dd
-     * @return yyyy-MM-dd
-     */
-    fun getSpecifiedDayAfter1(specifiedDay: String): String {
-        return try {
-            val c = Calendar.getInstance()
-            val date = FORMAT_yyyy_MM_dd.parse(specifiedDay)
-            c.time = date
-            val day = c.get(Calendar.DATE)
-            c.set(Calendar.DATE, day + 1)
-            FORMAT_yyyy_MM_dd.format(c.time)
-        } catch (e: ParseException) {
-            ""
-        }
-    }
-
-    /**
-     * 分钟转化为未来时间yyyyMMddHHmm
-     *
-     * @param minute 分钟数
-     * @return yyyyMMddHHmm
-     */
-    fun format2FutureTime(minute: Int): String {
-        val calendar = Calendar.getInstance()
-        calendar.add(Calendar.MINUTE, minute)
-        return FORMAT_yyyyMMddHHmm.format(calendar.time)
-    }
-
-    /**
-     * @return yyyyMMddHHmm
+     * @return yyyyMMddHHmmss
      */
     fun getNowDateTimeFormat(): String {
-        return FORMAT_yyyyMMddHHmm.format(Date())
+        return FORMAT_yyyyMMddHHmmss.format(Date())
     }
 
-    /**
-     * @param datetime yyyyMMddHHmm
-     * @return 毫秒数
-     */
-    fun formatDateTime(datetime: String): Long {
-        try {
-            return FORMAT_yyyyMMddHHmm.parse(datetime).time
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-        }
-        return 0
-    }
 }
\ 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 8ae1fc0..39b5806 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -6,23 +6,31 @@
 import android.view.KeyEvent
 import android.view.View
 import android.widget.TextView
+import com.google.zxing.Result
+import com.newcapec.zxinglib.IDecoderAcquirer
+import com.newcapec.zxinglib.PosDecoder
 import com.supwisdom.R
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
 import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.LogUtil
 
 /**
  ** create by zzq on 2019/7/26
  ** @desc 消费弹窗
  **/
-class DialogPurchase constructor(context: Context, callBack: ICallBack) : DialogBase(context) {
+class DialogPurchase constructor(context: Context, callBack: ICallBack) : DialogBase(context), IDecoderAcquirer {
+    private val TAG = "DialogPurchase"
     private val callBack = callBack
     private var vCount: TextView
     private var vPayhint: TextView
     private var vPayamt: TextView
     private var vBalance: TextView
+    private var posDec: PosDecoder? = null
+    private var lastFixpayDecoderOpenTime: Long = 0
     private val waitTime = 60
-    var qrcodePayingNoCancelEnable = false
-    var barcodePaying = false
+    var codePayingNoCancelEnable = false
+    var codePaying = false
+    var isFixPay = false
 
     init {
         setContentView(R.layout.dialog_purchase)
@@ -31,11 +39,28 @@
         vPayhint = this.findViewById(R.id.tv_pay_hint) as TextView
         vPayamt = this.findViewById(R.id.tv_pay_amount) as TextView
         vBalance = this.findViewById(R.id.tv_pay_balance) as TextView
+
+        posDec = PosDecoder(this)
+    }
+
+    override fun onFailed() {
+
+    }
+
+    override fun onDecoded(result: String?) {
+
+    }
+
+    override fun onDecoded(result: Result?) {
+        val rawSize = result?.rawBytes?.size ?: 0
+        if (rawSize > 0) {
+            callBack.callback(result!!.text)
+        }
     }
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
-            if (qrcodePayingNoCancelEnable) {
+            if (codePayingNoCancelEnable) {
                 return super.dispatchKeyEvent(event)
             }
             when (event.keyCode) {
@@ -47,7 +72,7 @@
         return super.dispatchKeyEvent(event)
     }
 
-    fun showProcess(hint: String, amount: String) {
+    fun show(hint: String, amount: String) {
         vPayhint.text = hint
         vPayhint.setTextColor(Color.BLACK)
         vPayamt.text = amount
@@ -55,6 +80,17 @@
 
         vBalance.visibility = View.GONE
         show()
+        asyncOpenDecoder()
+        resetCounter(waitTime)
+    }
+
+    fun showProcess(hint: String, amount: String) {
+        vPayhint.text = hint
+        vPayhint.setTextColor(Color.RED)
+        vPayamt.text = amount
+        vPayamt.visibility = View.VISIBLE
+
+        vBalance.visibility = View.GONE
         resetCounter(waitTime)
     }
 
@@ -103,11 +139,53 @@
         resetCounter(info.showtime)
     }
 
+    private fun asyncOpenDecoder() {
+        if (!isFixPay) {
+            try {
+                posDec!!.onResume()
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+                LogUtil.d(TAG, "open camera exception:" + CommonUtil.getExceptionStack(ex))
+            }
+        } else {
+            val time = System.currentTimeMillis()
+            if (time < lastFixpayDecoderOpenTime ||
+                time - lastFixpayDecoderOpenTime > 120000
+            ) {
+                lastFixpayDecoderOpenTime = time
+                try {
+                    posDec!!.onPause()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    LogUtil.d(TAG, "fix close camera exception:" + CommonUtil.getExceptionStack(ex))
+                }
+                try {
+                    posDec!!.onResume()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    LogUtil.d(TAG, "fix open camera exception:" + CommonUtil.getExceptionStack(ex))
+                }
+            }
+        }
+    }
+
+    private fun asyncCloseDecoder() {
+        if (!isFixPay) {
+            try {
+                posDec!!.onPause()
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+                LogUtil.d(TAG, "close camera exception:" + CommonUtil.getExceptionStack(ex))
+            }
+        }
+    }
+
     private fun finish(isManualCancel: Boolean) {
-        barcodePaying = false
-        qrcodePayingNoCancelEnable = false
+        codePaying = false
+        codePayingNoCancelEnable = false
         dismiss()
         callBack.callback(isManualCancel)
+        asyncCloseDecoder()
     }
 
     private var counter: ConsumeHintCount? = null
@@ -139,5 +217,7 @@
 
     interface ICallBack {
         fun callback(isManualCancel: Boolean)
+
+        fun callback(code: String)
     }
 }
\ No newline at end of file
