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 aa4194b..c754d51 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -29,6 +29,7 @@
 import com.supwisdom.view.DialogPurchase
 import java.util.*
 import java.util.concurrent.locks.ReentrantLock
+import kotlin.collections.ArrayList
 
 /**
  ** create by zzq on 2019/7/24
@@ -67,6 +68,7 @@
     private var amount: Int = 0
     private var payMode: PayMode? = null
     private val hotkeyPayMap = hashMapOf<Int, Int>()
+    private val hotkeyPayList = ArrayList<String>()
     private var payWay: String? = null
     private var counter: LastPayShowTimer? = null
     private var lastPayInfo: CardUserInfoBean? = null
@@ -89,14 +91,16 @@
                 if (isPaying) {
                     presenter.clickToInterrupt()
                 } else {
-                    if (payMode == PayMode.FIXPAY) {
-                        checkAmtToPay(amount, true)
-                    } else if (payMode == PayMode.HOTKEY) {
-
-                    } else {
-                        presenter.clickNoPay()
-                        amountTxt.text = ""
-                        AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
+                    when (payMode) {
+                        PayMode.FIXPAY -> checkAmtToPay(amount)
+                        PayMode.HOTKEY -> {
+                            AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+                        }
+                        else -> {
+                            presenter.clickNoPay()
+                            amountTxt.text = ""
+                            AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
+                        }
                     }
                 }
             }
@@ -204,9 +208,14 @@
                 val key = keyCode - KeyEvent.KEYCODE_0
                 if (hotkeyPayMap.containsKey(key)) {
                     amount = hotkeyPayMap[key]!!
-                    checkAmtToPay(amount, false)
+                    checkAmtToPay(amount)
                 }
             }
+            KeyEvent.KEYCODE_DEL -> {
+                //cancel
+                presenter.clickNoPay()
+                AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+            }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
                 isBackRuning = true
@@ -273,7 +282,7 @@
             KeyEvent.KEYCODE_ENTER -> {
                 amount = getCurAmount() + addAmount
                 if (amount > 0) {
-                    checkAmtToPay(amount, false)
+                    checkAmtToPay(amount)
                 } else {
                     AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
                 }
@@ -364,19 +373,24 @@
         SPApplication.getInstance().getPos().getControlPara(PublicDef.CONTROL_FIXAMT)?.also { mode ->
             when {
                 mode.paraval == PayMode.HOTKEY.desc -> {
+                    presenter.setFixMode(false)
                     payMode = PayMode.HOTKEY
                     hotkeyPayMap.clear()
+                    hotkeyPayList.clear()
                     SPApplication.getInstance().getPos().getHotkeyPay()?.forEach {
                         hotkeyPayMap[it.key] = it.amount
+                        hotkeyPayList.add(String.format("%d-%.02f", it.key, it.amount / 100.0f))
                     }
                 }
                 mode.paraval == PayMode.NORMAL.desc -> {
+                    presenter.setFixMode(false)
                     payMode = PayMode.NORMAL
                 }
                 else -> {
+                    presenter.setFixMode(true)
                     payMode = PayMode.FIXPAY
                     try {
-                        checkAmtToPay(Integer.parseInt(mode.paraval), true)
+                        checkAmtToPay(Integer.parseInt(mode.paraval))
                     } catch (ex: Exception) {
                         ex.printStackTrace()
                     }
@@ -543,19 +557,28 @@
         }
     }
 
-    private fun checkAmtToPay(inputAmt: Int, isFixPay: Boolean) {
-        if (isFixPay) {
-            AuxScreenController.getInstance()
-                .refreshContent(Arrays.asList("定额付款", CommonUtil.showFormatAmount("金额", inputAmt)))
-        } else {
-            AuxScreenController.getInstance()
-                .refreshContent(Arrays.asList("等待付款", CommonUtil.showFormatAmount("金额", inputAmt)))
-        }
+    private fun checkAmtToPay(inputAmt: Int) {
         amount = inputAmt
         amountTxt.text = String.format("%.02f", inputAmt / 100.0f)
         payStatusEnable = true
         presenter.clickToPay(inputAmt)
-        showDialogPay(isFixPay)
+        when (payMode) {
+            PayMode.FIXPAY -> {
+                AuxScreenController.getInstance()
+                    .refreshContent(Arrays.asList("定额付款", CommonUtil.showFormatAmount("金额", inputAmt)))
+                showDialogPay(true)
+            }
+            PayMode.HOTKEY -> {
+                AuxScreenController.getInstance()
+                    .refreshContent(Arrays.asList("热键付款", CommonUtil.showFormatAmount("金额", inputAmt)))
+                showDialogPay(false)
+            }
+            else -> {
+                AuxScreenController.getInstance()
+                    .refreshContent(Arrays.asList("等待付款", CommonUtil.showFormatAmount("金额", inputAmt)))
+                showDialogPay(false)
+            }
+        }
     }
 
     private fun showDialogPay(isFixPay: Boolean) {
diff --git a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
index f4fdfad..43b5ed2 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
@@ -32,7 +32,7 @@
     init {
         createHandler()
         cardPayService = CardPayService(iConsumeView, handler)
-        codePayService = CodePayService(iConsumeView, handler)
+        codePayService = CodePayService(handler)
     }
 
     private fun createHandler() {
@@ -91,6 +91,11 @@
         cardPayService.clickToInterrupt()
     }
 
+    fun setFixMode(isFixMode: Boolean) {
+        cardPayService.isFixMode = isFixMode
+        codePayService.isFixMode = isFixMode
+    }
+
     fun codeToPay(code: String, amount: Int) {
         this.code = code
         this.amount = amount
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/LastPayBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/LastPayBean.kt
new file mode 100644
index 0000000..5da0ba9
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/LastPayBean.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.activities.consume.bean
+
+/**
+ ** create by zzq on 2019/9/16
+ ** @desc
+ **/
+class LastPayBean {
+    var cardphyid: String? = null
+    var code: String? = null
+    var suctime: Long = 0 //ms
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index 4f90429..4b39eea 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
@@ -20,10 +20,8 @@
  ** create by zzq on 2019/7/25
  ** @desc 刷卡消费
  **/
-class CardPayService constructor(iConsumeView: IConsumeView, handler: Handler) {
+class CardPayService constructor(private val iConsumeView: IConsumeView, private val handler: Handler) {
     private val TAG = "CardPayService"
-    private val iConsumeView = iConsumeView
-    private val handler = handler
     private val pos = SPApplication.getInstance().getPos()
     private val runnable = CardPayRunnable()
     private val consumeApi = ConsumeApi()
@@ -35,8 +33,13 @@
     private var amount: Int = 0
     @Volatile
     private var payQueryConfirm = false
+    var isFixMode = false
     private var thread: Thread? = null
     private var cardBean: CardBean? = null
+    /**
+     * 防止定额连续消费
+     */
+    private var lastPayBean = LastPayBean()
 
     fun start() {
         isExist = false
@@ -210,6 +213,13 @@
         }
 
         private fun doConsume() {
+            if (isFixMode) {
+                if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
+                    if (System.currentTimeMillis() - lastPayBean.suctime < 15000) {
+                        throw CardPayFailError("15s内不能连续消费")
+                    }
+                }
+            }
             sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
             if (SPApplication.getInstance().isOnline()) {
                 if (!doOnlineConsume()) {
@@ -531,6 +541,8 @@
         }
 
         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
@@ -546,6 +558,8 @@
         }
 
         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
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 08b68c1..eb076ea 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
@@ -3,10 +3,10 @@
 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.CardPayConfirmRetBean
 import com.supwisdom.activities.consume.bean.CardPayInitRetBean
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.consume.bean.LastPayBean
 import com.supwisdom.entity.PayStatus
 import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlOnlineRecord
@@ -14,16 +14,13 @@
 import com.supwisdom.okhttp.TransResp
 import com.supwisdom.utils.*
 import org.apache.http.HttpStatus
-import java.lang.Exception
 
 /**
  ** create by zzq on 2019/7/30
  ** @desc 二维码消费
  **/
-class CodePayService constructor(iConsumeView: IConsumeView, handler: Handler) {
+class CodePayService constructor(private val handler: Handler) {
     private val TAG = "CodePayService"
-    private val iConsumeView = iConsumeView
-    private val handler = handler
     private val pos = SPApplication.getInstance().getPos()
     private lateinit var codeRecord: TransdtlOnlineRecord
     private val consumeApi = ConsumeApi()
@@ -35,6 +32,8 @@
     private var interruptedPay: Boolean = false
     @Volatile
     private var amount = 0
+    var isFixMode = false
+    private val lastPayBean = LastPayBean()
 
     fun interruptPay() {
         interruptedPay = true
@@ -44,6 +43,13 @@
         this.amount = amount
         interruptedPay = false
         try {
+            if (isFixMode) {
+                if (lastPayBean.code == code) {
+                    if (System.currentTimeMillis() - lastPayBean.suctime < 15000) {
+                        throw CardPayFailError("15s内不能连续消费")
+                    }
+                }
+            }
             initTransdtlOnline(code, amount)
             var resp = consumeApi.payInit(codeRecord)
             parseInitResult(resp)
@@ -178,6 +184,8 @@
     }
 
     private fun showSucInfo() {
+        lastPayBean.code = codeRecord.qrcode
+        lastPayBean.suctime = System.currentTimeMillis()
         val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
         info.showtime = pos.getSysPara()!!.sucShowtime
         info.amount = codeRecord.payamt
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index a03f510..fa71710 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.view
 
 import android.content.Context
+import android.content.Intent
 import android.graphics.Color
 import android.os.CountDownTimer
 import android.view.KeyEvent
@@ -11,6 +12,8 @@
 import com.newcapec.zxinglib.PosDecoder
 import com.supwisdom.R
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.menu.MenuActivity
+import com.supwisdom.activities.transdtl.TransdtlActivity
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.LogUtil
 
@@ -73,11 +76,17 @@
                         finish(isManualCancel = true, isPaying = false)
                     }
                 }
+                KeyEvent.KEYCODE_DPAD_LEFT -> jumpActivity(MenuActivity::class.java)
+                KeyEvent.KEYCODE_DPAD_RIGHT -> jumpActivity(TransdtlActivity::class.java)
             }
         }
         return super.dispatchKeyEvent(event)
     }
 
+    private fun <T> jumpActivity(cls: Class<T>) {
+        context.startActivity(Intent(context, cls))
+    }
+
     fun show(hint: String, amount: String) {
         vPayhint.text = hint
         vPayhint.setTextColor(context.resources.getColor(R.color.blue))
