diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ed48cb0..bf5d0b9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -33,10 +33,6 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
 
-    <!--写时钟权限-->
-    <uses-permission
-            android:name="android.permission.WRITE_SETTINGS"
-            serviceandroid:ignore="ProtectedPermissions"/>
     <uses-permission
             android:name="android.permission.WRITE_SECURE_SETTINGS"
             serviceandroid:ignore="ProtectedPermissions"/>
diff --git a/app/src/main/java/com/newcapec/jni/Icc.java b/app/src/main/java/com/newcapec/jni/Icc.java
index 3a4f197..0a3cb03 100644
--- a/app/src/main/java/com/newcapec/jni/Icc.java
+++ b/app/src/main/java/com/newcapec/jni/Icc.java
@@ -13,12 +13,12 @@
     /**
      * @param version
      */
-    public Icc(int version) {
-        if (version < 110) {
+    public Icc(String version) {
+        if (version.compareTo("110") < 0) {
             System.loadLibrary("iccV108");
-        } else if (version < 115) {
+        } else if (version.compareTo("115") < 0) {
             System.loadLibrary("iccV110");
-        } else if (version < 116) {
+        } else if (version.compareTo("116") < 0) {
             System.loadLibrary("iccV115");
         } else {
             System.loadLibrary("iccV116");
diff --git a/app/src/main/java/com/newcapec/jni/Picc.java b/app/src/main/java/com/newcapec/jni/Picc.java
index fadb179..18ecad4 100644
--- a/app/src/main/java/com/newcapec/jni/Picc.java
+++ b/app/src/main/java/com/newcapec/jni/Picc.java
@@ -105,10 +105,10 @@
     /**
      * @param version
      */
-    public Picc(int version) {
-        if (version < 110) {
+    public Picc(String version) {
+        if (version.compareTo("110") < 0) {
             System.loadLibrary("piccV108");
-        } else if (version < 116) {
+        } else if (version.compareTo("116") < 0) {
             System.loadLibrary("piccV115");
         } else {
             System.loadLibrary("piccV116");
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 7febabd..363ff7f 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,14 +56,15 @@
     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
-    private var codeSwitchEnable = false
+    private var cardPaying = false
     @Volatile
     private var payStatusEnable = false
     @Volatile
-    private var isBackRuning = false
+    private var isBackRunning = false
     private var addAmount: Int = 0
     @Volatile
     private var amount: Int = 0
@@ -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)
@@ -106,16 +110,12 @@
             }
 
             override fun callback(code: String) {
-                //扫码和寻卡消费互斥
-                if (!codeSwitchEnable) {
-                    return
-                }
                 if (!scanLock.tryLock()) {
                     return
                 }
                 try {
                     //正在扣款
-                    if (dialogPurchase!!.codePaying) {
+                    if (someWayPaying()) {
                         return
                     }
                     //已扣款
@@ -136,6 +136,13 @@
         presenter.loadLastTransdtl()
     }
 
+    private fun someWayPaying(): Boolean {
+        if (cardPaying || dialogPurchase!!.codePaying || isBackRunning) {
+            return true
+        }
+        return false
+    }
+
     private fun initView() {
         vShopname = this.findViewById<TextView>(R.id.tv_shopname)
         vLinkLogo = this.findViewById<ImageView>(R.id.tv_linklogo)
@@ -157,7 +164,7 @@
 
     override fun onStop() {
         super.onStop()
-        isBackRuning = true
+        isBackRunning = true
     }
 
     override fun onDestroy() {
@@ -170,6 +177,7 @@
     @SuppressLint("SetTextI18n")
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
+            presenter.resetOperationTime()
             when (payMode) {
                 PayMode.FIXPAY -> fixInputPay(event.keyCode)
                 PayMode.HOTKEY -> hotkeyInputPay(event.keyCode)
@@ -183,7 +191,7 @@
         when (keyCode) {
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
-                isBackRuning = true
+                isBackRunning = true
                 jumpActivity(MenuActivity::class.java)
             }
             KeyEvent.KEYCODE_DPAD_RIGHT -> {
@@ -218,7 +226,7 @@
             }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
-                isBackRuning = true
+                isBackRunning = true
                 jumpActivity(MenuActivity::class.java)
             }
             KeyEvent.KEYCODE_DPAD_RIGHT -> {
@@ -263,7 +271,7 @@
             }
             KeyEvent.KEYCODE_DPAD_LEFT -> {
                 //'F1'
-                isBackRuning = true
+                isBackRunning = true
                 jumpActivity(MenuActivity::class.java)
             }
 //                KeyEvent.KEYCODE_DPAD_UP ->
@@ -302,30 +310,39 @@
         }
     }
 
+    override fun screenSaver(flag: Boolean) {
+        if (flag) {
+            CommonUtil.setAppBrightness(this, PublicDef.SCREEN_SAVER_BRIGHTNESS)
+        } else {
+            CommonUtil.setAppBrightness(this, PublicDef.SCREEN_NORMAL_BRIGHTNESS)
+        }
+    }
+
     private var lastshowtime: String? = null
     override fun clearUserInfo(datetime: String) {
-        if (!isBackRuning) {
-            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()
         }
     }
 
     override fun onResume() {
         super.onResume()
-        isBackRuning = false
+        isBackRunning = false
         beepManager!!.updatePrefs()
         dealIntent()
         refresh()
@@ -354,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 {
@@ -370,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()
                     }
@@ -400,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 || amount != it.amount) {
+                    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))
@@ -643,8 +690,8 @@
         return this
     }
 
-    override fun isBackRuning(): Boolean {
-        return isBackRuning
+    override fun isBackRunning(): Boolean {
+        return isBackRunning
     }
 
     override fun showRecentDtl(record: TransdtlUnionRecord?) {
@@ -662,8 +709,8 @@
         }
     }
 
-    override fun codeScannerEnable(enable: Boolean) {
-        codeSwitchEnable = enable
+    override fun cardPayingStatus(isPaying: Boolean) {
+        cardPaying = isPaying
     }
 
     private fun resetPayShowCounter(timems: Long) {
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 43b5ed2..4be4346 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumePresenter.kt
@@ -16,10 +16,9 @@
  ** create by zzq on 2019/7/25
  ** @desc
  **/
-class ConsumePresenter constructor(iConsumeView: IConsumeView) {
+class ConsumePresenter constructor(private val iConsumeView: IConsumeView) {
     private val TAG = "ConsumePresenter"
     private val pos = SPApplication.getInstance().getPos()
-    private val iConsumeView = iConsumeView
     private val codePayRunnable = CodePayRunnable()
     private lateinit var handler: Handler
     private var cardPayService: CardPayService
@@ -45,23 +44,24 @@
                     PublicDef.MSG_CARD_PAY_QUERY -> iConsumeView.showConsumeQuery(msg.obj as String)
                     PublicDef.MSG_CARD_PAY_FAIL -> {
                         val ret = msg.obj as CardUserInfoBean
-                        LogUtil.d(TAG, "pay fail,reason=${ret.retmsg}")
+                        LogUtil.d(TAG, "pay fail,reason=$ret")
                         iConsumeView.showConsumeFail(ret)
                     }
                     PublicDef.MSG_PAYING_INTERRUPT -> {
                         val ret = msg.obj as CardUserInfoBean
-                        LogUtil.d(TAG, "pay interrupt,reason=${ret.retmsg}")
+                        LogUtil.d(TAG, "pay interrupt,reason=$ret")
                         iConsumeView.showConsumeInterrupt(ret)
                     }
                     PublicDef.MSG_CARD_REVERSE_FAIL -> {
                         val ret = msg.obj as CardUserInfoBean
-                        LogUtil.d(TAG, "reverse fail,reason=${ret.retmsg}")
+                        LogUtil.d(TAG, "reverse fail,reason=$ret")
                         iConsumeView.showReverseFail(msg.obj as CardUserInfoBean)
                     }
                     PublicDef.MSG_CARD_REVERSE_SUC -> iConsumeView.showReverseSuc(msg.obj as CardUserInfoBean)
                     PublicDef.MSG_USER_INFO_SHOW -> iConsumeView.showUserInfo(msg.obj as CardUserInfoBean)
                     PublicDef.MSG_USER_INFO_CLEAR -> iConsumeView.clearUserInfo(msg.obj as String)
                     PublicDef.MSG_LINK_STATUS -> iConsumeView.refreshLinkStatus(msg.obj as Boolean)
+                    PublicDef.MSG_SCREEN_SAVER -> iConsumeView.screenSaver((msg.obj as String) == "on")
                 }
             }
         }
@@ -91,6 +91,10 @@
         cardPayService.clickToInterrupt()
     }
 
+    fun resetOperationTime() {
+        cardPayService.resetOperationTime()
+    }
+
     fun setFixMode(isFixMode: Boolean) {
         cardPayService.isFixMode = isFixMode
         codePayService.isFixMode = isFixMode
@@ -133,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/IConsumeView.kt b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
index 608ff3f..3561af7 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/IConsumeView.kt
@@ -11,7 +11,7 @@
 interface IConsumeView {
     fun getActivity(): Activity
 
-    fun isBackRuning(): Boolean
+    fun isBackRunning(): Boolean
 
     fun showConsumeSuc(info: CardUserInfoBean)
 
@@ -34,6 +34,10 @@
     fun refreshLinkStatus(isOnline: Boolean)
 
     fun showRecentDtl(record: TransdtlUnionRecord?)
+    /**
+     * 是否正在刷卡支付
+     */
+    fun cardPayingStatus(isPaying: Boolean)
 
-    fun codeScannerEnable(enable: Boolean)
+    fun screenSaver(flag: Boolean)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
index 047d57b..286b664 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/CardUserInfoBean.kt
@@ -21,6 +21,10 @@
     var transdate: String? = null
     var transtime: String? = null
     var payway: String? = null //card,code
+
+    override fun toString(): String {
+        return "name=$username,cardno=$cardno,amount=$amount,payway=$payway,retcode=$retcode,retmsg=$retmsg"
+    }
 }
 
 enum class CardStatus(val desc: String) {
diff --git a/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt b/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt
new file mode 100644
index 0000000..bcbf64e
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.activities.consume.bean
+
+/**
+ ** create by zzq on 2019/11/5
+ ** @desc 屏保参数
+ **/
+class ScreenSaverBean {
+    var operationTime = 0L //ms
+    var operationFlag = false //是否操作
+    var flag = false //是否屏保
+}
\ 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 4b39eea..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
@@ -39,7 +39,14 @@
     /**
      * 防止定额连续消费
      */
-    private var lastPayBean = LastPayBean()
+    private val lastPayBean = LastPayBean()
+    @Volatile
+    private var operation = false
+    private val screenSaverBean = ScreenSaverBean()
+
+    init {
+        screenSaverBean.operationTime = System.currentTimeMillis()
+    }
 
     fun start() {
         isExist = false
@@ -75,6 +82,10 @@
         payQueryConfirm = false
     }
 
+    fun resetOperationTime() {
+        operation = true
+    }
+
     private inner class CardPayRunnable : Runnable {
         private lateinit var onlRecord: TransdtlOnlineRecord
         private lateinit var onlRvsRecord: TransdtlOnlineRecord
@@ -88,20 +99,21 @@
         private var curLinkRefreshTime: Long = 0
         override fun run() {
             while (!isExist) {
-                if (iConsumeView.isBackRuning()) {
+                iConsumeView.cardPayingStatus(false)
+                checkShowScreen()
+                if (iConsumeView.isBackRunning()) {
                     CommonUtil.doSleep(1000)
-                    doClear()
                     continue
                 }
-                iConsumeView.codeScannerEnable(true)
                 CommonUtil.doSleep(100)
                 try {
                     val cardphyid = Cardlib.instance.requestCard()
-                    iConsumeView.codeScannerEnable(false)
+                    iConsumeView.cardPayingStatus(true)
                     if (oldcardphyid != cardphyid) {
                         readCard()
                         cardBean!!.cardphyid = cardphyid
                         oldcardphyid = cardphyid
+                        operation = true
                     }
                     when (clickStat) {
                         ClickStat.PAY -> {
@@ -188,6 +200,31 @@
             }
         }
 
+        private fun checkShowScreen() {
+            val tt = System.currentTimeMillis()
+            if (operation) {
+                operation = false
+                screenSaverBean.operationTime = tt
+                screenSaverBean.operationFlag = true
+            }
+            if (tt > screenSaverBean.operationTime &&
+                tt - screenSaverBean.operationTime > PublicDef.SCREEN_SAVER_GAP
+            ) {
+                /**
+                 * 连续半小时无操作屏保
+                 */
+                screenSaverBean.operationTime = tt
+                screenSaverBean.flag = true
+                screenSaverBean.operationFlag = false
+                sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
+            } else {
+                if (screenSaverBean.operationFlag && screenSaverBean.flag) {
+                    screenSaverBean.flag = false
+                    sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
+                }
+            }
+        }
+
         private fun showCardUserInfo() {
             val info = CardUserInfoBean(PublicDef.SUCCESS, "账户信息")
             if (cardBean!!.username != cardBean!!.cardNo) {
@@ -215,8 +252,9 @@
         private fun doConsume() {
             if (isFixMode) {
                 if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
-                    if (System.currentTimeMillis() - lastPayBean.suctime < 15000) {
-                        throw CardPayFailError("15s内不能连续消费")
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
                     }
                 }
             }
@@ -362,6 +400,10 @@
 
         private fun doOnlineConsumeQuery(): Boolean {
             var queryCnt = 1
+            LogUtil.e(
+                TAG,
+                "pay timeout and query result,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
+            )
             sleepWithCancel(1000)
             while (payQueryConfirm) {
                 sendMsg(PublicDef.MSG_CARD_PAY_QUERY, "消费确认中[$queryCnt]")
@@ -411,7 +453,6 @@
 
         private fun parseConfirmResult(resp: TransResp?): Boolean {
             if (resp == null || resp.retcode != HttpStatus.SC_OK) {
-                SPApplication.getInstance().setEpayLinking(false)
                 return false
             }
             val retBean = try {
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 2b76df8..989ef92 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
@@ -45,8 +45,9 @@
         try {
             if (isFixMode) {
                 if (lastPayBean.code == code) {
-                    if (System.currentTimeMillis() - lastPayBean.suctime < 15000) {
-                        throw CardPayFailError("15s内不能连续消费")
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
                     }
                 }
             }
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/java/com/supwisdom/epaycard/DaliReader.kt b/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt
index 4992921..f146948 100644
--- a/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt
+++ b/app/src/main/java/com/supwisdom/epaycard/DaliReader.kt
@@ -37,9 +37,9 @@
         val temp = Build.DISPLAY
         val version = if (temp.contains("CAP08S-V1")) {
             when {
-                temp < "CAP08S-V1.0.9" -> 108
-                temp < "CAP08S-V1.1.1" -> 110
-                else -> 115
+                temp < "CAP08S-V1.0.9" -> "108"
+                temp < "CAP08S-V1.1.1" -> "110"
+                else -> "115"
             }
         } else {
             /**
@@ -48,7 +48,8 @@
             CommonUtil.getSerialNumber()?.replace("v", "")
                 ?.replace("V", "")
                 ?.replace(".", "")
-                ?.toInt() ?: 116
+                ?.replace(" ", "")
+                ?: "116"
         }
         picc = Picc(version)
         val ret = picc!!.open()
diff --git a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
index 5e3f70c..8765a41 100644
--- a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
@@ -35,7 +35,7 @@
     private var clientLong: OkHttpClient
     private val JSON = MediaType.parse("application/json; charset=utf-8")
     private val FORM_ENCODE = MediaType.parse("application/x-www-form-urlencoded;charset=utf-8")
-    private var commTime = 2
+    private var commTime = 5
     private var clientId: String? = null
     private var jwt: String? = null
 
diff --git a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
index 917f39c..253a752 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -5,6 +5,7 @@
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.app.ActivityManager
+import android.content.ContentResolver
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
@@ -12,6 +13,7 @@
 import android.os.Build
 import android.os.PowerManager
 import android.provider.Settings
+import android.view.WindowManager
 import android.widget.EditText
 import com.supwisdom.activities.SPApplication
 import java.io.File
@@ -191,4 +193,95 @@
             else -> " "
         }
     }
+
+    /**
+     * @param activity
+     * @param brightness [1-255]
+     * @desc 根据亮度值修改当前window亮度
+     */
+    fun setAppBrightness(activity: Activity, brightness: Int) {
+        val window = activity.window
+        val lp = window.attributes
+        if (brightness == -1) {
+            if (lp.screenBrightness < 0) {
+                /**
+                 * 已经是正常亮度
+                 */
+                return
+            }
+            lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
+        } else {
+            if (lp.screenBrightness > 0) {
+                /**
+                 * 已经屏保亮度
+                 */
+                return
+            }
+//            stopAutoBrightness(activity)
+            lp.screenBrightness = (if (brightness <= 0) 1 else brightness) / 255f
+        }
+        window.attributes = lp
+        /**
+         * 生效？
+         */
+//        getActivityBrightness(activity)
+    }
+
+    /**
+     * 获取当前activity的屏幕亮度
+     *
+     * @param activity 当前的activity对象
+     * @return 亮度值范围为0-0.1f，如果为-1.0，则亮度与全局同步。
+     */
+    private fun getActivityBrightness(activity: Activity): Float {
+        val localWindow = activity.window
+        val params = localWindow.attributes
+        return params.screenBrightness
+    }
+
+    /**
+     * 判断是否开启了自动亮度调节
+     * *
+     * * @param aContext
+     * * @return
+     *      
+     */
+    private fun isAutoBrightness(aContentResolver: ContentResolver): Boolean {
+        try {
+            return Settings.System.getInt(
+                aContentResolver,
+                Settings.System.SCREEN_BRIGHTNESS_MODE
+            ) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+        } catch (e: Settings.SettingNotFoundException) {
+            e.printStackTrace()
+        }
+
+        return false
+    }
+
+    /**
+     * 停止自动亮度调节
+     *
+     * @param activity
+     */
+    private fun stopAutoBrightness(activity: Activity) {
+        Settings.System.putInt(
+            activity.contentResolver,
+            Settings.System.SCREEN_BRIGHTNESS_MODE,
+            Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL
+        )
+    }
+
+    /**
+     * 开启亮度自动调节
+     *
+     * @param activity
+     */
+    private fun startAutoBrightness(activity: Activity) {
+        Settings.System.putInt(
+            activity.contentResolver,
+            Settings.System.SCREEN_BRIGHTNESS_MODE,
+            Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+        )
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index 140f9a8..18c7074 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -33,8 +33,15 @@
     const val MSG_LINK_STATUS = 19
     const val MSG_PAYING_QUERY = 20
     const val MSG_PAYING_INTERRUPT = 21
+    const val MSG_SCREEN_SAVER = 22
     /*************************不能重复*****************************/
     /**
+     * 屏保亮度
+     */
+    const val SCREEN_SAVER_BRIGHTNESS = 1
+    const val SCREEN_NORMAL_BRIGHTNESS = -1
+    const val SCREEN_SAVER_GAP: Long = 30 * 60 * 1000
+    /**
      * 卡消费标志(1 byte)
      */
     /*high 4 bit*/
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index fa71710..44d3c74 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -115,6 +115,7 @@
     }
 
     fun showPaySuccess(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = info.retmsg
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.payamt)
@@ -126,6 +127,7 @@
     }
 
     fun showPayInterrupt() {
+        payQueryConfirm = false
         vPayhint.text = "交易取消"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = "以银行交易为准"
@@ -136,6 +138,7 @@
     }
 
     fun showPayFail(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = "消费失败"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = info.retmsg
@@ -146,6 +149,7 @@
     }
 
     fun showReverseSuccess(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = info.retmsg
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.amount)
@@ -156,6 +160,7 @@
     }
 
     fun showReverseFail(info: CardUserInfoBean) {
+        payQueryConfirm = false
         vPayhint.text = "冲正失败"
         vPayhint.setTextColor(Color.RED)
         vPayamt.text = info.retmsg
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..b1e7226
--- /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="0000"
+            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="2400"
+            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>
