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 3a336af..e945e80 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -20,6 +20,7 @@
 import com.supwisdom.activities.transdtl.TransdtlActivity
 import com.supwisdom.auxscreen.AuxScreenController
 import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.PeriodFixPayRecord
 import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlUnionRecord
 import com.supwisdom.utils.CommonUtil
@@ -55,6 +56,7 @@
     private lateinit var vLastPayFailreason: TextView
     private lateinit var vLastPayFailll: LinearLayout
     private lateinit var vLastPayamtll: LinearLayout
+    private val pos = SPApplication.getInstance().getPos()
     private var beepManager: BeepManager? = null
     private val scanLock = ReentrantLock()
     @Volatile
@@ -73,6 +75,8 @@
     private var counter: LastPayShowTimer? = null
     private var lastPayInfo: CardUserInfoBean? = null
     private var dialogPurchase: DialogPurchase? = null
+    private var periodFixPayList: List<PeriodFixPayRecord>? = null
+    private var periodFixPayEnable = false
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -316,22 +320,23 @@
 
     private var lastshowtime: String? = null
     override fun clearUserInfo(datetime: String) {
-        if (!isBackRunning) {
-            vCitizenName.text = null
-            vCitizenCardno.text = null
-            vCardstatus.text = null
-            val tmptime = datetime.substring(0, 16)
-            if (lastshowtime != tmptime) {
-                lastshowtime = tmptime
-                vTime.text = tmptime
-                AuxScreenController.getInstance().refreshBottom(tmptime)
+        vCitizenName.text = null
+        vCitizenCardno.text = null
+        vCardstatus.text = null
+        val tmptime = datetime.substring(0, 16)
+        if (lastshowtime != tmptime) {
+            lastshowtime = tmptime
+            vTime.text = tmptime
+            AuxScreenController.getInstance().refreshBottom(tmptime)
+            if (periodFixPayEnable) {
+                parsePeriodFixPay()
             }
-            if (dialogPurchase!!.isShowing &&
-                !dialogPurchase!!.isFixPay &&
-                payStatusEnable
-            ) {
-                beepManager!!.playBeepSoundAndVibrate()
-            }
+        }
+        if (dialogPurchase!!.isShowing &&
+            !dialogPurchase!!.isFixPay &&
+            payStatusEnable
+        ) {
+            beepManager!!.playBeepSoundAndVibrate()
         }
     }
 
@@ -366,7 +371,7 @@
     private fun refresh() {
         addAmount = 0
         amountTxt.text = "0"
-        var shopname = SPApplication.getInstance().getPos().getDynamicPara()!!.shopname
+        var shopname = pos.getDynamicPara()!!.shopname
         if (shopname == null || shopname.length < 9) {
             vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_normal)
         } else {
@@ -382,28 +387,31 @@
         AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime().substring(0, 16))
         AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
 
-        SPApplication.getInstance().getPos().getControlPara(PublicDef.CONTROL_FIXAMT)?.also { mode ->
+        periodFixPayEnable = false
+        pos.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 {
+                    pos.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.PERIODFIX.desc -> {
+                    periodFixPayEnable = true
+                    periodFixPayList = pos.getPeriodFixPay()
+                    parsePeriodFixPay()
+                }
                 mode.paraval == PayMode.NORMAL.desc -> {
-                    presenter.setFixMode(false)
-                    payMode = PayMode.NORMAL
+                    doNormalPay()
                 }
                 else -> {
-                    presenter.setFixMode(true)
-                    payMode = PayMode.FIXPAY
                     try {
-                        checkAmtToPay(Integer.parseInt(mode.paraval))
+                        doFixPay(Integer.parseInt(mode.paraval))
                     } catch (ex: Exception) {
                         ex.printStackTrace()
                     }
@@ -412,6 +420,33 @@
         }
     }
 
+    private fun parsePeriodFixPay() {
+        val nowtime = DateUtil.getNowTimeNoFormat().substring(0, 4)
+        periodFixPayList?.forEach {
+            if (it.beginTime!! <= nowtime && nowtime < it.endTime!!) {
+                if (payMode != PayMode.FIXPAY) {
+                    doFixPay(it.amount)
+                }
+                return
+            }
+        }
+        if (payMode != PayMode.NORMAL) {
+            doNormalPay()
+        }
+    }
+
+    private fun doFixPay(fixamt: Int) {
+        presenter.setFixMode(true)
+        payMode = PayMode.FIXPAY
+        checkAmtToPay(fixamt)
+    }
+
+    private fun doNormalPay() {
+		amount = 0
+        presenter.setFixMode(false)
+        payMode = PayMode.NORMAL
+    }
+
     override fun refreshLinkStatus(isOnline: Boolean) {
         if (isOnline) {
             vLinkLogo.setImageDrawable(getDrawable(R.drawable.wireless_on))
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 4c8340c..4be4346 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
@@ -137,5 +137,6 @@
 enum class PayMode(val desc: String) {
     NORMAL("none"),
     FIXPAY("fixpay"),
-    HOTKEY("hotkey")
+    HOTKEY("hotkey"),
+    PERIODFIX("periodfix")
 }
\ 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 5266df9..11f8580 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
@@ -113,6 +113,7 @@
                         readCard()
                         cardBean!!.cardphyid = cardphyid
                         oldcardphyid = cardphyid
+                        operation = true
                     }
                     when (clickStat) {
                         ClickStat.PAY -> {
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 3daaf82..eaf5482 100644
--- a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
@@ -3,12 +3,10 @@
 import android.annotation.SuppressLint
 import android.os.Bundle
 import android.os.CountDownTimer
+import android.text.TextUtils
 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 android.widget.*
 import com.supwisdom.R
 import com.supwisdom.activities.BaseActivity
 import com.supwisdom.activities.SPApplication
@@ -16,6 +14,7 @@
 import com.supwisdom.activities.menu.MenuActivity
 import com.supwisdom.auxscreen.AuxScreenController
 import com.supwisdom.entity.HotKeyPayRecord
+import com.supwisdom.entity.PeriodFixPayRecord
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.PublicDef
@@ -29,17 +28,20 @@
  **/
 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 vSpecialDesc: TextView
+    private lateinit var rbHotkeyMode: RadioButton
+    private lateinit var rbPeriodMode: RadioButton
+    private lateinit var rgSpecialMode: RadioGroup
+    private lateinit var llSpecialList: LinearLayout
     private lateinit var llFixMode: LinearLayout
-    private lateinit var llHotMode: LinearLayout
+    private lateinit var llSpecialMode: LinearLayout
     private val pos = SPApplication.getInstance().getPos()
     private var keyActive = true
     private var shoppwdPass = false
-    private var hotkey = false
+    private var specialMode = false
     private var tmpPwd = ""
+    private var configMode = ConfigMode.NORMAL_FIX
+
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -49,83 +51,183 @@
     }
 
     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)
+        llSpecialList = findViewById<LinearLayout>(R.id.ll_special_list)
         this.findViewById<TextView>(R.id.tv_hot_add).setOnClickListener {
-            if (llHotList.childCount >= 9) {
+            if (llSpecialList.childCount >= 9) {
                 return@setOnClickListener
             }
+            if (configMode == ConfigMode.PERIOD_FIX) {
+                addPeriodFixRule()
+            } else {
+                addHotkeyRule()
+            }
+        }
+        this.findViewById<TextView>(R.id.tv_hot_save).setOnClickListener {
+            if (llSpecialList.childCount == 0) {
+                SWToast.show(applicationContext, "请先添加规则", PublicDef.TOAST_SHOW_DOUBT)
+                return@setOnClickListener
+            }
+            if (configMode == ConfigMode.PERIOD_FIX) {
+                if (!savePeriodFixRule()) {
+                    return@setOnClickListener
+                }
+            } else {
+                if (!saveHotkeyRule()) {
+                    return@setOnClickListener
+                }
+            }
+            finish()
+        }
+        this.findViewById<TextView>(R.id.tv_return).setOnClickListener {
+            showCurrentMode(ConfigMode.NORMAL_FIX)
+            refreshToSetAmount()
+        }
+        rgSpecialMode = this.findViewById<RadioGroup>(R.id.rg_special_mode)
+        rgSpecialMode.setOnCheckedChangeListener { _, checkedId ->
+            when (checkedId) {
+                R.id.rb_hot_mode -> showCurrentMode(ConfigMode.HOT_KEY)
+                R.id.rb_period_fix_mode -> showCurrentMode(ConfigMode.PERIOD_FIX)
+            }
+        }
+        rbPeriodMode = this.findViewById<RadioButton>(R.id.rb_period_fix_mode)
+        rbHotkeyMode = this.findViewById<RadioButton>(R.id.rb_hot_mode)
+
+        llFixMode = this.findViewById<LinearLayout>(R.id.ll_fix_mode)
+        llSpecialMode = this.findViewById<LinearLayout>(R.id.ll_hot_mode)
+
+        vSpecialDesc = this.findViewById<TextView>(R.id.tv_special_desc)
+    }
+
+    private fun addHotkeyRule() {
+        val item = View.inflate(this, R.layout.item_hotkey_pay, null)
+        item.findViewById<TextView>(R.id.tv_hot_del).setOnClickListener {
+            llSpecialList.removeView(item)
+            for (loop in 0 until llSpecialList.childCount) {
+                val item = llSpecialList.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 = "${llSpecialList.childCount + 1}"
+        llSpecialList.addView(item)
+    }
+
+    private fun addPeriodFixRule() {
+        val item = View.inflate(this, R.layout.item_period_fix_pay, null)
+        item.findViewById<TextView>(R.id.tv_del).setOnClickListener {
+            llSpecialList.removeView(item)
+            for (loop in 0 until llSpecialList.childCount) {
+                val item = llSpecialList.getChildAt(loop)
+                val key = item.findViewById<TextView>(R.id.tv_config)
+                key.text = "规则${(loop + 1)}:"
+            }
+        }
+        val key = item.findViewById<TextView>(R.id.tv_config)
+        key.text = "规则${llSpecialList.childCount + 1}:"
+        llSpecialList.addView(item)
+    }
+
+    private fun saveHotkeyRule(): Boolean {
+        val list = ArrayList<HotKeyPayRecord>()
+        for (loop in 0 until llSpecialList.childCount) {
+            val record = HotKeyPayRecord()
+            val item = llSpecialList.getChildAt(loop)
+            var temp = item.findViewById<TextView>(R.id.tv_hot_key)
+            record.key = Integer.parseInt(temp.text.toString())
+            temp = item.findViewById<EditText>(R.id.tv_hot_amount)
+            record.amount = CommonUtil.YuanToFen(java.lang.Double.parseDouble(CommonUtil.getEditView(temp)))
+            list.add(record)
+        }
+        pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.HOTKEY.desc)
+        if (!pos.saveHotkeyPay(list)) {
+            SWToast.show(applicationContext, "保持配置失败", PublicDef.TOAST_SHOW_CRY)
+            return false
+        }
+        return true
+    }
+
+    private fun savePeriodFixRule(): Boolean {
+        val list = ArrayList<PeriodFixPayRecord>()
+        for (loop in 0 until llSpecialList.childCount) {
+            val record = PeriodFixPayRecord()
+            val item = llSpecialList.getChildAt(loop)
+            record.beginTime = CommonUtil.getEditView(item.findViewById<EditText>(R.id.tv_period_start))
+            record.endTime = CommonUtil.getEditView(item.findViewById<EditText>(R.id.tv_period_end))
+            val temp = item.findViewById<EditText>(R.id.tv_amount)
+            record.amount = CommonUtil.YuanToFen(java.lang.Double.parseDouble(CommonUtil.getEditView(temp)))
+            if (TextUtils.isEmpty(record.beginTime) || TextUtils.isEmpty(record.endTime)) {
+                SWToast.show(applicationContext, "时间段不为空", PublicDef.TOAST_SHOW_CRY)
+                return false
+            }
+            if (record.beginTime!!.length != 4 || record.endTime!!.length != 4) {
+                SWToast.show(applicationContext, "时间段长度不对", PublicDef.TOAST_SHOW_CRY)
+                return false
+            }
+            if (!("0000" <= record.beginTime!! && record.beginTime!! < record.endTime!! && record.endTime!! <= "2400")) {
+                SWToast.show(applicationContext, "时间段不合法", PublicDef.TOAST_SHOW_CRY)
+                return false
+            }
+            list.add(record)
+        }
+        pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.PERIODFIX.desc)
+        if (!pos.savePeriodFixPay(list)) {
+            SWToast.show(applicationContext, "保持配置失败", PublicDef.TOAST_SHOW_CRY)
+            return false
+        }
+        return true
+    }
+
+    private fun loadHotkeyRule() {
+        llSpecialList.removeAllViews()
+        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)
+                llSpecialList.removeView(item)
+                for (loop in 0 until llSpecialList.childCount) {
+                    val item = llSpecialList.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)
+            key.text = "${llSpecialList.childCount + 1}"
+            val amt = item.findViewById<TextView>(R.id.tv_hot_amount)
+            amt.text = String.format("%.02f", it.amount / 100.0f)
+            llSpecialList.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)
     }
 
+    private fun loadPeriodFixRule() {
+        llSpecialList.removeAllViews()
+        pos.getPeriodFixPay()?.forEach {
+            val item = View.inflate(this, R.layout.item_period_fix_pay, null)
+            item.findViewById<TextView>(R.id.tv_del).setOnClickListener {
+                llSpecialList.removeView(item)
+                for (loop in 0 until llSpecialList.childCount) {
+                    val item = llSpecialList.getChildAt(loop)
+                    val key = item.findViewById<TextView>(R.id.tv_config)
+                    key.text = "规则${(loop + 1)}:"
+                }
+            }
+            val beginTime = item.findViewById<EditText>(R.id.tv_period_start)
+            beginTime.setText(it.beginTime)
+            val endTime = item.findViewById<EditText>(R.id.tv_period_end)
+            endTime.setText(it.endTime)
+            val amt = item.findViewById<EditText>(R.id.tv_amount)
+            amt.setText(String.format("%.02f", it.amount / 100.0f))
+            val key = item.findViewById<TextView>(R.id.tv_config)
+            key.text = "规则${llSpecialList.childCount + 1}:"
+            llSpecialList.addView(item)
+        }
+    }
+
+
     @SuppressLint("SetTextI18n")
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
@@ -145,13 +247,41 @@
     override fun onResume() {
         super.onResume()
         shoppwdPass = false
-        hotkey = false
         keyActive = true
-        llFixMode.visibility = View.VISIBLE
-        llHotMode.visibility = View.GONE
+        showCurrentMode(ConfigMode.NORMAL_FIX)
         refreshToCheckPasswd()
     }
 
+    private fun showCurrentMode(mode: ConfigMode) {
+        configMode = mode
+        when (mode) {
+            ConfigMode.HOT_KEY -> {
+                specialMode = true
+                rgSpecialMode.visibility = View.VISIBLE
+                rbHotkeyMode.isChecked = true
+                llFixMode.visibility = View.GONE
+                llSpecialMode.visibility = View.VISIBLE
+                vSpecialDesc.text = "设置快捷按键(单位:元)"
+                loadHotkeyRule()
+            }
+            ConfigMode.PERIOD_FIX -> {
+                specialMode = true
+                rbPeriodMode.isChecked = true
+                rgSpecialMode.visibility = View.VISIBLE
+                llFixMode.visibility = View.GONE
+                llSpecialMode.visibility = View.VISIBLE
+                vSpecialDesc.text = "设置波段定额(单位:元)"
+                loadPeriodFixRule()
+            }
+            else -> {
+                rgSpecialMode.visibility = View.GONE
+                llSpecialMode.visibility = View.GONE
+                llFixMode.visibility = View.VISIBLE
+                specialMode = false
+            }
+        }
+    }
+
     private fun checkShopPwd(keyCode: Int) {
         when (keyCode) {
             KeyEvent.KEYCODE_0,
@@ -203,7 +333,7 @@
     }
 
     private fun setFixAmount(keyCode: Int) {
-        if (hotkey) {
+        if (specialMode) {
             AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
             return
         }
@@ -227,9 +357,7 @@
             }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //F1
-                hotkey = true
-                llHotMode.visibility = View.VISIBLE
-                llFixMode.visibility = View.GONE
+                showCurrentMode(ConfigMode.HOT_KEY)
                 AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
             }
         }
@@ -244,11 +372,23 @@
     private fun refreshToSetAmount() {
         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)
+            when {
+                PayMode.FIXPAY.desc == it.paraval -> {
+                    vPayamt.text = String.format("%.02f", Integer.parseInt(it.paraval) / 100.0f)
+                    screenShowAmt()
+                }
+                PayMode.HOTKEY.desc == it.paraval -> {
+                    showCurrentMode(ConfigMode.HOT_KEY)
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+                    return
+                }
+                PayMode.PERIODFIX.desc == it.paraval -> {
+                    showCurrentMode(ConfigMode.PERIOD_FIX)
+                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+                    return
+                }
             }
-        }
-        screenShowAmt()
+        } ?: screenShowAmt()
     }
 
     private fun getFixAmount(): String {
@@ -306,7 +446,7 @@
     }
 
     private fun screenShowAmt() {
-        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-热键模式")
+        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-特殊模式")
         AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
         AuxScreenController.getInstance().refreshContent(
             Arrays.asList<String>(
@@ -317,10 +457,6 @@
         )
     }
 
-    override fun onDestroy() {
-        super.onDestroy()
-    }
-
     private var counter: ContinuePressTimer? = null
 
     private fun resetCounter(timems: Long) {
@@ -343,4 +479,10 @@
             keyActive = true
         }
     }
+}
+
+enum class ConfigMode {
+    NORMAL_FIX,
+    HOT_KEY,
+    PERIOD_FIX,
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
index 304a6a7..110f204 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/mode/EpayUpgradeApi.kt
@@ -18,9 +18,8 @@
  * @date 2019/4/9
  * @desc 在线升级
  */
-class EpayUpgradeApi constructor(callbackInterface: CallbackInterface) {
+class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
     private val TIMEOUT = 5 * 1000// 超时
-    private val callback = callbackInterface
     private val POSID = "posa711dali"
 
     fun upgrade(devphyid: String, version: String) {
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index 1c90e59..0112dfc 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -114,4 +114,10 @@
         key,
         amount
     }
+    enum class PeriodFixPay{
+        id,
+        begintime,
+        endtime,
+        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 4862731..8a0f51d 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -13,13 +13,14 @@
 class DBParaHelper private constructor(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
     companion object {
         private val DB_NAME = "db_para"
-        private val VERSION = 1
+        private val VERSION = 2
 
         val TABLE_NAME_SYSPARA = "tb_syspara"
         val TABLE_NAME_DYNAMICPARA = "tb_dynamicpara"
         val TABLE_NAME_CONTROLPARA = "tb_controlpara"
         val TABLE_NAME_WHITELIST = "tb_whitelist"
         val TABLE_NAME_HOTKEY = "tb_hotkey"
+        val TABLE_NAME_PERIOD_FIX = "tb_period_fix"
 
         private var instance: DBParaHelper? = null
         fun getInstance(context: Context): DBParaHelper {
@@ -38,9 +39,15 @@
     /**
      * SQL for create table
      */
+    private val CREATE_TABLE_NAME_PERIOD_FIX = ("create table IF NOT EXISTS "
+            + TABLE_NAME_PERIOD_FIX + " ( "
+            + BeanPropEnum.PeriodFixPay.id + " integer primary key autoincrement,"
+            + BeanPropEnum.PeriodFixPay.begintime + " varchar(4),"
+            + BeanPropEnum.PeriodFixPay.endtime + " varchar(4),"
+            + BeanPropEnum.PeriodFixPay.amount + " integer )")
     private val CREATE_TABLE_NAME_HOTKEY = ("create table IF NOT EXISTS "
             + TABLE_NAME_HOTKEY + " ( "
-            + BeanPropEnum.HotkeyPay.key + " integer primary key,"
+            + BeanPropEnum.HotkeyPay.key + " long primary key,"
             + BeanPropEnum.HotkeyPay.amount + " integer)")
     private val CREATE_TABLE_NAME_WHITELIST = ("create table IF NOT EXISTS "
             + TABLE_NAME_WHITELIST + " ( "
@@ -99,12 +106,13 @@
         db.execSQL(CREATE_TABLE_NAME_CONTROLPARA)
         db.execSQL(CREATE_TABLE_NAME_WHITELIST)
         db.execSQL(CREATE_TABLE_NAME_HOTKEY)
+        db.execSQL(CREATE_TABLE_NAME_PERIOD_FIX)
     }
 
     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")
+                db.execSQL(CREATE_TABLE_NAME_PERIOD_FIX)
             }
         }
     }
diff --git a/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt b/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
new file mode 100644
index 0000000..dce63c0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
@@ -0,0 +1,100 @@
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.PeriodFixPayRecord
+import java.util.concurrent.locks.Lock
+
+/**
+ ** create by zzq on 2019/11/20
+ ** @desc
+ **/
+class PeriodFixPayDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_PERIOD_FIX
+
+    fun getLock(): Lock {
+        return dbHelper.getLock()
+    }
+
+    fun replace(record: PeriodFixPayRecord): 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<PeriodFixPayRecord>): 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<PeriodFixPayRecord>? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, null)
+            val list = ArrayList<PeriodFixPayRecord>()
+            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): PeriodFixPayRecord {
+        val record = PeriodFixPayRecord()
+        record.beginTime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.PeriodFixPay.begintime.toString()))
+        record.endTime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.PeriodFixPay.endtime.toString()))
+        record.amount = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.PeriodFixPay.amount.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: PeriodFixPayRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.PeriodFixPay.begintime.toString(), record.beginTime)
+        values.put(BeanPropEnum.PeriodFixPay.endtime.toString(), record.endTime)
+        values.put(BeanPropEnum.PeriodFixPay.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 00ae522..9972af0 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -18,6 +18,7 @@
     private val controlParaDao = ControlParaDao(context)
     private val whiteListDao = WhiteListDao(context)
     private val hotkeyPayDao = HotkeyPayDao(context)
+    private val periodFixPayDao = PeriodFixPayDao(context)
     private val transdtlOnlineDao = TransdtlOnlineDao(sdContext)
     private val transdtlOfflineDao = TransdtlOfflineDao(sdContext)
     private val transdtlUnionDao = TransdtlUnionDao(sdContext)
@@ -73,6 +74,24 @@
         }
     }
 
+    fun savePeriodFixPay(list: List<PeriodFixPayRecord>): Boolean {
+        try {
+            periodFixPayDao.getLock().lock()
+            return periodFixPayDao.save(list)
+        } finally {
+            periodFixPayDao.getLock().unlock()
+        }
+    }
+
+    fun getPeriodFixPay(): List<PeriodFixPayRecord>? {
+        try {
+            periodFixPayDao.getLock().lock()
+            return periodFixPayDao.get()
+        } finally {
+            periodFixPayDao.getLock().unlock()
+        }
+    }
+
     fun replaceControlPara(record: ControlParaRecord): Boolean {
         try {
             controlParaDao.getLock().lock()
diff --git a/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt b/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
index 4d8bb24..e3ae7aa 100644
--- a/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/HotKeyPayRecord.kt
@@ -7,5 +7,4 @@
 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/PeriodFixPayRecord.kt b/app/src/main/java/com/supwisdom/entity/PeriodFixPayRecord.kt
new file mode 100644
index 0000000..abb736f
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/PeriodFixPayRecord.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/11/19
+ ** @desc
+ **/
+class PeriodFixPayRecord {
+    var beginTime: String? = null //hhmm
+    var endTime: String? = null //hhmm
+    var amount: Int = 0
+}
\ 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 653add6..befd0cf 100644
--- a/app/src/main/res/layout/activity_consume_mode.xml
+++ b/app/src/main/res/layout/activity_consume_mode.xml
@@ -8,22 +8,19 @@
                 style="@style/head_title_text_style"
                 android:text="消费模式"/>
         <RadioGroup
+                android:id="@+id/rg_special_mode"
                 android:visibility="gone"
                 android:layout_height="wrap_content"
+                android:weightSum="2"
                 android:layout_width="match_parent"
-                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"/>
+                android:orientation="horizontal">
             <RadioButton
                     android:id="@+id/rb_hot_mode"
-                    android:text="快捷消费"
+                    android:text="按键便捷消费"
+                    style="@style/consume_mode_rb_style"/>
+            <RadioButton
+                    android:id="@+id/rb_period_fix_mode"
+                    android:text="波段定额消费"
                     style="@style/consume_mode_rb_style"/>
         </RadioGroup>
         <LinearLayout
@@ -91,7 +88,7 @@
                 <TextView
                         android:id="@+id/tv_hot_save"
                         android:textSize="25sp"
-                        android:layout_marginLeft="50dp"
+                        android:layout_marginStart="50dp"
                         android:text="保存"
                         android:background="@drawable/corner_bg_blue"
                         android:padding="10dp"
@@ -102,7 +99,7 @@
                         android:id="@+id/tv_hot_add"
                         android:textSize="25sp"
                         android:text="添加"
-                        android:layout_marginLeft="50dp"
+                        android:layout_marginStart="50dp"
                         android:background="@drawable/corner_bg_blue"
                         android:padding="10dp"
                         android:textColor="@color/white"
@@ -110,6 +107,7 @@
                         android:layout_height="wrap_content"/>
             </LinearLayout>
             <TextView
+                    android:id="@+id/tv_special_desc"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:text="快捷消费(单位:元)"
@@ -117,11 +115,10 @@
                     android:textColor="@color/light_blue2"
                     android:textSize="20sp"/>
             <LinearLayout
-                    android:id="@+id/ll_hot_list"
+                    android:id="@+id/ll_special_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_period_fix_pay.xml b/app/src/main/res/layout/item_period_fix_pay.xml
new file mode 100644
index 0000000..0f3f609
--- /dev/null
+++ b/app/src/main/res/layout/item_period_fix_pay.xml
@@ -0,0 +1,61 @@
+<?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="7"
+              android:padding="5dp"
+              android:layout_marginTop="10dp"
+              android:layout_height="match_parent">
+    <TextView
+            android:id="@+id/tv_config"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="规则 1:"
+            android:visibility="gone"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_period_start"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:inputType="numberDecimal"
+            android:layout_weight="2"
+            android:maxLines="1"
+            android:text="1000"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_period_end"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:inputType="numberDecimal"
+            android:layout_weight="2"
+            android:maxLines="1"
+            android:text="1430"
+            android:textColor="@color/light_blue2"
+            android:textSize="25sp"/>
+    <EditText
+            android:id="@+id/tv_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_del"
+            android:layout_height="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:text="删除"
+            android:layout_marginStart="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 d85e0af..a1088c5 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -428,7 +428,8 @@
     </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:layout_width">0dp</item>
+        <item name="android:layout_weight">1</item>
         <item name="android:textSize">25sp</item>
         <item name="android:textColor">@color/light_blue2</item>
     </style>
