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 5ce1f02..2b2575c 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -457,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) {
@@ -698,7 +698,8 @@
         return try {
             CommonUtil.YuanToFen(
                 java.lang.Double.parseDouble(
-                    amountTxt.text.toString().trim { it <= ' ' })
+                    amountTxt.text.toString()
+                )
             )
         } catch (ex: Exception) {
             ex.printStackTrace()
@@ -718,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/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index f89263d..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,6 +15,7 @@
 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
@@ -48,6 +49,7 @@
      * 防止定额连续消费
      */
     private val lastPayBean = LastPayBean()
+    private val lock = ReentrantLock()
 
     @Volatile
     private var operation = false
@@ -73,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() {
@@ -128,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))
@@ -140,11 +155,17 @@
                                             + "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(
@@ -158,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) {
@@ -199,13 +222,13 @@
                         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) {
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)
     }
 
     /**
