diff --git a/app/build.gradle b/app/build.gradle
index 3debf66..08a41f1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -40,7 +40,7 @@
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-            signingConfig signingConfigs.release
+            signingConfig signingConfigs.sign
         }
         debug {
             signingConfig signingConfigs.sign
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 39de86e..2b2575c 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -23,10 +23,7 @@
 import com.supwisdom.entity.PeriodFixPayRecord
 import com.supwisdom.entity.ReversalFlag
 import com.supwisdom.entity.TransdtlUnionRecord
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
-import com.supwisdom.utils.SoundUtil
+import com.supwisdom.utils.*
 import com.supwisdom.view.DialogPurchase
 import java.util.*
 import java.util.concurrent.locks.ReentrantLock
@@ -39,6 +36,7 @@
 @Suppress("DEPRECATION")
 @SuppressLint("NewApi")
 class ConsumeActivity : BaseActivity(), IConsumeView {
+    private val TAG = "ConsumeActivity"
     private lateinit var amountTxt: TextView
     private lateinit var presenter: ConsumePresenter
     private lateinit var vLinkstat: TextView
@@ -60,6 +58,7 @@
     private val pos = SPApplication.getInstance().getPos()
     private var beepManager: BeepManager? = null
     private val scanLock = ReentrantLock()
+    private var appreboottime: Long = 0
 
     @Volatile
     private var cardPaying = false
@@ -189,6 +188,17 @@
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
             presenter.resetOperationTime()
+            if (event.keyCode == KeyEvent.KEYCODE_DPAD_UP) {
+                //F2 连续按重启app
+                val tt = System.currentTimeMillis()
+                if (tt - appreboottime < PublicDef.APP_REBOOT_GAP) {
+                    LogUtil.i(TAG, "设备双击F2,待机界面重启APP!!")
+                    CommonUtil.restartAPP(this)
+                } else {
+                    appreboottime = tt
+                }
+                return super.dispatchKeyEvent(event)
+            }
             when (payMode) {
                 PayMode.FIXPAY -> fixInputPay(event.keyCode)
                 PayMode.HOTKEY -> hotkeyInputPay(event.keyCode)
@@ -447,7 +457,7 @@
     }
 
     private fun parsePeriodFixPay() {
-        val nowtime = DateUtil.getNowTimeNoFormat().substring(0, 4)
+        val nowtime = DateUtil.getTimeHHmm()
         periodFixPayList?.forEach {
             if (it.beginTime!! <= nowtime && nowtime < it.endTime!!) {
                 if (payMode != PayMode.FIXPAY || amount != it.amount) {
@@ -688,7 +698,8 @@
         return try {
             CommonUtil.YuanToFen(
                 java.lang.Double.parseDouble(
-                    amountTxt.text.toString().trim { it <= ' ' })
+                    amountTxt.text.toString()
+                )
             )
         } catch (ex: Exception) {
             ex.printStackTrace()
@@ -708,7 +719,7 @@
             }
         } else {
             //限制消费金额<10000
-            if (str.length < 4) {
+            if (str.length < 5) {
                 amountTxt.text = "$str$value"
             }
         }
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
index bcbf64e..f7ed535 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/bean/ScreenSaverBean.kt
@@ -1,11 +1,12 @@
-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 //是否屏保
+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 //是否屏保
+    var gcTime = 0L //ms
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index 6ebab3c..20791e7 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
@@ -15,37 +15,49 @@
 import com.supwisdom.service.EpayApiImpl
 import com.supwisdom.utils.*
 import org.apache.http.HttpStatus
+import java.util.concurrent.locks.ReentrantLock
 
 /**
  ** create by zzq on 2019/7/25
  ** @desc 刷卡消费
  **/
-class CardPayService constructor(private val iConsumeView: IConsumeView, private val handler: Handler) {
+class CardPayService constructor(
+    private val iConsumeView: IConsumeView,
+    private val handler: Handler
+) {
     private val TAG = "CardPayService"
     private val pos = SPApplication.getInstance().getPos()
     private val runnable = CardPayRunnable()
     private val consumeApi = ConsumeApi()
+
     @Volatile
     private var isExist = false
+
     @Volatile
     private var clickStat = ClickStat.INIT
+
     @Volatile
     private var amount: Int = 0
+
     @Volatile
     private var payQueryConfirm = false
     var isFixMode = false
     private var thread: Thread? = null
     private var cardBean: CardBean? = null
+
     /**
      * 防止定额连续消费
      */
     private val lastPayBean = LastPayBean()
+    private val lock = ReentrantLock()
+
     @Volatile
     private var operation = false
     private val screenSaverBean = ScreenSaverBean()
 
     init {
         screenSaverBean.operationTime = System.currentTimeMillis()
+        screenSaverBean.gcTime = screenSaverBean.operationTime
     }
 
     fun start() {
@@ -63,23 +75,32 @@
     }
 
     fun clickNoPay() {
+        lock.lock()
         clickStat = ClickStat.INIT
         amount = 0
+        lock.unlock()
     }
 
     fun clickToPay(amount: Int) {
+        lock.lock()
         clickStat = ClickStat.PAY
         this.amount = amount
+        lock.unlock()
     }
 
     fun clickToReverse(amount: Int) {
+        lock.lock()
         clickStat = ClickStat.REVERSE
         this.amount = amount
+        lock.unlock()
     }
 
     fun clickToInterrupt() {
+        lock.lock()
         clickStat = ClickStat.INIT
+        this.amount = 0
         payQueryConfirm = false
+        lock.unlock()
     }
 
     fun resetOperationTime() {
@@ -118,6 +139,10 @@
                     when (clickStat) {
                         ClickStat.PAY -> {
                             try {
+                                lock.lock()
+                                if (clickStat != ClickStat.PAY) {
+                                    throw CardPayInterruptError("支付状态已改变")
+                                }
                                 doConsume()
                             } catch (ex: CardPayFailError) {
                                 sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
@@ -130,14 +155,23 @@
                                             + "exception=${CommonUtil.getExceptionStack(ex)}"
                                 )
                                 sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo("程序异常"))
+                            } finally {
+                                clickStat = ClickStat.INIT
+                                lock.unlock()
                             }
-                            clickStat = ClickStat.INIT
                         }
                         ClickStat.REVERSE -> {
                             try {
+                                lock.lock()
+                                if (clickStat != ClickStat.REVERSE) {
+                                    throw CardPayInterruptError("支付状态已改变")
+                                }
                                 doReverse()
                             } catch (ex: CardPayCancelFailError) {
-                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo(ex.message))
+                                sendMsg(
+                                    PublicDef.MSG_CARD_REVERSE_FAIL,
+                                    getRvsErrorInfo(ex.message)
+                                )
                             } catch (ex: Exception) {
                                 ex.printStackTrace()
                                 LogUtil.d(
@@ -145,8 +179,10 @@
                                             + "exception=${CommonUtil.getExceptionStack(ex)}"
                                 )
                                 sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo("程序异常"))
+                            } finally {
+                                clickStat = ClickStat.INIT
+                                lock.unlock()
                             }
-                            clickStat = ClickStat.INIT
                         }
                         ClickStat.INIT -> {
                             if (SPApplication.getInstance().isOnline() && !onlineBalance) {
@@ -180,18 +216,19 @@
             )
             if (resp != null && resp.retcode == HttpStatus.SC_OK) {
                 try {
-                    val retBean = GsonUtil.GsonToBean(resp.retjson!!, CardAccountRetBean::class.java)
+                    val retBean =
+                        GsonUtil.GsonToBean(resp.retjson!!, CardAccountRetBean::class.java)
                     if (retBean.retcode == PublicDef.SUCCESS) {
                         cardBean!!.username = retBean.username
                         cardBean!!.userid = retBean.userid
                         cardBean!!.balance = retBean.balance
-                        when {
-                            "normal" == retBean.status -> cardBean!!.cardstatus = CardStatus.NORMAL
-                            "expire" == retBean.status -> cardBean!!.cardstatus = CardStatus.EXPIRE
-                            "lost" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOCK
-                            "logout" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOGOUT
-                            "frozen" == retBean.status -> cardBean!!.cardstatus = CardStatus.FROZEN
-                            "lock" == retBean.status -> cardBean!!.cardstatus = CardStatus.LOST
+                        when (retBean.status) {
+                            "normal" -> cardBean!!.cardstatus = CardStatus.NORMAL
+                            "expire" -> cardBean!!.cardstatus = CardStatus.EXPIRE
+                            "lost" -> cardBean!!.cardstatus = CardStatus.LOCK
+                            "logout" -> cardBean!!.cardstatus = CardStatus.LOGOUT
+                            "frozen" -> cardBean!!.cardstatus = CardStatus.FROZEN
+                            "lock" -> cardBean!!.cardstatus = CardStatus.LOST
                         }
                     }
                 } catch (ex: Exception) {
@@ -207,22 +244,63 @@
                 screenSaverBean.operationTime = tt
                 screenSaverBean.operationFlag = true
             }
-            if (tt > screenSaverBean.operationTime &&
+            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")
+                val screenCtl = pos.getControlPara(PublicDef.CONTROL_SCREEN_PROTECT)
+                if (screenCtl?.paraval != null && "1" == screenCtl.paraval) {
+                    screenSaverBean.flag = true
+                    sendMsg(PublicDef.MSG_SCREEN_SAVER, "on")
+                }
+                val rebootCtl = pos.getControlPara(PublicDef.CONTROL_REBOOT_ENABLE)
+                if (rebootCtl?.paraval != null && "1" == rebootCtl.paraval) {
+                    val nowtime = DateUtil.getNowTimeNoFormat()
+                    /**
+                     * 凌晨1点-3点判断做设备重启
+                     */
+                    if (nowtime > "010000" && nowtime < "030000") {
+                        val ctlRecord = pos.getControlPara(PublicDef.CONTROL_REBOOT_DATE)
+                        val nowdate = DateUtil.getNowDateNoFormat()
+                        if (ctlRecord?.paraval == null || ctlRecord.paraval != nowdate) {
+                            LogUtil.i(TAG, "设备已自动重启")
+                            pos.replaceControlPara(ControlParaRecord().apply {
+                                this.paraname = PublicDef.CONTROL_REBOOT_DATE
+                                this.paraval = nowdate
+                            })
+                            CommonUtil.restartDevice(iConsumeView.getActivity())
+                        }
+                    }
+                }
             } else {
                 if (screenSaverBean.operationFlag && screenSaverBean.flag) {
                     screenSaverBean.flag = false
                     sendMsg(PublicDef.MSG_SCREEN_SAVER, "off")
                 }
             }
+            if (SPApplication.getInstance().isSynoCodeActive()) {
+                if (tt < screenSaverBean.gcTime ||
+                    tt - screenSaverBean.gcTime > PublicDef.APP_GC_SYNO_PERIOD
+                ) {
+//                LogUtil.d(TAG, "app auto do gc!!!!!!!!!!!!")
+//                Log.e(TAG, "app auto do gc!!!!!!!!!!!!")
+                    screenSaverBean.gcTime = tt
+                    CommonUtil.GC()
+                }
+            } else {
+                if (tt < screenSaverBean.gcTime ||
+                    tt - screenSaverBean.gcTime > PublicDef.APP_GC_PERIOD
+                ) {
+//                LogUtil.d(TAG, "app auto do gc!!!!!!!!!!!!")
+//                Log.e(TAG, "app auto do gc!!!!!!!!!!!!")
+                    screenSaverBean.gcTime = tt
+                    CommonUtil.GC()
+                }
+            }
         }
 
         private fun showCardUserInfo() {
@@ -327,7 +405,10 @@
             }
         }
 
-        private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
+        private fun checkOnlineReverseVaild(
+            unionRecord: TransdtlUnionRecord,
+            record: TransdtlOnlineRecord
+        ) {
             if (record.cardphyid != cardBean!!.cardphyid) {
                 throw CardPayCancelFailError("该卡不是最后消费")
             }
@@ -353,7 +434,10 @@
             }
         }
 
-        private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
+        private fun checkOfflineReverseVaild(
+            unionRecord: TransdtlUnionRecord,
+            record: TransdtlOfflineRecord
+        ) {
             if (record.cardphyid != cardBean!!.cardphyid) {
                 throw CardPayCancelFailError("该卡不是最后消费")
             }
@@ -418,7 +502,10 @@
             /**
              * 手动取消交易
              */
-            LogUtil.e(TAG, "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]")
+            LogUtil.e(
+                TAG,
+                "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]"
+            )
             throw CardPayInterruptError("交易取消")
         }
 
@@ -526,7 +613,8 @@
             }
 
             val whiteRecord =
-                pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: throw CardPayFailError("卡无权限")
+                pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!)
+                    ?: throw CardPayFailError("卡无权限")
             when (whiteRecord.status) {
                 "normal" -> {
 
@@ -539,7 +627,11 @@
                 else -> throw CardPayFailError("卡状态:${whiteRecord.status}")
             }
 
-            val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
+            val payamt = pos.getTransdtlOfflineAmt(
+                offRecord.transdate!!,
+                offRecord.cardno!!,
+                offRecord.cardphyid!!
+            )
             if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
                 throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
             }
diff --git a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
index c3a16c7..fc78d1c 100644
--- a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
@@ -68,6 +68,18 @@
         } else {
             kvMap[index++] = ControlParaRecord("晟元扫码>>", "关闭")
         }
+        var ctl = pos.getControlPara(PublicDef.CONTROL_REBOOT_ENABLE)
+        if (ctl?.paraval == "1") {
+            kvMap[index++] = ControlParaRecord("凌晨重启>>", "开启")
+        } else {
+            kvMap[index++] = ControlParaRecord("凌晨重启>>", "关闭")
+        }
+        ctl = pos.getControlPara(PublicDef.CONTROL_SCREEN_PROTECT)
+        if (ctl?.paraval == "1") {
+            kvMap[index++] = ControlParaRecord("设备屏保>>", "开启")
+        } else {
+            kvMap[index++] = ControlParaRecord("设备屏保>>", "关闭")
+        }
         kvMap[index++] = ControlParaRecord("成功显时间>>", "${sysRecord.sucShowtime}s")
         kvMap[index++] = ControlParaRecord("失败显时间>>", "${sysRecord.failShowtime}s")
         kvMap[index++] = ControlParaRecord("联机流水号>>", pos.getTransdtlOnlineMaxSeqno().toString())
diff --git a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
index dec3a26..da6eee5 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -115,6 +115,28 @@
                 "max_day_offline_amt" -> record.maxDayOfflineAmt = it.paraval!!.toInt()
                 "communicate_time" -> record.commTime = it.paraval!!.toInt()
                 "syno_code" -> record.synoCode = it.paraval == "1"
+                "reboot_enable" -> {
+                    /**
+                     * 设备凌晨自重启 1--开启
+                     */
+                    pos.replaceControlPara(
+                        ControlParaRecord(
+                            PublicDef.CONTROL_REBOOT_ENABLE,
+                            it.paraval ?: "0"
+                        )
+                    )
+                }
+                "screen_protect" -> {
+                    /**
+                     * 设备长时间待机时屏保 1--开启
+                     */
+                    pos.replaceControlPara(
+                        ControlParaRecord(
+                            PublicDef.CONTROL_SCREEN_PROTECT,
+                            it.paraval ?: "0"
+                        )
+                    )
+                }
             }
         }
         if (record.heatBeat == 0) {
diff --git a/app/src/main/java/com/supwisdom/service/SynoCodeService.kt b/app/src/main/java/com/supwisdom/service/SynoCodeService.kt
index c39bb27..4eae1ef 100644
--- a/app/src/main/java/com/supwisdom/service/SynoCodeService.kt
+++ b/app/src/main/java/com/supwisdom/service/SynoCodeService.kt
@@ -33,7 +33,7 @@
         val posid = CommonUtil.getSerialNumber()
         var resp = getRegisterStatus(posid) ?: return BaseResp(PublicDef.ERROR, "获取设备注册状态超时")
         if (resp.retcode != HttpURLConnection.HTTP_OK) {
-            return BaseResp(resp.retcode, resp.retmsg)
+            return BaseResp(resp.retcode, "获取注册状态失败:${resp.retcode},${resp.retmsg}")
         }
         val registerStatusRetBean =
             GsonUtil.GsonToBean(resp.retjson!!, EpaySynoRegisterStatusRetBean::class.java)
@@ -42,7 +42,7 @@
                 resp = registerDevice(posid, PublicDef.SCHOOL_NO)
                     ?: return BaseResp(PublicDef.ERROR, "注册设备超时")
                 if (resp.retcode != HttpURLConnection.HTTP_OK) {
-                    return BaseResp(resp.retcode, resp.retmsg)
+                    return BaseResp(resp.retcode, "注册失败:${resp.retcode},${resp.retmsg}")
                 }
                 return BaseResp(PublicDef.ERROR, "等待后台授权")
             }
@@ -53,7 +53,7 @@
             "activated" -> {
                 resp = getActiveStatus(posid) ?: return BaseResp(PublicDef.ERROR, "下载激活文件超时")
                 if (resp.retcode != HttpURLConnection.HTTP_OK) {
-                    return BaseResp(resp.retcode, resp.retmsg)
+                    return BaseResp(resp.retcode, "下载激活文件失败:${resp.retcode},${resp.retmsg}")
                 }
                 val activeRetBean =
                     GsonUtil.GsonToBean(resp.retjson!!, EpaySynoActiveRetBean::class.java)
@@ -85,7 +85,7 @@
         val resp = activeDevice(CommonUtil.getSerialNumber(), UrlBase64.encode(licenseByte))
             ?: return BaseResp(PublicDef.ERROR, "上传激活文件超时")
         if (resp.retcode != HttpURLConnection.HTTP_OK) {
-            return BaseResp(PublicDef.ERROR, resp.retmsg)
+            return BaseResp(PublicDef.ERROR, "上传激活文件失败:${resp.retcode},${resp.retmsg}")
         }
         return BaseResp(PublicDef.SUCCESS, "上传激活文件成功")
     }
diff --git a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
index 119217b..0e7cc2e 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -12,10 +12,12 @@
 import android.net.Uri
 import android.os.Build
 import android.os.PowerManager
+import android.os.Process
 import android.provider.Settings
 import android.view.WindowManager
 import android.widget.EditText
 import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.splash.SplashActivity
 import okhttp3.internal.and
 import java.io.File
 import java.io.FileOutputStream
@@ -311,4 +313,33 @@
         }
         return ""
     }
+
+    /**
+     * 手动GC
+     */
+    fun GC() {
+        Runtime.getRuntime().gc()
+    }
+
+    /**
+     * 重启整个APP
+     *
+     * @param context
+     */
+    fun restartAPP(context: Context) {
+//        val intent = Intent(context, SplashActivity::class.java)
+//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+//        context.startActivity(intent)
+//        Process.killProcess(Process.myPid())
+    }
+
+    /**
+     * 重启设备
+     *
+     * @param context
+     */
+    fun restartDevice(context: Context) {
+        val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+        pm.reboot(null)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index 0430400..c8a358d 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -16,6 +16,7 @@
     private val FORMAT_yyMMddHHmmss2 =
         org.apache.commons.lang3.time.FastDateFormat.getInstance("yy-MM-dd HH:mm:ss")
     private val FORMAT_HHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmmss")
+    private val FORMAT_HHmm = org.apache.commons.lang3.time.FastDateFormat.getInstance("HHmm")
     private val FORMAT_MMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMdd")
     private val FORMAT_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("MM-dd")
     private val FORMAT_yyyyMMddHHmmss =
@@ -111,16 +112,15 @@
         }
     }
 
+    fun getTimeHHmm(): String {
+        return FORMAT_HHmm.format(Date())
+    }
+
     /**
      * @return MM-dd
      */
     fun getDate_MMdd(): String? {
-        try {
-            return FORMAT_MM_dd.format(Date())
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return null
+        return FORMAT_MM_dd.format(Date())
     }
 
     /**
@@ -149,12 +149,7 @@
      * @return
      */
     fun getNowDateTime(dateStr: String): Date? {
-        try {
-            return FORMAT_yyyy_MM_dd.parse(dateStr)
-        } catch (e: ParseException) {
-            e.printStackTrace()
-        }
-        return null
+        return FORMAT_yyyy_MM_dd.parse(dateStr)
     }
 
     /**
@@ -206,12 +201,7 @@
      * @return yyyyMMdd
      */
     fun getNowDateNoFormat(date: Date): String? {
-        try {
-            return FORMAT_yyyyMMdd.format(date)
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return null
+        return FORMAT_yyyyMMdd.format(date)
     }
 
     /**
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index 2ddbf96..9a6db16 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -82,6 +82,9 @@
 
     const val CODE_SAME_FORBID_TIME: Long = 10 * 1000
     const val CAMERA_FIX_PAY_PERIOD: Long = 30 * 60 * 1000
+    const val APP_GC_PERIOD: Long = 10 * 60 * 1000
+    const val APP_GC_SYNO_PERIOD: Long = 6 * 60 * 60 * 1000
+    const val APP_REBOOT_GAP: Long = 500
 
     /**
      * 本地全局控制参数
@@ -90,7 +93,9 @@
     const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
     const val CONTROL_DEBUG_ENABLE = "debugenable"
     const val CONTROL_SYNOCODE_ACTIVE = "synocodeactive"
-
+    const val CONTROL_REBOOT_ENABLE = "rebootenable"
+    const val CONTROL_REBOOT_DATE = "rebootdate"
+    const val CONTROL_SCREEN_PROTECT = "screenprotect"
     /**
      * 消费冲正时限
      */
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index 4566945..874260e 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -41,6 +41,7 @@
     private val waitTime = 60
     private var syPreview: Preview? = null
     private var payQueryConfirm = false
+    private var appreboottime: Long = 0
     var codePayingNoCancelEnable = false
     var codePaying = false
     var isFixPay = false
@@ -171,6 +172,17 @@
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
         if (event.action == KeyEvent.ACTION_DOWN) {
+            if (event.keyCode == KeyEvent.KEYCODE_DPAD_UP) {
+                //F2 连续按重启app
+                val tt = System.currentTimeMillis()
+                if (tt - appreboottime < PublicDef.APP_REBOOT_GAP) {
+                    LogUtil.i(TAG, "设备双击F2,支付界面重启APP!!")
+                    CommonUtil.restartAPP(context)
+                } else {
+                    appreboottime = tt
+                }
+                return super.dispatchKeyEvent(event)
+            }
             if (codePayingNoCancelEnable) {
                 return super.dispatchKeyEvent(event)
             }
