diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..a5586c3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+.PHONEY: .o
+
+APPPATH=./app/build/outputs/apk/release
+BUILDAPK=app-release.apk
+SIGNAPK=app_sign.apk
+
+apk:
+	@echo "build app apk!"
+	gradlew assembleRelease
+	@echo "build android sign apk"
+	java -jar signapk.jar platform.x509.pem platform.pk8 $(APPPATH)/$(BUILDAPK) $(APPPATH)/$(SIGNAPK)
+	@echo "build upgrade zip"
+	python upgrade.py $(APPPATH)/$(SIGNAPK)
+clean:
+	@echo "remove build cache apk!"
+	rm -rf $(APPPATH)/$(BUILDAPK)
+	rm -rf $(APPPATH)/$(SIGNAPK)
+	rm -rf $(APPPATH)/hash256.sign
+	rm -rf $(APPPATH)/output.json
+	@echo "remove build cache file success"
+
diff --git a/app/build.gradle b/app/build.gradle
index 6737c2d..73373a4 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -24,6 +24,8 @@
             storePassword "123456"
             keyAlias "sup"
             keyPassword "123456"
+            v1SigningEnabled true
+            v2SigningEnabled true
         }
     }
     buildTypes {
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 5a07853..7febabd 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
@@ -65,6 +66,9 @@
     private var addAmount: Int = 0
     @Volatile
     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
@@ -87,9 +91,17 @@
                 if (isPaying) {
                     presenter.clickToInterrupt()
                 } 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(" 欢迎光临!", " 请刷卡..."))
+                        }
+                    }
                 }
             }
 
@@ -158,65 +170,126 @@
     @SuppressLint("SetTextI18n")
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
-            val keyCode = event.keyCode
-            when (keyCode) {
-                KeyEvent.KEYCODE_BACK -> {
-                    amountTxt.text = "0"
-                    presenter.clickNoPay()
-                }
-                KeyEvent.KEYCODE_0,
-                KeyEvent.KEYCODE_1,
-                KeyEvent.KEYCODE_2,
-                KeyEvent.KEYCODE_3,
-                KeyEvent.KEYCODE_4,
-                KeyEvent.KEYCODE_5,
-                KeyEvent.KEYCODE_6,
-                KeyEvent.KEYCODE_7,
-                KeyEvent.KEYCODE_8,
-                KeyEvent.KEYCODE_9 -> {
-                    presenter.clickNoPay()
-                    addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
-                }
-                KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
-                    presenter.clickNoPay()
-                    val str = amountTxt.text.toString()
-                    if (str.length < 8 && str.indexOf('.') < 0) {
-                        amountTxt.text = "$str."
-                        showScreenAmount()
-                    }
-                }
-                KeyEvent.KEYCODE_NUMPAD_ADD -> {
-                    //'+'
-                    addAmount += getCurAmount()
-                    amountTxt.text = ""
-                    showScreenAmount()
-                }
-                KeyEvent.KEYCODE_DPAD_LEFT -> {
-                    //'F1'
-                    isBackRuning = true
-                    jumpActivity(MenuActivity::class.java)
-                }
-//                KeyEvent.KEYCODE_DPAD_UP ->
-                //'F2'
-//                KeyEvent.KEYCODE_DPAD_DOWN ->
-                //'F3'
-                KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                    //'F4'
-                    jumpActivity(TransdtlActivity::class.java)
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    presenter.clickNoPay()
-                    delValueToEdit()
-                }
-                KeyEvent.KEYCODE_ENTER -> {
-                    checkAmtToPay()
-                }
+            when (payMode) {
+                PayMode.FIXPAY -> fixInputPay(event.keyCode)
+                PayMode.HOTKEY -> hotkeyInputPay(event.keyCode)
+                else -> normalInputPay(event.keyCode)
             }
         }
         return super.dispatchKeyEvent(event)
     }
 
+    private fun fixInputPay(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //'F1'
+                isBackRuning = true
+                jumpActivity(MenuActivity::class.java)
+            }
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                //'F4'
+                jumpActivity(TransdtlActivity::class.java)
+            }
+        }
+    }
+
+    private fun hotkeyInputPay(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_0,
+            KeyEvent.KEYCODE_1,
+            KeyEvent.KEYCODE_2,
+            KeyEvent.KEYCODE_3,
+            KeyEvent.KEYCODE_4,
+            KeyEvent.KEYCODE_5,
+            KeyEvent.KEYCODE_6,
+            KeyEvent.KEYCODE_7,
+            KeyEvent.KEYCODE_8,
+            KeyEvent.KEYCODE_9 -> {
+                val key = keyCode - KeyEvent.KEYCODE_0
+                if (hotkeyPayMap.containsKey(key)) {
+                    amount = hotkeyPayMap[key]!!
+                    checkAmtToPay(amount)
+                }
+            }
+            KeyEvent.KEYCODE_DEL -> {
+                //cancel
+                presenter.clickNoPay()
+                AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+            }
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //'F1'
+                isBackRuning = true
+                jumpActivity(MenuActivity::class.java)
+            }
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                //'F4'
+                jumpActivity(TransdtlActivity::class.java)
+            }
+        }
+    }
+
+    private fun normalInputPay(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_BACK -> {
+                amountTxt.text = "0"
+                presenter.clickNoPay()
+            }
+            KeyEvent.KEYCODE_0,
+            KeyEvent.KEYCODE_1,
+            KeyEvent.KEYCODE_2,
+            KeyEvent.KEYCODE_3,
+            KeyEvent.KEYCODE_4,
+            KeyEvent.KEYCODE_5,
+            KeyEvent.KEYCODE_6,
+            KeyEvent.KEYCODE_7,
+            KeyEvent.KEYCODE_8,
+            KeyEvent.KEYCODE_9 -> {
+                presenter.clickNoPay()
+                addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
+            }
+            KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
+                presenter.clickNoPay()
+                val str = amountTxt.text.toString()
+                if (str.length < 8 && str.indexOf('.') < 0) {
+                    amountTxt.text = "$str."
+                    showScreenAmount()
+                }
+            }
+            KeyEvent.KEYCODE_NUMPAD_ADD -> {
+                //'+'
+                addAmount += getCurAmount()
+                amountTxt.text = ""
+                showScreenAmount()
+            }
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //'F1'
+                isBackRuning = true
+                jumpActivity(MenuActivity::class.java)
+            }
+//                KeyEvent.KEYCODE_DPAD_UP ->
+            //'F2'
+//                KeyEvent.KEYCODE_DPAD_DOWN ->
+            //'F3'
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                //'F4'
+                jumpActivity(TransdtlActivity::class.java)
+            }
+            KeyEvent.KEYCODE_DEL -> {
+                //cancel
+                presenter.clickNoPay()
+                delValueToEdit()
+            }
+            KeyEvent.KEYCODE_ENTER -> {
+                amount = getCurAmount() + addAmount
+                if (amount > 0) {
+                    checkAmtToPay(amount)
+                } else {
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
+                }
+            }
+        }
+    }
+
     override fun showUserInfo(info: CardUserInfoBean) {
         CommonUtil.acquireWakeLock(this)
         vCitizenName.text = info.username
@@ -297,16 +370,32 @@
         AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime().substring(0, 16))
         AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
 
-        val record = SPApplication.getInstance().getPos().getControlPara(PublicDef.CONTROL_FIXAMT)
-        if (record != null && PublicDef.CONTROL_NO_FIXPAY_FLAG != record.paraval) {
-            try {
-                amount = Integer.parseInt(record.paraval)
-                amountTxt.text = String.format("%.02f", amount / 100.0f)
-                payStatusEnable = true
-                presenter.clickToPay(amount)
-                showDialogPay()
-            } catch (ex: Exception) {
-                ex.printStackTrace()
+        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))
+                    }
+                    AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+                }
+                mode.paraval == PayMode.NORMAL.desc -> {
+                    presenter.setFixMode(false)
+                    payMode = PayMode.NORMAL
+                }
+                else -> {
+                    presenter.setFixMode(true)
+                    payMode = PayMode.FIXPAY
+                    try {
+                        checkAmtToPay(Integer.parseInt(mode.paraval))
+                    } catch (ex: Exception) {
+                        ex.printStackTrace()
+                    }
+                }
             }
         }
     }
@@ -469,23 +558,33 @@
         }
     }
 
-    private fun checkAmtToPay() {
-        amount = getCurAmount() + addAmount
-        if (amount > 0) {
-            AuxScreenController.getInstance()
-                .refreshContent(Arrays.asList("等待付款", CommonUtil.showFormatAmount("金额", amount)))
-            amountTxt.text = String.format("%.02f", amount / 100.0f)
-            payStatusEnable = true
-            presenter.clickToPay(amount)
-            showDialogPay()
-        } else {
-            AuxScreenController.getInstance().refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
+    private fun checkAmtToPay(inputAmt: Int) {
+        amount = inputAmt
+        amountTxt.text = String.format("%.02f", inputAmt / 100.0f)
+        payStatusEnable = true
+        presenter.clickToPay(inputAmt)
+        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() {
+    private fun showDialogPay(isFixPay: Boolean) {
         dialogPurchase!!.codePaying = false
-        dialogPurchase!!.isFixPay = false
+        dialogPurchase!!.isFixPay = isFixPay
         dialogPurchase!!.codePayingNoCancelEnable = false
         dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
     }
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 b5aeb03..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
@@ -123,4 +128,10 @@
             codePayService.pay(code!!, amount)
         }
     }
+}
+
+enum class PayMode(val desc: String) {
+    NORMAL("none"),
+    FIXPAY("fixpay"),
+    HOTKEY("hotkey")
 }
\ No newline at end of file
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 cde67f4..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()) {
@@ -487,6 +497,11 @@
                 "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() {
@@ -526,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
@@ -541,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/activities/consumeMode/ConsumeModeActivity.kt b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
index d7f5e32..3daaf82 100644
--- a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
@@ -4,16 +4,24 @@
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.view.KeyEvent
+import android.view.View
+import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.RadioButton
 import android.widget.TextView
 import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
 import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.PayMode
 import com.supwisdom.activities.menu.MenuActivity
 import com.supwisdom.auxscreen.AuxScreenController
+import com.supwisdom.entity.HotKeyPayRecord
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.PublicDef
+import com.supwisdom.view.SWToast
 import java.util.*
+import kotlin.collections.ArrayList
 
 /**
  ** create by zzq on 2019/7/26
@@ -21,19 +29,127 @@
  **/
 class ConsumeModeActivity : BaseActivity() {
     private lateinit var vPayamt: TextView
+    private lateinit var vNormalMode: TextView
+    private lateinit var vFixMode: TextView
+    private lateinit var vHotkeyMode: TextView
+    private lateinit var llHotList: LinearLayout
+    private lateinit var llFixMode: LinearLayout
+    private lateinit var llHotMode: LinearLayout
     private val pos = SPApplication.getInstance().getPos()
     private var keyActive = true
     private var shoppwdPass = false
+    private var hotkey = false
     private var tmpPwd = ""
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         this.setContentView(R.layout.activity_consume_mode)
         initView()
+        initData()
+    }
+
+    private fun initData() {
+        pos.getHotkeyPay()?.forEach {
+            val item = View.inflate(this, R.layout.item_hotkey_pay, null)
+            item.findViewById<TextView>(R.id.tv_hot_del).setOnClickListener {
+                llHotList.removeView(item)
+                for (loop in 0 until llHotList.childCount) {
+                    val item = llHotList.getChildAt(loop)
+                    val key = item.findViewById<TextView>(R.id.tv_hot_key)
+                    key.text = "${(loop + 1)}"
+                }
+            }
+            val key = item.findViewById<TextView>(R.id.tv_hot_key)
+            key.text = "${llHotList.childCount + 1}"
+            val amt = item.findViewById<TextView>(R.id.tv_hot_amount)
+            amt.text = String.format("%.02f", it.amount / 100.0f)
+            llHotList.addView(item)
+        }
     }
 
     private fun initView() {
         vPayamt = findViewById<TextView>(R.id.tv_consume_mode_payamt)
+        llHotList = findViewById<LinearLayout>(R.id.ll_hot_list)
+        this.findViewById<TextView>(R.id.tv_hot_add).setOnClickListener {
+            if (llHotList.childCount >= 9) {
+                return@setOnClickListener
+            }
+            val item = View.inflate(this, R.layout.item_hotkey_pay, null)
+            item.findViewById<TextView>(R.id.tv_hot_del).setOnClickListener {
+                llHotList.removeView(item)
+                for (loop in 0 until llHotList.childCount) {
+                    val item = llHotList.getChildAt(loop)
+                    val key = item.findViewById<TextView>(R.id.tv_hot_key)
+                    key.text = "${(loop + 1)}"
+                }
+            }
+            val key = item.findViewById<TextView>(R.id.tv_hot_key)
+            key.text = "${llHotList.childCount + 1}"
+            llHotList.addView(item)
+        }
+        this.findViewById<TextView>(R.id.tv_hot_save).setOnClickListener {
+            if (llHotList.childCount == 0) {
+                SWToast.show(applicationContext, "请先添加热键", PublicDef.TOAST_SHOW_DOUBT)
+                return@setOnClickListener
+            }
+            val list = ArrayList<HotKeyPayRecord>()
+            for (loop in 0 until llHotList.childCount) {
+                val item = llHotList.getChildAt(loop)
+                val key = item.findViewById<TextView>(R.id.tv_hot_key)
+                val keyboard = key.text.toString()
+                val amt = item.findViewById<EditText>(R.id.tv_hot_amount)
+                val hotamt = CommonUtil.getEditView(amt)
+
+                val record = HotKeyPayRecord()
+                record.key = Integer.parseInt(keyboard)
+                record.amount = CommonUtil.YuanToFen(java.lang.Double.parseDouble(hotamt))
+                list.add(record)
+            }
+            pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.HOTKEY.desc)
+            if (!pos.saveHotkeyPay(list)) {
+                SWToast.show(applicationContext, "保持热键失败", PublicDef.TOAST_SHOW_CRY)
+                return@setOnClickListener
+            }
+            finish()
+        }
+        this.findViewById<TextView>(R.id.tv_return).setOnClickListener {
+            hotkey = false
+            llHotMode.visibility = View.GONE
+            llFixMode.visibility = View.VISIBLE
+            refreshToSetAmount()
+        }
+        vNormalMode = this.findViewById<RadioButton>(R.id.rb_normal_mode)
+        vFixMode = this.findViewById<RadioButton>(R.id.rb_fix_mode)
+        vHotkeyMode = this.findViewById<RadioButton>(R.id.rb_hot_mode)
+
+        llFixMode = this.findViewById<LinearLayout>(R.id.ll_fix_mode)
+        llHotMode = this.findViewById<LinearLayout>(R.id.ll_hot_mode)
+    }
+
+    @SuppressLint("SetTextI18n")
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (!keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+            if (shoppwdPass) {
+                setFixAmount(event.keyCode)
+            } else {
+                checkShopPwd(event.keyCode)
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        shoppwdPass = false
+        hotkey = false
+        keyActive = true
+        llFixMode.visibility = View.VISIBLE
+        llHotMode.visibility = View.GONE
+        refreshToCheckPasswd()
     }
 
     private fun checkShopPwd(keyCode: Int) {
@@ -87,6 +203,10 @@
     }
 
     private fun setFixAmount(keyCode: Int) {
+        if (hotkey) {
+            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+            return
+        }
         when (keyCode) {
             KeyEvent.KEYCODE_0,
             KeyEvent.KEYCODE_1,
@@ -98,44 +218,21 @@
             KeyEvent.KEYCODE_7,
             KeyEvent.KEYCODE_8,
             KeyEvent.KEYCODE_9 -> addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
-            KeyEvent.KEYCODE_DEL ->
-                //cancel
-                delValueToEdit()
-            KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
-                val str = vPayamt.text.toString()
-                if (str.length < 8 && str.indexOf('.') < 0) {
-                    vPayamt.text = "$str."
-                    screenShowAmt()
-                }
-            }
+            KeyEvent.KEYCODE_DEL -> delValueToEdit()
+            KeyEvent.KEYCODE_POUND,
+            KeyEvent.KEYCODE_PERIOD -> addDotToEdit()
             KeyEvent.KEYCODE_ENTER -> {
                 pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, getFixAmount())
                 jumpActivity(MenuActivity::class.java)
             }
-        }
-    }
-
-    @SuppressLint("SetTextI18n")
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (!keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-            if (shoppwdPass) {
-                setFixAmount(event.keyCode)
-            } else {
-                checkShopPwd(event.keyCode)
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //F1
+                hotkey = true
+                llHotMode.visibility = View.VISIBLE
+                llFixMode.visibility = View.GONE
+                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
             }
         }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        shoppwdPass = false
-        keyActive = true
-        refreshToCheckPasswd()
     }
 
     private fun refreshToCheckPasswd() {
@@ -145,11 +242,11 @@
     }
 
     private fun refreshToSetAmount() {
-        val record = pos.getControlPara(PublicDef.CONTROL_FIXAMT)
-        if (record != null && PublicDef.CONTROL_NO_FIXPAY_FLAG != record.paraval) {
-            vPayamt.text = String.format("%.02f", Integer.parseInt(record.paraval) / 100.0f)
-        } else {
-            vPayamt.text = PublicDef.CONTROL_NO_FIXPAY_FLAG
+        vPayamt.text = PayMode.NORMAL.desc
+        pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also {
+            if (PayMode.FIXPAY.desc == it.paraval) {
+                vPayamt.text = String.format("%.02f", Integer.parseInt(it.paraval) / 100.0f)
+            }
         }
         screenShowAmt()
     }
@@ -160,13 +257,12 @@
         } catch (e: Exception) {
             e.printStackTrace()
         }
-
-        return PublicDef.CONTROL_NO_FIXPAY_FLAG
+        return PayMode.NORMAL.desc
     }
 
     private fun addValueToEdit(value: Int) {
         var str = vPayamt.text.toString()
-        if ("0" == str || PublicDef.CONTROL_NO_FIXPAY_FLAG == str) {
+        if ("0" == str || PayMode.NORMAL.desc == str) {
             str = ""
         }
         //如果已经有小数点，则小数点后面不能超过两位
@@ -187,9 +283,9 @@
 
     private fun delValueToEdit() {
         val str = vPayamt.text.toString()
-        if (PublicDef.CONTROL_NO_FIXPAY_FLAG != str) {
+        if (PayMode.NORMAL.desc != str) {
             if (str.length <= 1) {
-                vPayamt.text = PublicDef.CONTROL_NO_FIXPAY_FLAG
+                vPayamt.text = PayMode.NORMAL.desc
             } else {
                 vPayamt.text = str.substring(0, str.length - 1)
             }
@@ -197,15 +293,28 @@
         screenShowAmt()
     }
 
+    private fun addDotToEdit() {
+        val str = vPayamt.text.toString()
+        if (PayMode.NORMAL.desc == str) {
+            vPayamt.text = "0."
+        } else {
+            if (str.length < 8 && str.indexOf('.') < 0) {
+                vPayamt.text = "$str."
+            }
+        }
+        screenShowAmt()
+    }
+
     private fun screenShowAmt() {
+        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-热键模式")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
         AuxScreenController.getInstance().refreshContent(
             Arrays.asList<String>(
-                PublicDef.CONTROL_NO_FIXPAY_FLAG + "-普通消费",
+                PayMode.NORMAL.desc + "-普通消费",
                 "值-定额消费(元)",
                 String.format("金额:%s", vPayamt.text.toString())
             )
         )
-
     }
 
     override fun onDestroy() {
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 f6d0578..77ba654 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
@@ -29,7 +29,7 @@
     private val LOAD_SUCCESS = 1
     private val JUMP_TO_UNREGISTER = 2
     private val LOAD_PROGRESS = 3
-    private val LOAD_DONE = 3
+    private val LOAD_DONE = 4
 
     private var hasInit: Boolean = false
     @Volatile
@@ -96,7 +96,7 @@
 
             try {
                 sendMessage(LOAD_PROGRESS, "加载白名单...")
-                apiInterface.downloadWhitelist(bean.cardverno!!)
+                apiInterface.downloadWhitelist(bean.whitelistid, bean.cardverno!!)
                 sendMessage(LOAD_DONE, "加载白名单成功")
             } catch (ex: Exception) {
                 sendMessage(LOAD_DONE, "加载白名单失败:${ex.message}")
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 cfc459c..681d57d 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
@@ -3,7 +3,9 @@
 import android.os.AsyncTask
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.bean.BaseResp
+import com.supwisdom.exception.WhiteListError
 import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.FileUtil
 import com.supwisdom.utils.PublicDef
 
 /**
@@ -53,16 +55,22 @@
     private inner class ClearWhiteList : AsyncTask<Void, Int, BaseResp>() {
         override fun onPostExecute(resp: BaseResp) {
             if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("黑名单更新成功", "")
+                iManageView.showOperResult("白名单更新成功", "")
             } else {
-                iManageView.showOperResult("黑名单更新失败", resp.retmsg!!)
+                iManageView.showOperResult("白名单更新失败", resp.retmsg!!)
             }
         }
 
         override fun doInBackground(vararg params: Void): BaseResp {
+            if (!pos.clearWhiteList()) {
+                return BaseResp(PublicDef.ERROR, "清空白名单失败")
+            }
+            val dyRecord = pos.getDynamicPara()
+            dyRecord!!.cardverno = "0"
+            pos.replaceDynamicPara(dyRecord)
             return try {
-                EpayApiImpl().downloadWhitelist("0")
-                BaseResp(PublicDef.ERROR, "更新成功")
+                EpayApiImpl().downloadWhitelist(dyRecord.whitelistid, "0")
+                BaseResp(PublicDef.SUCCESS, "更新成功")
             } catch (ex: Exception) {
                 BaseResp(PublicDef.ERROR, ex.message)
             }
@@ -72,13 +80,14 @@
     private inner class OutTransdtl : AsyncTask<Void, Int, BaseResp>() {
         override fun doInBackground(vararg params: Void): BaseResp {
             var num = 0
-//            val bm1List = pos.getTransdtlBM1(null)
-//            if (bm1List != null) {
-//                num += bm1List!!.size
-//                for (i in bm1List!!.indices) {
-//                    FileUtil.writeDtlFile(bm1List!!.get(i).toString())
-//                }
-//            }
+            pos.getTransdtlOnline().forEach {
+                num++
+                FileUtil.writeDtlFile(it.toString())
+            }
+            pos.getTransdtlOffline().forEach {
+                num++
+                FileUtil.writeDtlFile(it.toString())
+            }
             return BaseResp(PublicDef.SUCCESS, "共导出" + num + "笔")
         }
 
diff --git a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
index 6cf2a8e..ec0c647 100644
--- a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
@@ -58,16 +58,17 @@
 //        } else {
 //            kvMap[index++] = ControlParaRecord("长连接使能>>", "启用")
 //        }
-        if (SPApplication.getInstance().isOnline()) {
-            kvMap[index++] = ControlParaRecord("网络状态>>", "联机")
-        } else {
-            kvMap[index++] = ControlParaRecord("网络状态>>", "脱机")
-        }
+//        if (SPApplication.getInstance().isOnline()) {
+//            kvMap[index++] = ControlParaRecord("网络状态>>", "联机")
+//        } else {
+//            kvMap[index++] = ControlParaRecord("网络状态>>", "脱机")
+//        }
         kvMap[index++] = ControlParaRecord("成功显时间>>", "${sysRecord.sucShowtime}s")
         kvMap[index++] = ControlParaRecord("失败显时间>>", "${sysRecord.failShowtime}s")
         kvMap[index++] = ControlParaRecord("联机流水号>>", pos.getTransdtlOnlineMaxSeqno().toString())
         kvMap[index++] = ControlParaRecord("离线流水号>>", pos.getTransdtlOfflineMaxSeqno().toString())
         kvMap[index++] = ControlParaRecord("未上传流水>>", pos.getTransdtlUnconfirmNum().toString())
+        kvMap[index++] = ControlParaRecord("当天离线最大金额>>", String.format("%.02f元", sysRecord.maxDayOfflineAmt / 100.0f))
         kvMap[index++] = ControlParaRecord("定额间隔时间(s)>>", "${sysRecord.fixpayGap}s")
         kvMap[index++] = ControlParaRecord("心跳间隔>>", "${sysRecord.heatBeat}s")
     }
diff --git a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
index 2516bf6..35a0be7 100644
--- a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
@@ -27,6 +27,7 @@
     private var isSearching: Boolean = false
     @Volatile
     private var keyActive = true
+    private var hasdtlFlag = true
     private val MAX_SEARCH_NUM = 19
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -77,6 +78,9 @@
     }
 
     private fun moveNextSeqno() {
+        if (!hasdtlFlag) {
+            return
+        }
         var seqno = getShowSeqno()
         if (seqno > MAX_SEARCH_NUM) {
             return
@@ -107,6 +111,7 @@
 
     override fun onResume() {
         super.onResume()
+        hasdtlFlag = true
         keyActive = true
         refresh()
     }
@@ -114,6 +119,7 @@
     fun showTransdtlResult(record: TransdtlUnionRecord?) {
         isSearching = false
         if (record == null) {
+            hasdtlFlag = false
             vContent.text = "未找到消费记录"
             AuxScreenController.getInstance().refreshContent(
                 Arrays.asList<String>(
@@ -122,6 +128,7 @@
                 )
             )
         } else {
+            hasdtlFlag = true
             val transdatetime = StringBuilder()
             transdatetime.append(record.transdate!!.substring(0, 4)).append("-")
                 .append(record.transdate!!.substring(4, 6)).append("-")
diff --git a/app/src/main/java/com/supwisdom/bean/AuthRetBean.kt b/app/src/main/java/com/supwisdom/bean/AuthRetBean.kt
index b488ac6..560f8fd 100644
--- a/app/src/main/java/com/supwisdom/bean/AuthRetBean.kt
+++ b/app/src/main/java/com/supwisdom/bean/AuthRetBean.kt
@@ -12,5 +12,6 @@
     var offlineseqno: Int = 0
     var paraverno: Int = 0
     var paragroupid: Int = 0
+    var whitelistid: Int = 0
     var cardverno: String? = null
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/bean/HeartBeatRetBean.kt b/app/src/main/java/com/supwisdom/bean/HeartBeatRetBean.kt
index 2c68992..da5a8f2 100644
--- a/app/src/main/java/com/supwisdom/bean/HeartBeatRetBean.kt
+++ b/app/src/main/java/com/supwisdom/bean/HeartBeatRetBean.kt
@@ -9,4 +9,5 @@
     var paragroupid: Int = 0
     var paraverno: Int = 0
     var cardverno: String? = null
+    var whitelistid: Int = 0
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index a89d80e..1c90e59 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -11,6 +11,7 @@
         heatBeat,
         offlineEnable,
         maxOfflineDays,
+        maxDayOfflineAmt,
         mngpasswd,
         fixpayGap,
         consumeShowtime,
@@ -41,6 +42,7 @@
         offlineseqno,
         paraverno,
         paragroupid,
+        whitelistid,
         cardverno,
         jwt,
         jwtexpire,
@@ -107,4 +109,9 @@
         status,
         upflag
     }
+
+    enum class HotkeyPay {
+        key,
+        amount
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
index 3617287..4862731 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -19,6 +19,7 @@
         val TABLE_NAME_DYNAMICPARA = "tb_dynamicpara"
         val TABLE_NAME_CONTROLPARA = "tb_controlpara"
         val TABLE_NAME_WHITELIST = "tb_whitelist"
+        val TABLE_NAME_HOTKEY = "tb_hotkey"
 
         private var instance: DBParaHelper? = null
         fun getInstance(context: Context): DBParaHelper {
@@ -37,6 +38,10 @@
     /**
      * SQL for create table
      */
+    private val CREATE_TABLE_NAME_HOTKEY = ("create table IF NOT EXISTS "
+            + TABLE_NAME_HOTKEY + " ( "
+            + BeanPropEnum.HotkeyPay.key + " integer primary key,"
+            + BeanPropEnum.HotkeyPay.amount + " integer)")
     private val CREATE_TABLE_NAME_WHITELIST = ("create table IF NOT EXISTS "
             + TABLE_NAME_WHITELIST + " ( "
             + BeanPropEnum.WhiteList.cardphyid + " varchar(32),"
@@ -62,6 +67,7 @@
             + BeanPropEnum.DynamicPara.offlineseqno + " integer, "
             + BeanPropEnum.DynamicPara.paraverno + " integer, "
             + BeanPropEnum.DynamicPara.paragroupid + " integer, "
+            + BeanPropEnum.DynamicPara.whitelistid + " integer, "
             + BeanPropEnum.DynamicPara.cardverno + " varchar(32),"
             + BeanPropEnum.DynamicPara.jwt + " varchar(254),"
             + BeanPropEnum.DynamicPara.jwtexpire + " varchar(16),"
@@ -74,6 +80,7 @@
             + BeanPropEnum.Syspara.heatBeat + " integer, "
             + BeanPropEnum.Syspara.offlineEnable + " integer, "
             + BeanPropEnum.Syspara.maxOfflineDays + " integer, "
+            + BeanPropEnum.Syspara.maxDayOfflineAmt + " integer, "
             + BeanPropEnum.Syspara.mngpasswd + " char(6), "
             + BeanPropEnum.Syspara.fixpayGap + " integer, "
             + BeanPropEnum.Syspara.consumeShowtime + " integer, "
@@ -91,10 +98,14 @@
         db.execSQL(CREATE_TABLE_NAME_DYNAMICPARA)
         db.execSQL(CREATE_TABLE_NAME_CONTROLPARA)
         db.execSQL(CREATE_TABLE_NAME_WHITELIST)
+        db.execSQL(CREATE_TABLE_NAME_HOTKEY)
     }
 
     override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
         if (oldVersion < newVersion) {
+            if (oldVersion < 2 && newVersion >= 2) {
+//                db.execSQL("alter table $TABLE_NAME_SYSPARA add column ${BeanPropEnum.Syspara.maxDayOfflineAmt} integer")
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
index 5c6b0fb..a0fc815 100644
--- a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
@@ -91,6 +91,7 @@
         record.offlineseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.offlineseqno.toString()))
         record.paraverno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paraverno.toString()))
         record.paragroupid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paragroupid.toString()))
+        record.whitelistid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.whitelistid.toString()))
         record.cardverno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.cardverno.toString()))
         record.jwt = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwt.toString()))
         record.jwtExpire = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwtexpire.toString()))
@@ -110,6 +111,7 @@
         values.put(BeanPropEnum.DynamicPara.offlineseqno.toString(), record.offlineseqno)
         values.put(BeanPropEnum.DynamicPara.paraverno.toString(), record.paraverno)
         values.put(BeanPropEnum.DynamicPara.paragroupid.toString(), record.paragroupid)
+        values.put(BeanPropEnum.DynamicPara.whitelistid.toString(), record.whitelistid)
         values.put(BeanPropEnum.DynamicPara.cardverno.toString(), record.cardverno)
         values.put(BeanPropEnum.DynamicPara.jwt.toString(), record.jwt)
         values.put(BeanPropEnum.DynamicPara.token.toString(), record.token)
diff --git a/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt b/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt
new file mode 100644
index 0000000..3826967
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt
@@ -0,0 +1,98 @@
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.HotKeyPayRecord
+import java.util.concurrent.locks.Lock
+
+/**
+ ** create by zzq on 2019/9/4
+ ** @desc
+ **/
+class HotkeyPayDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_HOTKEY
+
+    fun getLock(): Lock {
+        return dbHelper.getLock()
+    }
+
+    fun replace(record: HotKeyPayRecord): Boolean {
+        val db = dbHelper.readableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun save(list: List<HotKeyPayRecord>): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            list.forEach {
+                val values = getContentValues(it)
+                if (db.insert(TABLE, null, values) <= 0) {
+                    return false
+                }
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun get(): List<HotKeyPayRecord>? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, null)
+            val list = ArrayList<HotKeyPayRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun clear(): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): HotKeyPayRecord {
+        val record = HotKeyPayRecord()
+        record.key = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.HotkeyPay.key.toString()))
+        record.amount = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.HotkeyPay.amount.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: HotKeyPayRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.HotkeyPay.key.toString(), record.key)
+        values.put(BeanPropEnum.HotkeyPay.amount.toString(), record.amount)
+        return values
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/Pos.kt b/app/src/main/java/com/supwisdom/db/Pos.kt
index 0f36600..00ae522 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -17,6 +17,7 @@
     private var sysRecord: SysParaRecord? = null
     private val controlParaDao = ControlParaDao(context)
     private val whiteListDao = WhiteListDao(context)
+    private val hotkeyPayDao = HotkeyPayDao(context)
     private val transdtlOnlineDao = TransdtlOnlineDao(sdContext)
     private val transdtlOfflineDao = TransdtlOfflineDao(sdContext)
     private val transdtlUnionDao = TransdtlUnionDao(sdContext)
@@ -54,6 +55,24 @@
         return cfgRecord
     }
 
+    fun saveHotkeyPay(list: List<HotKeyPayRecord>): Boolean {
+        try {
+            hotkeyPayDao.getLock().lock()
+            return hotkeyPayDao.save(list)
+        } finally {
+            hotkeyPayDao.getLock().unlock()
+        }
+    }
+
+    fun getHotkeyPay(): List<HotKeyPayRecord>? {
+        try {
+            hotkeyPayDao.getLock().lock()
+            return hotkeyPayDao.get()
+        } finally {
+            hotkeyPayDao.getLock().unlock()
+        }
+    }
+
     fun replaceControlPara(record: ControlParaRecord): Boolean {
         try {
             controlParaDao.getLock().lock()
@@ -149,6 +168,15 @@
         }
     }
 
+    fun clearWhiteList(): Boolean {
+        try {
+            whiteListDao.getLock().lock()
+            return whiteListDao.clear()
+        } finally {
+            whiteListDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOnlineMaxSeqno(): Int {
         if (onlMaxSeqno == 0) {
             try {
@@ -170,6 +198,15 @@
         }
     }
 
+    fun getTransdtlOnline(): List<TransdtlOnlineRecord> {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getAll()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
         try {
             transdtlOnlineDao.getLock().lock()
@@ -248,6 +285,24 @@
         }
     }
 
+    fun getTransdtlOffline(): List<TransdtlOfflineRecord> {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getAll()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getOfflineAmt(date, cardno, cardphyid)
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOfflineLast(): TransdtlOfflineRecord? {
         try {
             transdtlOfflineDao.getLock().lock()
diff --git a/app/src/main/java/com/supwisdom/db/SysParaDao.kt b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
index 14872aa..50de288 100644
--- a/app/src/main/java/com/supwisdom/db/SysParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
@@ -47,7 +47,6 @@
         } finally {
             db.endTransaction()
         }
-        return false
     }
 
     fun get(): SysParaRecord? {
@@ -88,6 +87,7 @@
         val enable = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.offlineEnable.toString()))
         record.offlineEnable = enable == 1
         record.maxOfflineDays = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxOfflineDays.toString()))
+        record.maxDayOfflineAmt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxDayOfflineAmt.toString()))
         record.mngPasswd = cursor.getString(cursor.getColumnIndex(BeanPropEnum.Syspara.mngpasswd.toString()))
         record.fixpayGap = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.fixpayGap.toString()))
         record.sucShowtime = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeShowtime.toString()))
@@ -108,6 +108,7 @@
             values.put(BeanPropEnum.Syspara.offlineEnable.toString(), 0)
         }
         values.put(BeanPropEnum.Syspara.maxOfflineDays.toString(), record.maxOfflineDays)
+        values.put(BeanPropEnum.Syspara.maxDayOfflineAmt.toString(), record.maxDayOfflineAmt)
         values.put(BeanPropEnum.Syspara.mngpasswd.toString(), record.mngPasswd)
         values.put(BeanPropEnum.Syspara.fixpayGap.toString(), record.fixpayGap)
         values.put(BeanPropEnum.Syspara.consumeShowtime.toString(), record.sucShowtime)
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
index fb9d0c0..8669aa8 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -56,6 +56,61 @@
         return false
     }
 
+    fun getAll(): List<TransdtlOfflineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderby = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderby)
+            val list = ArrayList<TransdtlOfflineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        var sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
+                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
+                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
+                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
+                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "='" + ReversalFlag.NONE.toString() + "' and "
+                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
+        var sumamt = 0
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                sumamt = cursor.getInt(cursor.getColumnIndex("sumamt"))
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
+                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
+                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
+                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
+                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "<>'" + ReversalFlag.NONE.toString() + "' and "
+                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                val reverse = cursor.getInt(cursor.getColumnIndex("sumamt"))
+                if (sumamt > reverse) {
+                    return (sumamt - reverse)
+                }
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
     fun getUnconfirm(): List<TransdtlOfflineRecord> {
         val db = dbHelper.readableDatabase
         var cursor: Cursor? = null
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index 78a4328..0a76b2b 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -56,6 +56,22 @@
         return false
     }
 
+    fun getAll(): List<TransdtlOnlineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderby = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderby)
+            val list = ArrayList<TransdtlOnlineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
     fun getUnconfirm(): List<TransdtlOnlineRecord> {
         val db = dbHelper.readableDatabase
         var cursor: Cursor? = null
diff --git a/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt b/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
index bee1dbe..9780e62 100644
--- a/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
@@ -12,6 +12,7 @@
     var shopname: String? = null //商户名
     var paraverno: Int = 0//参数版本
     var paragroupid: Int = 0//参数组id
+    var whitelistid: Int = 0 //白名单组id
     var onlineseqno: Int = 0 //后台最大联机流水号
     var offlineseqno: Int = 0 //后台最大离线流水号
     var cardverno: String? = null // 黑名单版本号 12byte
diff --git a/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt b/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
new file mode 100644
index 0000000..4d8bb24
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/9/5
+ ** @desc
+ **/
+class HotKeyPayRecord {
+    var key: Int = 0
+    var amount: Int = 0
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
index 65e1640..8829b75 100644
--- a/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
@@ -9,6 +9,7 @@
     var heatBeat: Int = 0// 心跳间隔
     var offlineEnable: Boolean = false // 脱机消费时限开关  false-关闭， true-开启
     var maxOfflineDays: Int = 0// 最大脱机天数
+    var maxDayOfflineAmt: Int = 0//同卡当天离线交易最大金额
     var mngPasswd: String? = null// 维护密码
     var sucShowtime: Int = 0// 消费成功显示时间
     var failShowtime: Int = 0 //消费失败显示时间
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
index 347d10a..a471c8f 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
@@ -27,4 +27,16 @@
         val tmp = GsonUtil.GsonString(this)
         return GsonUtil.GsonToBean(tmp, TransdtlOfflineRecord::class.java)
     }
+
+    override fun toString(): String {
+        val sb = StringBuilder()
+        sb.append("离线流水:").append("devphyid=").append(devphyid).append(",transdate=").append(transdate)
+            .append(",transtime=").append(transtime).append(",seqno=").append(devseqno).append(",cardno=")
+            .append(cardno).append(",payamt=").append(payamt).append(",extraamt=").append(extraamt)
+            .append(",managefeetype=").append(managefeetype).append(",reversalflag=").append(reversalflag)
+            .append(",reversalseqno=").append(reversalseqno).append(",reversaltransdate=").append(reversaltransdate)
+            .append(",reversaltranstime=").append(reversaltranstime).append(",status=").append(status)
+            .append(",upflag=").append(upflag)
+        return sb.toString()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
index 584e629..841ca3a 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -29,4 +29,16 @@
         val tmp = GsonUtil.GsonString(this)
         return GsonUtil.GsonToBean(tmp, TransdtlOnlineRecord::class.java)
     }
+
+    override fun toString(): String {
+        val sb = StringBuilder()
+        sb.append("联机流水:").append("devphyid=").append(devphyid).append(",transdate=").append(transdate)
+            .append(",transtime=").append(transtime).append(",seqno=").append(devseqno).append(",cardno=")
+            .append(cardno).append(",code=").append(qrcode).append(",transtype=").append(transtype)
+            .append(",payamt=").append(payamt).append(",extraamt=").append(extraamt).append(",managefeetype")
+            .append(managefeetype).append(",username=").append(username).append(",billno=").append(billno)
+            .append(",reversalflag=").append(reversalflag).append(",reversalbillno=").append(reversalbillno)
+            .append(",status=").append(status).append(",upflag=").append(upflag)
+        return sb.toString()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/APIInterface.kt b/app/src/main/java/com/supwisdom/service/APIInterface.kt
index b24df22..4c970a2 100644
--- a/app/src/main/java/com/supwisdom/service/APIInterface.kt
+++ b/app/src/main/java/com/supwisdom/service/APIInterface.kt
@@ -14,7 +14,7 @@
 
     fun downloadSyspara(paragroupid: Int, paraverno: Int)
 
-    fun downloadWhitelist(maxCardverno: String)
+    fun downloadWhitelist(whitelistid: Int, maxCardverno: String)
 
     fun uploadTransdtl(record: TransdtlOnlineRecord)
 
diff --git a/app/src/main/java/com/supwisdom/service/AuthEpay.kt b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
index 8c28078..6fe9a3e 100644
--- a/app/src/main/java/com/supwisdom/service/AuthEpay.kt
+++ b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
@@ -87,7 +87,7 @@
             .append("/").append(record.epayUri)
             .append("/api/auth/authentication/").append(record.devphyid).append("?")
 
-        val secret = CryptUtil.HMACSHA256(pos.getDynamicPara()!!.appsecret!!, token)
+        val secret = CryptUtil.HMACSHA256(token, pos.getDynamicPara()!!.appsecret!!)
         val params = WebParams()
         params.setParameter("appid", pos.getDynamicPara()!!.appid)
             .setParameter("secret", secret)
diff --git a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
index 0cdffea..8b359b0 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -48,13 +48,6 @@
         if (retBean.retcode != PublicDef.SUCCESS) {
             throw HeartBeatError(retBean.getErrorMsg())
         }
-        if (cardverno < retBean.cardverno!!) {
-            try {
-                downloadWhitelist(retBean.cardverno!!)
-            } catch (ex: WhiteListError) {
-                throw HeartBeatError(ex.message ?: "null")
-            }
-        }
         if (dyRecord.paraverno != retBean.paraverno) {
             try {
                 downloadSyspara(retBean.paragroupid, retBean.paraverno)
@@ -62,6 +55,15 @@
                 throw HeartBeatError(ex.message ?: "null")
             }
         }
+        if (dyRecord.whitelistid != retBean.whitelistid ||
+            cardverno < retBean.cardverno!!
+        ) {
+            try {
+                downloadWhitelist(retBean.whitelistid, retBean.cardverno!!)
+            } catch (ex: WhiteListError) {
+                throw HeartBeatError(ex.message ?: "null")
+            }
+        }
         /**
          * 时钟校准
          */
@@ -105,6 +107,7 @@
                 it.paraname == "manage_passwd" -> record.mngPasswd = it.paraval
                 it.paraname == "offline_flag" -> record.offlineEnable = it.paraval == "1"
                 it.paraname == "max_offline_days" -> record.maxOfflineDays = it.paraval!!.toInt()
+                it.paraname == "max_day_offline_amt" -> record.maxDayOfflineAmt = it.paraval!!.toInt()
                 it.paraname == "communicate_time" -> record.commTime = it.paraval!!.toInt()
             }
         }
@@ -120,13 +123,36 @@
         if (record.commTime == 0) {
             record.commTime = 3
         }
+        if (record.maxDayOfflineAmt == 0) {
+            record.maxDayOfflineAmt = 10000
+        }
         if (!pos.replaceSysPara(record)) {
             throw SysParaError("保存参数失败")
         }
+        val dyRecord = pos.getDynamicPara()
+        dyRecord!!.paraverno = paraverno
+        dyRecord.paragroupid = paragroupid
+        if (!pos.replaceDynamicPara(dyRecord)) {
+            throw SysParaError("保存参数失败")
+        }
     }
 
     @Throws(WhiteListError::class)
-    override fun downloadWhitelist(maxCardverno: String) {
+    override fun downloadWhitelist(whitelistid: Int, maxCardverno: String) {
+        var dyRecord = pos.getDynamicPara()
+        /**
+         * 白名单组ID变化清空本地白名单重新下载
+         */
+        if (dyRecord!!.whitelistid != whitelistid) {
+            if (!pos.clearWhiteList()) {
+                throw WhiteListError("清空白名单失败")
+            }
+            dyRecord.cardverno = "0"
+            dyRecord.whitelistid = whitelistid
+            if (!pos.replaceDynamicPara(dyRecord)) {
+                throw WhiteListError("保存参数失败")
+            }
+        }
         val maxcount = 20
         do {
             val params = WebParams()
@@ -161,7 +187,7 @@
             if (!pos.saveWhiteList(list)) {
                 throw WhiteListError("保存白名单失败")
             }
-            val dyRecord = pos.getDynamicPara()
+            dyRecord = pos.getDynamicPara()
             dyRecord!!.cardverno = retBean.cardverno
             if (!pos.replaceDynamicPara(dyRecord)) {
                 throw WhiteListError("保存参数失败")
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index b7c482f..140f9a8 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -76,10 +76,7 @@
     const val CONTROL_FIXAMT = "fixamt"
     const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
     const val CONTROL_DEBUG_ENABLE = "debugenable"
-    /**
-     * 非定额消费标识
-     */
-    const val CONTROL_NO_FIXPAY_FLAG = "none"
+
     /**
      * 消费冲正时限
      */
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))
diff --git a/app/src/main/res/drawable/corner_bg_blue.xml b/app/src/main/res/drawable/corner_bg_blue.xml
new file mode 100644
index 0000000..8619a1d
--- /dev/null
+++ b/app/src/main/res/drawable/corner_bg_blue.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/light_blue2" />
+    <corners android:radius="8dip" />
+    <stroke
+            android:width="1.0dip"
+            android:color="@color/light_blue2" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_consume_mode.xml b/app/src/main/res/layout/activity_consume_mode.xml
index 99e494f..653add6 100644
--- a/app/src/main/res/layout/activity_consume_mode.xml
+++ b/app/src/main/res/layout/activity_consume_mode.xml
@@ -1,44 +1,127 @@
 <?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="消费模式" />
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:padding="10dp"
-            android:text="0-普通消费\n非0定额消费\n单位(分)"
-            android:textColor="@color/light_blue2"
-            android:textSize="20sp" />
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="horizontal">
-
-            <TextView
-                android:layout_width="wrap_content"
+                style="@style/head_title_text_style"
+                android:text="消费模式"/>
+        <RadioGroup
+                android:visibility="gone"
                 android:layout_height="wrap_content"
-                android:padding="10dp"
-                android:text="金额: "
-                android:textColor="@color/light_blue2"
-                android:textSize="30sp" />
-
-            <TextView
-                android:id="@+id/tv_consume_mode_payamt"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:maxLength="6"
+                android:orientation="vertical">
+            <RadioButton
+                    android:id="@+id/rb_normal_mode"
+                    android:text="普通消费"
+                    style="@style/consume_mode_rb_style"
+                    android:checked="true"/>
+            <RadioButton
+                    android:id="@+id/rb_fix_mode"
+                    android:text="定额消费"
+                    style="@style/consume_mode_rb_style"/>
+            <RadioButton
+                    android:id="@+id/rb_hot_mode"
+                    android:text="快捷消费"
+                    style="@style/consume_mode_rb_style"/>
+        </RadioGroup>
+        <LinearLayout
+                android:id="@+id/ll_fix_mode"
+                android:visibility="gone"
+                android:orientation="vertical"
                 android:padding="10dp"
-                android:text="0"
-                android:textColor="@color/light_blue2"
-                android:textSize="30sp" />
-        </LinearLayout>
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+            <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="普通消费(none)"
+                    android:textColor="@color/light_blue2"
+                    android:textSize="20sp"/>
+            <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="定额消费(单位:元)"
+                    android:textColor="@color/light_blue2"
+                    android:textSize="20sp"/>
 
+            <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal">
+
+                <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="金额: "
+                        android:textColor="@color/light_blue2"
+                        android:textSize="30sp"/>
+
+                <TextView
+                        android:id="@+id/tv_consume_mode_payamt"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:maxLength="8"
+                        android:text="0"
+                        android:textColor="@color/light_blue2"
+                        android:textSize="30sp"/>
+            </LinearLayout>
+        </LinearLayout>
+        <LinearLayout
+                android:id="@+id/ll_hot_mode"
+                android:orientation="vertical"
+                android:padding="10dp"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+            <LinearLayout
+                    android:orientation="horizontal"
+                    android:gravity="center"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                <TextView
+                        android:id="@+id/tv_return"
+                        android:textSize="25sp"
+                        android:text="返回"
+                        android:background="@drawable/corner_bg_blue"
+                        android:padding="10dp"
+                        android:textColor="@color/white"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                <TextView
+                        android:id="@+id/tv_hot_save"
+                        android:textSize="25sp"
+                        android:layout_marginLeft="50dp"
+                        android:text="保存"
+                        android:background="@drawable/corner_bg_blue"
+                        android:padding="10dp"
+                        android:textColor="@color/white"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+                <TextView
+                        android:id="@+id/tv_hot_add"
+                        android:textSize="25sp"
+                        android:text="添加"
+                        android:layout_marginLeft="50dp"
+                        android:background="@drawable/corner_bg_blue"
+                        android:padding="10dp"
+                        android:textColor="@color/white"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+            </LinearLayout>
+            <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="快捷消费(单位:元)"
+                    android:layout_marginTop="10dp"
+                    android:textColor="@color/light_blue2"
+                    android:textSize="20sp"/>
+            <LinearLayout
+                    android:id="@+id/ll_hot_list"
+                    android:layout_width="match_parent"
+                    android:orientation="vertical"
+                    android:layout_height="match_parent"/>
+
+        </LinearLayout>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_hotkey_pay.xml b/app/src/main/res/layout/item_hotkey_pay.xml
new file mode 100644
index 0000000..060a897
--- /dev/null
+++ b/app/src/main/res/layout/item_hotkey_pay.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="horizontal"
+              android:background="@color/white"
+              android:layout_width="match_parent"
+              android:weightSum="5"
+              android:padding="5dp"
+              android:layout_marginTop="10dp"
+              android:layout_height="match_parent">
+    <TextView
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="快捷键: "
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <TextView
+            android:id="@+id/tv_hot_key"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="1"
+            android:textColor="@color/cl_red"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_hot_amount"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:inputType="numberDecimal"
+            android:layout_weight="2"
+            android:maxLines="1"
+            android:text="0"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <TextView
+            android:id="@+id/tv_hot_del"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="删除"
+            android:layout_marginLeft="10dp"
+            android:gravity="center"
+            android:padding="10dp"
+            android:background="@drawable/corner_bg_blue"
+            android:textColor="@color/white"
+            android:textSize="25sp"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 123c964..d85e0af 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -426,7 +426,12 @@
         <item name="android:textColor">@color/black</item>
         <item name="android:gravity">center</item>
     </style>
-
+    <style name="consume_mode_rb_style">
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:textSize">25sp</item>
+        <item name="android:textColor">@color/light_blue2</item>
+    </style>
     <style name="consume_pay_way_text_style">
         <item name="android:layout_height">wrap_content</item>
         <item name="android:layout_width">match_parent</item>
diff --git a/platform.pk8 b/platform.pk8
new file mode 100644
index 0000000..e27a393
--- /dev/null
+++ b/platform.pk8
Binary files differ
diff --git a/platform.x509.pem b/platform.x509.pem
new file mode 100644
index 0000000..087f02e
--- /dev/null
+++ b/platform.x509.pem
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEqDCCA5CgAwIBAgIJALOZgIbQVs/6MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD
+VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
+VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
+AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+Fw0wODA0MTUyMjQwNTBaFw0zNTA5MDEyMjQwNTBaMIGUMQswCQYDVQQGEwJVUzET
+MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
+A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
+ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+hvcNAQEBBQADggENADCCAQgCggEBAJx4BZKsDV04HN6qZezIpgBuNkgMbXIHsSAR
+vlCGOqvitV0Amt9xRtbyICKAx81Ne9smJDuKgGwms0sTdSOkkmgiSQTcAUk+fArP
+GgXIdPabA3tgMJ2QdNJCgOFrrSqHNDYZUer3KkgtCbIEsYdeEqyYwap3PWgAuer9
+5W1Yvtjo2hb5o2AJnDeoNKbf7be2tEoEngeiafzPLFSW8s821k35CjuNjzSjuqtM
+9TNxqydxmzulh1StDFP8FOHbRdUeI0+76TybpO35zlQmE1DsU1YHv2mi/0qgfbX3
+6iANCabBtJ4hQC+J7RGQiTqrWpGA8VLoL4WkV1PPX8GQccXuyCcCAQOjgfwwgfkw
+HQYDVR0OBBYEFE/koLPdnLop9x1yh8Tnw48ghsKZMIHJBgNVHSMEgcEwgb6AFE/k
+oLPdnLop9x1yh8Tnw48ghsKZoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
+CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
+QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
+CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJALOZgIbQVs/6MAwGA1Ud
+EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBAFclUbjZOh9z3g9tRp+G2tZwFAAp
+PIigzXzXeLc9r8wZf6t25iEuVsHHYc/EL9cz3lLFCuCIFM78CjtaGkNGBU2Cnx2C
+tCsgSL+ItdFJKe+F9g7dEtctVWV+IuPoXQTIMdYT0Zk4u4mCJH+jISVroS0dao+S
+6h2xw3Mxe6DAN/DRr/ZFrvIkl5+6bnoUvAJccbmBOM7z3fwFlhfPJIRc97QNY4L3
+J17XOElatuWTG5QhdlxJG3L7aOCA29tYwgKdNHyLMozkPvaosVUz7fvpib1qSN1L
+IC7alMarjdW4OZID2q4u1EYjLk/pvZYTlMYwDlE448/Shebk5INTjLixs1c=
+-----END CERTIFICATE-----
diff --git a/signapk.jar b/signapk.jar
new file mode 100644
index 0000000..4951807
--- /dev/null
+++ b/signapk.jar
Binary files differ
diff --git a/upgrade.py b/upgrade.py
index 6a2ec3c..957fed9 100644
--- a/upgrade.py
+++ b/upgrade.py
@@ -37,7 +37,10 @@
 	zf.close()
 
 if __name__ == '__main__':
-	appFile = './app/release/app-release.apk'
+	if len(sys.argv) < 2:
+		print('miss parameter:app path!!!')
+		exit(1)
+	appFile = sys.argv[1]
 	print('appFile = ' + appFile)
 	
 	if not path.exists(appFile):
